基于轻量级神经网络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, 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# 测试mobilenet准确率
def test_mobilenet():# todo 加载数据, 修改为你自己的数据集的路径train_ds, test_ds, class_names = data_load("../data/vegetable_fruit/image_data","../data/vegetable_fruit/test_image_data", 224, 224, 16)# todo 加载模型,修改为你的模型名称model = tf.keras.models.load_model("models/mobilenet_fv.h5")# model.summary()# 测试loss, accuracy = model.evaluate(test_ds)# 输出结果print('Mobilenet test accuracy :', accuracy)test_real_labels = []test_pre_labels = []for test_batch_images, test_batch_labels in test_ds:test_batch_labels = test_batch_labels.numpy()test_batch_pres = model.predict(test_batch_images)# print(test_batch_pres)test_batch_labels_max = np.argmax(test_batch_labels, axis=1)test_batch_pres_max = np.argmax(test_batch_pres, axis=1)# print(test_batch_labels_max)# print(test_batch_pres_max)# 将推理对应的标签取出for i in test_batch_labels_max:test_real_labels.append(i)for i in test_batch_pres_max:test_pre_labels.append(i)# break# print(test_real_labels)# print(test_pre_labels)class_names_length = len(class_names)heat_maps = np.zeros((class_names_length, class_names_length))for test_real_label, test_pre_label in zip(test_real_labels, test_pre_labels):heat_maps[test_real_label][test_pre_label] = heat_maps[test_real_label][test_pre_label] + 1print(heat_maps)heat_maps_sum = np.sum(heat_maps, axis=1).reshape(-1, 1)# print(heat_maps_sum)print()heat_maps_float = heat_maps / heat_maps_sumprint(heat_maps_float)# title, x_labels, y_labels, harvestshow_heatmaps(title="heatmap", x_labels=class_names, y_labels=class_names, harvest=heat_maps_float,save_name="results/heatmap_mobilenet.png")

三、基于PYQT5的系统界面实现

Python 提供了很多选项来开发 GUI 应用程序,PyQt5 就是其中之一。PyQt5是跨平台的GUI工具包,是Qt v5的一组python绑定。由于该库提供的工具和简单性,人们可以如此轻松地开发交互式桌面应用程序。GUI 应用程序由前端和后端组成。PyQt5提供了一个名为“QtDesigner”的工具,通过拖放方法设计前端,以便开发可以变得更快,并且可以在后端事情上利用好更多时间。

部分PYQT5实现代码:

