Python图像识别训练模型预测时出现检测框交错重叠的问题是什么原因?
上级又跑来给我出难题,要自己训练模型了。训练了几天的模型,但是结果都不理想啊。出现以下问题,请问是怎么回事呢?是我训练图像太少了吗,还是描述图片的框的时候不够准,还是怎么回事,完全搞不懂啊。。。

Python图像识别训练模型预测时出现检测框交错重叠的问题是什么原因?
感觉有点像是 MTCNN,前两层框就很多
这个问题通常是因为非极大值抑制(NMS)没处理好,或者后处理参数设得不对。模型在推理时会对同一个目标生成多个高度重叠的预测框,如果NMS的阈值(iou_threshold)设得太高,这些重复的框就过滤不掉,全画出来就乱套了。
核心就两步:拿到所有预测框,然后用NMS筛一遍。下面用PyTorch和OpenCV写个完整的例子:
import torch
import cv2
import numpy as np
def nms(boxes, scores, iou_threshold=0.5):
"""纯NumPy实现的NMS,不依赖库"""
x1 = boxes[:, 0]
y1 = boxes[:, 1]
x2 = boxes[:, 2]
y2 = boxes[:, 3]
areas = (x2 - x1) * (y2 - y1)
order = scores.argsort()[::-1]
keep = []
while order.size > 0:
i = order[0]
keep.append(i)
xx1 = np.maximum(x1[i], x1[order[1:]])
yy1 = np.maximum(y1[i], y1[order[1:]])
xx2 = np.minimum(x2[i], x2[order[1:]])
yy2 = np.minimum(y2[i], y2[order[1:]])
w = np.maximum(0.0, xx2 - xx1)
h = np.maximum(0.0, yy2 - yy1)
inter = w * h
iou = inter / (areas[i] + areas[order[1:]] - inter)
inds = np.where(iou <= iou_threshold)[0]
order = order[inds + 1]
return keep
# 模拟模型输出:假设有4个预测框,其中两个是同一个目标
boxes = np.array([
[50, 50, 150, 150], # 目标A
[55, 55, 155, 155], # 与A高度重叠
[200, 200, 300, 300], # 目标B
[250, 250, 350, 350] # 目标C
], dtype=np.float32)
scores = np.array([0.9, 0.85, 0.8, 0.75], dtype=np.float32)
# 应用NMS,IOU阈值设低点,比如0.3
keep_indices = nms(boxes, scores, iou_threshold=0.3)
filtered_boxes = boxes[keep_indices]
print("过滤后的框:", filtered_boxes)
# 输出应该只有3个框,那两个高度重叠的会合并成一个
# 画图示意
img = np.ones((400, 400, 3), dtype=np.uint8) * 255
for box in filtered_boxes:
x1, y1, x2, y2 = box.astype(int)
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imshow('NMS Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果你用的是现成的检测库(比如YOLO、Detectron2),检查一下推理代码里调用NMS的部分,重点看iou_threshold这个参数,一般调到0.3-0.5之间。训练时模型为了召回率高会输出很多框,预测时必须靠NMS来清理。
总结:调低NMS的IOU阈值。
我是用那个 imageai 的库进行训练的,他那代码里用的是 yolov3 来做预训练模型。
你 nms 设置有问题吧
IOU 都有 100 的了
嘛。看错了
不过还是 nms 设置问题
听你说的我又回去看了下那库,里面没找到有设置这参数的地方啊。。
感觉是 NMS 问题,阈值调小一点试试。然后 bbox 感觉也不是很准,loss 还有下降空间吗?
应该是 nms 阈值问题,准确度的话,多尺度训练开了吗
感觉可以通过左右翻转来增加训练样本数量
试试 softnms
iou 极大值抑制
先感谢楼上诸位的热心解答,但小弟仍有几件事不解。
经过这几天查资料,我这种情况好像叫什么过拟合。好像是因为模型太复杂,数量太少。
对于上面那两个,我是否应该增加样本数量,我之前只用了 200-300 张为样本,根据楼上老哥的回答,是可以左右旋转,这样会影响识别率吗?
然后就是,我要识别的船只各种各样,比如图上的,有长的轮船,也有小的渔船,也有游艇等等,我是否应该将船只分类?而不是都放一个 ship 里,不过如果要分类的话,那每个类的样本数量又更少了。。
之后就是,nms 是训练的时候设置的,还是识别的时候才设置的?如果我理解没错的话,应该是识别的时候再通过你们说的这些算法再过滤一次?
最后就是,我是否应该只用 TensorFlow,opencv 和 keras 来训练?而不要依靠那些又封装了一层的第三方库(目前用的是一个叫 imageai 的库来训练的,我也不知道怎么样。)
我训练了 170 多层,然后隔了几天看它没什么变化了(没生成新的 model ),我就停了。

