前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度学习实战之垃圾分类

深度学习实战之垃圾分类

原创
作者头像
陶陶name
发布2022-05-13 08:37:34
5840
发布2022-05-13 08:37:34
举报
文章被收录于专栏:陶陶计算机

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

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

1. 获取数据集

代码语言:txt
复制
这里笔者已经为大家提供了一个比较完整的数据集,所以大家不必再自己去收集数据了
代码语言:txt
复制
数据集链接:https://pan.baidu.com/s/1OhA7yQt9evqNIP5CIPjdgw
代码语言:txt
复制
提取码:Z5A1
代码语言:txt
复制
如下为数据集中的部分数据展示
代码语言:txt
复制
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200411172142392.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B1YmxpYzY2OQ==,size_16,color_FFFFFF,t_70#pic_center)
代码语言:txt
复制
这里就不过多的展示了,因为有些图片比较的不雅
代码语言:txt
复制
ok,不说题外话了,我们继续

2.预处理数据集

代码语言:txt
复制
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的网络结构
代码语言:txt
复制
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. 训练
代码语言:txt
复制
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

可视化训练结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到经过次的迭代后,模型的效果还是不错的,哈哈哈哈哈。。。。。。。

  1. 测试模型
    在这里插入图片描述
    在这里插入图片描述
    项目完整代码:https://github.com/taotao/garbage 有什么问题欢迎同笔者讨论:1017190168 最后希望大家能够动手实践实践最新版本:自笔者于2019年8月发出了深度学习实战之垃圾分类博文以来,已被访问上万次,几百次的收藏。同时也有很多的人询问笔者关于这个项目的问题。在这里非常的感谢大家的厚爱。其实很早就想再迭代一个垃圾分类项目出来,但是由于之前比较的忙,一直没有时间将其落实。最近没什么事情,笔者花了一些时间又重新做了一个垃圾分类系统。希望对大家学习研究有所帮助。新版本链接:深度学习之垃圾分类系统(识别率近99%) 垃圾分类识别系统(目标检测版)近期项目:新冠肺炎(Covid-19)病毒检测 欢迎大家阅读、获取。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档