周振林 周振林
首页
  • 前端文章

    • HTML
    • CSS
    • Tailwind CSS (opens new window)
    • JavaScript
    • Vue3
    • 其他
  • Spring
  • SpringMVC
  • Mybatis
  • Docker
  • 设计模式
  • 机器视觉
  • 安装教程
  • 其他教程
  • 基础
  • 虚拟化
  • OpenStack
  • 心情杂货
关于
收藏

周振林

IT界的小学生
首页
  • 前端文章

    • HTML
    • CSS
    • Tailwind CSS (opens new window)
    • JavaScript
    • Vue3
    • 其他
  • Spring
  • SpringMVC
  • Mybatis
  • Docker
  • 设计模式
  • 机器视觉
  • 安装教程
  • 其他教程
  • 基础
  • 虚拟化
  • OpenStack
  • 心情杂货
关于
收藏
  • Spring

  • SpringMVC

  • Mybatis

  • Docker

  • 设计模式

  • 机器视觉

    • 介绍
    • 计算机视觉的分类
    • 环境搭建
    • 深度学习的基本实现流程
    • PaddleX实现垃圾分类
      • PaddleX实现垃圾分类
        • B站教程地址
        • PaddleX的安装
        • 数据集的准备
        • 模型训练
        • 模型的预测
        • 模型训练的可视化
  • 安装教程

  • 其他教程

  • 后端
  • 机器视觉
周振林
2026-03-16
目录

PaddleX实现垃圾分类

# PaddleX实现垃圾分类

# B站教程地址

https://www.bilibili.com/video/BV18b4y1J7a6/

# PaddleX的安装

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

因为PaddleX依赖于pycocotools,如果报错:

Microsoft Visual C++ 14.0 is required
1

则需要安装visualcppbuildtools_full相应工具,下载链接如下:

链接: https://pan.baidu.com/s/1ey5eDKcfz8-_gD4sYd6XsA?pwd=dcgq 
提取码: dcgq
1
2

如果出现下载预训练模型报错

SSLError("Can't connect to HTTPS URL because the SSL module is not available)
1

需要安装Win64OpenSSL工具,下载链接如下:

链接: https://pan.baidu.com/s/1ey5eDKcfz8-_gD4sYd6XsA?pwd=dcgq 
提取码: dcgq
1
2

# 数据集的准备

数据集下载链接:

链接: https://pan.baidu.com/s/1ey5eDKcfz8-_gD4sYd6XsA?pwd=dcgq 
提取码: dcgq
1
2

本次实战为图片分类任务,数据集结构如下:

分别为分类的图片文件夹,建议有一个类别就建一个文件夹,方便管理。训练集和评价集的标签文件,格式如下:

**./3/933.jpg 3**
**./2/1670.jpg 2**
**./2/2175.jpg 2**
**./1/934.jpg 1**
**./1/1653.jpg 1**

**...**
1
2
3
4
5
6
7

前面为图片的相对路径,后面为对应的标签类别。labels.txt存放对应的标签,格式如下:

**有害垃圾**
**可回收垃圾**
**厨房垃圾**
**其他垃圾**
1
2
3
4

提供文件重命名的代码,用于每个文件夹里面图片的重命名

import os
 
def rename():
        res = os.listdir('./')
        for a in res:
                i = 0
                flag = os.path.isdir(a)
                if(flag == False):
                        continue
                path=a
                filelist=os.listdir(path)#该文件夹下所有的文件(包括文件夹)
                for files in filelist:#遍历所有文件
                    i=i+1
                    Olddir=os.path.join(path,files);#原来的文件路径                
                    if os.path.isdir(Olddir):#如果是文件夹则跳过
                            continue
                    filename=os.path.splitext(files)[0];#文件名
                    filetype=os.path.splitext(files)[1];#文件扩展名
                    Newdir=os.path.join(path,str(i)+filetype);#新的文件路径
                    os.rename(Olddir,Newdir)#重命名
rename()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

提供生成train.txt和eval.txt文件的代码,分类的比例为5:1

import os
import random
         
def ReadFileDatas():
    FileNamelist = []
    file = open('train.txt','r+')
    for line in file:
        line=line.strip('\n') #删除每一行的\n
        FileNamelist.append(line)
    #print('len ( FileNamelist ) = ' ,len(FileNamelist))
    file.close()
    return FileNamelist
 
def WriteDatasToFile(listInfo):
    file_handle_train=open('train.txt',mode='w')
    file_handle_eval = open("eval.txt",mode='w')
    i = 0
    for idx in range(len(listInfo)):
        str = listInfo[idx]
        #查找最后一个 “_”的位置
        ndex = str.rfind('_')
        #print('ndex = ',ndex)
        #截取字符串
        str_houZhui = str[(ndex+1):]
        #print('str_houZhui = ',str_houZhui)
        str_Result = str  + '\n'           #+ str_houZhui+'\n'
        #print(str_Result)
        if(i%6 != 0):
            file_handle_train.write(str_Result)
        else:
            file_handle_eval.write(str_Result)
        i += 1
    file_handle_train.close()
    file_handle_eval.close()

path = './'
res = os.listdir(path)
print(res)
with open("train.txt","w") as f:
    for i in res:
        if(os.path.isdir(i)):
            path1 = path + i
            res2 = os.listdir(path1)
            for j in res2:
                f.write(path1+"/"+j+" " + i +'\n')

listFileInfo = ReadFileDatas()
#打乱列表中的顺序
random.shuffle(listFileInfo)
WriteDatasToFile(listFileInfo)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

# 模型训练

借助于PaddleX,模型训练变得非常简单,主要分为数据集定义,数据增强算子定义,模型定义和模型训练四个步骤:

from paddlex import transforms as T
import paddlex as pdx

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()
])

train_dataset = pdx.datasets.ImageNet(		#定义训练集
    data_dir='rubbish',
    file_list='rubbish/train.txt',
    label_list='rubbish/labels.txt',
    transforms=train_transforms,
    shuffle=True)
eval_dataset = pdx.datasets.ImageNet(		#定义评价集
    data_dir='rubbish',
    file_list='rubbish/eval.txt',
    label_list='rubbish/labels.txt',
    transforms=eval_transforms)

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=64,
            eval_dataset=eval_dataset,
            lr_decay_epochs=[4, 6, 8],
            save_dir='output/mobilenetv3_small',
            use_vdl=True)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

具体参数的含义可以参照PaddleX的Github (opens new window)文档,在B站视频中也做了详细的讲解。

# 模型的预测

import paddlex as pdx
model = pdx.load_model('output/mobilenetv3_small/best_model')
result = model.predict('188.jpg')
print("Predict Result: ", result)
1
2
3
4

可以观察输出的结果是否正确。

# 模型训练的可视化

visualdl --logdir output/mobilenetv3_small --port 8001
1

打开浏览器输出网址,可以看到训练的各个参数曲线。

Last Updated: 2026/03/16, 22:14:06
深度学习的基本实现流程
开发环境配置

← 深度学习的基本实现流程 开发环境配置→

最近更新
01
深度学习的基本实现流程
03-16
02
环境搭建
03-16
03
计算机视觉的分类
03-16
更多文章>
Copyright © 2019-2026 鲁ICP备19032096号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×