class MainWindow(QTabWidget):# 初始化def __init__(self):super().__init__()self.setWindowIcon(QIcon('images/logo.png'))self.setWindowTitle('基于深度学习的水果种类识别系统')  # todo 修改系统名称# 模型初始化self.model = tf.keras.models.load_model("models/mobilenet_fv.h5")  # todo 修改模型名称self.to_predict_name = "images/welcom.png"  # todo 修改初始图片,这个图片要放在images目录下self.class_names = ['圣女果', '梨', '芒果', '苹果', '香蕉']self.resize(900, 700)self.initUI()# 界面初始化,设置界面布局def initUI(self):main_widget = QWidget()main_layout = QHBoxLayout()font = QFont('楷体', 15)# 主页面,设置组件并在组件放在布局上left_widget = QWidget()left_layout = QVBoxLayout()img_title = QLabel("欢迎来到水果种类识别系统")img_title.setFont(font)img_title.setAlignment(Qt.AlignCenter)self.img_label = QLabel()img_init = cv2.imread(self.to_predict_name)h, w, c = img_init.shapescale = 400 / himg_show = cv2.resize(img_init, (0, 0), fx=scale, fy=scale)cv2.imwrite("images/show.png", img_show)img_init = cv2.resize(img_init, (224, 224))cv2.imwrite('images/target.png', img_init)self.img_label.setPixmap(QPixmap("images/show.png"))left_layout.addWidget(img_title)left_layout.addWidget(self.img_label, 1, Qt.AlignCenter)left_widget.setLayout(left_layout)right_widget = QWidget()right_layout = QVBoxLayout()btn_change = QPushButton(" 上传图片 ")btn_change.clicked.connect(self.change_img)btn_change.setFont(font)btn_predict = QPushButton(" 开始识别 ")btn_predict.setFont(font)btn_predict.clicked.connect(self.predict_img)label_result = QLabel(' [这是什么水果] ')self.result = QLabel("识别结果")label_result.setFont(QFont('楷体', 16))self.result.setFont(QFont('楷体', 24))right_layout.addStretch()right_layout.addWidget(label_result, 0, Qt.AlignCenter)right_layout.addStretch()right_layout.addWidget(self.result, 0, Qt.AlignCenter)right_layout.addStretch()right_layout.addStretch()right_layout.addWidget(btn_change)right_layout.addWidget(btn_predict)right_layout.addStretch()right_widget.setLayout(right_layout)main_layout.addWidget(left_widget)main_layout.addWidget(right_widget)main_widget.setLayout(main_layout)# 关于页面,设置组件并把组件放在布局上about_widget = QWidget()about_layout = QVBoxLayout()about_title = QLabel('欢迎使用水果种类识别系统')  # todo 修改欢迎词语about_title.setFont(QFont('楷体', 18))about_title.setAlignment(Qt.AlignCenter)about_img = QLabel()about_img.setPixmap(QPixmap('images/bj.jpg'))about_img.setAlignment(Qt.AlignCenter)label_super = QLabel("作者:宁政")label_super.setFont(QFont('楷体', 12))# label_super.setOpenExternalLinks(True)label_super.setAlignment(Qt.AlignRight)about_layout.addWidget(about_title)about_layout.addStretch()about_layout.addWidget(about_img)about_layout.addStretch()about_layout.addWidget(label_super)about_widget.setLayout(about_layout)# 添加注释self.addTab(main_widget, 'main_page')self.setTabIcon(0, QIcon('images/main_page.png'))

系统演示



四、总结

本文阐述了一种基于轻量级卷积神经网络MobileNet V2的水果分类与识别算法研究。为了最大限度地促进机械收获,需要一个检测系统,它可以让我们识别不同类别的水果。一个相对未开发的想法是使用深度学习和人工智能算法,不仅可以检测水果的种类,还可以检测水果是否成熟。这可以证明是有利可图的,因为它可以提供作物生长状况以及成熟和未成熟果实的个体数量,以及决定是否是收获时间的有用信息。第一步对数据进行了预处理,数据预处理技术在众多的深度学习计算中起到了重要作用。然后,数据的获取是相当耗时费力的,因为这些数据分析必须兼顾多方面,然后有时必须对数据做出复杂的标注。数据是深度学习研究的基础,图像获取是图像识别的第一步,然后可以对图像进行预处理。要获得质量较高的图像样本及样本数量对于训练一个好的深度学习模型非常重要。在本论文中,从CNN实验发现CNN通过挖掘大量数据中的空间关系,在一定程度上降低了网络中的训练模型的参数含量,进而把了反向传播算法的有效性给提高了。

水果检测使用卷积神经网络比现有的图像细化技术获得精度。建议的工作可以在超市中实施,以检测水果并将它们聚类。该系统使用带有ReLU激活因子的卷积层来推导图像的属性,最大池化来提取高度的属性,扁平化来提高精度。该系统提供97%的准确率。在未来,通过增加卷积层的数量和使用softmax激活因子,可以对单个水果的新鲜度和腐烂度进行分类。

