YOLO V5自定义目标检测:如何导出边界框CSV/TXT结果文件
YOLOv5导出带边界框、置信度的检测结果为TXT/CSV方法
基础TXT导出(小改即可实现)
- 官方detect.py自带
--save-txt运行参数,默认执行后会在runs/detect/对应输出文件夹/labels路径下生成每张图对应的TXT结果,不过默认输出格式为类别id 归一化中心x 归一化中心y 归一化框宽 归一化框高,不带置信度,坐标为相对原图的0-1归一化值。 - 要让默认TXT携带置信度,找到detect.py中遍历检测框写入文件的代码段(位置随版本略有浮动,核心逻辑为遍历det变量逐行写文件),修改
line变量的赋值逻辑,把置信度字段加进去即可:
# 原代码 # line = (cls, *xywh) # 修改为 line = (cls, conf, *xywh)
修改后运行python detect.py --weights 你的训练权重路径.pt --source 待检测数据路径 --save-txt,导出的TXT每行格式就变为类别id 置信度 归一化中心x 归一化中心y 归一化框宽 归一化框高。
自定义导出统一CSV文件(含绝对像素坐标)
如果需要把所有图片的检测结果汇总到一个CSV文件,直接按以下步骤修改detect.py:
- 在文件开头的导入模块区域,加入csv模块导入:
import csv - 在文件的参数定义段(
parse_opt()函数内),新增CSV导出的开关参数:parser.add_argument('--save-csv', action='store_true', help='export all detection results to csv file') - 找到遍历待检测图片的推理循环起始位置(即
for path, im, im0s, vid_cap, s in dataset:这行之前),加入CSV文件初始化逻辑,提前写好表头:
表头里x1/y1为边界框左上角像素坐标,x2/y2为右下角像素坐标,都是原图上的绝对位置,不需要额外换算。if opt.save_csv: csv_f = open('detection_result.csv', 'w', newline='', encoding='utf-8') csv_writer = csv.writer(csv_f) # 表头可根据自己需求调整字段 csv_writer.writerow(['image_name', 'class_id', 'confidence', 'x1', 'y1', 'x2', 'y2']) - 还是在之前提到的遍历检测框的代码段(
for *xyxy, conf, cls in reversed(det):内部),加入CSV写入逻辑:if opt.save_csv: # 提取坐标、类别、置信度数值,保留2-4位小数减少冗余 x1, y1, x2, y2 = [i.item() for i in xyxy] cls_id = int(cls.item()) conf_score = round(conf.item(), 4) img_name = Path(path).name csv_writer.writerow([img_name, cls_id, conf_score, round(x1,2), round(y1,2), round(x2,2), round(y2,2)]) - 在整个推理循环结束的位置(即遍历完所有待检测数据之后),加入CSV文件关闭逻辑,避免内容缓存丢失:
if opt.save_csv: csv_f.close()
- 运行时加上
--save-csv参数即可,参考命令:
python detect.py --weights best.pt --img 640 --conf 0.25 --source ./test_images --save-csv
运行完成后会在detect.py同级目录生成detection_result.csv,包含所有检测结果。
补充说明
- 如果需要在CSV里存归一化坐标,参考原TXT的坐标转换逻辑,把xyxy转成xywh格式后除以原图宽高张量
gn再写入即可。 - 如果不需要逐图生成单独的TXT标签文件,运行时不加
--save-txt参数即可,不会生成冗余文件。 - 所有字段的保留小数位、表头命名都可以根据自己的业务需求调整代码里的对应部分。
内容的提问来源于stack exchange,提问作者Dilow
相关产品推荐
相关产品推荐

