基于Qt与Arm NN的嵌入式喷码检测系统设计与实现
2020-04-09王斌宋树祥王宜瑜庞中秋
王斌 宋树祥 王宜瑜 庞中秋
摘 要:现存的喷码检测系统大多基于工控PC电脑实现,其在价格、体积、功耗、灵活性等方面存在着较大的局限性。为此,设计了一种基于Qt与Arm NN的嵌入式喷码检测系统,该系统的核心处理器采用Arm cortex-a9,搭载配置有相关软件工具的嵌入式linux操作系统,采用位置检测算法来实现软件检测待测目标的位置,通过由图像预处理、喷码区域提取、条形码识别、字符子串分割、基于卷积神经网络及caffe框架的喷码字符识别模型训练、利用Arm NN将识别模型引入到ARM端实现喷码字符识别、识别结果处理等过程组成的喷码检测算法来实现对喷码内容的检测。该系统还基于Qt多线程技术开发了具有完善系统功能的图形应用程序,便于现场生产人员使用。经相关测试表明该系统有效可行、正检率高,能够满足包装生产流水线喷码检测的实际需求。
关键词:嵌入式;区域提取;字符分割;卷积神经网络;Arm NN;字符识别
中图分类号:TP752 文献标识码:A
Design and Implementation of Embedded Printing Character
Inspection System Based on Qt and Arm NN
WANG Bin,SONG Shu-xiang?覮,WANG Yi-yu,PANG Zhou-qiu
(College of Electronic Engineering,Guangxi Normal University,Guilin,Guangxi 541004,China)
Abstract:Most of the existing printing character inspection systems are based on industrial PC,but they are limited in price,volume,power consumption and flexibility.To solve this problem,an embedded printing character inspection system based on Qt and Arm NN is designed. The core processor of the system is Arm cortex-a9,which is equipped with embedded Linux operating system with relevant software tools. The position detection algorithm is adopted to realize the location of the target to be tested.By image preprocessing,region extraction,bar code identification,character substring,based on convolutional neural network segmentation and caffe framework of character recognition model training,using Arm NN identification model is introduced into the Arm end realize the recognition of character recognition,the results of treatment process,such as printing inspection algorithm to implement to spurt the code content detection.The system also developed a graphic application program with perfect system function based on Qt multi-thread technology,which is convenient for field production personnel.Relevant tests show that the system is effective and feasible,with high positive inspection rate,and can meet the actual needs of the packaging production line for the printing character inspection.
Key words:embedded;area extraction;character segmentation;convolutional neural network;arm NN;character recognition
工業产品的包装上的喷码通常包含诸多重要信息包装在喷码机喷码完成之后,由于整个喷印过程中可能出现的机械故障、产线环境变化、运输过程磨损等因素,进而造成产品包装喷印质量的变化,导致包装信息喷印错误的产生。包装信息错误的产品将会对企业的生产成本效率、产品物流仓储、品牌形象等方面造成一系列不利影响。为了保证喷码的正确可读,生产过程中喷码检测的环节不可或缺。传统的由人工辨别喷码好坏并不适合应用在企业的大规模包装生产流水线上。而现有的喷码检测仪器主控平台多基于工控PC电脑,其与满足同等运算能力需求的嵌入式ARM工控板相比,存在价格,功耗较高、占用体积大、随生产线设备移动部署能力差等问题。
近年来,卷积神经网络在图像分类识别领域具有超越其他传统算法的出色表现[1],此外,而深度学习框架的出现避免了从头编写复杂神经网络以及通用代码的重复编写,使用框架提供的底层标准模块、组件进行开发能提高深度学习相关的工作效率。而Arm NN[2]是ARM官方免费推出的一套基于ARM处理器上运行的开源神经网络推理引擎及相关SDK,其作用是对框架下训练出的模型进行针对ARM架构的优化,并使之能在ARM处理器上高效运行,将其应用于ARM端喷码检测的字符识别环节。
依托某医疗器械公司的试剂纸箱包装生产流水线作为实际研发环境,设计了一种基于Qt与Arm NN的嵌入式喷码检测系统,系统能够自动识别纸箱喷码内容,检测出识别异常的纸箱。本系统以嵌入式ARM平台为硬件载体,结合Qt界面编程、多线程、图像处理、卷积神经网络等技术进行嵌入式软件开发,实现了对运转中的包装纸箱生产线上的包装喷码进行自动实时检测。
1 系统总体结构
系统硬件设计部分主要由图像采集单元、ARM工控板、触屏显示模块、报警装置组成。图像采集单元负责采集产线上运动纸箱的清晰喷码图像,ARM工控板为系统提供核心运算CPU及所需的相应的外围存储、通信等资源,触屏显示模块为系统人机交互的硬件载体,报警装置用于识别异常时发出警报信息。
系统软件设计部分主要由软件环境搭建和检测算法设计及应用程序设计三个部分组成。软件环境搭建包括嵌入式linux操作系统以及应用程序开发过程中所需相关工具移的移植与配置。检测算法设计包括纸箱位置检测算法设计及纸箱喷码检测算法设计,前者用于在生产状态下软件检测是否有纸箱经过相机镜头并采集相应的喷码图像,而后者用于检测具体的喷码内容。应用程序设计基于Qt多线程开发将图像采集、纸箱位置检测、喷码检测、 GUI人机交互等独立线程集成到系统中。实现了自动检测、单个检测、数据入库、可视化调试等系统功能。
2 系统硬件设计
本系统采用基于ARM cortex-A9内核的三星Exynos-4412处理器,运行主频 1.5GHz,能流畅运行嵌入式linux系统,CPU外围模块包括DDR3内存和eMMC闪存,microUSB 接口、串口、网口、SD卡、电源、触控屏、USB工业相机等。串口接报警装置,相机接图像辅助采集模块共同构成图像采集单元,图像辅助采集模块包含了遮光罩、补光灯、调位杆等设备,用于采集尽量清晰,外部干扰少的喷码图片。系统硬件设计如图1所示。
■
图1 系统硬件结构图
3 系统软件设计
3.1 软件环境搭建
首先需要搭建嵌入式linux系统:在宿主机上安装交叉编译环境后,再依次编译并移植Bootloader、linux内核、根文件系统到ARM端。本文移植的嵌入式系统是基于linux3.8内核的Xubuntu Desktop13.10,该系统支持 Xfce 图形桌面环境、电容触摸屏等功能。
3.1.1 OpenCV、Qt、Zbar、SQLite移植
OpenCV能很方便处理喷码检测过程中涉及到的图像处理及通用算法[3]。Qt是一款优秀的使用C++语言开发的跨多平台的应用程序及图形界面开发框架,适合用于开发本系统的图形应用程序。zbar是一个开源的条形码识别库,可以从摄像头、图像文件、视频等来源读取条形码[4],并支持多种常用条码类型的识别,这里将其用于纸箱喷码中条形码的识别。SQLite是一款以能在嵌入式系统有限的硬件资源下正常使用为设计目标的轻量型的数据库,故将其用于满足本系统检测结果的入库、查询等需求。因此我们通过依次执行下载相关源码、使用cmake或./configure等生成Makefile、make及 install、 生成相关的bin及库文件、拷贝到ARM端相应目录并配置系统环境等步骤即可将这些软件工具移植到ARM中。
3.1.2 为caffe框架构建并配置Arm NN SDK
如图2所示,Arm NN建立起了现有深度学习框架(TensorFlow 、Caffe[5]等)与底层ARM处理器之间的连接。它可以加载、转换、优化在现有的深度学习框架下训练出来的模型,使其再无需修改地能够在Arm Cortex CPU和Arm Mali GPU上高效运行。本次配置Arm NN SDK版本号为18_11。
■
图2 Arm NN SDK作用示意图
在宿主机Ubuntu已经配置好caffe、protobuf 等环境的前提下,为caffe配置并构建Arm NN SDK开发环境可以分为如下几个步骤:首先:从ARM官方GitHub下载Arm NN SDK和Arm Compute Library文件,并且配置好Cmake,SCons等编译安装工具。其次,指定armnn所需的依赖项的路径,包括boost、caffe。然后,构建armnn,具体包括使用scons 编译Arm Compute Library以及使用Cmake构建Arm NN SDK(通过CMakeLists.txt传递armnn构建所需的诸多配置参数)生成主要的3个库文件libarmnn.so libarmnnCaffeParser.so libarmnnUtils.a。最后,运行上一步生成的UnitTests测试文件以便验证Arm NN SDK是否完全构建成功。
3.2 检测算法设计
3.2.1 纸箱位置检测
进行纸箱喷码内容检测的前提是采集到清晰完整喷码的纸箱图像。本系统以生产线上纸箱运到相机镜头相对中心位置作为触发条件来触发纸箱喷码内容检测。因此需要进行纸箱相对相机镜头位置的检测,本文利用纸箱與背景的亮度差异作为特征使用图像处理方法进行软件上的位置检测。
在本系统固定环境下大量测试统计表明,相机采集到不含纸箱的背景图像,转换到HSV色彩空间后[6],其V明度分量值大于0.6的像素点数约占全图像素的40%,而采集到的纸箱图像相应的的占比约为90%。据此设定阈值判别一个图像区域内是否含有纸箱。将采集到的图像左边1/4区域设定为in区域,将图像右边1/4区域设定为out区域。具体步骤:(1)设置标志位g_flag_in、g_flag_match表明当前采集到的帧图像内的纸箱状态,均初始化为0。(2)获取相机采集到的帧图像,并将尺寸缩减到原帧的1/3以减少运算量(3)将源RGB图转换到HSV色彩空间,提取明度V分量并计算当前帧图像的in、out区域明度百分比P_in、P_out。
(4)進行判别:
当(g_flag_in=0)且(g_flag_match=0)且(P_in>0.9)且(P_out<0.4)时认为此帧图像属于"有纸箱进入镜头并充满了in区域"的情形,令g_flag_in=1。
当(g_flag_in=1)且(g_flag_match=0)且(P_in>0.9)且(P_out>0.9)时认为此帧图像属于"有纸箱在进入in区域之后又进入并充满out区域"的情形,此时,整个纸箱应处于镜头的相对中心,能采集到当前纸箱上的完整喷码内容,认为匹配一帧有效纸箱图像,发送此帧图像到相关显示、识别线程,且令g_flag_match=1防止对同一个纸箱重复匹配。
当(g_flag_in=1)且(g_flag_match=1)且(P_in<0.4)且(P_out<0.4)时认为此帧图像属于"匹配纸箱后首次出现in、out区域均不含纸箱"的情形,此时,说明匹配纸箱走出镜头范围。令g_flag_in、g_flag_match标志清零等待新帧继续进行判别。整个纸箱位置检测算法简洁有效,能在嵌入式平台上实时运行,一次纸箱位置检测流程如图3所示。
■
图3 纸箱位置检测流程图
3.2.2 纸箱喷码检测
纸箱喷码检测的内容包括图像预处理、喷码区域提取、条形码识别、字符子串分割、喷码字符识别模型训练、Arm端字符识别,识别结果处理。
3.2.2.1 图像预处理
喷码图像的预处理步骤为:对如图4(a)所示的原始彩色图像进行转灰度变换,使用检测水平边缘的Sobel算子进行边缘检测,再使用OTSU算法进行全局二值化。如图所示3-1,使用边缘检测减少无关信息后的OTSU全局二值化效果良好,如图4(b)所示。
■
(a)原始图 (b)Otsu算法后二值图
图4 喷码图像预处理
3.2.2.2 喷码区域提取
为了去除纸箱上除待识别喷码区域以外的干扰信息,需要对中心喷码区域进行提取。对此,使用形态学操作后提取连通域提取的算法可以实现。具体的,对由预处理得到二值图使用3*3的形态学操作核开操作消除点状噪声以及增大中心喷码与外围无关喷码之间的距离,再使用25*25的操作核膨胀将各个喷码子串形成连通域,如图5(a)所示,查找图中轮廓,排序轮廓面积,最大者即为该连通域,获取该轮廓的外接矩形,再使用ROI框选即可提取到中心喷码区域,如图5(b)所示。提取到中心喷码区域后,需要进一步提取各喷码子串。首先,进行开操作滤波去除散落的小点状噪声后再进行水平投影分割大致分割出4个喷码子串区域。其次,分别在各子串区域内使用25*1的操作核膨胀使得各子串自身横向联通,再查找轮廓及通过面积、纵横比等筛选轮廓。最后,使用opencv中的RotatedRect类获取轮廓的最小外接旋转矩形即可实现各喷码子串区域的精确提取,结果如图5(c)所示。利用getRectSubPix()提取出对应的喷码子串的矩形ROI区域。由于提取到的矩形ROI区域可能存在一定的倾斜角度,故采用仿射变换对每个旋转矩形进行倾斜校正。
计算机图形学中一般按照公式(1)的方式处理仿射变换:
i′1 = A b0 1i1 (1)
其中A = a11 a12a21 a22 ,i = xy,b = a13a23,i′ = x′y,A b,为仿射变换矩阵。旋转矩形的倾斜校正后即完成了各喷码子串的提取,如图5(d)所示。
■
(a)二值图形态学操作结果 (b)中心喷码区域
■
(c)提取到的喷码子串区域 (d)倾斜校正后的喷码子串
图5 喷码区域提取
3.2.2.3 字符子串分割
由于光照的并不能做到完全的均匀,子串左右两端存在一定的灰度差异,全局二值化产生的阈值会使得端点附近字符二值化效果较差,所以这里需采取局部自适应二值化。最后,对二值化后微量的散落的黑斑块采取形态学操作核为5*5的闭操作,获得干扰最小化的子串,如图6(a)所示。其中,经过同等处理的条形码子串已经可以调用zbar库进行条码识别。
本系统环境下出现投影分割异常的基本都是相邻字符粘连的情形,故采用带有粘连处理的垂直投影分割法进行喷码子串字符分割:首先,按列统计各列黑色字符点数到数组,创建同尺寸纯背景图,根据统计的列点数逐列绘制垂直投影直方图。然后,从左到右按列遍历,再设定标志位inBlock以表达当前遍历点是否位于字符区域内部。最后,以列的黑像素点数为0时,inBlock是否为真来判定当前遍历点是字符区域的起点还是终点,从而分割字符。在上述过程中,遍历到终点时进行字符粘连情形判断,即:(1)取原图宽的1/9作为平均字符宽度Width_avr,设定Width_max=1.25*Width_avr。(2)若投影宽度为i*Width_max与(i+1)*Width_max之间时认为有i个相邻字符粘连。(3)在当前投影段横向上[1/2i,3/2i]、[3/2i,5/2i]...[2i-3/2i,2i-1/2i]等区间内分别寻找该区间内列黑像素数点和最少的列,将其视作区间内相邻粘连字符的实际分割列,再使用ROI提取实际分割区域以完成分割。效果如图6(b)所示。
■
(a)喷码子串的全局与局部自适应二值化效果
■
(b)粘连喷码子串分割效果
图6 字符子串分割
3.2.2.4喷码字符识别模型训练
在大量生产的过程中,难免地会产生规整性较差的喷码字符,如图7所示。
■
图7 规整性较差的喷码字符
相对于传统机器学习,卷积神经网络不需要手动或使用特征提取算法来进行特征提取,而是用多个不同的卷积核在训练阶段就完成了特征提取及抽象。此外,由于其采用了局部连接、权值共享、下采样层等能大幅降低参数总量的特性,能够在参数量可接受的情况下加深网络层数,使得网络整体的表達能力更强,实现更好的学习效果。LeNet是一种经典的卷积神经网络结构 ,已经在手写数字数据集Mnist上取得的优异的识别效果,所以我们在lenet-5网络的基础上作出调整后用于喷码字符的识别:根据分割后喷码字符的纵横比,将输入层数据尺寸改为32*16。这样可以减少形变丢失特征信息也减少了参数量,加快了网络训练及推理的速度。此外,池化层的池化方式改用最大值池化,激活函数改用PReLU[7-8]函数,输出层的分类器改用Softmax回归分类器。 调整后lenet网络结构如图8所示。其中,由于标准RELU函数在训练过程中可能出现部分神经元“坏死”现象,PReLU近年被提出,PReLU表示带参数的ReLU函数,ReLU、PReLU函数如公式(2)、(3)所示,PReLU相对于 ReLU的不同在于新引入了可训练的参数ai作用于x负半轴,这避免了函数在x负半轴范围内倒数变成0,从而修正了数据的分布,解决了训练过程中可能出现的神经元“坏死”问题,而更新参数ai时,使用带动量的BP算法进行更新,如公式(4)所示,式中μ、η两个系数分别表示动量系数与学习率。
RELU(xi) = xi if xi > 00 if xi ≤ 0 (2)
PRELU(xi) = xi if xi > 0aixi if xi ≤ 0i (3)
Δai = μΔai + η■ (4)
■
图8 调整后的lenet网络结构
喷码数据集制作,将系统硬件架设于生产线上,驱动相机持续采集包装喷码图片,从中选取出各型号及批次纸箱1000多幅原始喷码图片,经过预处理,区域提取,喷码分割及尺寸归一化后,得到大量32*16尺寸的单字符图片,于其中手动筛选数字0至9十类图片使每类图片都达560张(取决于出现较低频率的数字的数量),再在一定范围内随机平移和旋转扰动增强数据集,使数据集总数达到22400张,按比例分成训练集和测试集存放于caffe对应目录下,并从文件名提取各图片标签。以shuffle打乱文件顺序方式生成数据集lmdb文件。拷贝数据集、网络定义文件、超参数文件等到caffe相关目录,执行网络训练命令。本文调整后的lenet网络在自制的喷码字符数据集上迭代约6000轮后训练结果趋向稳定,准确率达到了99.37%。
此外,还在宿主机环境下构建了基于模板匹配和传统的三层BP神经网络的喷码字符识别实验,使用相同的测试集数据进行测试,得到识别率及性能对比如表1所示。
表1 不同识别算法的识别率比较
■
显然,基于lenet5调整的卷积神经网络在喷码字符的识别上相较基于模板匹配及传统BP神经网络的算法识别率有明显提高,虽然识别耗时也相应变长,但对系统整体的的实时性影响较小,属于可接受的范围内。
3.2.2.5 Arm端字符识别
在ARM端通过Arm NN SDK加载由宿主机环境下训练出的caffemodel执行喷码字符识别步骤如下:
(1)使用opencv加载分割出的喷码字符图片逐像素输入到输入张量InputTensors。
(2)调用Arm NN接口ICaffeParserPtr::CreateNetworkFromBinaryFile()从前述步骤中训练出的caffemodel文件中读取网络结构及权值参数等信息。同时通过GetNetworkInputBindingInfo()接口为网络中的data输入层、prob输出层寻找绑定结点,并返回给armnnCaffeParser::BindingPointInfo类型变量。
(3)根据ARM底层处理器类型(gpu、cpu、无neon优化cpu)选择网络优化参数(GpuAcc、CpuAcc、CpuRef),本文硬件平台ARM cortex-A9内核处理器基于ARMv7-A架构,属于可开启neon运算加速的ARM CPU,选择CpuAcc优化参数。Optimize(*network,CpuAcc,runtime->GetDeviceSpec())。
(4)创建Arm NN runtime并加载优化过的网络:runtime->LoadNetwork(networkIdentifier,std::move(optNet))。
(5)调用runtime->EnqueueWorkload(networkIdentifier,InputTensors,OutputTensors)执行单向推断识别喷码字符。
3.3 应用程序设计
由于系统在使用自动检测模式时需要处理相机的实时采集、纸箱位置检测、喷码内容检测、主界面的人机交互4个模块的任务,为提升系统运行效率以及防止Qt主界面的冻结,需采取Qt的多线程技术来应对[9-10]。在主界面线程的基础上新开辟3个线程,并使用Qt的信号与槽、线程同步实现线程间通信、数据传输。
如图9所示,图像采集子线程负责循环的采集帧图片并且发给主界面及纸箱位置检测子线程,纸箱位置检测子线程负责循环的对接收到的帧图片进行检测是否含有有效纸箱,若是则将其发送给喷码检测子线程,喷码检测子线程负责循环的对收到的有效纸箱帧图片进行内容识别并返回结果到主界面。主界面线程与各子线程的交互分为显示控件与功能控件两部分:主界面上将各子线程返回信息实时显示到相应的显示控件和用主界面上的功能控件实现对各子线程内容的调用。
图9 Qt多线程应用程序结构
4 系统功能实现及应用测试
4.1 系统功能实现
系统菜单主要由“检测”、“查询”、“设置”、“调试”四个功能模块组成。
检测模块分为自动检测与单个检测,其中自动检测为系统的核心功能。具体的,界面左上方的图形视图窗口用来实时显示相机采集,右上方的QLabel窗口用来显示匹配到的有效纸箱,点击“自动检测”按钮开启系统的自动检测模式。检测中会将检测信息返回到主界面实时显示,如图所示,识别结果栏会显示识别出的喷码内容。当前编号栏的值会根据识别过的纸箱数递增,当前结果栏会显示识别是否成功。实时信息输出栏会输出程序运行过程的实时打印信息。失败列表栏输出识别失败的纸箱编号,同时报警提示产线人员确认复检及检出。
单个检测,主要用于单个纸箱检测、自动检测模式下的遗漏复检、检测本地纸箱喷码图片等需求。
查询模块分为属性查询与统计查询.系统会将每次识别的纸箱信息自动保存到本地数据库。属性查询按照检测日期、纸箱序列号、检测编号、型号容量、是否成功等属性来查询某条检测记录。如图所示。而统计查询可以进行设定首尾日期内的检测的成功率,型号、容量检测数量的统计。
调试模块可以实时显示检测算法各步骤运行的结果以及对一些步骤的参数进行调整。系统整体的软件功如图10所示。
图10 系统软件功能图
4.2 系统应用测试
分别在6组不同型号、容量的包装纸箱进行生产时,调节好对应的相机距离,让系统进入自动检测模式进行持续测试,当系统识别异常报警时,进行人工复检,确认该纸箱喷码是否喷印异常,最后依据公式(5)统计得出系统的正检率。统计结果如表2所示。
正检率=(1 - ■) × 100%
(5)
测试结果基本达到了系统预设的指标,表明本系统在生产线上运转良好,能实现对多种型号、容量下的纸箱喷码检测。
表2 系统运行正检率
5 结 论
针对目前的喷码检测系统的一些不足,设计了一套基于Qt与Arm NN的嵌入式喷码检测系统,分别进行了系统软硬件的设计。硬件上,设计了以高性能ARM处理器为运算核心与其他外设组成硬件平台。软件上,首先進行了软件环境的搭建。其次设计了位置检测算法来用于检测待测目标位置、喷码检测算法用于检测喷码内容,其中,在字符识别环节利用Arm NN将在caffe框架下训练出的喷码字符识别模型引入到ARM端并实现了对喷码字符准确识别。最后根据生产人员的需求分析开发了功能完善的人机交互软件。实际使用表明,本系统运作良好,喷码检测过程中的识别率、正检率均较高,可以满足实际生产中的需求。
参考文献
[1] 刘海龙,李宝安,吕学强,等. 基于深度卷积神经网络的图像检索算法研究[J].计算机应用研究,2017,34(12):3816—3819.
[2] Arm Limited. About arm NN SDK[EB/OL].https://developer.arm.com/ip-products/processor s/machine-learning/arm-nn,2018-02-09.
[3] 毛星云. OPENCV3编程入门[M]. 北京:电子工业出版社,2015.
[4] 吴兆林. 基于Zbar条形码图像识别的实现[J]. 数字技术与应用,2016(8):128—129.
[5] 欧先锋,向灿群,郭龙源,等. 基于Caffe深度学习框架的车牌数字字符识别算法研究[J].四川大学学报:自然科学版,2017(05):83—89.
[6] 李潘,吴少波,王丽娜. 基于机器视觉的宽厚板喷码自动识别系统[J]. 冶金自动化,2013(4):12—15.
[7] COLNAGHI S,HONEINE J L,SOZZI S,et al. Body sway increases after functional inactivation of the cerebellar vermis by cTBS[J]. Cerebellum,2017,16(1):1—14.
[8] ZHANG H,YING L,ZHANG Y,et al. Spectral-spatial classification of hyperspectral imagery using a dual-channel convolutional neural network[J]. Remote Sensing Letters,2017,8(5):438—447.
[9] 张庆.车牌识别算法及其在QT平台上的实现[D]. 北京:北方工业大学,2017.
[10] 姚宇乐,陈强,张九卫,等. 基于ARM920T的嵌入式图像处理平台搭建及应用[J]. 计算机系统应用,2016(7):208—212.