深度学习实战之垃圾分类

垃圾分类,指按一定规定或标准将垃圾分类储存、分类投放和分类搬运,从而转变成公共资源的一系列活动的总称。分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用;然而我们在日常生活中认为对垃圾分类还是有些不知所措的,对干垃圾、湿垃圾……分的不是很清楚,由此我们就想到了使用深度学习的方法进行分类。

简介

本篇博文主要会带领大家进行数据的预处理、网络搭建、模型训练、模型测试

1. 获取数据集
这里笔者已经为大家提供了一个比较完整的数据集,所以大家不必再自己去收集数据了
数据集链接:https://pan.baidu.com/s/1OhA7yQt9evqNIP5CIPjdgw​
提取码:Z5A1
如下为数据集中的部分数据展示
在这里插入图片描述
这里就不过多的展示了,因为有些图片比较的不雅
ok,不说题外话了,我们继续

2.预处理数据集

import torch,visdom,time
import os,csv,random,glob
from PIL import Image
from torchvision import transforms
from torch.utils.data import DataLoader,Dataset

class Data(Dataset):
    def __init__(self,root,resize,model):
        super(Data, self).__init__()
        self.root=root
        self.resize=resize
        
        # dividing data
        if model=='train':
            self.images=self.images[:int(0.6*len(self.images))]
            self.labels=self.labels[:int(0.6*len(self.labels))]
        if model=='verify':
            self.images=self.images[int(0.6*len(self.images)):int(0.8*len(self.images))]
            self.labels=self.labels[int(0.6*len(self.labels)):int(0.8*len(self.labels))]
        else:
            self.images=self.images[int(0.8*len(self.images)):]
            self.labels=self.labels[int(0.8*len(self.labels)):]
def main():
    # show data
    viz = visdom.Visdom()
    db = Data('data', 64, 'train')

    x,y = next(iter(db))
    print('sample:', x.shape, y.shape, y)

    viz.image(db.normalize(x), win='sample_x', opts=dict(title='sample_x'))

if __name__ == '__main__':
    main()

这里需要对数据进行增强,增强的最终结果如下图所示:
在这里插入图片描述

  1. 搭建网络
    接下来进行搭建网络了,笔者这里使用的是resnet的网络结构
import  torch
from    torch import  nn
from    torch.nn import functional as F
class ResBlk(nn.Module):
  
    def __init__(self, ch_in, ch_out, stride=1):
     
        super(ResBlk, self).__init__()

        self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=stride, padding=1)
        self.bn1 = nn.BatchNorm2d(ch_out)
        self.conv2 = nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1)
        self.bn2 = nn.BatchNorm2d(ch_out)

        self.extra = nn.Sequential()
        if ch_out != ch_in:
            # [b, ch_in, h, w] => [b, ch_out, h, w]
            self.extra = nn.Sequential(
                nn.Conv2d(ch_in, ch_out, kernel_size=1, stride=stride),
                nn.BatchNorm2d(ch_out)
            )
class ResNet18(nn.Module):

    def __init__(self, num_class):
        super(ResNet18, self).__init__()

        self.conv1 = nn.Sequential(
            nn.Conv2d(3, 16, kernel_size=3, stride=3, padding=0),
            nn.BatchNorm2d(16)
        )
        # followed 4 blocks
        # [b, 16, h, w] => [b, 32, h ,w]
        self.blk1 = ResBlk(16, 32, stride=3)
        # [b, 32, h, w] => [b, 64, h, w]
        self.blk2 = ResBlk(32, 64, stride=3)
        # # [b, 64, h, w] => [b, 128, h, w]
        self.blk3 = ResBlk(64, 128, stride=2)
        # # [b, 128, h, w] => [b, 256, h, w]
        self.blk4 = ResBlk(128, 256, stride=2)

        self.outlayer = nn.Linear(256*3*3, num_class)

    def forward(self, x):
      
        return x

def main():
   
if __name__ == '__main__':
    main()

  1. 训练
