米尔入门级i.MX6UL开发板的神经网络框架ncnn移植与测试

发布者:EE小广播最新更新时间:2023-02-17 来源: EEWORLD关键字:米尔  i  MX6UL  开发板  嵌入式  神经网络 手机看文章 扫描二维码
随时随地手机看文章

米尔入门级i.MX6UL开发板的神经网络框架ncnn移植与测试


嵌入式Linux入门级板卡的神经网络框架ncnn移植与测试-米尔i.MX6UL开发板



米尔 MYD-Y6ULX-V2 开发板,基于 NXP i.MX6UL/i.MX6ULL处理器,该开发板被米尔称之为经典王牌产品。本次测试目标是在此开发板上进行神经网络框架ncnn的移植与测试开发,测试ncnn在此开发板上的性能与应用测试。 


image.png


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与同类框架对比 


image.png


03.在i.MX 6ull上移植编译ncnn


工程地址:


    githubhttps://github.com/Tencent/ncnn 从工程的readme文件看,该工程已经支持很多嵌入式CPU的架构,其中就有arm 32位版本。


image.png


 既然支持arm32位,那么ixm6ull处理器也应该支持,即着手编译米尔i.MX6UL/i.MX6UL开发板上的版本。

  1. 从github 上拉取ncnn源码在主机上执行命令:Sudo git clone https://github.com/Tencent/ncnn.git 可见是一个 cmake工程,那么尝试cmake 编译。


