如何将YOLO检测得到的类别名称保存至CSV或TXT文件
YOLOv4视频检测类别结果导出CSV/TXT实现方案
原有代码问题梳理
count_objects函数传入by_class = False,返回结果不是按类别维度的统计数据,无法获取单个类别的检测结果- 循环写入CSV时错误写入全量允许检测类别列表
allowed_classes,没有写入实际检测到的类别名称/统计值 - CSV文件未指定完整存储路径,生成文件会散落在工程根目录,不便于后续管理
- csv模块导入放在条件分支内部,不符合Python编码规范,重复触发分支时会重复执行导入逻辑
修正后的CSV导出代码
# 所有导入放在文件头部 import os import csv # 原有检测逻辑保留,以下为CSV导出分支的修正代码 if FLAGS.csv: # 统一检测结果存储路径 result_root = os.path.join(os.getcwd(), 'detections') crop_path = os.path.join(result_root, 'crop', video_name) csv_path = os.path.join(result_root, 'class_detections.csv') # 递归创建缺失目录 os.makedirs(crop_path, exist_ok=True) # 按类别统计检测结果 counted_classes = count_objects(pred_bbox, by_class = True, allowed_classes=allowed_classes) # 写入CSV,表头为【类别名称, 检测次数】 with open(csv_path,'w',newline ='', encoding='utf-8') as f: writer = csv.writer(f) # 写入表头 writer.writerow(['类别名称', '检测次数']) # 遍历统计结果逐行写入 for class_name, count in counted_classes.items(): writer.writerow([class_name, count])
代码修改说明
- 把
by_class参数改为True,获取按类别分组的检测统计结果 - 新增CSV表头,可读性更强,指定utf-8编码避免中文类别名乱码
- 用
os.makedirs的exist_ok=True参数替代try-except判断目录是否存在,代码更简洁 - 所有存储路径统一放在
detections目录下,便于统一管理检测结果 - 写入内容改为实际检测到的类别名称和对应的出现次数,符合后续分析需求
TXT格式导出实现
如果需要导出为TXT格式,替换CSV写入部分的代码即可:
txt_path = os.path.join(result_root, 'class_detections.txt') with open(txt_path, 'w', encoding='utf-8') as f: f.write("类别名称\t检测次数\n") for class_name, count in counted_classes.items(): f.write(f"{class_name}\t{count}\n")
内容的提问来源于stack exchange,提问作者AITHARAJU SAI HEMANTH
相关产品推荐
相关产品推荐

