手把手教你:图像识别的垃圾分类系统

系列文章

手把手教你:人脸识别考勤系统

手把手教你:基于粒子群优化算法(PSO)优化卷积神经网络(CNN)的文本分类

@

项目简介

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

博主也参考过网上其他博主介绍:ResNet或图像分类的文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,只需要搭建出一个分类或预测系统即可。

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

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

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

不多废话,直接进入正题!

一、项目架构

整个项目的程序流程图如下,分别为:
1.图像数据预处理
2.模型训练
3.模型测试
三个模块

手把手教你:图像识别的垃圾分类系统

二、图像数据

本文用到的垃圾图片数据主要为以下四类:

1.厨余垃圾
2.可回收垃圾
3.其他垃圾
4.有害垃圾
如下:

手把手教你:图像识别的垃圾分类系统

其中每个类别又涉及多个子类别如, 有害垃圾文件夹中,中又涉及以下多个类别:

手把手教你:图像识别的垃圾分类系统

每类图片数量及图片总数情况如下,共计6038张图像数据:

手把手教你:图像识别的垃圾分类系统

三、环境介绍

1.环境要求

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

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

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

如下:

手把手教你:图像识别的垃圾分类系统

2.环境安装实例

环境都可以通过pip进行安装。如果只是想要功能跑起来,这边建议tensorflow安装cpu版的。

如果没使用过pycharm通过pip安装包的同学可以参考如下:

手把手教你:图像识别的垃圾分类系统
点开”终端”,然后通过pip进行安装tensorflow,其他环境包也可以通过上面的方法安装。

四、重要代码介绍

1.图像数据读取和预处理

## 读取图像,解决imread不能读取中文路径的问题
def cv_imread(filePath):
    # 核心就是下面这句,一般直接用这句就行,直接把图片转为mat数据
    cv_img=cv2.imdecode(np.fromfile(filePath,dtype=np.uint8),-1)
    # imdecode读取的是rgb,如果后续需要opencv处理的话,需要转换成bgr,转换后图片颜色会变化
    # cv_img=cv2.cvtColor(cv_img,cv2.COLOR_RGB2BGR)
    return cv_img

定义图像获取函数
def read_img(img_url_list,num):
    # 设置随机数种子
    random.seed(999)
    imgs = []
    err_img = []
    if num>len(img_url_list):
        print("抱歉,出错了,您设置的采样数量大于了图片张数,请调小img_num!")
    else:
        # 对图片数量进行采样
        img_url_list = img_url_list[:num]
        for img_url in tqdm(img_url_list):
            # 获取图像
            img = cv_imread(img_url)
            if img is None:
                err_img.append(img_url)
            else:
                # skimage.transform.resize(image, output_shape)改变图片的尺寸
                img = cv2.resize(img, (w,h))
                if np.asarray(img).shape == (w,h,3):
                    imgs.append(img)
                else:
                    err_img.append(img_url)
    return imgs

2.图像数据增强

因为我们用于训练的图像数量不算多,可以进行以下几种方式进行数据增强:

  1. 随机裁剪
  2. 旋转
  3. 翻转
图像增强将图像进行随机翻转,裁剪
def img_create_cut(imgs,label,cut_min,cut_max,cut_true):
    imgs_out = []
    label_out = []
    w = imgs[0].shape[0]
    h = imgs[0].shape[1]
    for i in tqdm(range(len(imgs))):
        # 添加原图
        imgs_out.append(imgs[i])
        label_out.append(label[i])
        if cut_true:
            # 原图随机裁剪,执行1次
            for f in range(1):
                # 生成裁剪随机数
                rd_num = np.random.uniform(cut_min, cut_max)
                # 生成随机裁剪长宽
                rd_w = int(w * rd_num)
                rd_h = int(h * rd_num)
                # 进行裁剪
                crop_img = tf.image.random_crop(imgs[i],[rd_w,rd_h,c]).numpy()
                # 重新调整大小
                re_img = cv2.resize(crop_img, (w, h))
                # 添加裁剪图像
                imgs_out.append(re_img)
                # 添加类标
                label_out.append(label[i])
        # 随机翻转
        for e in range(0,2):
            # 1:水平翻转,0:垂直翻转,-1:水平垂直翻转
            f_img = cv2.flip(imgs[i], e)
            # 添加翻转图像
            imgs_out.append(f_img)
            # 添加类标
            label_out.append(label[i])

    imgs_out,label_out = np.asarray(imgs_out, np.float32), np.asarray(label_out, np.int32)
    # 打乱顺序
    # 读取data矩阵的第一维数(图片的个数)
    num_example = imgs_out.shape[0]
    arr = np.arange(num_example)
    np.random.seed(99)
    np.random.shuffle(arr)
    imgs_out= imgs_out[arr]
    label_out= label_out[arr]
    return imgs_out,label_out

3.模型加载并训练

3.1 模型加载

手把手教你:图像识别的垃圾分类系统

3.2 模型训练

手把手教你:图像识别的垃圾分类系统

3.3 训练各项指标

可以看到,训练准确率模型很快就达到了一个比较高的水平,测试集准确率在80分以上。

手把手教你:图像识别的垃圾分类系统

4.结果预测

读取训练好的模型:

w = test_data.shape[1]
h = test_data.shape[2]
c = test_data.shape[3]
获取label数量
label_counts = len(classes)
加载模型结构
Resnetmodel = ResNetModel(input_shape=(w,h,c),classes=label_counts)
ResNet_model = Resnetmodel.ResNet50()
设置学习率
learning_rate=0.001
optimizer = keras.optimizers.Adam(learning_rate=learning_rate)
ResNet_model.compile(optimizer=optimizer,loss='sparse_categorical_crossentropy',metrics=['accuracy'])
ResNet_model.summary()