image.png


  1. 初次使用camke编译先进入ixml6ull的SDK下,切换到交叉编译环境,然后创建 build 目录,进入build目录下,执行cmake命令cmake ../从输出信息上看 cmake失败,查看cmake 日志,发现错误原因是cmake在生成开发板的makefile文件时,需要指定使用的编译工具链。

  2. 添加imx6ull开发板的编译配置根据脚本的过程,在toolchains目录下,有很多其它开发板的编译配置文件,参照其它开发板的配置文件,添加一个i.MX6UL开发板的配置文件。文件名: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 flagsset(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags")

 

image.png


4.再使用cmake生成编译文件添加完i.MX6UL/i.MX6ULL开发板的编译工具链后,就可以使用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库和测试样例程序了。


image.png


直接执行make –j4就开始愉快地编译了。 

image.png

image.png


 编译libncnn库文件成功,会继续自动编译 examples 下的例子文件。 

image.png

大约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 下,可以看到所有例程也编译出来了。 


image.png



04.板上运行测试ncnn


编译完成把可执行文件与模型文件复制到i.MX6UL/i.MX6ULL开发板里进行测试。


把 build/benchmark 下的benchmark 复制到开发板/home/root/ncnn 目录下,同时把工程根目录下的benchmark 目录下所有文件也复制到i.MX6UL/i.MX6ULL开发板 /home/root/ncnn目录下,


image.png


 然后就可以执行 benchmark 执行文件来测试i.MX6UL/i.MX6ULL开发板的人工神经网络的计算能力。


先把开发环境下目标文件系统arm目录下/usr/lib下的libgomp.so.1文件复制到开发板的/usr/lib下,这个文件是并行计算库,ncnn编译时用到了这个库,这个库在多核处理器上能够支持执行并行计算。然后再在i.MX6UL/i.MX6ULL开发板执行benchmark,执行输出结果如下图:

 

image.png


可见大部分的模型能够跑通了,有部分模型运行出现异常。


从抛出的分值可以评估该开发板的神经网络推理计算能力了。


这个分值是一个模型推理一次的耗时,所以数值越小意味着算力越强。考虑到这个开发板是一个arm v7入门级的开发板,这样的性能已经超乎预料了。


05.测试基于ncnn的应用


这里在i.MX6UL/i.MX6ULL开发板上测试ncnn的应用例子,这里就用ncnn下的例程来做测试,在上面编译完example后,在build目录下会产生example的目标板的可执行文件。编译出来的例子程序如下,把他们全部传到开发板上。


image.png


 需要注意的是,除了ncnn的应用执行文件,在这些例子执行的时候,还需要模型和测试的资源文件,而这些文件体积都比较大,因此不能传送到开发板的系统目录上,需要单独存在扩展的存储空间上。


经过观察板上的文件系统,发现有3.1G的空间没有使用,此时可以使用fdisk 来格式化该空间,格式化成 ext4 格式,重启板子后,就可以看到这部分空间了,然后把ncnn的所有测试执行文件和资源文件传到该目录下,这样就够用了。


image.png


 在板上执行各个测试例子,会提示缺少相关模型文件和参数文件,这些模型和参数文件在这个github上面,下载相应的文件到当前目录下就可以。


https://github.com/nihui/ncnn-assets/tree/master/models


image.png


 1. 测试图片分类器


准备被测试图片,test,jpg ,传到上ncnn当前目录下

 

image.png


并且下载好 squeezenet_v1.1.param和 squeezenet_v1.1.bin 文件到 ncnn当前目录下,然后执行一下命令:


./squeezenet./test.jpg


很快就输出识别结果,输出结果如下图


image.png


 输出结果前面的编号和分类号,具体可以参考:


mageNet20121000分类名称和编号


https://zhuanlan.zhihu.com/p/315368462


但不知本测试模型所用分类的版本是否和这个一致。


2  测试图片内容多目标识别


测试图片内容识别,先用上面的图,再使用 squeezenetssd 来执行。执行前先下载 squeezenet_ssd_voc.bin和 squeezenet_ssd_voc.param 到板上ncnn当前目录下,然后执行:

./squeezenetssd./test.jpg

大约3秒左右输出结果如图:

 输出的分类编号,可见代码的定义:


image.png


 同时输出了识别结果图:

 

image.png


再测试另外一张图;

 

image.png


执行结果如下:


image.png


 输出识别结果图:


image.png


 上面的识别,因为输出的第二个目标被第三个目标遮盖,第二个识别为“Dog”,所以识别准确度还是比较高的。


再测试了一张图:



输出:


image.png

image.png

  

识别效果也比较理想。


06.ncnn移植测试总结

经过在米尔i.MX6UL/i.MX6ULL开发板上,进行这次的ncnn移植测试,总体非常顺利,在移植中只需要针对开发板的编译器,修改添加相应的编译脚本即可顺利的编译ncnn库和所有例程。并不需要对代码做任何改动或者调整,因此过程很快,短暂的时间就可以完成ncnn这样一个神经网络框架在本开发板上运行起来。

对ncnn的benchmark的性能测试来看,因为本开发板仅为arm v7单核处理器,处于入门级的一款开发板,能跑出这样的成绩已经出乎意料。

 在对实际图像分类和图像内容识别测试中,其中图像分类仅百十毫秒就出结果,对多目标识别单张图在2秒左右,这对一些静态的环境下已经能够达到业务使用的需求了,再综合其硬件性能,可见效能比是非常高的。同时工程里还带有一些各种其它框架模型转化ncnn的工具,方便将其它模型转化到ncnn上来使用,非常方便。

 同时也测试出ncnn的良好的可移植性和对不同嵌入式硬件的支持较好,其它任何一个神经网络框架恐怕无法在这样一个系统上运行,因此也为这样一个有效的国产开源神经网络项目点赞。


米尔电子,专注嵌入式处理器模块设计和研发,是领先的嵌入式处理器模组厂商。米尔电子在嵌入式领域具有20年的行业技术经验,为客户提供专业的ARM工业控制板、ARM开发板、ARM核心板、ARM开发工具、充电桩计费控制单元及充电控制板等产品和技术服务。此外,米尔电子还可通过涵盖众多ARM处理器及操作系统的专业技术提供定制设计解决方案,通过专业且高效率服务帮助客户加速产品上市进程。更多了解:http://www.myir-tech.com/news/news.asp


关键字:米尔  i  MX6UL  开发板  嵌入式  神经网络 引用地址:米尔入门级i.MX6UL开发板的神经网络框架ncnn移植与测试

上一篇:恩智浦新款i.MX 95应用处理器将采用自家NPU IP
下一篇:ISSCC上公布了两款有意思的处理器——基因和3D渲染处理器

推荐阅读最新更新时间:2024-11-11 10:37

关于MSP硬件I2C讲解
0.前言 对于大多数单片机来说,I2C成了一个老大难问题。从51时代开始,软件模拟I2C成了主流,甚至到ARMCortex M3大行其道的今天,软件模拟I2C依然是使用最广的方法。虽然软件模拟可以解决所有的问题,但是总感觉没有充分发挥MCU内部的硬件资源。查阅了所有关于MSP430F5系列的图书,没有关于硬件I2C的应用代码,自己通过调试摸索,把经验总结之后和大家分享,希望大家喜欢。同时,I2C的使用可以分为等待法和中断法,从理解的角度来说等待法思路清晰易于上手,从功耗的角度出发,中断法可以灵活的进入低功耗模式,但是不易理解。本文先从等待法入手。 MSP430F5系列的硬件I2C使用大致会有以下问题: 【I2C地址设定】一般
[单片机]
关于MSP硬件<font color='red'>I</font>2C讲解
STM8L051F3 硬件I2C从机实例--新手导航
这是我写的第一篇有关于技术的文章,可能写的不是很好,仅供参考。 先介绍一下背景,我是第一次接触STM的芯片,以前接触过都是基于51的芯片,算是有一点基础吧。因为公司的项目需要用到STM8L051F3的硬件I2C作为从机送数据,把自己从接触到调通遇到的问题记录一下,有需要的可以参考一下。 这篇文章是以相对新手的水平去写给新手参考的,所以我会尽量写的详细点。 1.首先我们需要查看数据手册,看下硬件I2C的接口是哪个端口,我用的是STM8L051F3这一块芯片。 这款芯片的I2C应该是不能复用别的端口的,反正手册我没查到,只能用C0跟C1。 2.接下来开始初始化I2C需要的设置。(这里我只讲7位地址的。) void
[单片机]
STM8L051F3 硬件<font color='red'>I</font>2C从机实例--新手导航
5G+AIoT智慧时代 嵌入式伙伴会议于上海隆重召开
全球嵌入式平台领导厂商研华科技近日在上海成功举办了“2019研华嵌入式平台服务创新与突破合作伙伴会议”,本次会议以“嵌入式单板平台创新”、“嵌入式软硬件整合服务”、“5G及AI发展趋势和技术”为主轴吸引了超过百余名嵌入式开发工程师与物联网行业关注者参会。会议同时还邀请到Intel公司、联通公司、Canonical 、遨博智能等产业伙伴出席会议,与现场嘉宾共同探讨嵌入式创新平台以及5G、AI、无线等工业物联网最新技术与趋势。 近几年,随着工业物联网的发展对嵌入式产品开发和设计也提出了更多的需求和挑战。会上,研华IoT嵌入式平台事业群产品总监区晓风也提到面对工业物联网的复杂需求和挑战,只有与产业伙伴共创物联网生态
[物联网]
5G+AIoT智慧时代 <font color='red'>嵌入式</font>伙伴会议于上海隆重召开
嵌入式学习笔记之点亮一个LED
1. 硬件关系 硬件连接 相关引脚定义 2.汇编知识 基本汇编指令: LDR r0, 假设r1的值为x,则将x的地址存入r0 str r0, 假设r1的值为x,则将r0写入到x地址上 B 跳转 mov r0,r1 把r1赋值给r0,也就是r0=r1 ldr r0,=0x12345678 伪指令,在编译工具编译下会被拆分为arm指令。相当于r0=0x12345678 而mov指令赋值只能是简单值,而ldr伪指令可以任意值 汇编基本格式 .text .global _start _start: #你的代码 编写程序 .text .global _start _sta
[单片机]
英特尔首个神经网络处理器揭开面纱
  要了解计算机神经系统科学家Naveen Rao,只要看看他的手就行了。下面就随网络通信小编一起来了解一下相关内容吧。   这位42岁的Dr.在滑雪、滑板、骑自行车、轮滑溜冰、驾驶赛车、摔跤和打篮球的生涯中,弄伤了全部的十个手指。   他是一个冒险者,不断挑战身体和精神上的极限。在科学研究方面,他试图通过创造受到人脑结构和行为启发的芯片和软件,加速计算机行业进入人工智能的新时代。   让Rao有别于其他正在尝试同样事情的人的是这样一个事实, 英特尔 去年以4亿美元的价格收购了他在圣地亚哥创办的公司:Nervana。   这是一个认证标志。 英特尔 是电脑芯片行业的巨头,每年的销售额约600亿美元。但同时,它也是一个年迈的巨人,
[网络通信]
以ARM9芯片和S3C2440嵌入式系统为核心的以太网接口电路设计
1.引言 随着微电子技术和计算机技术的发展,嵌入式技术得到广阔的发展,已成为现代工业控制、通信类和消费类产品发展的方向。以太网在实时操作、可靠传输、标准统一等方面的卓越性能及其便于安装、维护简单、不受通信距离限制等优点,已经被国内外很多监控、控制领域的研究人员广泛关注,并在实际应用中展露出显着的优势。本文提出了一种基于DM9000AE网络接口芯片和32位三星ARM9处理器S3C2440嵌入式系统的以太网接口的设计方案,并在Windows CE操作系统上开发移植了网络驱动程序实现网络的接入。 2. DM9000AE工作原理 2.1 DM9000的主要特性和总体结构 DM9000AE是DEVICOM(台湾联杰国际)研发的一款10/
[单片机]
以ARM9芯片和S3C2440<font color='red'>嵌入式</font>系统为核心的以太网接口电路设计
瑞萨I3C总线扩展和SPD集线器产品通过基板管理控制器认证
全球半导体解决方案供应商瑞萨电子集团宣布瑞萨I3C IMX3102 2:1总线多路复用器、IMX3112 1:2总线扩展器和DDR5 SPD Hub SPD5118已通过ASPEED Technology认证,可适配其面向数据中心及嵌入式平台和应用的前沿产品AST2600基板管理控制器(BMC)。瑞萨电子作为ASPEED AST2600 BMC批准供应商清单(AVL)中的首个I3C合作伙伴,为客户提供了一条轻松的迁移路径,使他们的DDR5平台和板卡可从I2C或其它传统的总线接口升级为全新高速I3C规格。 瑞萨I3C驱动器和扩展器产品包含众多功能,与现有解决方案相比,客户可以更高效、更低成本地开发其应用。这些功能包括基于I
[嵌入式]
瑞萨<font color='red'>I</font>3C总线扩展和SPD集线器产品通过基板管理控制器认证
国产嵌入式操作系统下触摸屏的实现
国产龙芯1A手持式计算机和ReWorks嵌入式操作系统,通过移植触摸中间件tslib为上层应用提供了统一的接口,实现了触摸屏的校准和测试。    1 、综述   龙芯系列处理器是中国自主研发的通用CPU,其中龙芯1系列处理器面向工业控制、消费电子(手机/MP4/掌上电脑等)等嵌入式应用。龙芯1A芯片片内集成了32位处理器核、2D GPU、VGA和LCD显示接口、以及南桥芯片组功能,可满足超低价位云终端、工业控制/数据采集、网络设备、消费类电子等领域需求。   ReWorks嵌入式操作系统是中国电子科技集团某所基于“九五”、“十五”的技术成果自行研制、拥有全部源代码的嵌入式实时操作系统,适用于多种目标硬件环境(x86、mips
[模拟电子]
国产<font color='red'>嵌入式</font>操作系统下触摸屏的实现
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved