卷积神经网络训练花卉识别分类器

介绍

  本部分是花卉分类器,后续会有更为详细的更新。

  花卉分类器使用语言:Python,使用深度学习框架:PyTorch,方法:训练卷积神经网络

  关于PyTorch的基本用法可以参考博客:PyTorch笔记

  Gitee仓库:花卉识别

  Github仓库:花卉识别

  Git相关用法可以参考博客:Git使用笔记

数据集

  目前选用了20种花卉数据用于分类

  data文件夹内存放了我使用的20种花卉数据集。日后会继续扩增。

  数据来源主要取决于3个方面:

  • 5种花卉数据集,每类花卉包含600张到900张不等的图片
  • 来源于Oxford 102 Flowers数据集,该数据集包含102类英国花卉数据,每个类别包含 40 到 258 张图像
  • 最后一部分来源于百度图片,使用python程序批量采集花卉图像数据

  有些花卉的name是我自己写的,采用的是花卉的学名,通常是拉丁文。

  我选用的20种花卉数据如下所示:

编号name名称数量
1daisy雏菊633
2dandelion蒲公英898
3roses玫瑰花641
4sunflowers向日葵699
5tulips郁金香799
6Nymphaea睡莲226
7Tropaeolum_majus旱金莲196
8Digitalis_purpurea毛地黄190
9peach_blossom桃花55
10Jasminum茉莉花60
11Matthiola紫罗兰54
12Rosa月季54
13Rhododendron杜鹃花57
14Dianthus康乃馨48
15Cerasus樱花50
16Narcissus水仙花52
17Pharbitis牵牛花46
18Gazania勋章菊108
19Eschscholtzia花菱草82
20Tithonia肿柄菊47

  花卉样式:

image-20200323134803440

数据扩展

  收集到的每种花卉数量不是很多,而像樱花、水仙花等都是每类50张左右,数据量过少,若直接拿去训练模型的话,正确率不会太高,且会发生严重的过拟合。

  目前使用的数据扩展方法分为三种:镜像翻转、上下翻转和椒盐噪声。

  镜像翻转:将图片左右翻转,生成新的数据

image-20200323161939465

  上下翻转:将图片上下翻转,生成新的数据

image-20200323162157922

  椒盐噪声:为图片增加噪声,生成新的数据

image-20200323162309627

  扩展后的花卉数量如下所示:

编号name名称数量增量后数量
1daisy雏菊6332496
2dandelion蒲公英8983588
3roses玫瑰花6412400
4sunflowers向日葵6992796
5tulips郁金香7993196
6Nymphaea睡莲2261808
7Tropaeolum_majus旱金莲1961568
8Digitalis_purpurea毛地黄1901360
9peach_blossom桃花55440
10Jasminum茉莉花60480
11Matthiola紫罗兰54432
12Rosa月季54432
13Rhododendron杜鹃花57456
14Dianthus康乃馨48384
15Cerasus樱花50400
16Narcissus水仙花52416
17Pharbitis牵牛花46368
18Gazania勋章菊108464
19Eschscholtzia花菱草82656
20Tithonia肿柄菊47376

数据切分

  数据集准备好了,要切分为训练集、验证集和测试集。

  在PyTorch的torchvision包内有一个关于计算机视觉的数据读取类ImageFolder,它的调用方式是torchvision.datasets.ImageFolder,主要功能是读取图片数据,且要求图片是下图这种存放方式。

image-20200321104936098

  然后这样来调用类:

train_dataset = ImageFolder(root='./data/train/',transform=data_transform)

  root表示根目录,transform表示数据预处理方式。

  这种方式将train目录下的cat和dog文件夹内的所有图片作为训练集,而文件夹名cat和dog作为标签数据进行训练。

  因此我们就要像ImageFolder要求的那样切分数据集。

image-20200323184552442

  我切分的比例是3:1:1。实际上,如果不想切分出验证集的话,可以将验证集的代码部分注掉,直接使用训练集和测试集也是可以的。

#比例
scale = [0.6, 0.2, 0.2]

  至此,数据部分准备完成了。

模型训练

  目前采用的是AlexNet和VGG16两种网络,其实两种网络比较相似,不同的是VGG16较于AlexNet更“深”

  AlexNet网络结构如下:

img

  VGG16网络结构如下:

在这里插入图片描述

  二者相比较,VGG16准确率更高一些,可见更深的网络对于提高准确率有一定的帮助。

  AlexNet训练过程中的准确率变化如下:

image-20200323225509766

  VGG16经历200个epoch训练的准确率变化如下:

image-20200323230153110

  AlexNet经历了500个epoch训练后最终能达到83%的准确率

  VGG16经历了200个epoch训练后最终能达到90%的正确率

  以上两种训练的模型参数我都保存到了仓库内

在这里插入图片描述

模型验证

  除了验证测试集以外,还可以用图片去验证模型的训练效果。

  选用的是验证效果比较好的VGG16网络,读取的参数是200个epoch训练后的参数

image-20200323231914637

image-20200323231935143

  可以看到,测试的效果还是非常好的,模型可以非常准确的判断花卉的种类。

一个补充

  如果你恰好有个云服务器,又想做一个web服务器的话,可以尝试flask框架(当然在本地也可以使用flask,不过这个就没有多大意义了)

  按照flask文件夹中的程序,在服务器上运行之后,然后打开一个新网页,输入IP:端口?图片地址就可以做识别了。

image-20200423135159846

  其中sjcup.cn是我的一个域名,这里可以替换为自己服务器的公网IP

  另外还有一个坑就是图片名称不可为中文名称,否则会检测不到

  公网IP无法访问的问题可以根据这个链接做一些修改

觉得文章还不错的话就请留下一个大大的赞吧,十分感谢!!

下一步计划

  • 扩增数据集,可以识别更多类别的花卉
  • 采用新的网络训练,如Inception V3
评论 4 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

纸照片

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值