import torch
from torch import optim, nn
import visdom
import torchvision
from torch.utils.data import DataLoader

from Data_Pre import Data
# from    resnet import ResNet18
from torchvision.models import resnet18

from utils import Flatten

batchsz = 32
lr = 1e-3
epochs = 20

device = torch.device('cuda')
torch.manual_seed(1234)

train_db = Data('data', 224, model='train')
val_db = Data('data', 224, model='verify')
test_db = Data('data', 224, model='test')
train_loader = DataLoader(train_db, batch_size=batchsz, shuffle=True,
                          num_workers=4)
val_loader = DataLoader(val_db, batch_size=batchsz, num_workers=2)
test_loader = DataLoader(test_db, batch_size=batchsz, num_workers=2)

viz = visdom.Visdom()

def evalute(model, loader):
    model.eval()

    correct = 0
    total = len(loader.dataset)

    for x, y in loader:
        x, y = x.to(device), y.to(device)
        with torch.no_grad():
            logits = model(x)
            pred = logits.argmax(dim=1)
        correct += torch.eq(pred, y).sum().float().item()
    return correct / total

可视化训练结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到经过次的迭代后,模型的效果还是不错的,哈哈哈哈哈。。。。。。。
5. 测试模型
在这里插入图片描述
有什么问题欢迎同笔者讨论:1017190168
最后希望大家能够动手实践实践

最新版本:

自笔者于2019年8月发出了深度学习实战之垃圾分类博文以来,已被访问上万次,几百次的收藏。同时也有很多的人询问笔者关于这个项目的问题。在这里非常的感谢大家的厚爱。其实很早就想再迭代一个垃圾分类项目出来,但是由于之前比较的忙,一直没有时间将其落实。最近没什么事情,笔者花了一些时间又重新做了一个垃圾分类系统。希望对大家学习研究有所帮助。

  • 90
    点赞
  • 529
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 148
    评论
下面是一个基于深度学习实现垃圾分类的数据训练的源代码示例,使用Keras框架和TensorFlow后端: ``` import tensorflow as tf from tensorflow import keras from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout from tensorflow.keras.preprocessing.image import ImageDataGenerator # 定义数据集路径和大小 train_dir = 'path/to/training/dataset' val_dir = 'path/to/validation/dataset' train_size = 2000 val_size = 800 # 数据增强 train_datagen = ImageDataGenerator(rescale=1./255, rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) val_datagen = ImageDataGenerator(rescale=1./255) # 从文件夹中读取数据并进行数据增强 train_generator = train_datagen.flow_from_directory(train_dir, target_size=(150, 150), batch_size=32, class_mode='categorical') val_generator = val_datagen.flow_from_directory(val_dir, target_size=(150, 150), batch_size=32, class_mode='categorical') # 构建模型 model = keras.Sequential([ Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)), MaxPooling2D(2, 2), Conv2D(64, (3, 3), activation='relu'), MaxPooling2D(2, 2), Conv2D(128, (3, 3), activation='relu'), MaxPooling2D(2, 2), Conv2D(128, (3, 3), activation='relu'), MaxPooling2D(2, 2), Flatten(), Dropout(0.5), Dense(512, activation='relu'), Dense(4, activation='softmax') ]) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.RMSprop(lr=1e-4), metrics=['acc']) # 训练模型 history = model.fit_generator(train_generator, steps_per_epoch=train_size//32, epochs=100, validation_data=val_generator, validation_steps=val_size//32) # 保存模型 model.save('garbage_classification_model.h5') ``` 在上述代码中,我们首先使用`ImageDataGenerator`来定义数据增强的方式,包括旋转、平移、剪切、缩放和水平翻转等操作。然后使用`flow_from_directory`方法从文件夹中读取数据并进行数据增强。接着构建一个包含多个卷积层、池化层和全连接层的卷积神经网络,最后编译模型并使用`fit_generator`方法对模型进行训练。最终,我们使用`save`方法将模型保存到本地。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 148
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陶陶name

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值