快来看,你的盒子也能用OpenCV NPU后端啦

144 篇文章 73 订阅

作者 || 高锦炜
转载 || OpenCV 中国团队
编辑 || 3D视觉开发者社区
✨如果觉得文章内容不错,别忘了三连支持下哦😘~

OpenCV DNN基于TIM-VX的NPU后端早在两个月前已经合入主仓库,并即将在OpenCV 4.6中正式发布。此后仅需简单敲入两行代码便可通过OpenCV将量化的深度模型部署在NPU上,极大地提高了模型运行速度。OpenCV Webinar 15对此也进行了专门介绍。

OpenCV这个NPU后端官方部署的硬件环境是Khadas VIM3 (https://www.khadas.com/vim3),我手边有一个工业小盒子EAIS-750E(https://www.yuque.com/william-apmjq/vob7gl/sh946b),它与Khadas VIM3拥有相同的SoC芯片,理论上也适用OpenCV这个NPU后端,于是便花了点时间捣鼓了一下。

经过测试,在EAIS-750E上可以使用OpenCV NPU后端调用NPU进行推理,同时我也用OpenCV Zoo & Benchmark(https://github.com/opencv/opencv_zoo)测试了一下EAIS-750E的性能。

不过,在安装部署过程中还是遇到了一些坑,下面我就来跟大家分享一下使用OpenCV NPU后端和OpenCV Zoo & Benchmark的体验

在EAIS-750E上安装带NPU后端功能的版本,基本可以直接参考OpenCV官方教程(https://github.com/opencv/opencv/wiki/TIM-VX-Backend-For-Running-OpenCV-On-NPU)。但由于官方教程针对的硬件环境是Khadas VIM3,在EAIS-750E上安装需要稍微进行一些修改。

源码编译安装具有NPU后端的Python接口

通常安装OpenCV Python接口的方法是pip install opencv-python。但是由于pip install opencv-python安装的OpenCV Python接口是默认不打开NPU后端的,所以需要下载OpenCV源代码自行编译安装带NPU后端的OpenCV Python接口。

$ git clone https://github.com/opencv/opencv
$ cd opencv && mkdir build && cd build
$ cmake .. -D WITH_TIMVX=ON -D CMAKE_BUILD_TYPE=RELEASE \ 
           -D BUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF \
           -D CMAKE_INSTALL_PREFIX=/usr/local/  \
           -D PYTHON3_INCLUDE_DIR=/usr/include/python3.6 \ 
           -D PYTHON3_EXECUTABLE=/usr/bin/python3.6 \
           -D PYTHON3_LIBRARY=/usr/lib/aarch64-linux-gnu/  
$ make -j 6
$ sudo make install
$ sudo cp /usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.cpython-36m-aarch64-linux-gnu.so /usr/local/lib/python3.6/dist-packages/cv2.so

如上,安装路径为/usr/local/,打开了TIM-VX后端选项,打开了python接口,关闭TESTS等选项节省编译时间。使用6线程编译可大幅度缩短编译时间,EAIS-750E上完成整个编译过程大约需要30min。

用下面的命令查看安装是否成功:

$ python3 -c "import cv2; print(cv2.__version__)"

在这里插入图片描述

输出OpenCV版本号,说明OpenCV Python接口安装成功。

模型性能测试

利用OpenCV Zoo & Benchmark(https://github.com/opencv/opencv_zoo)可以测试和比较深度学习模型在不同硬件平台上的性能

首先,下载opencv_zoo项目,同时下载模型。所有模型总共742MB,有点大,下载需要20min左右。

$ git clone https://github.com/opencv/opencv_zoo && cd opencv_zoo
$ git lfs install  && git lfs pull

下载模型的同时另开一个终端安装依赖库,numpy安装大约也要20min。

$ sudo apt install python3-pip
$ pip3 install Cython pyyaml -i  https://pypi.tuna.tsinghua.edu.cn/simple 
$ pip3 install numpy requests -i https://pypi.tuna.tsinghua.edu.cn/simple

注意,这里不要使用官方教程中 requirements.txt 来安装依赖库,因为其流程里包含pip安装opencv-python库,如前所述这样安装的库并不支持NPU后端。

同时,不知道什么原因,在我这里它并没有直接安装预编译库,而是进入了OpenCV源码编译并且还是单线程编译,这在EAIS-750E上耗费了2小时,而且安装后还覆盖了前面编译好的具备NPU后端的opencv-python库。

接着,下载测试需要的图片文件(https://pan.baidu.com/share/init?surl=8sV8D4vXUb2xC9EG45k7bg,pvrw)放到opencv_zoo/benchmark/data目录下并解压。

下面,来测试face_detection_yunet模型在EAIS-750E NPU上的运行速度。由于benchmark测试依赖yaml文件,默认的yaml文件是针对CPU的配置,所以需要修改config下的face_detection_yunet.yaml文件:

$ cd benchmark 
$ vim config/face_detection_yunet.yaml 

在这里插入图片描述

修改的内容包括:

  • backend: “default” -> “timvx”

  • target: “cpu” -> “npu”

  • warmup和repeat都改设为1。因为NPU推理不需要Cache预热,但NPU第1次运行编译耗时很长,之后执行1遍和10遍耗时是一致的

  • modelPath须更换成原路径下的int8模型,否则用浮点模型会fallback到CPU执行

修改好yaml文件后就可以调用NPU运行测试了:

$ cd benchmark 
$ PYTHONPATH=.. python3 benchmark.py --cfg ./config/face_detection_yunet.yaml

在这里插入图片描述

于仕琪老师开发的世界上最快的人脸检测模型YuNet只需要4.2ms,so cool!

经过实际测试,EIAS-750E运行OpenCV Benchmark数据表格如下:

在这里插入图片描述

从上表中看到,EAIS-750E CPU性能与树莓派4接近并略强一些,因为750E有4个主频达2.2GHz的A73 CPU,比树莓派1.5GHz强不少

前面提到,EAIS-750E的SoC芯片Khadas VIM3是相同的,但是benchmark的实测结果在个别模型上存在差异。这是由于这两块开发板的NPU驱动版本和DDR内存规格不同造成的。EAIS-750E的NPU驱动版本是 6.4.4,而Khadas VIM3的NPU驱动版本使用的是6.4.8。

另外,表中的MobileNetv1/MobileNetv2/MPPalmDet模型耗时特别长,这是因为OpenCV Zoo提供的是perchannel的量化模型,而芯片的NPU对perchannel量化模型目前还不完善。

OpenCV是图像处理的必用工具,使用OpenCV做AI推理使在同一套框架下完成图像处理和AI推理整套流程成为可能,大大地简化了系统设计

版权声明:本文为奥比中光3D视觉开发者社区授权转载发布,仅做学术分享,版权归原作者所有,若涉及侵权内容请联系删文

3D视觉开发者社区是由奥比中光给所有开发者打造的分享与交流平台,旨在将3D视觉技术开放给开发者。平台为开发者提供3D视觉领域免费课程、奥比中光独家资源与专业技术支持。

点击加入3D视觉开发者社区,和开发者们一起讨论分享吧~
也可以移步微信关注官方公众号 3D视觉开发者社区 ,获取更多干货知识哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值