梁 炜
(重庆邮电大学 计算机科学与技术学院,重庆 400065)
随着科技和经济的迅速发展,人们的生活水平逐渐提高,产生的垃圾日益增多,总体来看,我国生活垃圾产生量在4亿吨以上[1],对垃圾的分类处理带来了极大的挑战。为了实现快捷的垃圾回收利用,2019年6月,《关于在全国地级及以上城市全面开展生活垃圾分类工作的通知》提出,自2019年起,全国地级及以上城市要全面启动生活垃圾分类工作;2020年年底,46个重点城市要基本建成垃圾分类处理系统;2022年前,各地级城市至少有一个区实现生活垃圾分类全覆盖;2025年年底前,全国地级及以上城市要基本建成垃圾分类处理系统[2]。以上的数据表明,垃圾分类正在快速实施和落实,让居民不得不去了解并且努力牢记垃圾的所属种类。所以,如何确保垃圾正确投放,正是居民们关注的问题。
本文结合深度学习和安卓开发,实现APP的垃圾分类识别功能,既保障了居民从源头上能准确掌握垃圾分类,又保障了垃圾场在后期回收、焚烧等工作的简洁性。
卷积神经网络(Convolutional Neural Networks,CNN)是一种可对人类视觉神经进行深层抽象的模型,主要特点是深度前馈和权值共享,无须人工设计特征以及特征提取,只需经过卷积和映射,便可直接得到识别结果,在复杂环境下具有一定的高效性和鲁棒性[3]。在2012年以前,卷积神经网络由于在一般的实际任务中表现不如SVM,Boosting等算法好,一直处于学术界边缘的地位。直到2012年的Imagenet图像识别大赛中,Hinton组提到的Alexnet引入了全新的深层结构和dropout方法,把错误率从25%以上降到了15%,颠覆了图像识别领域对CNN的认识。此后,CNN重新得到图像识别领域的重视,并在之后几年又依次引入了ZFNet,GoogleNet,VGGNet等。卷积神经网络的结构为输入层、隐藏层和输出层,其中,隐藏层又包括卷积层、池化层和全连接层3类常见构筑。在卷积层中对输入的垃圾图像进行矩阵运算,主要目的是对图像特征进行逐层学习;池化层主要负责对卷积层中输出的特征值进行降维处理,在整幅图像像素中强化图像的特征值;全连接层主要对上述步骤中提取的特征值进行分类运算,完成分类结果的输出。
由于Android开发是基于Java语言,所以需要先安装JDK,并在此基础上选择合适的Android开发平台,主要平台为Eclipse和Android studio。Eclipse是老牌的开发工具,早期开发Android程序基本都使用该软件;Android Studio是后来由开发了Android的Google亲自开发的、用来开发Android项目的工具,相比eclipse的性能更加强大。对比之下,本文选择使用Android Studio。
在2014年,在IamgeNet 大规模视觉识别挑战赛(ImageNet Large Scale Visual Recognition Challenge,ILSVRC)的网络结构中,为了解决ImageNet中的1 000类图像分类和定位问题,牛津大学计算机视觉实验室提出了VGGNet网络模型,并取得了分类第二、定位第一的好成绩。
对于类别个数多、样本个数多的数据集来说,一个较浅的网络无法训练出很好的效果,而VGGNet探索的是神经网络的深度与其性能之间的关系,通过反复堆叠3×3的小型卷积核和2×2的最大池化层,成功构建了11-19层的卷积神经网络[4]。本文基于常用的VGG16模型,搭建垃圾分类识别模型。VGG16的模型如图1所示。
图1 VGG16的模型
VGG16模型工作过程:(1)模型的输入图像大小为固定的224×224的RGB图像,输入时的唯一一个数据预处理就是各自减去 RGB 3个通道的均值。(2)VGG各种级别的结构都采用了5段卷积,每一段有一个或多个卷积层。同时,每一段的尾部都接着一个最大池化层,来缩小图片尺寸。总的来说,包含13个卷积层,5个最大池化层,3个全连接层和一个SoftMax分类器层。(3)卷积核为3×3,池化窗口为2×2。(4)连接3个全连接层,前两个全连接都是4 096,最后一个根据imagenet1 000类定为1 000个输出。(5)所有隐藏都进行ReLU激活。
本文选用ReLU函数作为激活函数,对卷积层和全连接层进行激活。计算速度非常快,只需要判断输入是否大于0,并且收敛速度远快于sigmoid和tanh。其函数解析式:
ReLU=max(0,x)
(1)
求损失值时,需要使用到两个函数。
第一步,先对网络最后一层的输出做一个softmax,通常是求取输出属于某一类的概率,即对输出的值归一化为概率值。假设在进入softmax函数之前,已经有模型输出C值,其中,C是要预测的类别数,模型可以是全连接网络的输出a,其输出个数为C,即输出为a1,a2,a3, ...,ac。所以,每个样本属于类别i的概率为:
(2)
第二步,将输出的yi和实际标签值都采用onehot(独热编码)形式,再使用softmax公式对输出向量[y1,y2,y3…]和样本的实际标签做一个交叉熵,具体如下:
(3)
其中,zi指代实际的标签中第i个的值,yi就是softmax的输出向量[y1,y2,y3…]中,第i个元素的值。
将垃圾分为可回收垃圾、厨余垃圾、有害垃圾和其他垃圾4大类,每种选择常见的20种RGB三通道图片各200张。对于垃圾的标签本文,采用垃圾种类/垃圾具体名称进行命名,如可回收垃圾/矿泉水瓶,以便在模型的输出中知道该垃圾属于的类别和具体的名称。
首先,基于原始的VGG16模型进行微调,原先的输出结果是对1 000个不同的类别进行判定,而在此是对80个图像,也就是垃圾种类的判断,因此,第一步是修改输出层的全连接数据。最后一层的输出通道设置成80,而对于其他部分,定义创建卷积层和全连接层的方法则无须做出太大改动。需要注意的是,VGG模型需要增加一个额外的参数trainable=False,其直接解释为在模型进行微调时,不需要变动权重值的层就可以通过设置trainable=False来确保权值不会改变。
其次,需要载入权重文件,注意应该将需要重新学习与调整的层进行剔除,除此之外的层都载入相应的权值。完成模型的微调后,需要通过分批的形式对输入的图像数据进行训练。对此,循环载入具有参数batch_size大小而定的图片数量,读取相应的图片标签作为数据标签一同进行训练,注意,在分批时,应对图像采取VGGNet在ImageNet上一样的图像预处理方式。
考虑到APP使用的便利性和居民对软件中存在垃圾广告等的厌恶程度,该APP采用极简模式,主界面只有显示屏和一个按钮,点击按钮,调用模型函数进行处理,并返回到显示界面。
将VGG16微调后的模型和其标签放入加载到内存当中去,当居民使用该APP进行拍照时,将手机拍摄的照片经过压缩和归一化处理,再输入到VGG16模型中,识别出相关的结果,并映射到对应的垃圾类别,最后,返回识别结果到界面。
连续不断的环境污染问题,让人们对环境重视了起来,开始提倡垃圾分类。本文基于VGGNet中的VGG16模型,制作了一个垃圾分类APP,让居民不再为垃圾所属种类所烦恼。由于本文数据集种类和图片样本还不完善,有可能会遇到不在训练集里的垃圾,所以,在以后的模型优化中,数据集的分类还需更加详细,种类应更加全面,也可以通过微调VGG16模型中其他层的权重值得到准确率更高的模型。