蔬菜图片的类型识别系统【基于MobileNetV3模型】

文章目录

  • MobileNet V3 的创新
    • 1. SE模块的加入
    • 2. 修改尾部结构
    • 3. 修改通道数量
    • 4. 改变激活函数
  • ​使用示例:
    • 1. 安装PaddleX
    • 2. 准备蔬菜分类数据集
    • 3. 定义训练/数据增强
    • 4. 定义dataset加载图像分类数据集
    • 5. 使用MobileNetV3_small模型开始训练
    • 6. 代码示例
    • 7. 加载训练保存的模型预测

识别系统简介

本作业设计实现了一个蔬菜图片的类型识别系统,使用百度官方蔬菜数据集vegetables_cls(共960张训练数据+240张验证数据,包含菠菜、胡萝卜、西红柿等6种蔬菜图片数据)。
作业基于国产百度Paddle框架,使用MobileNetV3模型,进行开发实现,过程中对图片数据进行RandomCrop数据增强。

模型介绍

MobileNet V3 是对 MobileNet V2 的改进,同样是一个轻量级卷积神经网络。为了适用于对资源不同要求的情况,MobileNet V3 提供了两个版本,分别为 MobileNet V3 Large 以及 MobileNet V3 Small。

MobileNet V3 的创新

1. SE模块的加入

仿照 MnasNet,MobileNet V3 在 MobileNet V2 中的 BottleNeck 模块中的深度级卷积操作后面添加了 SE 模块。如下图所示:

2. 修改尾部结构

MobileNet V2 中,在 GlobalAveragePooling 操作之前,为了提高特征图的维度我们使用了一个 1x1 的卷积层,但是这必定会带来了一定的计算量,所以在 MobileNet V3 中作者将其放在 GlobalAveragePooling 的后面,首先利用 GlobalAveragePooling 将特征图大小由 7x7 降到了 1x1,然后再利用 1x1 提高维度,这样就减少了很多计算量。另外,为了进一步地降低计算量,作者直接去掉了前面纺锤型卷积的 3x3 以及 1x1 卷积,进一步减少了计算量,就变成了如下图第二行所示的结构。

3. 修改通道数量

修改网络开始时第一个卷积核的数量,MobileNet V2 中使用了 32 个卷积核,在 MobileNet V3 中,作者仅使用了 16 个卷积核就达到了相同的精度。

4. 改变激活函数

SE 模块中
MobileNet V3 中将原来 SE 模块中的 sigmoid 激活函数换成了 h-sigmoid 激活函数,其表达式如下:

BottleNeck 模块中
MobileNet V3 中将原来 BottleNeck 模块中的 ReLU6 激活函数换成了 h-swish 激活函数,其表达式如下:

​使用示例:

使用pip安装方式安装2.1.0版本:

1. 安装PaddleX

pip install paddlex==2.1.0 -i https://mirror.baidu.com/pypi/simple
pip install paddlepaddle==2.3.2 -i https://mirror.baidu.com/pypi/simple

2. 准备蔬菜分类数据集

wget https://bj.bcebos.com/paddlex/datasets/vegetables_cls.tar.gz
tar xzvf vegetables_cls.tar.gz

3. 定义训练/数据增强

因为训练时加入了数据增强操作,因此在训练和验证过程中,模型的数据处理流程需要分别进行定义。如下所示,代码在train_transforms中加入了RandomCrop和RandomHorizontalFlip两种数据增强方式。

from paddlex import transforms as T
train_transforms = T.Compose([T.RandomCrop(crop_size=224),T.RandomHorizontalFlip(),T.Normalize()])eval_transforms = T.Compose([T.ResizeByShort(short_size=256),T.CenterCrop(crop_size=224),T.Normalize()
])

4. 定义dataset加载图像分类数据集

定义数据集,pdx.datasets.ImageNet表示读取ImageNet格式的分类数据集:

train_dataset = pdx.datasets.ImageNet(data_dir='vegetables_cls',file_list='vegetables_cls/train_list.txt',label_list='vegetables_cls/labels.txt',transforms=train_transforms,shuffle=True)
eval_dataset = pdx.datasets.ImageNet(data_dir='vegetables_cls',file_list='vegetables_cls/val_list.txt',label_list='vegetables_cls/labels.txt',transforms=eval_transforms)

