基于深度学习的垃圾分类识别系统

文章目录

  • 前言
  • 一、环境准备
  • 1.准备python、pycharm
  • 2.准备pytorch
  • 二、构建数据集
  • 1.准备图像
  • 2.图像标签
  • 三、代码实现
  • 四、训练结果
  • 五、系统测试

  • 前言

    根据一些资料和日常生活经验,一般情况下将日常垃圾分类为:厨余垃圾、其他垃圾、有害垃圾和可回收垃圾。

    该课题研究的垃圾自动分类系统能够帮助人们进行垃圾分类,防止因错误投放造成的污染,并且减少了后期垃圾分拣的工作量,从而缩短了整个处理过程所需要的时间,并且加强了居民内心深处垃圾分类的意识,对保护环境有着重要意义,进一步推动了高质量的绿色城市的建设。


    一、环境准备

    1.准备python、pycharm

                 去官网下载对应的版本即可

    2.准备pytorch

      (1)安装anaconda

           打开Anaconda Prompt,看到第一行左面有(base)即安装成功。如下图所示:

                 

           使用conda指令创建一个虚拟环境python3.5版本,输入命令:conda create-n python=3.5之后,弹出提示,输入y,即可安装;

           输入指令:conda activate pytorch进入pytorch环境,准备安装pytorch。如下图所示,当左面的base变成pytorch后,说明已经进入了pytorch环境。

                

       (2)安装pytorch

           打开官网找到推荐的版本,在命令行中输入对应命令,等待安装。最后检查是否安装成功,输入python,之后输入import torch,如果没有报错,则安装结束,如下图所示:

               

      

    二、构建数据集

    1.准备图像

         

    可回收垃圾 189种 39143张图片
    厨余垃圾 100种 20123张图片
    其他垃圾 44种 4531张图片
    有害垃圾 10种 1686张图片

            可回收垃圾包含有189个种类,有39143个训练项目;厨余垃圾有100个种类,包括20123个训练项目;其他垃圾有44个种类的垃圾,包含4531个项目;而有害垃圾有10个种类的垃圾,包含1686个训练项目。

    2.图像标签

     三、代码实现

               本文选择了ResNet网络结构,基于ResNet我们选择了ResNet50模型

    Resnet模型代码示例:

    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)
    
            # [b, 256, 7, 7]
            self.outlayer = nn.Linear(256*3*3, num_class)
    
        def forward(self, x):
            """
            :param x:
            :return:
            """
            x = F.relu(self.conv1(x))
    
            # [b, 64, h, w] => [b, 1024, h, w]
            x = self.blk1(x)
            x = self.blk2(x)
            x = self.blk3(x)
            x = self.blk4(x)
    
            # print(x.shape)
            x = x.view(x.size(0), -1)
            x = self.outlayer(x)
    
    
            return x

    训练网络train文件代码如下:

    batchsz = 32
    lr = 1e-4
    epochs =1
    
    device = torch.device('cpu')##cuda 改 cpu
    torch.manual_seed(1234)
    
    train_db = Data('train_data', 224, mode='train')
    val_db = Data('train_data', 224, mode='val')
    test_db = Data('train_data', 224, mode='test')
    train_loader = DataLoader(train_db, batch_size=batchsz, shuffle=True,
                              num_workers=4)
    val_loader = DataLoader(val_db, batch_size=batchsz, num_workers=4)
    test_loader = DataLoader(test_db, batch_size=batchsz, num_workers=4)
    
    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
    

    四、训练结果

    运行train文件后,我们可以看到经过数十次的迭代之后,最终网络模型的准确率还是比较可观的,最好的批次是第十次,其准确率达到98%,但是测试的最终的准确率大约为96.7%,其运行界面如下:

            

     与此同时生成了可视化结果图,结果图显示,随着迭代次数的不断增加,损失函数值逐渐变小并趋于0,并且训练数据的准确性逐渐达到1,具体结果图如下所示:

           

     系统整体准确率很高,实际应用性很强

    五、系统测试

    测试的代码如下所示:

    def prediect(img_path):
        net=torch.load('model.pkl')
        net=net.to(device)
        torch.no_grad()
        img=Image.open(img_path)
        img=transform(img).unsqueeze(0)
        img_ = img.to(device)
        outputs = net(img_)
        _, predicted = torch.max(outputs, 1)
        # print(predicted)
        print(classes[predicted[0]])
    
    if __name__ == '__main__':
        prediect('./test/img_除湿袋_9.jpeg')

    将数据集中一部分图片取出来作为测试的数据集,避免训练网络的数据和测试的数据重复的情况,确保了系统的实用性。将测试的图片导入其中,可以看到除湿袋被定义为其他垃圾,经查证后结果正确,结果图如下所示:

           


     

    总结

    本研究系统最终的准确率达到96%,经测试系统准确率还可以,仅供大家学习使用。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于深度学习的垃圾分类识别系统

    发表评论