基于轻量级神经网络MobileNet V2的水果识别种类算法研究相关推荐

  1. 基于Python tensorflow2.3实现的水果识别系统源码+模型+数据集,卷积神经网络的入门案例

    水果识别-基于tensorflow2.3实现 水果识别是卷积神经网络的入门案例,这里我将模型的训练.测试.保存以及使用整合在了一起,至于原理部分,大家可以参考知乎或者B站上的回答,在这里我就不赘述了 ...

  2. MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试

    文章目录 MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试 一.题目要求 二.完整的目录结构说明 三.Mnist数据集及数据格式转换 四.BP神经网络相关知识 4.1 ...

  3. 基于卷积神经网络的温室黄瓜病害识别系统

    基于卷积神经网络的温室黄瓜病害识别系统 1.研究思路 针对温室现场采集的黄瓜病害图像中含有较多光照不均匀和复杂背景等噪声的情况,采用了一种复合颜色特征(combinations of color fe ...

  4. 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)

    基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...

  5. 基于BP神经网络的手写数字识别

    基于BP神经网络的手写数字识别 摘要 本文实现了基于MATLAB关于神经网络的手写数字识别算法的设计过程,采用神经网络中反向传播神经网络(即BP神经网络)对手写数字的识别,由MATLAB对图片进行读入 ...

  6. 【图像识别】基于卷积神经网络cnn实现银行卡数字识别matlab源码

    1 基于卷积神经网络cnn实现银行卡数字识别模型 模型参考这里. 2 部分代码 %印刷体识别 clc;clear;close all; addpath('util/'); addpath('data/ ...

  7. 基于卷积神经网络VGG的猫狗识别

    !有需要本项目的实验源码的可以私信博主! 摘要:随着大数据时代的到来,深度学习.数据挖掘.图像处理等已经成为了一个热门研究方向.深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远超 ...

  8. python模糊神经网络预测_一种基于模糊神经网络的化学分子生物毒性预测模型算法的制作方法...

    本发明属于化工 技术领域: ,具体是一种基于模糊神经网络的化学分子生物毒性预测模型算法. 背景技术: :近些年来,化学物质合成技术飞快发展,合成物质已经应用于社会的各行各业,随着工业的高度发展,全球化 ...

  9. 阅读笔记3:基于深度学习的运动想象脑电信号分类算法研究

    1.论文信息 题目:基于深度学习的运动想象脑电信号分类算法研究 作者佟歌 单位:哈尔滨工程大学控制科学与工程 发表时间:201803 2.笔记 2.1 脑电信号采集及预处理 2.1.1脑电信号分析方法 ...

最新文章

  1. ios:CGContextRef 渲染中文问题
  2. Windows 任务管理器中的几个内存概念
  3. python爬虫实现网页采集器
  4. Java笔记-Servlet相关记录
  5. [ZJOI2017]树状数组
  6. 8999元起!vivo X Fold折叠屏旗舰今日首销:采用航天级浮翼式铰链
  7. 如何看公司的财务数据
  8. 你可以退部的,不必说抱歉
  9. SqlServer数据库正在还原的解决办法
  10. java火车站售票源代码_火车票管理系统 - WEB源码|JSP源码/Java|源代码 - 源码中国...
  11. 西门子定位器6DR5010-0NN00-0AA0
  12. word总页数不包含封面_word目录不包含封面 word 目录 不含封面
  13. 【luogu P3802】小魔女帕琪(概率期望)
  14. MySQL复制表数据到新表的方法 亲测可用
  15. 摄影测量后方交会算法C#实现
  16. mysql partition赋权_Mysql的赋权
  17. 如何提高测试用例评审效率?
  18. 红孩儿编辑器的模块设计10
  19. excel如何快速批量翻译单词
  20. Openwrt 18.06 iPhone XR usb tethering导致内核崩溃问题解决方案

热门文章

  1. 左乘行向量 右乘列向量 置换矩阵(permutation matrix)
  2. [错误]input输入框只能输入或者选中替换输入,不能删除内容
  3. 把 oneNote 2016 中的文本复制向阿里钉钉或QQ,微信等文本框是图片,而不是希望的文本
  4. Mac系统下一键安装Homebrew方法(本人亲测有效)
  5. 分析mysql数据库死锁
  6. 面试第一关:如果介绍自己
  7. vue项目如何部署到nginx服务器
  8. PLC串级PID控制详解(炉膛和中央空调系统控温)
  9. tsv文件转excel文件
  10. Spring重定向指南