赞
踩
根据一些资料和日常生活经验,一般情况下将日常垃圾分类为:厨余垃圾、其他垃圾、有害垃圾和可回收垃圾。
该课题研究的垃圾自动分类系统能够帮助人们进行垃圾分类,防止因错误投放造成的污染,并且减少了后期垃圾分拣的工作量,从而缩短了整个处理过程所需要的时间,并且加强了居民内心深处垃圾分类的意识,对保护环境有着重要意义,进一步推动了高质量的绿色城市的建设。
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,如果没有报错,则安装结束,如下图所示:
可回收垃圾 | 189种 | 39143张图片 |
厨余垃圾 | 100种 | 20123张图片 |
其他垃圾 | 44种 | 4531张图片 |
有害垃圾 | 10种 | 1686张图片 |
可回收垃圾包含有189个种类,有39143个训练项目;厨余垃圾有100个种类,包括20123个训练项目;其他垃圾有44个种类的垃圾,包含4531个项目;而有害垃圾有10个种类的垃圾,包含1686个训练项目。
三、代码实现
本文选择了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%,经测试系统准确率还可以,仅供大家学习使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。