当前位置:   article > 正文

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

基于深度学习的垃圾分类

文章目录


前言

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

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


一、环境准备

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模型代码示例:

  1. class ResNet18(nn.Module):
  2. def __init__(self, num_class):
  3. super(ResNet18, self).__init__()
  4. self.conv1 = nn.Sequential(
  5. nn.Conv2d(3, 16, kernel_size=3, stride=3, padding=0),
  6. nn.BatchNorm2d(16)
  7. )
  8. # followed 4 blocks
  9. # [b, 16, h, w] => [b, 32, h ,w]
  10. self.blk1 = ResBlk(16, 32, stride=3)
  11. # [b, 32, h, w] => [b, 64, h, w]
  12. self.blk2 = ResBlk(32, 64, stride=3)
  13. # # [b, 64, h, w] => [b, 128, h, w]
  14. self.blk3 = ResBlk(64, 128, stride=2)
  15. # # [b, 128, h, w] => [b, 256, h, w]
  16. self.blk4 = ResBlk(128, 256, stride=2)
  17. # [b, 256, 7, 7]
  18. self.outlayer = nn.Linear(256*3*3, num_class)
  19. def forward(self, x):
  20. """
  21. :param x:
  22. :return:
  23. """
  24. x = F.relu(self.conv1(x))
  25. # [b, 64, h, w] => [b, 1024, h, w]
  26. x = self.blk1(x)
  27. x = self.blk2(x)
  28. x = self.blk3(x)
  29. x = self.blk4(x)
  30. # print(x.shape)
  31. x = x.view(x.size(0), -1)
  32. x = self.outlayer(x)
  33. return x

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

  1. batchsz = 32
  2. lr = 1e-4
  3. epochs =1
  4. device = torch.device('cpu')##cuda 改 cpu
  5. torch.manual_seed(1234)
  6. train_db = Data('train_data', 224, mode='train')
  7. val_db = Data('train_data', 224, mode='val')
  8. test_db = Data('train_data', 224, mode='test')
  9. train_loader = DataLoader(train_db, batch_size=batchsz, shuffle=True,
  10. num_workers=4)
  11. val_loader = DataLoader(val_db, batch_size=batchsz, num_workers=4)
  12. test_loader = DataLoader(test_db, batch_size=batchsz, num_workers=4)
  13. viz = visdom.Visdom()
  14. def evalute(model, loader):
  15. model.eval()
  16. correct = 0
  17. total = len(loader.dataset)
  18. for x, y in loader:
  19. x, y = x.to(device), y.to(device)
  20. with torch.no_grad():
  21. logits = model(x)
  22. pred = logits.argmax(dim=1)
  23. correct += torch.eq(pred, y).sum().float().item()
  24. return correct / total

四、训练结果

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

        

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

       

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

五、系统测试

测试的代码如下所示:

  1. def prediect(img_path):
  2. net=torch.load('model.pkl')
  3. net=net.to(device)
  4. torch.no_grad()
  5. img=Image.open(img_path)
  6. img=transform(img).unsqueeze(0)
  7. img_ = img.to(device)
  8. outputs = net(img_)
  9. _, predicted = torch.max(outputs, 1)
  10. # print(predicted)
  11. print(classes[predicted[0]])
  12. if __name__ == '__main__':
  13. prediect('./test/img_除湿袋_9.jpeg')

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

       


 

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/430501
推荐阅读
相关标签
  

闽ICP备14008679号