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

基于轻量级神经网络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。
图1.1 MobileNet 模型可以应用于各种识别任务,以提高设备智能的效率
如上图中显示,Depthwise convolution与一般标准卷积计算有所不同,因为对于一般标准卷积计算来说其卷积核心是用在所有的输入通道上(input channels),而Depthwise convolution则针对各种输入通道而使用了不同的标准卷积计算核心,也就是说每一种卷积计算核心对应着一种输入通道,所以说depthwise convolution实际上是depth级别的操作系统。而pointwise convolution实际上是普通的标准卷积计算,只不过其使用一x一的标准卷积算核心。在图三点一三中则更清晰地显示了二种操作系统。关于depthwise与separable convolution,其实首先要通过depthwise convolution对各个输入通道依次进行卷积,之后再通过pointwise convolution将上面的计算再加以结合,这其总体效率与一个标准卷积算法是相当的,不过会大大减少实际计算量与模型参量。
MobileNet 结构建立在上一节中提到的深度可分离卷积之上,但第一层是全卷积。通过以如此简单的术语定义网络,我们能够轻松地探索网络拓扑以找到一个好的网络。
图1.2 卷积神经网络特征提取工作过程
图1.3 深度可分离卷积
图1.4 深度卷积和逐点卷积
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] + 1

    print(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_sum
    print(heat_maps_float)
    # title, x_labels, y_labels, harvest
    show_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.shape
        scale = 400 / h
        img_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激活因子,可以对单个水果的新鲜度和腐烂度进行分类。

代码压缩包

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值