ARM NEON技术在车位识别算法中的应用

摘要:为了在车位检测系统中不使用dsp的情况下,达到实时处理和节约成本的目的,在嵌入式linux系统中使用了cortex-a系列的neon协处理器技术来优化一种车位图像检测算法的代码。在cortex-a8平台上使用该图像处理算法进行了大量的处理测试,图像算法处理速度得到很大提升。最后在多个平台下使用该图像处理算法进行测试对比,使用了neon技术后其算法处理速度提升明显,能够满足实时要求。
0 引言
随着城市越来越多家庭拥有汽车,相应的停车场建设数目也越来越多,停车场管理系统也越来越重要。
而国内城市车多人多,空间拥挤给停车厂管理带来诸多不便。车位检测系统设计成嵌入式终端是一个好的选择。图像检测算法的复杂度给实时检测带来难题,一般的图像处理都是基于dsp完成,这带来了成本的上升。
arm 公司cortex-a 系列处理器的出现,极大地缓解了这个难题。
arm 平台能够很好地支持linux 系统,linux 系统具有强大的网络通讯功能,也给程序移植等带来便利。本文的检测算法在arm平台基于neon技术进行了优化,在保证检测精度的同时,处理速度提升明显,与使用dsp相比,大大节约了成本,为停车场管理系统的研究提供新的方向。
1 arm neon技术介绍
arm 的neon 通用simd 引擎可有效处理当前和将来的多媒体格式,从而改善用户体验。neon 技术是通过清晰方式构建的,并可无缝用于其本身的独立流水线和寄存器文件。neon 技术是arm cortex-a系列处理器的128 位simd(单指令多数据)体系结构扩展,旨在为多媒体应用提供更加强大的加速功能,从而明显改善程序性能。它具有32 个寄存器,64 位宽(是16 个寄存器,128 位宽的双倍视图)neon 指令特点如下:
(1)寄存器被视为同一数据类型的元素的矢量;
(2)数据类型可为:有符号/无符号的8 位、16 位、32 位、64 位单精度浮点;
(3)指令在所有通道中执行同一操作。
neon 寄存器可在多个通道内进行并行运算,如图1所示。
neon 的指令都是以v 字母开头的,例如:vadd.i16q0,q1,q2,这就是一个neon 的指令了,很明显的特点就是v 开头,i 主要用来表明是一个整型(int),16 表示一个16 位的型,q0,q1,q2 都是128 位的寄存器(q 打头的寄存器都是128 位的)。这个指令就是让q1,q2 中装载8 个16位的数据,然后执行加法操作,最后放到q0中去。这么一个指令就完成了8次加法运算,这也就是性能的提升,对于其他运算也是如此。
2 系统设计和算法介绍
本系统基于cortex-a8平台实现,车位检测系统架构如图2所示。
采集通过模拟摄像头,由tvp5150解码后输出8位y∶cb∶cr=4∶2∶2的数据传送的a8平台,tvp5150驱动基于video for linux2(v4l2)开发,因此视频采集程序调用v4l2相关api函数即可完成。然后调用相关图像处理程序,提取多个图像特征,与背景图像对比,进行有车无车检测,然后tcp/ip网络 将图像和有车位车情况发送到上位机。
车位检测算法流程如图3所示。
本系统目前在一处地下停车场进行测试验证,如图4在停车中采集到的背景和待测图像,通过对100幅采集到800×600 分辨率的现场图像,在cortex-a8 平台上进行测试,平均检测时间为538 ms,该算法在地下停车场中准确率97%.表1 中给出了处理一幅待测图像cortex-a8 和arm11 平台优化前平均时间的测试对比结果(均使用gcc交叉编译)。
3 图像处理算法在cortex-a8 平台上的优化
本系统是cortex-a8和linux系统上搭建,linux下使用的编译器为gcc.本文中使用普通c 语言优化和neon编程优化对图像相关函数进行了优化,并进行了测试对比,下面给出方差函数variance代码进行优化前后的对比说明,如图5优化前的代码。
3.1 c语言级别优化
对于一般c语言级别的优化,对于图像这类矩阵数据而言,主要针对循环优化。以第一个循环为例,如图6对于c语言级别循环优化后的代码如图6所示。
由优化后的结果可见,通过对循环展开,有效的减少了循环跳转次数,跳转为原来的1 4 。但是也可以发现,加法运算次数,几乎和原来相同并没有减少。对于其他for循环和其他函数进行优化后,测试时间对比如表2所示。
由表中数据可见,使用普通c 语言界别优化,并没有明显提升,原因是在linux系统上使用gcc编译器进行编译的,在选择-o2 级别优化的时候,已经对循环进行了优化,所以运行速度没有明显提升。
3.2 使用neon技术的优化
gcc 编译器从4.3 版本开始,很好地提供了对arm neon 技术的支持。例如gcc 中的函数:
uint32x2_t vadd_u32(uint32x2_t,uint32x2_t),对应汇语言:vadd.i32 d0,d0,d0.uint32x2_t代表这个数据类型是2 个32 位无符号整型。在使用gcc 编译器中的neon 技术时,需要包含头文件《arm_neon.h》.neon增强指令集是在cortex-a系列发布后才具有的功能,因此arm11 无法使用neon 技术。对方差函数variance第一个for循环优化后的代码对比如图7所示。
由优化后程序代码可见,循环跳转次数为原来的1 4 ,但是由于使用了neon 相关的vld1q_u32 函数,一次可在neon的128位寄存器中装入4个32位数值,调用vaddq_u32可对4个数据时同时进行加法运算,在一个指令周期就完成了4次加法运算,理论上加法运算次数为原来的1 4 ,大大提高了运算性能。
对于第二个for循环也可以采用类似方法优化,只是调用的函数略有不同,具体考参考gcc的技术文档,有详细的使用说明。
其他函数如预处理、角点、相关度函数的优化和此方法类似,重点针对循环和可以并行运算的代码进行优化。
表3 中给出了cortex-a8 平台使用neon 技术优化后与arm11测试时间的对比。
4 结语
通过使用arm neon 技术,对于图像处理这类矩阵运算进行并行优化,可大大提高处理速度,进行优化后,速度较优化前提升了达2倍之多,较arm11提升了8 倍的速度。arm cotex-a 系列所使用的neon 技术,不仅使车位图像检测算法的速度有很大提升,在信号处理等多媒体处理算法中,也有广阔的应用前景。

Photonic Sensors(IF 4.4)入选JCR一区
2018年芯片产业持续高增长“有危必有机,国产芯片股现涨停潮!
苏宁小店Biu将进入复制扩张期
模式C在开关闭合及断开时的等效电路和波形图
小米平板3最新消息:小米6发布会时间确定,和小米平板3同时发布!
ARM NEON技术在车位识别算法中的应用
单片机时钟电路原理
3D晶体管技术革新现代电子产业
芯海科技CSA37F62喜获2023芯向亦庄“汽车芯片50强”
AI领域关键技术是靠机器视觉掀起的智造变革吗?
GeForce RTX和AMD RDNA 2架构均支持DX12_2 将为大量光追效果带来性能和效率的双提升
开关电源的分类/工作方式/基本原理
全球锂电铜箔头部企业德福科技发布三季度业绩公告
退补之后的电动车续航里程还剩多少
NB-IoT为何能备受万众青睐?
TTP68系列触摸IC,欢迎咨询来电:王先生 134 2398 4687
5G手机的最佳入手时间是什么时候
oppor11最新消息:oppor11发布会声势浩大?和浙江卫视一起办晚会?
常见机器学习算法名单
单片机编程总结