作者:吴佳、高晋伟
NPU,即神经处理单元,是一种专门的处理器,旨在加速常见的机器学习任务的性能,通常是神经网络应用程序。除了加速之外,NPU 还释放了 CPU,并且非常节能。
OpenCV 的动态神经网络 (DNN) 模块是一个轻量级且高效的深度学习推理引擎。它经过高度优化,可以在各种硬件上部署深度学习模型。自去年 6 月发布 4.6.0 版本以来,**OpenCV 现在支持在 NPU 上运行模型!** **Khadas VIM3**是第一个由 OpenCV 正式支持的开发板,它通过 DNN 模块在 NPU 上运行量化的深度学习模型。不仅如此,OpenCV DNN 还与使用 *A311D* 系统级芯片 (SoC) 的各种开发板配合使用,与 VIM3 上的芯片相同。
首先让我们看看 VIM3 NPU 如何加速推理(以下测试使用**OpenCV 模型动物园**中的基准,OpenCV 版本为 4.6.0-pre)。
深度学习模型 | Khadas VIM3 CPU(毫秒) | Khadas VIM3 NPU(毫秒) |
---|---|---|
YuNet | 5.42 | 4.04 |
SFace | 82.22 | 46.25 |
CRNN-EN | 181.89 | 125.30 |
CRNN-CN | 238.95 | 166.79 |
PP-ResNet | 543.69 | 75.45 |
PP-HumanSeg | 82.85 | 31.36 |
YoutuReID | 486.33 | 44.61 |
如上所述,只要开发板具有 A311D SoC,模型就可以在其他开发板的 NPU 上运行。这是另一个开发板的测试结果。
深度学习模型 | EAIS-750E CPU(毫秒) | EAIS-750E NPU(毫秒) |
---|---|---|
YuNet | 5.99 | 4.20 |
SFace | 85.70 | 52.00 |
CRNN-EN | 237.40 | 158.00 |
CRNN-CN | 310.50 | 210.00 |
PP-ResNet | 541.00 | 67.70 |
PP-HumanSeg | 92.20 | 36.20 |
YoutuReID | 502.70 | 45.50 |
从上表可以看出,NPU 可以将推理速度提高**10 倍以上**。真是个令人振奋的消息!更重要的是,使用 OpenCV DNN 启用 NPU 很容易。**唯一需要做的就是设置后端和目标设备。**
import cv2 as cv # some preprocessing # ... # load model net = cv.readNet(PATH_TO_MODEL) # settings net.setPreferableBackend(cv.dnn.DNN_BACKEND_TIMVX) # set backend net.setPreferableTarget(cv.dnn.DNN_TARGET_NPU) # set target device # infer output = net.forward() # the postprocessing # ...
不过,启用 OpenCV DNN NPU 后端需要做一些额外工作。 GitHub 上提供了相关说明。如果您使用的开发板不是 VIM3,但拥有相同的 A311D 芯片,您可以参考这篇文章以获取更多提示。
**Khadas**是一家位于深圳的单板计算机 (SBC) 制造商,面向开源社区和流媒体播放器行业。它是 OpenCV 开发合作伙伴之一。**VIM3** SBC 是一款功能强大的开发板,搭载了 12nm Amlogic A311D SoC,该 SoC 将 x4 Cortex A73 性能核心(2.2GHz)和 x2 Cortex A53 效率核心(1.8GHz)合并为六核配置,并配备了用于神经网络应用的板载 **5.0 万亿次操作每秒 (TOPS) NPU**。
为了结束这篇文章,让我们用 VIM3 做一些简单但很酷的事情:使用“视觉”控制机械臂,通过实时在 NPU 上运行深度学习人脸检测模型来跟踪其摄像头前的人脸。请查看下面的 GIF。