如何将AlexeyAB实现的Yolov4视频目标检测结果保存为txt/json格式
AlexeyAB版YOLOv4 视频检测结构化结果持久化实现方案
核心适配逻辑说明
此前参考的YOLOv3通用保存方案无法生效,本质是因为该类方案大多基于darknet官方老版本代码逻辑,和AlexeyAB维护的YOLOv4分支的代码结构、函数调用链路存在版本差异,对准视频检测的专属逻辑分支修改即可实现需求。
实操步骤
1. 定位核心修改位置
- 所有视频流检测的处理逻辑集中在仓库下
src/detector.c文件中 - 找到视频处理的核心循环函数
detect_video_thread,在该函数内、每帧完成模型前向推理拿到检测结果数组(detections)的位置插入存储逻辑,不需要修改原有视频渲染、avi编码输出的代码段,可保证原有视频输出功能完全不受影响。
2. 按需求选择存储格式实现
(1)TXT格式持久化(零额外依赖)
- 在
detect_video_thread的初始化位置定义文件句柄:FILE* txt_out = fopen("video_detection_result.txt", "w"); - 每帧检测结果遍历逻辑完成后,逐目标过滤置信度高于阈值的有效检测项,写入文件:
// 循环遍历当前帧所有检测结果 for (int i = 0; i < dets.total; i++) { detection current_det = dets.det[i]; if (current_det.objectness < thresh) continue; // 按固定格式写入单条检测结果 fprintf(txt_out, "frame_idx:%d, class_id:%d, class_name:%s, confidence:%.4f, bbox:[x=%.2f, y=%.2f, w=%.2f, h=%.2f]\n", current_frame_id, current_det.class_id, names[current_det.class_id], current_det.objectness, current_det.bbox.x, current_det.bbox.y, current_det.bbox.w, current_det.bbox.h); } - 视频流全部处理完成后,执行
fclose(txt_out);关闭文件句柄,避免系统缓存导致内容未写入。
(2)JSON格式结构化存储(轻量依赖)
- 引入单文件版cJSON组件,将源码放入
src目录后加入Makefile的编译列表即可 - 在视频线程初始化位置定义JSON根数组对象:
cJSON* json_root = cJSON_CreateArray(); - 每帧处理时,新增一个子JSON对象,存入当前帧序号、时间戳、检测目标列表(每个目标单独存类别、置信度、边界框字段)
- 全量处理完成后,调用cJSON的序列化接口把整体JSON对象转为字符串,写入本地文件,最后释放JSON内存即可。
常见踩坑修正
- 不要把存储逻辑加到图片检测的分支代码中,否则视频运行时永远不会触发存储逻辑
- 写文件时指定的输出路径建议用绝对路径,避免相对路径下文件位置和预期不一致
- 若需要适配下游标注格式,记得把YOLO输出的归一化边界框坐标乘以当前帧的宽高,转换为绝对像素坐标后再存储
- 程序退出前强制刷新文件写入缓存,避免异常退出导致已检测的内容丢失
内容的提问来源于stack exchange,提问作者Anam Zahra
相关产品推荐
相关产品推荐

