Darknet-YOLOv3目标检测:预测结果无法保存至JSON/TXT的问题咨询
解决Darknet Demo模式下保存检测结果到JSON/TXT的问题
别担心,作为计算机视觉新手遇到这种问题太正常了,我来帮你理清问题所在,以及给出几种可行的解决方法~
你当前命令的问题
你用了 -out result.json 参数,但在Darknet的 detector demo 模式下,这个参数并不生效。-out 参数是给 detector test(批量测试图片)模式设计的,用来保存检测结果到JSON,而demo模式默认只负责实时展示或保存视频,不会处理这个参数。
解决方案
方案1:重定向控制台输出到TXT文件(最简单快捷)
你已经加了 -ext_output 参数,这会让控制台输出每帧的详细检测结果(包括目标类别、置信度、坐标)。我们可以把控制台的输出直接重定向到TXT文件:
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights -dont_show test_vid.mp4 -i 0 -out_filename output.avi -ext_output > result.txt 2>&1
>表示把正常输出(检测结果)写入result.txt2>&1表示把错误信息也写入同一个文件,避免丢失关键日志
生成的TXT文件里,每一条检测结果会是类似这样的格式:
person: 99% (left_x: 100 top_y: 200 width: 150 height: 300)
如果之后需要转换成JSON,可以用Python写个简单的脚本解析这个TXT文件,整理成结构化的JSON格式。
方案2:修改源码实现JSON输出(适合需要原生JSON的情况)
如果一定要直接生成JSON格式的结果,需要修改Darknet的源码:
- 打开
darknet/src/demo.c文件 - 找到处理检测结果的部分(比如在
draw_detections函数附近,或者打印结果的printf语句处) - 添加代码,把每个目标的信息(类别、置信度、坐标、帧号)格式化成JSON字符串,写入到指定的文件中
- 重新编译Darknet:在终端执行
make命令 - 再次运行你的demo命令,就能生成JSON结果文件了
方案3:拆分视频为帧,用test模式批量处理(适合不需要实时预览的场景)
如果不需要实时处理视频,只是想得到检测结果和生成视频,可以先把视频拆成单帧图片,再用批量测试模式:
- 用ffmpeg拆分视频(需要先安装ffmpeg):
ffmpeg -i test_vid.mp4 frames/frame_%04d.jpg
(frames 是提前创建好的文件夹)
2. 生成包含所有帧路径的文本文件:
ls frames/*.jpg > frames.txt
- 用
detector test批量处理并保存JSON结果:
./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -ext_output -out result.json < frames.txt
- 最后如果需要把帧重新合成视频,可以用:
ffmpeg -i frames/frame_%04d.jpg -c:v libx264 -r 30 output.avi
额外注意事项
- 建议拉取Darknet的最新代码重新编译,旧版本可能存在参数支持不全的问题
- 如果用方案1的TXT转JSON,Python脚本可以参考遍历每一行,提取类别、置信度、坐标,然后组织成列表写入JSON文件
内容的提问来源于stack exchange,提问作者Saran Raj
相关产品推荐
相关产品推荐

