邵彩幸,于 越,段 琼,刘明志
(1.西南民族大学计算机科学与技术学院,四川 成都 610041;2.西南民族大学计算机系统国家民委重点实验室,四川 成都 610041)
人工智能的发展,使得通过图像技术进行物体识别发展迅速[1].使计算机视觉成为极具吸引力学科的原因之一是:它会使未来逐步变为现实,人脸检测就是例证[2].在李玉鹏等针对树莓派的人脸识别考勤系统的开发与实现中采用了腾讯优图人脸识别API来实现视频流中人脸的识别[3];胡玉峰研究了在嵌入式环境下使用OpenCV提供的级联分类器实现视觉控制方向的定位追踪眼睛[4];韩宇等采用了计算帧差和二值化等图像处理要素,实现了在树莓派硬件环境中对涌动目标的识别与跟踪[5].袁晨等将Android与OpenCV函数库相结合生成人脸检测模块的动态库[6].罗瑞奇等通过改进传统Haar-like特征提取算法实现了车辆识别[7].上述等研究人员的目标识别方法实现了目标识别的准确性,但识别模块采用仅为现有的级联分类器或第三方的API.本文使用OpenCV提供的级联分类器训练方法自行训练级联分类器,进行鞋子的识别.经实验测试表明该鞋子识别系统识别准确率高,识别相对稳定.
Python是一种面向对象的解释型计算机编程语言,具有十分丰富且强大的数据库,它已经逐步变成继Java和C++之后的第三大程序开发语言[8].在众多项目研究经验中发现Python语言灵活性大,可靠性高,因此本系统选用python作为主体开发语言.
在界面设计上选用PyQt5作为开发工具.PyQt是Python和Qt库的融合,Qt本身强大的魅力,使得越来越多的Python程序员开始用 PyQt进行应用程序的开发[9].从理论上来说,凡是Python所涉及的开源模块在PyQt中都可以使用,同时PyQt完成了对Qt所有类的封装,也就继承了Qt的开发能力.从界面的美观程度以及优异的人机交互的程度来看,选用PyQt5进行界面设计是必要且有优势的.在图像识别实现上选用OpenCV作为主体框架.在图像识别实现上选用OpenCV作为主体框架,这在实现图像高级处理的过程中是必要的,如对目标进行分割、识别和3D重建,对图片特征的检测、跟踪与运动分析[10].OpenCV内置的强大数字图像处理函数,系统设计过程利用软件编程思想减少了对硬件的依赖,能够很好地做到成本低、识别率高、复杂性低[11],这对于本系统实现模块化的开发是有利的.
树莓派处于linux系统开发环境,为实现上述所选用工具,需安装如下开发包:
Python 3.5.3、PyQt5、Python-OpenCv 3.4.1.
本研究的目标是在树莓派为基础的嵌入式开发平台上,能够通过摄像头进行鞋子图像的采集并传输回我们开发的识别系统,通过对图像的处理与特征的提取实现鞋子目标的识别与储存.因为树莓派的功能十分多样,它几乎具备PC机上的所有基本功能而且成本十分低廉,方便获得,它能十分准确的满足我们进行程序开发的需求,因此我们选择Raspberry Pi当做我们程序开发的设备端[12].树莓派是一款只有信用卡大小的微型计算机,本系统使用的开发板型号是树莓派 3B,它使用了 Broadcom BCM2837,1.2GHz,64位处理器芯片、1GB内存,支持视频输入与影像输出,并且能耗低、运行稳定,能完全满足本系统的图像处理需求.输入设备本系统选用的是ov5647摄像头,它通过CSI接口与树莓派开发板连接,由于树莓派对该摄像头有很好的兼容性,所以无需安装额外的驱动,使用十分方便.它支持500w像素的图像采集,能够清晰的采集目标图像这对系统的识别过程有很大的帮助,能有效地的提高识别的精度与效率.
在图1硬件结构连接图中,电源负责系统供电、摄像头负责采集图像样本,显示器负责显示系统实时的处理结果,内存负责对识别到的目标进行存储.
图1 鞋子识别系统的硬件连接Fig.1 The hardware connection of the shoe recognition system
系统的框架主要可由三个模块组成,分别为图像采集模块、目标识别模块与图像保存模块,图2为系统构架.
首先,引用 PiCamera库进行图像采集,通过OpenCV的VideoCapture函数进行图像的读取,并通过QLabel显示在界面中.接下来,调用OpenCV的CascadeClassifier的detectMultiscale方法对捕获的图像进行特征的提取,这里的识别主要依靠自己训练的级联分类器来对图像进行处理.最后,对识别到的图片进行保存,系统流程图如图3所示:
图2 系统架构Fig.2 System structure
图3 程序流程图Fig.3 Program flow chart
目标识别的模块我们采用的是AdaBoost算法,AdaBoost(Adaptive Boosting)是 Boosting 算法中的一种,由Freund[13]提出.该算法提取图片的类 Haar特征,接着从提取的特征中选取一系列的重要特征,在将这些重要数据分类后,这一系列重要特征就可以组成一个级联分类器[14].所谓级联分类器,是指对目标和非目标进行分类的算法.本系统的目标识别中采用的是Haar分类器.Haar分类器是将AdaBoost算法生成的强分类器进行级联从而生成的分类器,这个过程是先训练出一个级联的分类器,每一级都有相同的识别率进入下一级,大于阈值的进入下一轮的搜索,当通过分类器的所有级时,表明物体被识别[15].所以Haar分类器可以有如下表示:
Haar分类器 = Haar-like特征+积分图+Ada-Boost+级联
Haar特征是由Papageorgiou等[16-17]提出的,它是将图像中黑色区域与白色区域的像素和相减而得到的黑色区域与白色区域的梯度变化的矩形特征,他反应了图像中相邻区域之间像素灰度变化的情况[18].
Haar分类将照强分类器由简单到复杂的顺序依次级联,从而达到目标识别的准确度.为了识别速度的提升,Haar分类器使用 Haar-like特征表示人脸,使用积分图实现特征数值的快速计算[19].积分图是一个快速且有效的对一个网格的矩形子区域中计算和的数据结构和算法.其数学表达式为:
其中 I(x,y)表示原图像在(x,y)处的积分图像,i(x',y')表示(x,y)处原始像.
当积分图构建好之后,可以用积分图进行简单的预算得到图像中任何矩阵区域的像素累加值,还可以通过两个矩阵像素值的差来得到Haar-like特征.
系统选用的级联分类器完全由自己训练,由于树莓派的性能有限,所以该级联分类器是在PC机上进行训练,然后再应用到树莓派上.利用OpenCV训练Haar特征分类器,总体上包括3步:准备正负样本图片、然后对正样本图片进行裁剪和归一化;通过执行CreateSamples.exe建立分类器所需要的正样本集,执行traincascade.exe来对正样本与负样本进行逐级的训练,最后得到级联分类器的模型文件[20].我们共采集正样本600张,负样本1800张.所谓正样本就是图片中带有鞋子的样本图片,负样本就是图片中没有鞋子的样本图片,图4是训练级联分类器的流程图.
对收集的图片进行批处理,求处理为命名统一,格式一致,大小相同的文件(一般大小为50∗50或30∗30).使用 OpenCV封装的 OpenCV_createsamples.exe生成正样本矢量集.vec文件.在Windows的DOS命令执行窗口中键入:
opencv_ createsamples.exe-info pos\\pos.dat-vec pos\\pos.vec-num 800-w 30-h 30 pause
其中-info描述正样本所在的文件路径,-vec描述生成的正样本矢量集所在的文件夹,-num描述正样本数量-w与-h分别描述图片的宽与高(以像素为单位).
级联分类器的训练主要使用OpenCV封装的opencv_traincascade.exe,在 windows的 DOS 命令执行窗口中键入如下指令:
opencv_traincascade.exe-data data-shose-vec pos.vec-bg neg\\neg.dat-numPos 29-numNeg 29-numStages 20-mem 200-featureType HAAR-w 30-h 30
其中-data主要描述级联分类器的存储路径,-vec用于描述正样本vec文件的路径,-bg用于描述负样本信息路径;-numPos描述每级分类器训练时所用的正样本数目,-numNe描述每级分类器训练时所用的负样本数目,-numStages描述训练的分类器的级数,在-featureType特征类型的选用中选择HAAR特征,-w与-h描述正负样本的大小.
图4 级联分类器的训练流程Fig.4 Cascading classifier training process
为了测试系统的识别精度与识别速度,选定自然光线下的复杂背景作为测试的主要背景,测试的图像样本分为如下三组:
第一组:深色系鞋子的样本;
第二组:浅色系鞋子的样本;
第三组:颜色由深到浅的鞋子样本.
在识别系统中,由于OpenCV在识别鞋子之前会将所有图像进行灰度化处理,为了节省图像灰度化的
图5 对深色样本的识别结果Fig.5 Recognition result for dark samples
从系统对鞋子颜色由深到浅的相关样本识别结果可以看出,对有一定灰度或者鞋子上有一定灰度标志的鞋子可以进行明确且标准地识别,识别速度快,时间更快地看到测试结果,因此测试选取的样本均为灰度化预处理后的样本.
在测试结果中可以发现,系统对深色系鞋子的识别度较高,识别速度快,识别过程稳定,不会再样本移动过程中中断识别;系统对浅色系鞋子的识别能力较差(针对于纯白色的鞋子样本几乎不能识别),但对已识别清晰的样本可以保证识别速度不变,识别过程较为稳定.具体识别情况可通过图5与图6的对比得到:识别过程相当稳定.具体情况可通过图7得到.
图6 对浅色样本的识别结果Fig 6 Recognition result for light samples
通过三组样本的测试可以明确本系统的鞋子目标检测功能具有80%以上的识别率,并且识别速度快,识别结果相当稳定.通过系统识别反思得到,浅色系鞋子样本不能清晰识别的原因在于,制作级联分类器时浅色系鞋子样本选取基数小,导致训练级数不够.对此应该重新选择较为全面的正样本,进行级数更高的训练.
图7 对颜色由深到浅变化的样本的识别结果Fig.7 Recognition result for samples with dark to light changes in color
本文系统且详细地介绍了识别过程中不同模块的流程图、功能流程图以及各个核心功能的完整搭建过程,设计出了基于嵌入式与OpenCV的目标识别系统.利用Python语言与OpenCV想结合,融合数字图像处理以及机器识别技术,结合独家训练出的级联分类器,该系统针对于随意图像中指定物体(本系统采用的是鞋子)的识别是清晰且准确的.本文提出的通过机器视觉识别鞋子的构想对于日后应用于多功能图像识别展示镜的实现起到了测试以及肯定性作用.