5. 使用MobileNetV3_small模型开始训练

本文档中使用百度基于蒸馏方法得到的MobileNetV3预训练模型,模型结构与MobileNetV3一致,但精度更高。PaddleX内置了20多种分类模型,查阅PaddleX 图像分类模型API了解更多分类模型。

num_classes = len(train_dataset.labels)
model = pdx.cls.MobileNetV3_small(num_classes=num_classes)model.train(num_epochs=10,train_dataset=train_dataset,train_batch_size=32,eval_dataset=eval_dataset,lr_decay_epochs=[4, 6, 8],save_dir='output/mobilenetv3_small',use_vdl=True)

6. 代码示例

项目地址:https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/image_classification/mobilenetv3_small.py

import paddlex as pdx
from paddlex import transforms as T# 定义训练和验证时的transforms
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/transforms/transforms.md
train_transforms = T.Compose([T.RandomCrop(crop_size=224), T.RandomHorizontalFlip(), T.Normalize()])eval_transforms = T.Compose([T.ResizeByShort(short_size=256), T.CenterCrop(crop_size=224), T.Normalize()
])# 定义训练和验证所用的数据集
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/datasets.md
train_dataset = pdx.datasets.ImageNet(data_dir='vegetables_cls',file_list='vegetables_cls/train_list.txt',label_list='vegetables_cls/labels.txt',transforms=train_transforms,shuffle=True)eval_dataset = pdx.datasets.ImageNet(data_dir='vegetables_cls',file_list='vegetables_cls/val_list.txt',label_list='vegetables_cls/labels.txt',transforms=eval_transforms)# 初始化模型,并进行训练
# 可使用VisualDL查看训练指标,参考https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/visualdl.md
num_classes = len(train_dataset.labels)
model = pdx.cls.MobileNetV3_small(num_classes=num_classes)# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/models/classification.md
# 各参数介绍与调整说明:https://github.com/PaddlePaddle/PaddleX/tree/develop/docs/parameters.md
model.train(num_epochs=10,train_dataset=train_dataset,train_batch_size=32,eval_dataset=eval_dataset,lr_decay_epochs=[4, 6, 8],learning_rate=0.01,save_dir='output/mobilenetv3_small',use_vdl=True)

7. 加载训练保存的模型预测

模型在训练过程中,会每间隔一定轮数保存一次模型,在验证集上评估效果最好的一轮会保存在save_dir目录下的best_model文件夹。通过如下方式可加载模型,进行预测:

import paddlex as pdx
model = pdx.load_model('output/mobilenetv3_small/best_model')
result = model.predict('vegetables_cls/bocai/100.jpg')
print("Predict Result: ", result)

预测结果输出如下,

Predict Result:  [{'category_id': 0, 'category': 'bocai', 'score': 0.99960476}]

