如何调整Keras训练的目标检测模型实现单帧多目标检测
问题根因与解决方案
核心问题原因
你当前训练的模型属于单目标检测架构,模型的输出头被设计为仅输出1组边界框坐标(4个浮点值)和1组类别概率,所以无论输入图像中存在多少个目标,模型只会输出它判断置信度最高的那1个目标的结果,这是你无法检测多目标的根本原因。
可行解决方案
你可以根据自己的需求选择以下两种方案:
方案1:不重新训练现有模型,通过后处理逻辑实现多目标检测
适合临时应急使用,不需要调整模型结构和重新训练:
- 对输入图像构建图像金字塔,生成多个不同缩放比例的图像,适配不同大小的目标
- 使用固定尺寸的滑动窗口遍历每一张缩放后的图像,将每个窗口裁剪下来输入到你现有模型中做预测
- 过滤所有置信度低于预设阈值(推荐设置为0.5~0.7)的预测结果
- 对剩余的所有预测结果执行
非极大值抑制(NMS),剔除重叠度高的重复预测框,最终保留的结果就是图中所有目标的检测结果 - 注意:该方案推理速度慢,对重叠目标、小目标的检测效果一般。
方案2:更换原生支持多目标检测的模型架构重新训练
这是长期使用的最优方案,检测精度和推理速度都远高于方案1:
- 可以选择SSD、YOLO系列(如YOLOv8、YOLOv5)等原生多目标检测架构,这类模型的输出头会基于预设的大量锚框输出所有可能目标的边界框和类别概率,天然支持单图多目标检测
- 训练前需要调整数据集标注格式,确保每张图中所有目标的边界框、类别都被完整标注,替换你之前单目标的标注逻辑
- 预测阶段需要调整你当前的代码逻辑:不再直接取
boxPreds[0]、np.argmax(labelPreds)仅获取单个结果,而是遍历所有高于置信度阈值的预测结果,执行NMS后逐个绘制框和类别标签即可。
内容的提问来源于stack exchange,提问作者S Andrew
相关产品推荐
相关产品推荐

