第二弹-yolov5模型 27fps提升至57fps全过程
发表于2024-07-09 21:34:46
0 查看


- 首先讲一下下本文解决痛点,感谢叮叮当当博主提供解决思路
- 当然我知道肯定存在更快更好的方法,如果社区同学有相应解决方案,希望可以在本文后面不吝赐教,提供下具体思路,不胜感激
- 如果有幸官方大大看到博文,觉得能入眼,不知是否有奖励一块20T板供后续学习的机会

- 本次采用的跟第一弹采用的方式不同,使用三进程协同机制来处理前处理, 推理,后处理显示 三个重要流程
- 类似于算子工程中的 CopyIn,Compute,CopyOut 流水线,但本质又不一样因为他们是并行处理的
- 更类似于Cortex-M3架构的3级流水线,取指,解码,执行
- 这样做的好处就是充分利用了4核可以使用进程的优势,降低了每一帧视频的处理时间,为后续增添算法提供了时间冗余保障

- 在数据流的构造角度上讲解
- 首先通过ffmpeg 读取 mp4 后缀 视频文件 为 h264 avcc编码,再通过ffmpeg 转换 成 h264 annexb的编码格式
- 再通过 dvpp 的 vdec 将 h264 annexb 转换成 YUV 图片
- 最终通过 aipp 将YUV 格式图片 转换成 RGB 格式图片 参与 yolov5_nms.om 推理, 得到识别框并展示

- 代码中使用到了ACLlite 架构,其实就是AscendCL的高级封装语言,会比较陌生
- 这里重要使用到的就是几个类 VideoRead ,VdecHelper,FFmpegDecoder
- VideoRead 重点就在 VideoRead::Open() 和 VideoRead::Read 上

- 运行VideoRead::Open() 的过程中,ffmpeg 通过 FFmpegDecoder::GetVideoInfo() 获得了 mp4 文件的 各个重要参数
- 如 输入 视频类型 videoType_ = AV_CODEC_ID_H264等
- 运行VideoRead::Open() 的过程中进行了dvppVdec_->init() ,涉及设置 dvpp vdec 输出格式 重要步骤
- 比如 设置 参数PIXEL_FORMAT_YUV_SEMIPLANAR_420 还有H265_MAIN_LEVEL 等

- VideoRead::Read() 重要的是启动了 dvpp 线程,事实上应该是ffmpeg 解码 和 dvpp vdec 解码



- 以上为大致的一个流程,具体细节大家自行看代码
- 那么接下来预备知识准备完毕,我们进入正题
- 首先原本orange pi 使用的是3 :1 cpu 设置,一个ai cpu ,负责标量计算
- 本人觉得利用率太低了,ai cpu 的工作 control cpu 也可以干的好
- 所以先将 3:1 cpu 功能设置 改成了 4 : 0 充分解放生产力

- 其次通过对三个阶段的时间耗时打印对比,发现imshow所在后处理 会严重干扰前面两个阶段的耗时
- 所以要想办法减少Imshow的耗时,通过测试,发现图片实际大小与像素的显示大小会严重感染imshow的耗时
- 因为涉及了一个压缩和padding的过程
- 本人使用1920*1080的视频流转640*640*3进行推理后再 进行 640 *320 的窗口显示
- 运行非常流畅,不会出现降频降帧的情况

- 当然在进行这一步前,需要将官方视频通过ffmpeg转换成60帧
- 升级opencv 到最新版本(猜想新版本有优化)
- 使用两个进程对输入cap进行双流读取(用了互斥进行进程同步)
- 使用两个进程对输出pop获得数据进行双流imshow(不建议)
- 使用命令nice -n -5 bash scripts/sample_run.sh imshow 进行优先级升级运行

本帖最后由 匿名用户 于 2024/07/09 21:35:34 编辑
OG_PRINT("[INFO] Video %s, type %d, profile %d, width:%d, height:%d, fps:%d",streamName_.c_str(), videoType_, profile_, frameWidth_, frameHeight_, fps_);