4.1 测试集模型评价

使用sklearn输出各类别评价指标:
其中类标:

0为:厨余垃圾
1为:可回收垃圾
2为:其他垃圾
3为:有害垃圾

手把手教你:图像识别的垃圾分类系统

4.2 单张图片测试

手把手教你:图像识别的垃圾分类系统

五、完整代码地址

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

完整代码下载:
手把手教你:图像识别的垃圾分类系统

Original: https://www.cnblogs.com/dawudexiaowu/p/16128709.html
Author: 小屋打AI
Title: 手把手教你:图像识别的垃圾分类系统

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/810904/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Django如何使用 mysql 数据库

    1.Django简介 Python下有多款不同的 Web 框架,Django是最有代表性的一种。许多成功的网站和APP都基于Django。 Django是一个开源的Web应用框架,…

    Python 2023年8月6日
    039
  • python nacos示例_flask项目注册到nacos,一开始没问题.过一会nacos监控那里实例数就没了…

    code import datetime import logging import random from flask import Flask from pyctuator.p…

    Python 2023年8月14日
    064
  • Pywebview + Flask 编写客户端软件

    文章目录 Pywebview + Flask 编写客户端软件 * 1.安装依赖库 2.创建 index.html 2.创建 flask 应用和路由 3.整合 Pywebview 和…

    Python 2023年8月14日
    049
  • PYTHON的一维转二维

    需求 实践中,很多数据是一维的,比如按客户编号构建的一张分地区、分阶段违约次数表。一维数组:现在需要将其转换为二维矩阵,各地区、各阶段的客户违约次数之和。既做了一维转二维的工作,也…

    Python 2023年8月6日
    075
  • python程序设计实训前言_Python语言程序设计课程论文——推送盒,箱子

    Python语言程序设计课程论文 项目名称:推箱子 摘要 在这个充满竞争的社会里,随着生活节奏的不断加快,人们的生活水平越来越繁忙,因此,越来越多人感到无比的烦躁与巨大的压力,这些…

    Python 2023年9月22日
    044
  • vivo大数据日志采集Agent设计实践

    作者:vivo 互联网存储技术团队- Qiu Sidi 在企业大数据体系建设过程中,数据采集是其中的首要环节。然而,当前行业内的相关开源数据采集组件,并无法满足企业大规模数据采集的…

    Python 2023年10月14日
    042
  • Pro3:js实现放大镜效果

    在我们平时见到很多购物网站都会有放大镜效果的出现,当我们将鼠标放在一个商品图片的上面,就会在旁边出现对应的放大效果。 ; 实现步骤 实现原理是非常简单的,实际上是两张图片,一张原图…

    Python 2023年11月6日
    036
  • 高级人工智能系列(一)——贝叶斯网络、概率推理和朴素贝叶斯网络分类器

    高级人工智能系列(一)——贝叶斯网络、概率推理和朴素贝叶斯网络分类器 初学者整理,如有错误欢迎指正。 原创地址 一、概率论基础 1.1 样本空间 Ω 样本空间是随机试验中所有可能的…

    Python 2023年10月28日
    045
  • yolo 车辆测距+车辆识别+单目测距(双目测距)

    基于yolo目标检测算法实现的车前道路中的车辆和行人检测,并且可以估测出目标与本车之间的距离 一、视频展示 yolo车距1 订阅专栏获得源码(提供完整代码,无需看下文) 二、单目测…

    Python 2023年9月29日
    041
  • 内容资产管理11问

    👇点击一键关注 主笔:邹小困、邝晴岚 主持人:增长黑盒分析师Emma 出品:增长黑盒研究组 前言 在这个信息爆炸的数据时代,各个行业正积极推进数字化转型,产业升级与技术赋能成为主题…

    Python 2023年9月15日
    056
  • 基于Python的统计建模

    目录 数据集 基于实例的线性回归的简要介绍 代码块 (1)数据的读入 (2)数据的理解 以”数据框形状”的角度去理解数据 以”简要信息&#822…

    Python 2023年9月3日
    072
  • 任意文件读取漏洞中flask SSTL 注入练习总结

    一、flask: Flask是一个使用python编写的 Web 应用框架,模板引擎使用 Jinja2 。j简单理解为,flask 是一个开发web 程序的python 第三方框架…

    Python 2023年8月11日
    054
  • 数据清洗Chap5——数据转换

    数据清洗-Chap 5-dataframe操作 5.1日期格式数据处理 5.2高阶函数数据处理 5.3字符串数据处理 5.1日期格式数据处理 1.Pandas中使用to_datet…

    Python 2023年8月16日
    061
  • DataFrame基础操作巩固——人口分析案例

    需求: 导入文件,查看原始数据 将人口数据和各州简称数据进行合并 将合并的数据中重复的abbreviation列进行删除 查看存在缺失数据的列 找到有哪些state/region使…

    Python 2023年8月18日
    041
  • django项目介绍

    命令行创建django项目: django-admin startproject 项目名项目创建成功后,命令行进入项目文件夹:cd 项目名命令行创建项目网站:django-admi…

    Python 2023年8月3日
    043
  • scrapy 下载中间件的调度与返回

    scrapy下载中间件的调用顺序以及返回值 本篇博文用以探索scrapy运行时调用下载中间件的调用顺序以及相应的返回值时的变化。 步骤1 运行一个正常的scrapy爬虫程序,示例代…

    Python 2023年10月3日
    049
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球