0


yolov5模型 9fps提升至27fps全过程

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

cke_3645.png

  • 接着介绍下设备,使用的是香橙派12T + 1.6GHZ + 8.0.RC2.alpha003
  • 镜像烧录在 m.2 nvme PM981A固态中,如何选择固态可见我之前博文
  • 由于海鲜市场购买,没购置铁盒,所以二次改装,露出固态以加强散热
  • 经测试在持续视频推理中,发热量还是比较大的,到烫级别

cke_12598.png

  • 由于固态如果从海鲜市场淘的,多少是会带有类似EFI System的, 要考虑格式化

cke_76280.png

  • 官方工具应该会自动格式化整盘,所以不再手动格式化
  • 使用官方提供方式,界面烧录镜像,当前最新镜像自带的CANN版本是7.0
  • 所以要升级CANN版本到最新

cke_78038.png

  • 官网开发资源中点击资源下载中心
  • 保证全为空,再进入下载最新版本的CANN
  • 更新CANN 使用./Ascend-cann-toolkit_8.0.RC2.alpha003_linux-aarch64.run --upgrade --quiet 命令
  • 具体的就不再阐释,看CANN的官方文档有更新一项

cke_121853.png

  • 下载完CANN还没完,抱歉,这才是刚开始
  • 我们 cat /usr/local/Ascend/ascend-toolkit/latest/version.cfg
  • 会发现适配驱动要求是7.3.T10.0.B528 ,这是超频1.6GHZ和12T的 firmware安装版本
  • 有人会问不安装行不行,答案是不行,因为不安装 acl 等细操都运行报错
  • 所以还需要升级firmware, 此处省略安装,具体过程在香橙派下载的官方工具中

cke_208897.png

  • 搞完了这一步,终于可以进入正题,这次我优化的方式是使用aipp+nms后处理融合后的Om模型

  • 那么我们需要借鉴 Ascend EdgeAndRobotics 中的 YOLOV5Video 案例 ,在gitee Ascend仓库可以找到

  • 由于使用的是ACLLite 进行 编程 ,所以我们要下载ACLLite,也在gitee Ascend仓库

  • 这里切记一定要完成ACLLite python 文件夹的搬迁,作为CANN的 thirdpart, 否则会报出缺文件的错误

  • 具体安装按照 两个Md 去操作,我就贴出几个会让我们抓狂的注意事项

  • 安装ACLLite 环境时 按照官方指示先安装cython,再安装av==6.2.0

  • 但是会报出无法安装av这个版本的错误 因为两个库有版本依赖关系

  • 你只要安装cython==0.29.37 就可以解决这个问题

cke_585006.png

  • 在工程代码中 需要 import videocapture as video
  • videocapture 并不是 python 库文件,而是ACLLite 工程中python 中以 av库 为基础编写的文件
  • 这里一定要注意,别一直在解决Pip install videocapture的问题

cke_783459.png

  • 另外所有环境变量,也就是md中提及要export的变量,需要放在/etc/profile 中,并且要source /etc/profile 生效
  • 否则MobaXterm 多窗口关闭或者重新登录,你会发现环境修改并未生效

cke_929742.png

  • 另外最好使用Anaconda 重新 conda create --name python38 python=3.8 一个环境
  • 并且重新安装好环境,为了后续使用 base 环境 pip uninstall av, 使用 python38 这个环境 安装av
  • 为什么呢? 因为 torchvision 会跟 av 运行起 冲突,使得 opencv 无法正常弹出窗口以及imshow操作

cke_1175394.png

  • 最后 不要忘了 pip install opencv-contrib-python opencv-python
  • 运行程序,当然在代码里,增加了前处理,推理,后处理的时间间隔输出
  • 我们可以看到程序有27帧的处理速率,这里用到了dvpp + aipp +nms融合,效果明显

20240628_061328.gif

  • 运行非常流畅

20240628_061909.gif

  • 相比使用01-yolov5的官方案例,在jupyter 跑时间测量程序,只有9帧速率,效果好多了

cke_1682492.png

  • 如果去除了jupyter显示,也才17帧左右 ,所以是不能使用Jupyter进行一个帧率演示的

cke_1809698.png

  • 官方用了ACLLite 高一级语言处理,其实就是封装后的语言
  • 我的思路是01-yolov5 推理框架不变,不用ACLLite ,使用yolov5_nms.om进行推理,然后使用AIPP进行前处理
  • 因为AIPP 是在AI CORE 上面处理的,在BGR 转 RGB , HWC 转 CHW , 均值化处理上面 ,能得到很大的性能提升
  • DVPP 主要涉及一个resize 工作 和 后处理 尺寸恢复以及 画框操作 可以直接用Python 来编写
  • 这里DVPP resize 工作 我直接使用 原配letterbox 函数,preprocess_image其余删除
  • 后处理 尺寸恢复以及 画框操作 使用 YOLOV5Video 的 postprocess操作
  • 思路就大概如此,当然代码上需要做些细微调整,这里主要讲思路,代码就不贴了
