这是一款基于卷积神经网络和数字图像处理的智能水果检测和分类系统,由检测,分类两个部分组成。通过互联网下载和使用多媒体处理工具对水果拍摄视频剪辑处理得到大量水果图片,对图片进行标定获得数据集,并将数据集分成训练集和测试集。检测部分使用 Keras搭建的FASTER RCNN目标检测算法进行对不同水果的检测,在10多个小时的网络训练后,得到多个权值文件,选取总错误率最小的权值文件进行预测。其中预测返回了被检测的目标以及圈定目标的框的位置信息,通过框截取输入图片中的目标,并通过苹果的颜色和圆形度以及香蕉表面斑点的多少分别对两种水果进行等级分类。本设计已完成代码的设计、FASTER RCNN模型的训练、多种水果的检测以及对苹果和香蕉的等级分类,使用PyQt5进行界面设计与实现。通过测试,本系统能够检测五种不同的水果,且能够对苹果和香蕉进行三级有效分类。
本数据集包含苹果、香蕉、火龙果、草莓和橘子在内的五种不同的水果,数据集采用LabelImg进行制作。LabelImg是一个可视化的图像标定工具,许多目标检测网络(如FASTER RCNN,YOLO,SSD)训练时所需要的数据集,均需要借助这个工具进行图像中目标的标定。生成的XML文件时遵循PASCAL VOC格式。打开LabelImg,进行对训练集中图片的标定。所谓标定,就是选取大小合适的框,将图片中需要检测的物体进行框起来,并标注上框内目标的类别名称。标定过程如图所示:
标定结束后,就会生成对应图片的XML文件。XML文件不仅包含该图片的基本信息,比如文件路径,图片的大小以及是否时彩色图片等等。其中文件中的前景包含了每一个目标的名字以及所处的位置,位置信息由左上角坐标和右下角坐标进行区分。某个标定结束的XML文件内容如图所示:
本系统主要包含检测和分类两个部分。其中,检测过程包括水果图片的获取与Pascal VOC格式训练集的制作,FASTER RCNN目标检测网络的搭建,网络的预测过程。其中网络的预测部分可以通过调用摄像头进行验证,或者输入带有目标的图片进行预测。检测系统整体架构如图所示:
系统使用的编程语言为Python,作为一种计算机编程语言,近年来,随着人工智能相关研究的不断发展,成为最近几年比较热门的语言。Python语言简单易学,且包含许多的开发库,比如Matplotlib,Numpy,OpenCv等库。如今Python版本的迭代较快,最近一版为3.9.5。最新版本拥有的功能更加强大,但由于刚出不久,开发资料少,相关函数库的改动仍需一段时间的磨合,故我们选取稳定的Python3.6版本。本文中所涉及的实验均在Windows10操作系统,Intel i5 7th处理器,GTX1050的显卡下完成的。
作为谷歌发布的一个端到端开源机器学习平台,一经发布就受到广大开发者的热爱。继TensorFlow1.0版本发布后, 2.0版本将更多的精力放在了简洁性和易用性上面,相较于1.0版本API复杂难懂,2.0版本的入门学习难度降低很多。尽管如此,2.0版本的难度依然很高。由于我们用到了contrib模块,而2.0版本已经去掉,且1.0版本网络资源较多,这可以为我们解决开发中的问题提供很大的帮助。Keras库为研究机器学习算法的强大实验工具,能够创建复杂的拓扑,包括使用残差层、自定义多输入/输出模型以及强制编写的正向传递。并可与更高级别的抽象一起工作,以实现完全可定制的逻辑。同时,TensorFlow每个版本都会有速度更快的Gpu版本和普通的Cpu版本,前者对显卡等电脑硬件的要求较高,为提高运行的速度,我们安装Gpu版本的TensorFlow。Gpu版本会用到Cuda10.0和Cudnn7.4.1.5,因此在使用之前需要安装Cuda。系统的开发环境如图所示:
TensorFlow是谷歌开发的机器学习系统,他是基于数据流编程的符号数学系统,作为人工智能领域的一个重要软件工具,广泛应用于各类机器学习算法的编程实现。FASTER RCNN作为一种目标检测的算法,使用的TensorFlow进行实现是个非常好的选择。根据FASTER RCNN相关理论以及TensorFlow提供的许多的函数模块,使用Python语言便可快速搭建数学模型。
FASTER RCNN目标检测网络共包含了两次解码过程,先进行初略的筛选再细调。值得注意的是,第一次获得的建议框解码后的结果是对共享特征层进行截取。
主干特征提取网络使用卷积,归一化等函数根据上文所述的主干提取网络的运行流程图进行搭建。其他层同样可以采用TensorFlow的所集成API进行构建。
FASTER RCNN的训练过程包含两部分,分别为建议框网络的训练,以及ROI网络的训练。在预测过程中,如果想要调整先验框获得建议框,我们需要对共享特征层进行一次3*3的卷积进行特征整合,然后进行两个卷积操作。该目标检测网络的预测结果,并不是建议框在图片上的真实位置,需要解码才能得到真是位置。而在训练的时候,我们需要计算损失函数,该损失函数是相对于FASTER RCNN建议框网络的预测结果的。计算损失函数我们需要进行两步操作,分别是将图片输入到当前的FASTER RCNN建议框的网络中,得到建议框网络的预测结果,同时还需要对真实框进行编码,这个编码的输入时真实框的位置信息,输出FASTER RCNN建议框预测结果的格式信息。也就是说,我们需要找到每一张用于训练的图片的真实框所对应的先验框,并且要知道建议框预测结果如何操作才能得到这样一个真实框。从建议框预测结果获得真实框的过程称作解码,而从真实框获得建议框预测结果的过程就是编码的过程。
解码过程的逆过程就是编码过程,因此,我们要找到每一个真实框对应的先验框,代表这个真实框由某个先验框进行预测得到的。首先,我们需要将每一个真实框和所有先验框及进行一个IOU计算,此步骤的工作时计算每一个真实框和所有先验框的重合程度。目标检测中的IOU,其描述的是检测到的结果(当然是一个包含目标的框)与标注的结果(真实框)的重合程度。在获得所有先验框和每一个真实框的重合程度信息后,选出先验框中与真实框重合程度大于一定门限的先验框,代表这些先验框负责预测该实际框。由于一个先验框只能负责一个真实框的预测,所有当某个先验框与多个真实框的重合程度较大时,那么与其IOU最大的真实框的预测由该先验框负责。在这一步后,我们据可以找到每一个先验框所负责预测的真实框,然后进行上面的编码行为。在建议框网络的训练过程中,会忽略一些重合度相对较高但是不是非常高的先验框,一般将重合度在0.3-0.7之间的先验框进行忽略。
接下来进行ROI网络的训练。通过上一步的训练,就可以接下来对建议框网络进行训练了,建议框网络会提供一些位置的建议,并根据这些建议对建议框进行一定的截取,并获得对应的预测结果,事实上就是将上一步建议框当作了ROI网络的先验框。因此,我们需要计算所有真实框和建议框的重合程度,并进行筛选,如果某个真实框和建议框的重合程度大于0.5则认为该建议框时正样本,如果重合程度小于0.5则认为该建议框为负样本。我们再对真实框进行编码,这个编码是相对与建议框而言的,也就是说,当这些建议框存在的时候,ROI预测网络才能根据需要什么样的预测结果将这些建议框调整成真实框。
本文采用现在深度学习很多框架采用的VOC数据集进行训练。一般VOC数据集都包括Annotations,ImageSets,JPEFImages。其中第一个文件中放着所有图片的标记信息,是以XML为文件后缀。第二个文件中的layout,包含train,trainval和val三个txt格式数据,train是训练数据,均为图片名,没有后缀,val是验证数据,trainval 则是所有训练和验证数据test为测试数据。其Main文件夹中保存的是各类目标出现的统计。在训练前分别将图片文件和标签文件放入JPEGImages和Annotation文件中,并运行voc2faster-rcnn.py文件生成对应的txt。最后键入自己数据集所包含的种类,初始的权值文件便可训练我们的数据集了。
由于FASTER RCNN没有采用传统的方法,而是通过RPN生成待检测区域,这样在生成ROI区域的时候,运行的时间相应减少了。我们使用标定结束的数据集放入建立好的FASTER RCNN目标检测网络,设置好训练的次数,权值文件保存的路径,运行train.py次数越多损失的值就越小,相应的运行的时间也会增加,同样会出现过拟合的现象。经历大概10多个小时的训练后,便得到许多的权值文件,每个权值文件都包含了这一次训练的各种评判参数,根据损失值的大小可以选取合适权值文件作为预测的权值文件。程序运行过程和每一次运行生成的权值文件如图所示:
目标检测网络训练结束后,选取获得的权重文件中最终损失值最小或者Val Loss最小的。然后选取要分的类,也就是要区分出几种水果,最后将待检测的图片输入到网络中进行预测。预测的输出在原图中将目标检测出来并且标示出可信度,本系统训练时只训练了五种不同的水果,故也只能实现训练集所包含的五种水果的预测。预测结果如图所示:
同时,我们可以使用摄像头对包含有水果的图片进行检测。测试步骤为:手机打开一张水果的图片,放到电脑摄像头前,命令行就会打印出检测结果。同样我们包含水果的图片进行测试,图3.8是利用笔记本摄像头检测一张图片,fps指每秒的帧数。图3.9是对应图片的终端输出,输出了检测信息,包含水果的类别和位置坐标。图3.10是对实物的检测结果以及相应的置信度。
前面提到,我们的分类过程是在检测过程之后,检测后不仅返回图片中目标的类别,同时返回出检测框的左上角和右下角坐标,就可以根据这两个坐标进行截取图片。我们将苹果分为三等,颜色亮丽且形状非常规整视为一等,二等则是那种颜色一般或形状也凑合的,三等则是颜色很差或形状不规整的苹果。并采用最近邻方法进行预测和训练。我们仍采用Python语言进行编写程序,苹果分类软件开发平台与上面的检测平台一致,这里就不赘述。使用Python集成的OpenCv和PIL进行图像的读取与处理,结合数字图像处理中的理论并选取OpenCv中API的合适参数。在求取图像色泽度时,原图和RGB转HSV后H分量后的图片如图所示:
在求取面积时,在图像增强后使用大津阈值分割法获得二值化图像,如图所示:
上面演示了一个图片获得对应特征值的过程,然后我们将多个图片进行特征提取,做成我们的训练集,采用模式识别中最近邻算法进行预测检测后的苹果的品级。训练集的分布如图所示:
从图中可以看出,一等品(红色)集中在色泽度高且形状规整的部分,虽然三个等级的苹果呈现出集中的趋势,但是仍然有误差。由于最近邻的判断结果与训练集有很大的关系,但基本上是可以满足要求的。图4.4为苹果分类的结果,输出包括直径和红色程度。
由前面香蕉分类流程图可知,最重要的是灰度增强时参数的调整以及霍夫变换时参数的调整。对比度增强主要调节下图一中两个点坐标,而霍夫变换主要调节目标中圆的半径范围和圆心距离小于多少时认为是同一个圆。参数如表所示。
Para |
Disc. |
Image |
输入图像,必须是八位的单通道灰度图像 |
Circles |
输出结果,发现的圆信息,包括圆点和半径 |
Method |
目前只有 HOUGH_GRADIENT,通过梯度来寻找 |
Dp |
dp = 1:在原图上寻找;dp = 2, 原图宽高减半 |
Mindist |
如果两个圆的圆心距离小于 mindist 则认为是同一个圆 |
Param1 |
Canny 检测时的 高阈值,低阈值是 param1 的一半 |
Param2 |
中心点累加器阈值,小于该阈值的会被忽略 |
Minradius,Maxradius |
搜寻半径范围 |
在参数调节结束后,便可以在原图上根据霍夫圆变换获得的圆的三个参数进行标注。我们灰度增强的效果是要将香蕉体表上的斑点视为前景,背景以及蕉身视为背景。效果如图所示:
由于香蕉体表的斑点比较小,且相邻两个圆的距离也较小,因此设置的待检测圆的半径范围也比较小。图4.7左侧图中,香蕉表面虽然有斑点,但是不影响食用,检测到的斑点也较少。下图右侧的香蕉质量明显很差,用霍夫圆变换得到的表面的圆也比较多,也即斑点的个数比较多。
霍夫圆变换可以检测到图片中圆的半径和圆心坐标,每个圆也就代表了香蕉表面的斑点。根据返回的参数便可统计斑点的个数,进而相应的判断香蕉的分类结果。
如前面所述,界面的设计采用Qt设计师这个软件进行设计,我们使用的控件有按钮,文本框以及对话框。整个GUI界面的背景是选取一个图片,然后设置一个跟其他组件没有继承关系的ListView,然后铺开作为背景,这样不会遮挡其他组件。文本框显示我们打开的图片和处理的图片在整个界面上面的位置。我们使用按钮进行设计所要完成的功能,我们的功能有四个,分别是打开图片,检测目标,水果的分类和退出。打开图片并能够在图片显示控件上显示出来,其中两个图片显示控件的大小都是100*100,因此界面中显示的图片是进行压缩后的。检测后点击检测,便可以得到被检测图片。当点击分类时,首先进行对检测结果的截取,使用分类算法得到其品级。退出按钮即结束所有的工作,退出界面,退出程序的执行。设计的界面如下图所示:
界面设计好后通过指令将界面转化成Python文件,该Python文件是一个类,该类包含了所有的组件信息,比如其名字,位置,以及调用函数。我们再建立一个新的Python文件,并把表示界面的类导入,就可以进行对四个按钮函数内容的编写了。由于我们前面已经把检测和分类的代码实现,故只需稍加改动,便可迁移到我们界面中实现功能和界面的互动。
在设计结束界面后,编辑按钮的事件函数。将前面所调试成功的实验内容相应的放入事件函数中,并分别在打开和检测按钮的事件处理函数中加入图片显示的操作。由于处理时所用的图片格式和显示时的格式不统一,便导致显示上有些瑕疵,但并不影响其结果的准确性。下图1是三种水果的检测结果,包括边界框以及置信度信息。下图2是五种水果的检测结果,图下图3,4,5分别显示了香蕉三种品级的分类结果,下图6,7,8分别显示了苹果三种品级的分类结果。
1. ffmpeg视频转图片
2. 水果划分等级的标准
3. PyQt5简单教程
4. PyQt5编写简单GUI
5. Qt -- QImage使用总结
6. Qt Designer设置背景图片
7. 从RCNN-FASTER RCNN
8. 理解卷积神经网络中的特征图(feature map)
9. 目标检测综述
10 理解FASTERR CNN(知乎知乎知乎)
11 Faster RCNN网络简介
12 labelimg标定图片
13 windows下的tensorflow-gpu=1.13.2环境配置
14 windows下的tensorflow-gpu=2.2.0环境配置
15 对比度增强算法
16 opencv 图像增强
17 opencv图像的灰度处理
18 faster rcnn中rpn的anchor,sliding windows,proposals的理解
19 霍夫变换圆检测原理及 OpenCV API 应用
20 Faster RCNN算法解析
21 Keras搭建Faster-RCNN目标检测平台
注:如果要代码资源的话:https://market.m.taobao.com/app/idleFish-F2e/widle-taobao-rax/page-detail?wh_weex=true&wx_navbar_transparent=true&id=653416653220&ut_sk=1.YHb1YYoyq4QDABrl2nUHJK%252F2_21407387_1629527639677.copy.detail.653416653220.3422931154&forceFlush=1