基于轻量级神经网络MobileNet V2的水果识别种类算法研究
时代背景
农用机器人,是由现代农业中发展出来的一个能够部分取代人类劳动力的高智能精密机械装置。它是现代农业生产中不能缺少的环节,也是未来种植业发展的大趋势。
从上个世纪年代末开始,首先出现的的是以日本为代表等的先进国家开发启动了农作物层面的工作机器人的研究。嫁接、收获、除草、移栽、分拣、等农活的农业机器人开发工作取得了成功,并逐渐走向商业应用阶段。中国的农业机器人技术发展较晚,还处在起步阶段。尽管中国的农业技术人员在自动嫁接、智能采摘除草、果蔬分级生产线和导航方法等农业机器人研发领域都获得了相应的成果,但总体发展水平和速度仍低于发达国家。
国外对采摘机器人的研发主要以日本为代表。日本研制的采摘机器人采摘茄子时成活率达到了百分之六十二点五,平均工作速率为六十四点一秒一个小时。除采集作业之外,葡萄的采集机器人还能够进行喷雾装袋、修剪枝叶等任务。番茄的采集速度为约十五秒一个,成活率约为百分之七十,卷心菜采成活率百分之四十三,工作速率为五十五秒一个。而英国科学家研制的蘑菇采集机器人,采摘速率为约一点五秒一个,成活率则在百分之七十五以下。以色列和美国共同研制的瓜类采集机器人,可实现百分之八十五以上的识别采集工作。韩国庆北大学研制的苹果类采集机器人识别率达到了百分之八十五,速度为5秒一个。
20世纪90年代开始,中国重点进行了蘑菇、草莓、黄瓜、番茄等采摘机器人的研制工作。此类机器人主要由摄像机、伺服机构、机械手、机器人抓取系统以及电脑等设备构成。在其中,还可以采用电脑视觉系统。提供分类所需要的尺寸和体积信号,以便引导机械手精确地抵达待采集水果的中心。采蘑菇机械人平均每天可收获70-80个蘑菇。草莓采集机器人的平均采集速率为每小时七十三点六粒,采集成活率为百分之九十。茄子采集机器人的测量间距在27-57厘米范围内时,测量误差可限制在+18mm之内,抓取成活率为百分之八十九,平均采摘时间为37s。黄瓜采摘机器人使用双目视觉成像设备,主要进行温室环境的作业。机械手使用了先进的红外线反射光电感应器,可以通过黄瓜的外形确定黄瓜的成熟度,并在十五s内进行下一个摘取动作。而智能采摘机械人通过多传感器信号的融合技术和开放式管理方式,不但能够摘取番茄,而且还能够摘取外形尺寸相似的柑橘和苹果,从而做到了一机多用。
当前,对水果分类方式的研究大多采用了傅里叶变换和水果表面颜色。前者先测量彩色水果图形的边界,进而获取水果的轮廓零点五径范围序列并进行离散傅里叶转换。最后再利用傅里叶系数定义分类器,并按照所给出的划分阈值对水果的外形特征进行类型划分。
后者通过将苹果图片转换为HIS颜色模型后,对苹果图片中H分量的面积加权直方图的二个主要成分加以分析,从而进行了水果分类,分级误差仅为百分之一点七五。2008年,李甦等人。总结了生物目标表面颜色的分布变化规律,并分别构建出"数量——程度"和"尺寸——评价光度值"的空间模式。前者能够精确地说明果面的程度,后者能够精确地说明水果种类。
一、轻量级神经网络MobileNet
谷歌公司提供的一款用于手机等嵌入式电子设备上的轻量级深度神经网络,名称为MobileNets。MobileNets在结构上采用了流线型的整体结构,经过深度的可分离卷积来构造轻量级的深度神经网络,给予我们一种简单的全局超参数,可以让我们在考虑复杂度的时候能够更合理地均衡延迟和精确度。这种超参数可以使得神经网络模型构建者从问题的根本出发,为其应用程序提炼大小适当的模型。
MobileNets网络模型最初在并随后用于Inception模型来降低减少前几层的庞大的计算量。平扁化的网络结构使得我们能从完全分离的卷积中构建一个轻量级网络,演示了极度分离网络的潜力。
获得小型网络的另一种方法是缩小、分解或压缩预训练网络。基于乘积量化的压缩,散列深度级可分离卷积其实是一种可分解卷积操作(factorized convolutions),其可以分解为两个更小的操作:depthwise convolution和pointwise convolution。
如上图中显示,Depthwise convolution与一般标准卷积计算有所不同,因为对于一般标准卷积计算来说其卷积核心是用在所有的输入通道上(input channels),而Depthwise convolution则针对各种输入通道而使用了不同的标准卷积计算核心,也就是说每一种卷积计算核心对应着一种输入通道,所以说depthwise convolution实际上是depth级别的操作系统。而pointwise convolution实际上是普通的标准卷积计算,只不过其使用一x一的标准卷积算核心。在图三点一三中则更清晰地显示了二种操作系统。关于depthwise与separable convolution,其实首先要通过depthwise convolution对各个输入通道依次进行卷积,之后再通过pointwise convolution将上面的计算再加以结合,这其总体效率与一个标准卷积算法是相当的,不过会大大减少实际计算量与模型参量。
MobileNet 结构建立在上一节中提到的深度可分离卷积之上,但第一层是全卷积。通过以如此简单的术语定义网络,我们能够轻松地探索网络拓扑以找到一个好的网络。
MobileNet V2,是之前MobileNet V1的改进版。MobileNet V1主要采用了depthwise separable conVolution来取代了传统的卷积方法,相当于完成了空间与通道之间的解耦,以实现模型化加速的目的。和MobileNet V1比较,MobileNet V2主要有二个改进:一是在线性瓶颈上。即去掉小维输出层后面的非线性激活层,保证模型的表现力。二则是在倒置残差块上。这种结构正好与传统residual block中降维后扩展相反,所以shotcut连接降维后就变成了feature map。
二、数据集
在该算法研究中,数据库分为训练集(train)和测试集(test)两部分
● 图片类别可由图片名称中提取。
● 训练集包含五类苹果,香蕉,梨,圣女果,芒果五类共311张图片;测试集包含158张。图片集如下图所示。
mobilenet模型训练部分代码
# 数据集加载函数,指明数据集的位置并统一处理为imgheight*imgwidth的大小,同时设置batch
def data_load(data_dir, test_data_dir, img_height, img_width, batch_size):
# 加载训练集
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
label_mode='categorical',
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size)
# 加载测试集
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
test_data_dir,
label_mode='categorical',
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size)
class_names = train_ds.class_names
# 返回处理之后的训练集、验证集和类名
return train_ds, val_ds, class_names
模型测试部分代码(测试会生成热力图)
数据加载,分别从训练的数据集的文件夹和测试的文件夹中加载训练集和验证集
def data_load(data_dir, test_data_dir