嵌入式Linux入门级板卡的神经网络框架ncnn移植与测试-米尔i.MX6UL开发板
![](/public/static/modules/cms/images/rd1.png)
2023-02-17
![](/public/static/modules/cms/images/rd2.png)
967
![](/public/static/modules/cms/images/rd3.png)
来源:米尔电子
本篇测评由电子发烧友的优秀测评者“ALSET”提供。
电子发烧友网发布了一款试用产品:米尔 MYD-Y6ULX-V2 开发板,基于 NXP i.MX6UL/i.MX6UL L处理器,该开发板被米尔称之为经典王牌产品。本次测试目标是在此开发板上进行神经网络框架ncnn的移植与测试开发,测试ncnn在此开发板上的性能与应用测试。
01.
什么是ncnn
ncnn 是腾讯优图推出的在手机端极致优化的高性能神经网络前向计算框架。也能够在移动设备上的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑移动端的部署和使用。无第三方依赖,跨平台,其中手机端 cpu的速度快于目前所有已知的开源框架。
基于ncnn,能够将深度学习算法轻松移植到手机端和移动设备上高效执行,开发人工智能应用。以腾讯内部应用为例,ncnn目前已在QQ,Qzone,微信,天天P图等上得到应用。
ncnn支持大部分常用的CNN 网络:
Classical CNN: VGG AlexNetGoogleNet Inception …
Practical CNN: ResNetDenseNet SENet FPN …
Light-weight CNN:SqueezeNet MobileNetV1/V2/V3 ShuffleNetV1/V2 MNasNet …
Detection: MTCNNfacedetection …
Detection: VGG-SSDMobileNet-SSD SqueezeNet-SSD MobileNetV2-SSDLite …
Detection: Faster-RCNNR-FCN …
Detection: YOLOV2 YOLOV3MobileNet-YOLOV3 …
Segmentation: FCN PSPNetUNet …
腾讯优图实验室是主要研究计算机视觉技术,ncnn的许多应用方向也都在图像方面,如人像自动美颜,照片风格化,超分辨率,物体识别。
腾讯优图ncnn提供的资料显示:对比目前已知的同类框架,ncnn是cpu框架中最快的,安装包体积最小,跨平台兼容性中也是最好的。以苹果主推的CoreML为例,CoreML是苹果主推的 iOS gpu计算框架,速度非常快,但仅支持 iOS11以上的 iphone手机受众太狭窄。非开源也导致开发者无法自主扩展功能。
02.
ncnn功能简介
ncnn支持卷积神经网络,支持多输入和多分支结构,可计算部分分支无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架纯 C++ 实现,跨平台,支持 android ios 等ARM NEON 汇编级良心优化,计算速度极快精细的内存管理和数据结构设计,内存占用极低支持多核并行计算加速,ARM big.LITTLE cpu 调度优化。
支持基于全新低消耗的 vulkan api GPU 加速整体库体积小于 700K,并可轻松精简到小于 300K可扩展的模型设计,支持 8bit 量化和半精度浮点存储,可导入 caffe/pytorch/mxnet/onnx 模型支持直接内存零拷贝引用加载网络模型可注册自定义层实现并扩展。
ncnn与同类框架对比
03.
在i.MX 6ull上移植编译ncnn
工程地址:
githubhttps://github.com/Tencent/ncnn 从工程的readme文件看,该工程已经支持很多嵌入式CPU的架构,其中就有arm 32位版本。
既然支持arm32位,那么ixm6ull处理器也应该支持,即着手编译MYD-Y6ULX-V2开发板上的版本。
1.从github 上拉取ncnn源码
在主机上执行命令:
Sudo git clone https://github.com/Tencent/ncnn.git
可见是一个 cmake工程,那么尝试cmake 编译。
2.初次使用camke编译
先进入ixml6ull的SDK下,切换到交叉编译环境,然后创建 build 目录,进入build目录下,执行cmake命令
cmake ../
从输出信息上看 cmake失败,查看cmake 日志,发现错误原因是cmake在生成开发板的makefile文件时,需要指定使用的编译工具链。
3.添加imx6ull开发板的编译配置
根据脚本的过程,在toolchains目录下,有很多其它开发板的编译配置文件,参照其它开发板的配置文件,添加一个该开发板的配置文件。
文件名:arm-poky-linux-gnueabi.cmake
内容如下:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER "arm-poky-linux-gnueabi-gcc")
set(CMAKE_CXX_COMPILER "arm-poky-linux-gnueabi-g++")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_C_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon --sysroot=/home/lutherluo/workspace/fsl-imx-fb/5.10-gatesgarth/sysroots/cortexa7t2hf-neon-poky-linux-gnueabi")
set(CMAKE_CXX_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon --sysroot=/home/lutherluo/workspace/fsl-imx-fb/5.10-gatesgarth/sysroots/cortexa7t2hf-neon-poky-linux-gnueabi")
# cache flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags")
4.再使用cmake生成编译文件
添加完该开发板的编译工具链后,就可以使用cmake来生成编译所需的makefile文件了。在cmake时,可以指定除了编译ncnn库外,还可以编译ncnn例子程序。命令如下:
cmake-DCMAKE_BUILD_TYPE=Release -DNCNN_SIMPLEOCV=ON-DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-poky-linux-gnueabi.cmake-DNCNN_BUILD_EXAMPLES=ON ..
查看目录下,已经顺利地生成了 Makefile文件。
5.使用make编译文件
然后可以正式编译ncnn库和测试样例程序了。
直接执行
make –j4
就开始愉快地编译了。
编译libncnn库文件成功,会继续自动编译 examples 下的例子文件。
大约10多分钟,顺利地全部编译完成。
在编译测试用例时,会出现库格式错误的提示,此时需要设置一下交叉编译环境下的库归档工具,系统默认使用的是arm-poky-linux-gnueabi-ar 工具,这个工具产生的 .a文件有问题,经过测试使用 arm-poky-linux-gnueabi-gcc-ar 即可。
只需要在执行切换交叉环境脚本后,再单独执行一下以下命令即可修改该问题:
export ar=arm-poky-linux-gnueabi-gcc-ar
再进行编译即可。
6.查看编译结果
编译完成后,在build目录下,可以看到 benchmark 目录,该目录下就是ncnn的基准测试工具,可以看到目标板执行文件已经编译出来。
再进入到 build/example 下,可以看到所有例程也编译出来了。
04.
板上运行测试ncnn
编译完成把可执行文件与模型文件复制到开发板里进行测试。
把 build/benchmark 下的benchmark 复制到开发板/home/root/ncnn 目录下,同时把工程根目录下的benchmark 目录下所有文件也复制到开发板 /home/root/ncnn目录下,
然后就可以执行 benchmark 执行文件来测试开发板的人工神经网络的计算能力。
先把开发环境下目标文件系统arm目录下/usr/lib下的libgomp.so.1文件复制到开发板的/usr/lib下,这个文件是并行计算库,ncnn编译时用到了这个库,这个库在多核处理器上能够支持执行并行计算。然后再在本开发板执行benchmark,执行输出结果如下图:
可见大部分的模型能够跑通了,有部分模型运行出现异常。
从抛出的分值可以评估该开发板的神经网络推理计算能力了。
这个分值是一个模型推理一次的耗时,所以数值越小意味着算力越强。考虑到这个开发板是一个arm v7入门级的开发板,这样的性能已经超乎预料了。
05.
测试基于ncnn的应用
这里在MYD-Y6ULX-V2开发板上测试ncnn的应用例子,这里就用ncnn下的例程来做测试,在上面编译完example后,在build目录下会产生example的目标板的可执行文件。编译出来的例子程序如下,把他们全部传到开发板上。
需要注意的是,除了ncnn的应用执行文件,在这些例子执行的时候,还需要模型和测试的资源文件,而这些文件体积都比较大,因此不能传送到开发板的系统目录上,需要单独存在扩展的存储空间上。
经过观察板上的文件系统,发现有3.1G的空间没有使用,此时可以使用fdisk 来格式化该空间,格式化成 ext4 格式,重启板子后,就可以看到这部分空间了,然后把ncnn的所有测试执行文件和资源文件传到该目录下,这样就够用了。
在板上执行各个测试例子,会提示缺少相关模型文件和参数文件,这些模型和参数文件在这个github上面,下载相应的文件到当前目录下就可以。
https://github.com/nihui/ncnn-assets/tree/master/models
1. 测试图片分类器
准备被测试图片,test,jpg ,传到上ncnn当前目录下
并且下载好 squeezenet_v1.1.param和 squeezenet_v1.1.bin 文件到 ncnn当前目录下,然后执行一下命令:
./squeezenet./test.jpg
很快就输出识别结果,输出结果如下图
输出结果前面的编号和分类号,具体可以参考:
mageNet20121000分类名称和编号
https://zhuanlan.zhihu.com/p/315368462
但不知本测试模型所用分类的版本是否和这个一致。
2 测试图片内容多目标识别
测试图片内容识别,先用上面的图,再使用 squeezenetssd 来执行。执行前先下载 squeezenet_ssd_voc.bin和 squeezenet_ssd_voc.param 到板上ncnn当前目录下,然后执行:
./squeezenetssd./test.jpg
大约3秒左右输出结果如图:
输出的分类编号,可见代码的定义:
同时输出了识别结果图:
再测试另外一张图:
执行结果如下:
输出识别结果图:
上面的识别,因为输出的第二个目标被第三个目标遮盖,第二个识别为“Dog”,所以识别准确度还是比较高的。
再测试了一张图:
输出:
识别效果也比较理想。
06.
ncnn移植测试总结
经过在MYD-Y6ULX-V2开发板上,进行这次的ncnn移植测试,总体非常顺利,在移植中只需要针对开发板的编译器,修改添加相应的编译脚本即可顺利的编译ncnn库和所有例程。并不需要对代码做任何改动或者调整,因此过程很快,短暂的时间就可以完成ncnn这样一个神经网络框架在本开发板上运行起来。
对ncnn的benchmark的性能测试来看,因为本开发板仅为arm v7单核处理器,处于入门级的一款开发板,能跑出这样的成绩已经出乎意料。
在对实际图像分类和图像内容识别测试中,其中图像分类仅百十毫秒就出结果,对多目标识别单张图在2秒左右,这对一些静态的环境下已经能够达到业务使用的需求了,再综合其硬件性能,可见效能比是非常高的。同时工程里还带有一些各种其它框架模型转化ncnn的工具,方便将其它模型转化到ncnn上来使用,非常方便。
同时也测试出ncnn的良好的可移植性和对不同嵌入式硬件的支持较好,其它任何一个神经网络框架恐怕无法在这样一个系统上运行,因此也为这样一个有效的国产开源神经网络项目点赞。
2023-02-17
嵌入式Linux入门级板卡的神经网络框架ncnn移植与测试-米尔i.MX6UL开发板
本篇测评由电子发烧友的优秀测评者“ALSET”提供。电子发烧友网发布了一款试用产品:米尔 MYD-Y6ULX-V2 开发板,基于 NXP i.MX6UL/i.MX6UL L处理器,该开发板被米尔称之为经典王牌产品。本次测试目标是在此开发板上进行神经网络框架ncnn的移植与测试开发,测试ncnn在此开发板上的性能与应用测试。01.什么是ncnnncnn 是腾讯优图推出的在手机端极致优化的高性能神经网
2022-11-24
FPGA+MPU+MCU三芯合一!米尔全自动血细胞分析仪解决方案
全自动血细胞分析仪是医院临床检验应用非常广泛的仪器之一,用来检测红细胞、血红蛋白、白细胞、血小板等项目。是基于电子技术和自动化技术的全自动智能设备,功能齐全,操作简单,依托相关计算机系统在数据处理和数据分析等方面具有出色表现,可同时进行多个参数的可靠分析,通过联网互通和交互式触摸屏可以实现线上信息共享等功能,被广泛应用在医院临床检验中
2022-10-18
基于Zynq-7000高速数据采集解决方案—米尔MYD-C7Z010/20-V2开发板
近年来,科技日新月异,随着机器视觉、人工智能的迅速发展,相关行业对数据采集系统的性能要求更加苛刻,要求能够同时采样的通道更多,采样的精度和速度要求更高。在雷达,航天,视频传输,工业控制等领域,采样率、分辨率、传输速率成为评价超高速数据采集系统的最重要技术指标,所以芯片的选择就变得尤为重要,既需要具备高精度、高采样速率等模块,又需要可以嵌入操作便捷、用户体验更友好的操作系统,实现良好的人机交互功能。
2022-08-26
开发环境篇:Linux C按键控制LED--米尔MYD-YT507H开发板
本篇测评由电子工程世界的优秀测评者“qinyunti”提供。此次板卡的测试,是Linux C开发环境下按键控制LED的操作实录。前言对于核心板或者开发板的选型我们一样会考虑二次开发的便捷性,开发环境,手册等的易用性和完整性。下面我们就从开发者的角度体验,从Linux C开发,Qt开发,python开发等常见开发入手进行体验。现在开始第一部分Linux C开发环境的简单体验。准备串口登录丝印Debu
2022-08-22
第一视角体验国产处理器全志T507-H开发板
现在车规级芯片市场潜力巨大,需求旺盛,芯片都在逐渐走向国产化。本期要介绍的主角是米尔基于全志T507-H的MYD-YT507H开发板,是米尔结合国产工业级平台CPU:全志T507-H芯片研制的CPU模组,集成了四核Cortex-A53的CPU和G31MP2的GPU,具有强大的图像处理功能,并拥有多路视频输入和输出的接口。
2022-08-05
米尔的国产T507-H开发板怎么玩?macOS如何将Ubuntu系统烧录到eMMC的完全调教指南!
本篇测评由电子发烧友的优秀测评者“HonestQiao”提供。此次板卡的测试,是用macOS将Ubuntu系统烧录到eMMC的操作实录。米尔MYD-YT507H开发板,官方提供了HMI系统和Ubuntu18.04镜像,体验过默认的HMI系统后,我就换上了我喜欢的Ubuntu系统了。一、系统烧录参考官方的文档,使用全志的图形界面烧录工具,在Windows下烧录简单又方便:因为我使用的是macOS系统
2022-07-15
如何实现异构处理器间相互通讯——米尔带您玩转i.MX 8M Plus开发板
本篇测评由电子工程世界的优秀测评者“bloong”提供。此次测试的项目,是异构处理器间相互通讯项目。MYD-JX8MPQ配备了一颗异构的Cortex-M7协处理器,可以同时运行Linux和RTOS。本文主要介绍协处理器M7使用方法。M7在运行时可能会涉及到和A53核共用资源,这里列举出会冲突资源如下:ECSPI0/ECSPI2,FLEXCAN,GPIO1/GPIO5,GPT1,I2C3,I2S3,
2022-05-18
基于QT+OpenCV的人脸识别-米尔iMX8M Plus开发板的项目应用
本篇测评由电子工程世界的优秀测评者“流行科技”提供。此次测试的开源项目,是基于QT+OpenCV的人脸识别打卡项目。本次体验使用的是开源的代码,此代码本来是运行在WIN下的,为了测试稍微进行了修改,让其运行在米尔iMX8M Plus开发板上。测试项目实际是分了两个工程,一个工程是作为管理员控制功能使用,添加人脸信息。同时也可以查询到打卡记录,对从机进行下发通知等等。人脸识别我们主要需要用到open
2021-10-26
米尔MYS-8MMX开发板试用体验测评——dql2016
米尔MYS-8MMX开发板试用体验测评四日前,米尔科技发布了关于MYS-8MMX开发板的测评公告,公告发布后,吸引了各大媒体平台的测评者争相报名,本期我们分享其中一名优秀测评者的测评报告,供各位参考。想要了解优秀测评者“dql2016”关于MYS-8MMX开发板测评原文的可以复制下方链接查看:https://bbs.elecfans.com/jishu_2159854_1_1.html【米尔MYS
2021-09-29
应用开发笔记 | 米尔MYD-YA15XC-T LoRa无线通讯实例
1.概述本文主要基于LoRa调制功能的无线串口模块的树莓派扩展板,讲述在M4核LoRa的调试过程。2.硬件资源ØTypec Debug线1根ØMicro usb线1根ØMYD-15XC-T开发板Ø树莓派接口SX1262 868M LoRa HAT模块2个3.软件资源ØLinux 5.4.31ØSTM32CubeIDE 1.5.0ØLInux虚拟机Ø米尔提供的SDK4.环境准备预先安装好CubeID