手把手教你:基于深度残差网络(ResNet)的水果分类识别系统

原文地址:

手把手教你:基于深度残差网络(ResNet)的水果分类识别系统

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

@TOC
</font>
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

一、项目简介

本文主要介绍如何使用python搭建:一个基于深度残差网络(ResNet)的水果图像分类识别系统

项目只是用水果分类作为抛砖引玉,其中包含了使用ResNet进行图像分类的相关代码。主要功能如下:

  • 数据预处理,生成用于输入TensorFlow模型的TFRecord的数据。
  • 模型构建及训练,使用tensorflow.keras构建深度残差网络。
  • 预测水果分类并进行模型评估。

如各位童鞋需要更换训练数据,完全可以根据源码将图像和标注文件更换即可直接运行。

<font color=#999AAA >博主也参考过网上图像分类的文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,只需要搭建出一个预测系统即可。</font>

本文只会告诉你如何快速搭建一个基于ResNet的图像分类系统并运行,原理的东西可以参考其他博主

也正是因为我发现网上大多的帖子只是针对原理进行介绍,功能实现的相对很少。

如果您有以上想法,那就找对地方了!

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

<font color=#999AAA >不多废话,直接进入正题!

二、水果分类结果预测

首先我们来看下模型最终预测的水果类别的情况。本项目采用的数据集共有13种水果:香蕉、樱桃、无花果、芒果等等。博主英语不好就不在这献丑了,感兴趣的同学可以百度翻译
[图片上传失败...(image-54eaec-1652018800776)]

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

  • 接下来是模型预测的结果,这里我输入了2个单张图片,来验证模型的分类结果:
    [图片上传失败...(image-7e33d3-1652018800776)]
    [图片上传失败...(image-1f913a-1652018800776)]
  • 可以看到2张图片分别为:香蕉、桔柚,模型都准确预测并分类正确。

三、环境安装

1.环境要求

本项目开发IDE使用的是:Anaconda中的jupyter notebook,大家可以直接csdn搜索安装指南非常多,这里就不再赘述。

因为本项目基于TensorFlow因此需要以下环境:

  • tensorflow >= 2.0
  • pandas
  • scikit-learn
  • numpy
  • OpenCV2
  • matplotlib

2.环境安装示例

环境都可以通过pip进行安装。如果只是想要使用博主训练的模型直接进行预测,不需要对模型重新训练的话,这边建议tensorflow安装cpu版的。

<font color=#999AAA >如果没使用过jupyter notebook通过pip安装包的同学可以参考如下:

  • 新建一个terminal窗口:

[图片上传失败...(image-cfbf21-1652018800776)]

  • 在新建的窗口中使用pip进行安装:

[图片上传失败...(image-7f05fb-1652018800776)]

点开“终端”,然后通过pip进行安装pandas,其他环境包也可以通过上面的方法安装。

四、重要代码介绍

环境安装好后就可以打开jupyter notebook开始愉快的执行代码了。由于代码众多,博客中就不放入最终代码了,有需要的童鞋可以在博客最下方找到下载地址

1.数据预处理

  • 首先我们将需要处理的图像分为训练集、测试集。

[图片上传失败...(image-1607dd-1652018800776)]

  • 其中按13类的水果分别建立文件夹放入对应水果图片:
    [图片上传失败...(image-a27b1b-1652018800776)]

  • 这里拿芒果举例:
    [图片上传失败...(image-c6de9a-1652018800776)]

  • 使用opencv2来读取图像生成:(100,100,3)的三通道图像数据。

# 定义图像处理函数
def read_img(path):
    print("数据集地址:"+path)
    imgs = []
    labels = []
    for root, dirs, files in tqdm(os.walk(path)):
        for file in files:
            # print(path+'/'+file+'/'+folder)
            # 读取的图片
            img = cv2.imread(os.path.join(root, file))
            # 将读取的图片数据加载到imgs[]列表中
            imgs.append(img)
            # 将图片的label加载到labels[]中,与上方的imgs索引对应
            labels.append(str(os.path.basename(root)))
    return imgs,labels
  • 并处理图像,和对类别进行LabelEncoder编码处理,处理后情况如下:
  • 训练集共计:6560张图片,测试集共计:2207张图片。
    [图片上传失败...(image-cd3e6b-1652018800776)]
  • 然后将数据储存为TFRecord:
    [图片上传失败...(image-194afa-1652018800776)]

2.分类模型构建

  • 使用TensorFlow搭建一个ResNet模型:

[图片上传失败...(image-936fe0-1652018800776)]

3.模型训练

  • 模型训练,设置批处理batch_size:64,每2个epoch保存一次模型,博主总共跑了30个epoch。
from tensorflow.keras.callbacks import (
    ReduceLROnPlateau,
    EarlyStopping,
    ModelCheckpoint,
    TensorBoard)

# 编译模型来配置学习过程
ResNet_model.compile(optimizer=optimizer,loss='sparse_categorical_crossentropy',metrics=['accuracy'])
callbacks = [
#     ReduceLROnPlateau(verbose=1),
    # 提前结束解决过拟合
    # EarlyStopping(patience=10, verbose=1),
    # 保存模型
    ModelCheckpoint(checkpoints + 'resnet_train_{epoch}.tf', monitor='accuracy',verbose=0,
                    # 当设置为True时,将只保存在验证集上性能最好的模型
                    save_best_only=True, save_weights_only=True,
                    # CheckPoint之间的间隔的epoch数
                    period=2),
    TensorBoard(log_dir='logs')
]
# 模型训练
history = ResNet_model.fit(data_train, epochs = epoch,callbacks=callbacks,validation_data = data_test)
  • 训练和测试集的准确率如下,可以看到训练至15个epoch左右已经能达到很高的准确率了。
    [图片上传失败...(image-24bad1-1652018800776)]

五、训练自己的数据

1.项目目录如下

[图片上传失败...(image-2a36e9-1652018800776)]

2.分类模型训练

  • 需要将自己的数据集整理后放入以下项目目录中:

./img/train/

./img/test/

下目录设置,一个类别的图片放入一个文件夹中,如下:
[图片上传失败...(image-a0fda5-1652018800776)]
然后按顺序执行下述代码:

a数据预处理.ipynb
b加载并训练模型.ipynb
c模型评估及预测.ipynb

即可开始分类模型训练

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

六、完整代码地址

由于项目代码量和数据集较大,感兴趣的同学可以下载完整代码,使用过程中如遇到任何问题可以在评论区进行评论,我都会一一解答。

完整代码下载:
【代码分享】手把手教你:基于深度残差网络(ResNet)的水果分类识别系统

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容