You need to enable JavaScript to run this app. 如何将AlexeyAB实现的Yolov4视频目标检测结果保存为txt/json格式
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.08 12:54:04