蔬菜图片的类型识别系统【基于MobileNetV3模型】相关推荐

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

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

  2. 【Spark Summit East 2017】使用Spark MLlib和Apache Solr构建实时实体类型识别系统

    更多精彩内容参见云栖社区大数据频道https://yq.aliyun.com/big-data:此外,通过Maxcompute及其配套产品,低廉的大数据分析仅需几步,详情访问https://www.a ...

  3. 【02】水果蔬菜识别系统-基于tensorflow2.3开发

    ------------------------------------------------2021年6月18日重大更新-------------------------------------- ...

  4. 手写数字识别系统 基于python

    环境基于Python3.6和Tensorflow框架 实现手写数字识别系统 本文使用python基于TensorFlow设计手写数字识别算法,并编程实现GUI界面,构建手写数字识别系统.文中首先对如何 ...

  5. MATLAB实现数字识别系统,基于人工神经网络的MATLAB手写数字识别系统

    <基于人工神经网络的MATLAB手写数字识别系统>由会员分享,可在线阅读,更多相关<基于人工神经网络的MATLAB手写数字识别系统(8页珍藏版)>请在人人文库网上搜索. 1.基 ...

  6. 使用gpu服务器搭建人脸识别系统,基于GPU的大规模人脸识别系统的设计与实现

    摘要: 近年来,随着基于深度学习的人脸识别技术的发展,成为了计算机视觉研究最热门的领域之一,被广泛的应用于公共安全.安防.金融等领域.但在实际应用场景中,人脸识别的准确率往往容易受到光线.遮挡.姿态等 ...

  7. GAN掉人脸识别系统?GAN模型「女扮男装」

    文章来源 新智元 编辑:LRS [新智元导读]人脸识别技术最近又有新的破解方式!一位斯坦福的学生使用GAN模型生成了几张自己的图片,轻松攻破两个约会软件,最离谱的是「女扮男装」都识别不出来. 真的有人 ...

  8. 【人脸表情识别】基于回归模型的人脸表情识别方法

    前面几篇专栏中,我们介绍了有关基于图片/视频的人脸表情识别的相关内容,这两个领域采用解决分类问题的方法来对表情进行识别.这篇文章,我们将介绍通过回归的方式来理解表情的方式--基于连续模型的人脸表情识别 ...

  9. 基于MATLAB花卉识别系统,基于深度学习的花卉识别系统设计与实现

    杨美艳 任富顺 顾志东 摘   要:深度学习是机器学习的一种前沿发展,设计主要利用谷歌的tensorflow框架,实现了对十种花卉的分类和识别.通过已有的大量的花卉图片素材,编写卷积神经网络对花卉图片 ...

  10. 基于matlab的手写体数字识别系统,基于matlab的手写体数字识别系统研究

    基于matlab的手写体数字识别系统研究 丁禹鑫1,丁会2,张红娟2,杨彤彤1 [摘要]随着科学技术的发展,机器学习成为一大学科热门领域,是一门专门研究计算机怎样模拟或实现人类的学习行为的交叉学科.文 ...

最新文章

  1. 安卓队列缓存文件,包括断点续传
  2. jquery键盘事件全记录
  3. Pixhawk代码分析-姿态解算篇B
  4. 中移M5310A NBIoT模组通信测试命令
  5. python-类的定制
  6. 将csv添加到mysql,将CSV导入到mysql表
  7. bzoj 3238: [Ahoi2013]差异(后缀数组+单调栈)
  8. 基本数据类型的包装类和随机数
  9. GB2312-80 所有汉字排序-拼音
  10. Linux环境,使用convert命令批量转换JPG图片——缩小图片尺寸
  11. QLV格式怎么在线转换成MP4转换器
  12. 短信验证码后端-接口设计
  13. 3d图形学中的uv坐标
  14. 如何用Yii2编程:ActiveRecord
  15. 微信小程序如何分享到朋友圈
  16. 基于SpringBoot框架和VUE的求职招聘系统
  17. matlab的spm,医学图像的批量配准(Matlab,SPM),医学影像,matlabSPM
  18. Java的递归问题的解决和面向对象的基本理论认识
  19. 联想x1carbon更换电池_联想_ThinkPad|ThinkCentre|ThinkStation服务与驱动下载_常见问题...
  20. Pytorch Random Erasing

热门文章

  1. 这是属于你我平凡人的荣耀
  2. PhotoShop 之移动选区
  3. 35岁仍然落魄,有这3个苗头将大器晚成,你要刮目相看,主动结交
  4. 谜底是计算机病毒的谜语,有关于安全的谜语及谜底答案解析|谜底是粽子的谜语...
  5. Android系统开发篇(二) —— 建立Android系统开发环境之Ubuntu 20.04.4 LTS
  6. QT中的explicit关键字的意思
  7. 域远程管理计算机,远程控制局域网电脑 图解局域网怎么远程控制
  8. 用数学语言说我爱你怎么说_你会说我的语言吗
  9. 一款老飞飞_魅力飞飞脚本研究增加攻击与暴击几率方式探讨源码(附带易语言源码)
  10. android 自定义indicator,【Android】TabLayout 自定义指示器 Indicator 样式