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

系列文章

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

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

@

项目简介

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

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

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

正是因为我发现,大部分的网帖都只是针对原理的介绍,实现功能的相对较少。

[En]

It is precisely because I found that most of the online posts are only for the introduction of the principle, the realization of the function is relatively few.

如果你有以上想法,那你来对地方了!

[En]

If you have the above ideas, you are in the right place!

别说太多废话了,开门见山吧!

[En]

Don’t talk too much nonsense, just get to the point!

一、项目架构

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

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

二、图像数据

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

[En]

The spam image data used in this article are mainly divided into the following four categories:

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

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

每个类别涉及若干子类别,如危险废物文件夹和以下类别:

[En]

Each category involves a number of subcategories, such as the * hazardous waste * folder, and the following categories:

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

每类图片数量及图片总数情况如下,共计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.图像数据增强

由于我们用于训练的图像数量不大,我们可以通过以下方式对数据进行增强:

[En]

Because the number of images we use for training is not large, we can enhance the data in the following ways:

  1. 随机裁剪
  2. 旋转
  3. 翻转
图像增强功能会随机翻转图像并对其进行裁剪。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Image enhancement randomly flips the image and crops it.</font>*</details>
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分以上。

[En]

It can be seen that the training accuracy model soon reached a relatively high level, and the accuracy of the test set was more than 80 points.

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

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 单张图片测试

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

五、完整代码地址

由于有大量的项目代码和数据集,有兴趣的学生可以下载完整的代码。如果你在使用过程中遇到任何问题,可以在评论区发表评论或私下相信我,我会逐一回答。

[En]

Due to the large amount of project code and data set, interested students can download the complete code. If you encounter any questions during use, you can comment on them in the comments section or privately trust me, and I will answer them one by one.

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

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

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

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

(0)

大家都在看

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