aipp_op {
    aipp_mode: static
    input_format : RGB888_U8
    src_image_size_w : 640
    src_image_size_h : 640    
    csc_switch : false
    rbuv_swap_switch : true

    crop: true
    load_start_pos_h : 0
    load_start_pos_w : 0
    crop_size_w : 640
    crop_size_h : 640

    min_chn_0 : 0
    min_chn_1 : 0
    min_chn_2 : 0
    var_reci_chn_0: 0.0039215686274509803921568627451
    var_reci_chn_1: 0.0039215686274509803921568627451
    var_reci_chn_2: 0.0039215686274509803921568627451

}复制
def infer_frame_with_vis(image, model, labels_dict, cfg, bgr2rgb=True):
    # 数据预处理
    timestamp_start = time.time()
    # img, scale_ratio, pad_size = preprocess_image(image, cfg, bgr2rgb)
    img, scale_ratio, pad_size = letterbox(image, new_shape=cfg['input_shape'])
    timestamp_preprocess = time.time()

    # 模型推理

    image_info = np.array([640, 640,
                            640, 640],
                            dtype=np.float32)

    output = model.infer([img,image_info])    
    # output = torch.tensor(output)
    timestamp_infer = time.time()
    img_vis = postprocess(img,output,cfg)
    timestamp_postprocess = time.time()
    # print("timestamp_preprocess:",timestamp_preprocess - timestamp_start,"timestamp_infer:",timestamp_infer - timestamp_preprocess,"timestamp_postprocess:",timestamp_postprocess - timestamp_infer)
    return img_vis复制
  • 最后我是用了行人和车辆测试两个视频进行测试,效果如下
  • 两个视频都是跑到了27fps

  • 摄像头实时识别也能达到29fps-30fps
  • 当然为什么比27fps高,我想应该是前处理输入视频的大小导致letterbox处理时间的不同,最终影响帧率

cke_4578.png

  • 从cpu使用上看还是有提升空间的

cke_2908269.png

  • 最后我们来分析模型文件
  • yolov5_nms.om 网络分层中融合了两个昇腾特殊算子 YoloV5DetectionOutput算子和YoloPreDetection

cke_1264658.png

  • 复习一下yolov5目标检测模型 输出张量的说明
  • 正常情况应该是如下图输出

cke_1291325.png

cke_3151125.png

  • 最后附录整个流程一些自问自答
  1. AIPP是在哪个器件完成工作的?

  2. DVPP是在哪个器件完成工作的?

  3. 整个流处理过程是怎么样的?对比opencv优势在哪里

  4. 什么痛点用到DVPP?

  5. 什么痛点用到AIPP?

  6. DVPP在AIPP前还是后面?

  7. AIPP和DVPP分工的不同?

  8. 需要的预处理如何用AIPP转换

  9. DVPP要使用ACLLite进行编程吗?代码里面有所有实例,包括VDEC吗

  10. aipp_mode 代表了什么?

  11. mean_chn_i var_reci_chn 代表了什么? 如何计算得到的像素

  12. csc_switch 是什么作用

  13. rbuv_swap_switch 什么作用?

  14. matrix_r0c0 列表数据要去哪里获得?是固定的吗?还是会改变的?

  15. AIPP atc编译的时候使用 --insert_op_conf=aipp.cfg

  16. 经过AIPP处理后的图片,统一采用什么格式存储

  17. AIPP NHWC 输入,最后会输出成什么格式

  18. 安装ACLLite核心流程应该是怎么样的?跟opencv 一样下载库文件然后设定环境变量就OK?还是使用Pip 或者conda 下载?

  19. 有多少个环境变量需要设定?

  20. NPU_HOST_LIB 的环境变量跟 /etc/profile中的不一样怎么办?哪个为准?

  21. 环境变量里面哪两个最重要?是不是Python的引用需要使用到这两个环境变量?

  22. ACLLite的本质代码是是什么?是CANN的底层代码封装吗?

  23. av 下载应该选择怎么样的版本

  24. 怎么查看opencv版本号

  25. opencv支持 h.264 直接cap.read() 或者 cv2.VideoCapture吗

  26. 如果opencv不支持h.264, DVPP应该进行怎么样的转码?是VDEC 吗?

  27. h.264转RGB或者YUV 是如何控制转换的类型的?

  28. h.264是什么格式?通过cap.read()读取每一帧是什么格式?

  29. import videocapture as video , videocapture 读取h.264直接转换成jpeg吗?

  30. videocapture是库文件吗?还是只是个py

  31. av 下载应该选择怎么样的版本?大于6.2.0 版本可以吗?

  32. 配套的cython应该选择什么版本?0.29.37可以吗,大于会怎么样?

  33. videocapture.VideoCapture和cv2.VideoCapture的区别?

标签: YOLO 人工智能

本文转载自: https://blog.csdn.net/xiujiti6871/article/details/140135325
版权归原作者 william_myq 所有, 如有侵权,请联系我们删除。

“yolov5模型 9fps提升至27fps全过程”的评论:

还没有评论