YOLO V5导出边界框坐标时如何获取对应score of prediction
可行性结论
这个需求完全可以实现,不需要修改模型结构、也不需要重新训练。YOLOv5推理时本来就会输出每个检测框的预测置信度(也就是你要的prediction score),你之前导出的txt里没有这个值,只是默认导出配置没开置信度保存,或者自定义导出逻辑的时候没把这个字段写进去而已。
具体操作方法
方法1:零代码修改,直接加启动参数(最省事)
如果你是用YOLOv5官方自带的detect.py脚本跑推理导出结果,根本不用改源码,启动推理命令的时候加上--save-conf参数就行。开启后导出的txt文件,每一行都会在类别、坐标信息的末尾自动追加对应的预测分数。
示例命令:
python detect.py --weights 你训练好的模型权重路径.pt --source 待检测的图片/视频文件夹路径 --save-txt --save-conf
导出的txt单条记录格式为:类别ID 归一化x中心坐标 归一化y中心坐标 归一化框宽度 归一化框高度 预测分数,其中预测分数范围在0到1之间,数值越高代表模型对这个检测结果的判定越确定,和你在检测可视化图上看到的框上标的置信度数值完全一致。
方法2:自定义导出逻辑时手动追加置信度字段
如果你是自己写的推理、导出代码,只需要在遍历检测结果的时候,把每个框对应的置信度值一起写入txt就可以。YOLOv5单张图的推理返回结果里,每个检测框的存储格式是[x1, y1, x2, y2, 置信度, 类别ID],遍历的时候直接取出置信度字段,和你之前要存的坐标、类别ID拼到一起写入文件就行。
参考代码片段:
# pred为模型返回的单张图片检测结果 for *xyxy, conf, cls in pred: # 这部分是你原有的坐标转换逻辑,比如转归一化xywh格式 xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / img_size_ratio).view(-1).tolist() # 把conf拼到要写入的行数据里 line_content = (int(cls), *xywh, float(conf)) # 写入对应txt文件 with open(target_txt_path, 'a') as f: f.write(('%g ' * len(line_content)).rstrip() % line_content + '\n')
注意点
- 要是加了
--save-conf参数导出的txt还是没有分数,先检查你本地拉的YOLOv5仓库版本,太老的版本没内置这个参数,直接用方法2手动加字段就行,代码改动很小,不会影响原有检测效果。 - 如果你在后处理阶段加了置信度阈值过滤(比如只保留置信度大于0.25的检测框),导出的分数就是过滤后的最终结果分数,不需要额外做数值转换。
内容的提问来源于stack exchange,提问作者Dilow
相关产品推荐
相关产品推荐

