
密集缺陷检测常常卡在后处理。整数 NMS 可以避免一部分浮点除法,但坐标约定、阈值边界和溢出处理稍有差异,留下的框就可能不同。它是一个可独立验证的工程环节,不能把 NMS 加速等同于缺陷召回改善。
RKNN Toolkit2 v2.5.0的后端和算子说明提醒我们:转换成功和输出语义一致需要分别核对。本文把测试限在坐标与抑制规则,没有运行检测网络。
半开框不能混入加一
本文框为 [x1,y1,x2,y2),面积是 (x2-x1)(y2-y1)。边相接的两个框没有交集。若训练代码采用闭区间像素索引,面积可能出现加一;两种约定都能用,混在一起就会让极小框的 IoU 偏差很大。
设交集面积 I、并集面积 U,阈值为有理数 a/b。IoU>a/b 等价于 I*b>U*a,其中 U 必须大于零。C/C++ 还必须为乘积选足够宽的整数类型。
def area(box):
x1,y1,x2,y2 = box
if x2 <= x1 or y2 <= y1:
raise ValueError("positive half-open box required")
return (x2-x1)*(y2-y1)
def suppress(a,b,num=1,den=2):
aa,bb = area(a),area(b)
if not 0 <= num <= den or den <= 0:
raise ValueError("invalid threshold")
iw = max(0,min(a[2],b[2])-max(a[0],b[0]))
ih = max(0,min(a[3],b[3])-max(a[1],b[1]))
inter = iw*ih
union = aa+bb-inter
return inter*den > union*num
a=(0,0,4,4)
assert suppress(a,a)
assert not suppress(a,(4,0,8,4))
assert not suppress((0,0,3,1),(1,0,4,1)) # IoU恰为1/2
assert suppress((0,0,100000,100000),(1,1,100001,100001))
try:
area((0,0,0,3))
raise AssertionError("degenerate box accepted")
except ValueError:
pass
print("integer IoU: identical, touching, equality, large and invalid cases passed")

这段代码验证一个框对的判据,没有实现整套 NMS。完整流程还应固定按分数降序排列的规则、相同分数的稳定次序、类别内还是跨类别抑制,以及候选数上限。先截断候选再做 NMS 可能丢掉真缺陷,需要用验证集选择上限。
多尺度收益要单独归因
增加浅层特征、改变输入分辨率和替换 NMS,分别影响网络计算、定位和候选保留。一次把三项都改掉,只能测组合效果,不能把全部改善归功于整数运算。
应保存同一批原图、模型原始输出和各阶段候选,逐层比较框。漏检率若非零,就不能叫“零漏检”;样本中未出现漏检,也不等于整个产线漏检概率为零。本文没有真实缺陷标签、模型输出和产线节拍记录,尚未验证任何召回率或毫秒级时延。
网硕互联帮助中心



![[效率] Pi Agent:一个把子代理和计划模式都删掉的编程工具,凭什么说它更适合普通人-网硕互联帮助中心](https://www.wsisp.com/helps/wp-content/uploads/2026/10/20261027182441-6ae0ec692d1ab-220x150.png)

评论前必须登录!
注册