您现在的位置是:主页 > 电路技术 > 嵌入式系统 >


基于Qt与Arm NN的嵌入式喷码检测系统设计

2020-06-15 22:30嵌入式系统 人已围观

简介工业产品的包装上的喷码通常包含诸多重要 信息包装在喷码机喷码完成之后,由于整个喷印过程中可能出现的机械故障、产线环境变化、运输过 程磨损等因素,进而造成产品包装喷印...

  工业产品的包装上的喷码通常包含诸多重要 信息包装在喷码机喷码完成之后,由于整个喷印过程中可能出现的机械故障、产线环境变化、运输过 程磨损等因素,进而造成产品包装喷印质量的变化,导致包装信息喷印错误的产生。包装信息错误 的产品将会对企业的生产成本效率、产品物流仓 储、品牌形象等方面造成一系列不利影响。为了保 证喷码的正确可读,生产过程中喷码检测的环节不可或缺。传统的由人工辨别喷码好坏并不适合应用 在企业的大规模包装生产流水线上。而现有的喷码 检测仪器主控平台多基于工控PC电脑,其与满足同等运算能力需求的嵌入式ARM工控板相比,存 在价格,功耗较高、占用体积大、随生产线设备移动 部署能力差等问题。
  
  近年来,卷积神经网络在图像分类识别领域具 有超越其他传统算法的出色表现,此外,而深度学习框架的出现避免了从头编写复杂神经网络以及 通用代码的重复编写,使用框架提供的底层标准模块、组件进行开发能提高深度学习相关的工作效 率。而Ami NN曰是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系统硬件结构图
  图1系统硬件结构图
  

  3系统软件设计

  
  3.1软件环境搭建
  
  首先需要搭建嵌入式linux系统:在宿主机上 安装交叉编译环境后,再依次编译并移植Bootloader Jinux 内核、根文件系统到ARM端。本文移植的 嵌入式系统是基于linux3.8内核的Xubuntu Desk- topl3.10,该系统支持Xfce图形桌面环境、电容触 摸屏等功能。
  
  3.1.1 OpenCV、Qt、Zbar、SQLite 移植
  
  OpenCV能很方便处理喷码检测过程中涉及 到的图像处理及通用算法乳Qt是一款优秀的使用 C++语言开发的跨多平台的应用程序及图形界面 开发框架,适合用于开发本系统的图形应用程序。 zbar是一个开源的条形码识别库,可以从摄像头、 图像文件、视频等来源读取条形码叫并支持多种常 用条码类型的识别,这里将其用于纸箱喷码中条形 码的识别oSQLite是一款以能在嵌入式系统有限的 硬件资源下正常使用为设计目标的轻量型的数据 库,故将其用于满足本系统检测结果的入库、查询 等需求。因此我们通过依次执行下载相关源码、使 用 cmake 或./configure 等生成 MakefileAmake 及 install, 生成相关的bin及库文件、拷贝到ARM端相 应目录并配置系统环境等步骤即可将这些软件工 具移植到ARM中。
  
  3.1.2为caffe框架构建并配置Ami NN SDK
  
  如图2所示,Arm NN建立起了现有深度学习 框架(TensorFlow、Caffe同等)与底层ARM处理器之 间的连接。它可以加载、转换、优化在现有的深度学 习框架下训练出来的模型,使其再无需修改地能够 在 Ami Cortex CPU 和 Arm Mali GPU 上高效运行。 本次配置Ami NN SDK版本号为18_11。
  图2 Arm NN SDK作用示意图
  图2 Arm NN SDK作用示意图
  
  在宿主机Ubuntu已经配置好caffe、protobuf 等环境的前提下,为caffe配置并构建Arm NN SDK 开发环境可以分为如下几个步骤:首先:从ARM 官方 Git Hub 下载 Arm NN SDK 和 Arm Compute Library 文件,并且配置好Cmake, SCons等编译安装 工具。其次,指定amrnn所需的依赖项的路径,包括 boost-,caffeo然后,构建armnn,具体包括使用 scons 编译Arm Compute Library以及使用Cmake构建 Arm NN SDK(通过 CMakeLists.txt 传递 armnn 构建 所需的诸多配置参数)生成主要的3个库文件 libarmnn.so libarmnnCaffeParser.so libarmnnUtils.ao 最后,运行上一步生成的UnitTests测试文件以便 验证Arm NN SDK是否完全构建成功。
  
  3.2检测算法设计
  
  3.2.1纸箱位置检测
  
  进行纸箱喷码内容检测的前提是采集到清晰 完整喷码的纸箱图像。本系统以生产线上纸箱运到 相机镜头相对中心位置作为触发条件来触发纸箱 喷码内容检测。因此需要进行纸箱相对相机镜头位 置的检测,本文利用纸箱与背景的亮度差异作为特 征使用图像处理方法进行软件上的位置检测。
  
  在本系统固定环境下大量测试统计表明,相机 采集到不含纸箱的背景图像,转换到HSV色彩空 间后回,其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_0Ut。
  
  (4)进行判别:
  
  当(g_flag_in=0 )且(g_flag_match=0 )且(P_in> 0.9)且(P_out<0.4)时认为此帧图像属于"有纸箱进 入镜头并充满了 in区域啲情形,令g_flag_m=l。
  
  当(g_flag_in=l )且(g_flag_match=0 )且(P_in> 0.9 )且(P_out>0.9)时认为此帧图像属于"有纸箱在 进入in区域之后又进入并充满out区域”的情形, 此时,整个纸箱应处于镜头的相对中心,能采集到 当前纸箱上的完整喷码内容,认为匹配一帧有效纸 箱图像,发送此帧图像到相关显示、识别线程,且令 g_flag_match=l防止对同一个纸箱重复匹配。
  
  当(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 纸箱位置检测流程图
 
  3.2.2纸箱喷码检测
  
  纸箱喷码检测的内容包括图像预处理、喷码区域提取、条形码识别.字符子串分割、喷码字符识别模型训练、Arm端字符识别,识别结果处理。
  
  3.2.2.1图 像预处理
  
  喷码图像的预处理步骤为:对如图4(a)所示的原始彩色图像进行转灰度变换,使用检测水平边缘的Sobel算子进行边缘检测,再使用OTSU算法进行全局二值化。如图所示3-1,使用边缘检测减少无关信息后的OTSU全局二值化效果良好,如图4(b )所示。
  图4 喷码图像预处理
  图4 喷码图像预处理
 
  胀将各个喷码子串形成连通域,如图5(a)所示,查 找图中轮廓,排序轮廓面积,最大者即为该连通域, 获取该轮廓的外接矩形,再使用ROI框选即可提 取到中心喷码区域,如图5( b )所示。提取到中心喷 码区域后,需要进一步提取各喷码子串。首先,进行 开操作滤波去除散落的小点状噪声后再进行水平 投影分割大致分割出4个喷码子串区域。其次,分 别在各子串区域内使用25*1的操作核膨胀使得各 子串自身横向联通,再查找轮廓及通过面积、纵横 比等筛选轮廓。最后,使用opencv中的RotatedRect 类获取轮廓的最小外接旋转矩形即可实现各喷码 子串区域的精确提取,结果如图5(c)所示。利用 getRectSubPix ()提取出对应的喷码子串的矩形 ROI区域。由于提取到的矩形ROI区域可能存在 一定的倾斜角度,故采用仿射变换对每个旋转矩形 进行倾斜校正。
  
  计算机图形学中一般按照公式(1)的方式处理 仿射变换:
  
  公式1
  
  为仿射变换矩阵3旋转矩形的倾斜校正启即完成了各喷码子串的提取 , 如图5(d)所示 。
  图5 喷码区域提取
  图5 喷码区域提取
  
  3.2.2.3字符子串分割
  
  由于光照的并不能做到完全的均匀,子串左右 两端存在一定的灰度差异,全局二值化产生的阈值 会使得端点附近字符二值化效果较差,所以这里需 采取局部自适应二值化。最后,对二值化后微量的散落的黑斑块采取形态学操作核为5*5的闭操作, 获得干扰最小化的子串,如图6(a)所示。其中,经 过同等处理的条形码子串已经可以调用zbar库进 行条码识别。
  
  本系统环境下出现投影分割异常的基本都是 相邻字符粘连的情形,故采用带有粘连处理的垂直 投影分割法进行喷码子串字符分割:首先,按列统 计各列黑色字符点数到数组,创建同尺寸纯背景 图,根据统计的列点数逐列绘制垂直投影直方图。 然后,从左到右按列遍历,再设定标志位inBlock以 表达当前遍历点是否位于字符区域内部。最后,以 列的黑像素点数为0时,inBlock是否为真来判定 当前遍历点是字符区域的起点还是终点,从而分割 字符。在上述过程中,遍历到终点时进行字符粘连 情形判断,即:(1 )取原图宽的1/9作为平均字符宽度 Width_avr,设定 Width_max = 1.25 *Width_avro (2)若投影宽度为i*Width_max与(i +1) *Width_max之间时认为有i个相邻字符粘连。(3 ) 在当前投影段横向上[l/2i,3/2i]、[3/2i,5/2i]...[2i-3/ 2i, 2i_l/2i]等区间内分别寻找该区间内列黑像素数 点和最少的列,将其视作区间内相邻粘连字符的实 际分割列,再使用R0I提取实际分割区域以完成 分割。效果如图6(b)所示。
  图6 字符子串分割
  图6 字符子串分割
  
  3.2.2.4喷码字符识别模型训练
  
  在太快产的过程中,难免地会产生规整性较 差的喷码字符,如图7所示。
  图7规整性较差的喷码字符
  图7规整性较差的喷码字符
  
  相对于传统机器学习,卷积神经网络不需要手 动或使用特征提取算法来进行特征提取,而是用多 个不同的卷积核在训练阶段就完成了特征提取及 抽象。此外,由于其采用了局部连接、权值共享、下 采样层等能大幅降低参数总量的特性,能够在参数 量可接受的情况下加深网络层数,使得网络整体的 表达能力更强,实现更好的学习效果。LeNet是一 种经典的卷积神经网络结构,已经在手写数字数 据集Mnist上取得的优异的识别效果,所以我们在 lenet-5网络的基础上作出调整后用于喷码字符的 识别:根据分割后喷码字符的纵横比,将输入层数 据尺寸改为32*16。这样可以减少形变丢失特征信 息也减少了参数量,加快了网络训练及推理的速 度。此外,池化层的池化方式改用最大值池化,激活 函数改用PReLU牌 函数,输出层的分类器改用 Softmax回归分类器。调整后lenet网络结构如图 8所示。其中,由于标准RELU函数在训练过程中 可能出现部分神经元“坏死”现象,PReLU近年被 提出,PReLU表示带参数的ReLU函数,ReLU、 PReLU函数如公式(2),(3)所示,PReLU相对于 ReLU的不同在于新引入了可训练的参数佐作用 于*负半轴,这避免了函数在*负半轴范围内倒数 变成0,从而修正了数据的分布,解决了训练过程 中可能出现的神经元“坏死”问题,而更新参数a 时,使用带动量的BP算法进行更新,如公式(4)所 示,式中四顷两个系数分别表示动量系数与学习率。
  
  公式2-4
  图8 调整后的lenet网络结构
  图8 调整后的 lenet网络结构
  
  喷码数据集制作,将系统硬件架设于生产线 上,驱动相机持续采集包装喷码图片,从中选取出 各型号及批次纸箱1000多幅原始喷码图片,经过 预处理,区域提取,喷码分割及尺寸归一化后,得到 大量32*16尺寸的单字符图片,于其中手动筛选数 字。至9十类图片使每类图片都达560张(取决于 出现较低频率的数字的数量),再在一定范围内随 机平移和旋转扰动增强数据集,使数据集总数达到 22400张,按比例分成训练集和测试集存放于caffe 对应目录下,并从文件名提取各图片标签。以 shuffle打乱文件顺序方式生成数据集Imdb文件。 拷贝数据集、网络定义文件、超参数文件等到caffe 相关目录,执行网络训练命令。本文调整后的lenet 网络在自制的喷码字符数据集上迭代约6000轮后训练结果趋向稳定,准确率达到了99.37%。
  
  此外,还在宿主机环境下构建了基于模板匹配 和传统的三层BP神经网络的喷码字符识别实验, 使用相同的测试集数据进行测试,得到识别率及性 能对比如表1所示。
  
  表1不同识别算法的识别率比较
  表1 不同识别算法的识别率比较
  显然,基于lenet5调整的卷积神经网络在喷码 字符的识别上相较基于模板匹配及传统BP神经 网络的算法识别率有明显提高,虽然识别耗时也相 应变长,但对系统整体的的实时性影响较小,属于可接受的范围内。
  
  3.2.2.5 Arm端字符识别
  
  在ARM端通过Arm NN SDK加载由宿主机环 境下训练出的caffemodel执行喷码字符识别步骤 如下:
  
  (1)使用opencv加载分割出的喷码字符图片 逐像素输入到输入张量InputTensors。
  
  (2)调用 Ami NN 接口 ICaffeParserPtr::Creat- eNetworkFromBinaryFile ()从前述步骤中训练出的 caffemodel文件中读取网络结构及权值参数等信 息。同时通过 GetNetworklnputBindinglnfo()接口为 网络中的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 ->GetDevice- Spec ( )) 。
  
  (4 )创建Arm NN runtime并加载优化过的网 络 :runtime -〉LoadNetwork (networkidentifier,std:: move(optNet) )o
  
  (5 )调用 runtime->EnqueueWorkload( networkidentifier ,InputTensors, OutputTensors) 执行单向推 断识别喷码字符。
  
  3.3应用程序设计
  
  由于系统在使用自动检测模式时需要处理相 机的实时采集、纸箱位置检测、喷码内容检测、主界 面的人机交互4个模块的任务,为提升系统运行效 率以及防止Qt主界面的冻结,需采取Qt的多线程 技术来应对[9-,0]o在主界面线程的基础上新开辟3 个线程,并使用Qt的信号与槽、线程同步实现线程 间通信、数据传输。
  
  如图9所示,图像采集子线程负责循环的采集 帧图片并且发给主界面及纸箱位置检测子线程,纸 箱位置检测子线程负责循环的对接收到的帧图片 进行检测是否含有有效纸箱,若是则将其发送给喷 码检测子线程,喷码检测子线程负责循环的对收到 的有效纸箱帧图片进行内容识别并返回结果到主 界面。主界面线程与各子线程的交互分为显示控件 与功能控件两部分:主界面上将各子线程返回信息 实时显示到相应的显示控件和用主界面上的功能 控件实现对各子线程内容的调用。
  图9 Qt多线程应用.程序结构
  图9 Qt多线程应用.程序结构
  

  4系统功能实现及应用测试

  
  4.1系统功能实现
  
  系统菜单主要由“检测”、“查询”、“设置”、“调 试”四个功能模块组成。
  
  检测模块分为自动检测与单个检测,其中自动 检测为系统的核心功能。具体的,界面左上方的图 形视图窗口用来实时显示相机采集,右上方的 QLabel窗口用来显示匹配到的有效纸箱,点击“自 动检测”按钮开启系统的自动检测模式。检测中会 将检测信息返回到主界面实时显示,如图所示,识 别结果栏会显示识别出的喷码内容。当前编号栏的 值会根据识别过的纸箱数递增,当前结果栏会显示 识别是否成功。实时信息输出栏会输出程序运行过 程的实时打印信息。失败列表栏输出识别失败的纸 箱编号,同时报警提示产线人员确认复检及检出。
  
  单个检测,主要用于单个纸箱检测、自动检测模 式下的遗漏复检、检测本地纸箱喷码图片等需求。
  
  查询模块分为属性查询与统计查询.系统会将 每次识别的纸箱信息自动保存到本地数据库。属性 查询按照检测日期、纸箱序列号、检测编号、型号容 量、是否成功等属性来查询某条检测记录。如图所 示。而统计查询可以进行设定首尾日期内的检测的 成功率,型号、容量检测数量的统计。
  
  调试模块可以实时显示检测算法各步骤运行 的结果以及对一些步骤的参数进行调整。系统整体 的软件功如图10所示。
  图10 系统软件功能图
  图10系统软件功能图
  
  4.2系统应用测试
  
  分别在6组不同型号、容量的包装纸箱进行生 产时,调节好对应的相机距离,让系统进入自动检 测模式进行持续测试,当系统识别异常报警时,进 行人工复检,确认该纸箱喷码是否喷印异常,最后 依据公式(5 )统计得出系统的正检率。统计结果如 表2所示。
  
  公式5
  
  表 2 系统运行正检率
  表 2 系统运行正检率
  测试结果基本达到了系统预设的指标,表明本 系统在生产线上运转良好,能实现对多种型号、容 量下的纸箱喷码检测。

Tags:

标签云