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

cke_41371.png

1.gif

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

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

Pasted%20image%2020240709202542.png

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

cke_370487.png

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

cke_495133.png

  • 运行VideoRead::Open() 的过程中,ffmpeg 通过 FFmpegDecoder::GetVideoInfo() 获得了 mp4 文件的 各个重要参数
  • 如 输入 视频类型 videoType_ = AV_CODEC_ID_H264等

OG_PRINT("[INFO] Video %s, type %d, profile %d, width:%d, height:%d, fps:%d",streamName_.c_str(), videoType_, profile_, frameWidth_, frameHeight_, fps_);

  • 运行VideoRead::Open() 的过程中进行了dvppVdec_->init() ,涉及设置 dvpp vdec 输出格式 重要步骤
  • 比如 设置 参数PIXEL_FORMAT_YUV_SEMIPLANAR_420 还有H265_MAIN_LEVEL 等

cke_571882.png

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

cke_598341.png

  • 模型执行使用的AscendCL 的acl 代码

cke_932724.png

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

cke_1129668.png

npu-smi info -t usages -i 0 -c 0
npu-smi info -t cpu-num-cfg -i 0 -c 0
npu-smi set -t cpu-num-cfg -i 0 -c 0 -v 0:4:0

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

cke_1715471.png

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

2.gif

本帖最后由 匿名用户2024/07/09 21:35:34 编辑

我要发帖子