1. 引言
随着我国经济水平的高速发展,人们的物质消费水平不断提升,相对应的垃圾产生量也在迅速增长,由垃圾产生的问题日益突出,人们的反映越来越强烈,推行垃圾分类势在必行,推行垃圾分类意义重大 [1] [2] [3] 。
近些年来深度学习技术的发展,为垃圾分类工作提供了新的手段。周滢慜 [4] 基于机器视觉技术,设计了一种基于Faster-RCNN卷积神经网络的目标检测模型改进算法,并采用了基于Hyper-Column像素分类的方案解决小尺寸目标分类难的问题,同时也改进了VGG16神经网络结构以提升识别精度与速度,而人机交互纠错机制的引入则提高了该垃圾分类模型识别的精度。黄国维 [5] 提出基于深度学习的城市智能分类垃圾桶设计,通过在NB-IOT智能物联网技术基础上搭建智能垃圾桶实时检测网络,在卷积神经网络基础上提出了垃圾智能分类算法与模型,仿真试验结果表明,该分类算法反应时间快,识别准确率高。岳晓明等 [6] 提出了一种基于CenterNet网络的垃圾分类模型,该模型可在各种复杂情况下对垃圾目标进行快而准的识别,并拥有25 ms的低耗时以及98.2%的高精度,解决了目前垃圾分类检测方法适用性较差、错误率较高、无法实时检测等问题,有望应用在工业输送过程中。王小燕等 [7] 对Faster RCNN、YOLOv3和RetinaNet三种网络模型在垃圾分类中的应用进行了研究,并依托于所搭建的分类识别实验平台设计了对照实验,结果表明采用基于Faster RCNN的垃圾分类识别算法,达成了垃圾分类检测的目标,极大地节省了人工成本,提升了不同种类垃圾分类检测效率,从而降低了环境受到垃圾污染的可能性。
然而在推行垃圾分类和研究智能化垃圾分类方法的过程中,遇到了许多现实问题以及局限性,本文的研究内容便来源于人们在实际生活中遇到的垃圾分类处理问题以及对目前已有的垃圾分类研究成果应用局限性的思考,具体问题以及局限性如下。
1) 垃圾分类仅依赖工作人员进行分拣与回收,存在着许多问题,如劳动强度过高、分拣效率较低、工作环境恶劣,影响工作人员身体健康等。
2) 目前国内还存在一些群众对垃圾分类的意识较为淡薄,不理解垃圾分类的重大意义,如老人和小孩等人群,由于主观学习能力较差,导致对垃圾的类别认识不够清晰,较容易错误投放垃圾。
3) 人们在外出时,既存在因为未随身携带垃圾分类手册而不了解所携带垃圾所属类别,导致无法进行准确投放,也存在因为不了解垃圾投放点的位置而无法及时将身边的垃圾准确投放至对应类别垃圾桶内,导致垃圾乱扔等问题。
4) 目前已有的研究内容主要分为基于硬件的分类系统以及基于深度学习的分类算法,前者基于大型分类机搭建而成,需要用户主动前往设备,后者主要是针对算法模型的研究,需要提前搜集垃圾图像进行检测,两者均具有无法随时随地进行垃圾分类识别和便捷性较低等缺点。
5) 截止本文确定研究内容前,利用移动端设备进行垃圾分类的相关研究非常少,且在各软件应用商店内均无相关类型的APP,人们对使用更加便捷的方式进行垃圾分类与投放有一定的需求。
基于上述分析可知,智能垃圾分类及投放点定位APP的开发,可有效提升人们对垃圾种类识别以及垃圾投放的高效性和便利性,也可提高人们进行垃圾分类的兴趣与意愿,同时也具有一定的探索意义。
2. 系统开发主要技术选型
2.1. Java
Java是一种开发语言,具有面向对象的特点,具有封装、继承、多态性的特性 [8] ,因此可以设计出低耦合的系统,使系统更加灵活、更加易于维护。广泛使用在Web后端开发以及客户端开发中 [9] 。由于Java虚拟机JVM的存在,使其开发的应用具有良好的可移植性。
2.2. SpringBoot
SpringBoot框架是Java平台上的一个开源应用程序框架,它提供了一个具有反转控制特征的容器。尽管SpringBoot框架本身对编程模型没有任何限制,但它在Java应用程序中的频繁使用使其非常流行,后来被用作EJB (EnterpriseJavaBeans)模型的补充,甚至是替代品。SpringBoot框架提供了一系列开发解决方案,如利用控制反转的核心特性,通过依赖注入实现控制反转,实现管理对象生命周期的容器化,各种持久化技术管理数据访问 [10] ,提供大量优秀的Web框架来促进开发等。
2.3. MyBatis-Plus
MyBatis-Plus (简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生 [11] 。甚至是替代品。它具有以下特性:
1) 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
2) 损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作。
3) 强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求。
4) 支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器——Sequence),可自由配置,完美解决主键问题。
2.4. MySQL
MySQL是一个关系型数据库管理系统 [12] ,由瑞典MySQL AB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。MySQL可以在各种平台上运行UNIX,Linux,Windows等。可以将其安装在服务器甚至桌面系统上。此外,MySQL是可靠,可扩展和快速的。
2.5. Android
安卓(Android)是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统 [13] 。主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。
2.6. XUI
XUI是一个简洁而又优雅的Android原生UI框架。其主要具有以下特点:
1) 简洁优雅,尽可能少得引用资源文件的数量,项目库整体大小不足1 M (打包后大约644 k)。
2) 组件丰富,提供了绝大多数我们在开发者常用的功能组件。
3) 兼容性高,框架还提供了3种不同尺寸设备的样式(4.5英寸、7英寸和10英寸),并且最低兼容到Android SDK 17,让UI兼容性更强。
4) 扩展性强,各组件提供了丰富的属性和样式API,可以通过设置不同的样式属性,构建不同风格的UI。
3. 系统功能需求分析
智能垃圾分类及投放点定位系统主要包括垃圾名称模糊搜索、垃圾信息上传、投放点信息上传、垃圾分类图鉴、语音识别、智能垃圾分类、投放点定位及导航等功能。该系统分为前端(即Android移动端APP)和后端(即服务器端应用)。
移动端功能需求简要说明如下。
1) 垃圾信息上传。用户点击主界面的垃圾信息上传按钮,进入垃圾信息上传界面,输入垃圾相关信息后,点击上传,即可将垃圾信息数据上传至数据库中。
2) 投放点信息上传。用户点击主界面的垃圾投放点信息上传按钮,进入垃圾投放点信息上传界面,输入垃圾投放点相关信息后,点击上传,即可将垃圾投放点信息数据上传至数据库中。
3) 垃圾分类图鉴。请求数据库中保存的所有已上传的垃圾信息,将垃圾信息数据展示给用户。
4) 语音识别。当用户使用语音识别功能时,APP会根据识别结果进行判断,若用户是询问最近的指定垃圾投放点的位置信息,则会跳转自可视化界面并自动进行导航;若用户是询问某一垃圾所属的分类类别,则会跳转到垃圾分类图鉴界面,并展示该垃圾的相关信息。
5) 智能垃圾分类器。用户可以通过操作界面的按钮打开手机相机,然后将所要进行检测的垃圾物放置在相机镜头内,APP将会自动检测镜头内垃圾物的名称以及所属类别,并将识别结果输出在操作界面上。
6) 投放点定位及导航。用户可通过主界面按钮进入地图界面,APP在后台自动向服务端发送请求,获取保存在数据库里的垃圾投放点的经纬度信息,然后调用百度地图API将其显示在地图上。若用户发起导航请求,APP则调用百度地图API通过获取用户当前所在位置,并计算离当前位置最近的投放点坐标,进而自动规划最佳导航路线。
服务器端功能主要是对垃圾、垃圾投放点等详细信息进行增、删、改、查等管理。
4. 技术架构
用户通过安卓端APP实时识别垃圾种类以及下载垃圾详情和投放点详情信息,而客户端APP内的垃圾与投放点信息数据均来自服务端,为了完成客户端与服务端的数据传输以及信息交互,本系统采用MySQL数据库进行垃圾与投放点信息数据和各种信息的存储,然后通过HTTP网络协议实现了客户端服务端的交互。为了提升系统的使用性能以及可维护性,开发该APP时使用了MVC架构,将掌上电力APP划分为多层,通过各个层来完成不同的任务,各层任务如下:
表现层:该层即系统运行所在的移动设备,用户通过该层与智能垃圾分类及投放点定位APP进行交互。
业务层:该层即APP内各个功能具体实现所在层次,用户进行操作后,APP通过该层进行逻辑处理以及通过HTTP与服务端进行网络交互,包括发送请求上传或获取垃圾与投放点信息等。
服务层:即服务端所在层次,该层主要对用户数据进行相关操作以及业务的核心处理,为用户提供服务。
数据层:大量的用户数据需要进行操作以及管理,该层主要利用数据库对用户数据进行管理以及维护。
图1展示了智能垃圾分类及投放点定位系统所采用的技术架构。

Figure 1. Technical architecture diagram of the system
图1. 系统技术架构图
5. 系统设计与实现
5.1. 关键问题解决方案
在开发智能垃圾分类及投放点定位APP过程中,需要解决的关键问题主要有两点,分别为APP调用垃圾分类模型对手机相机视频流中的垃圾物体进行分类识别以及将投放点位置相关信息展示在地图界面上并可以对其发起导航,下面将针对上述开发过程中所需要解决的关键问题进行具体说明并提出相应的解决方案。
5.1.1. MobileNetV2轻量化卷积神经网络
在开发APP中的智能垃圾分类模块时,需要对手机相机视频流中的垃圾物体进行分类识别,考虑到目前手机的处理器已发展完备具备较高的计算能力,同时为了给用户带来良好的体验,需保证识别的高效性和准确性,因此本文采用图像处理的方法对视频流中的帧图像进行分析处理,从而确定相机镜头下垃圾的名称以及所属种类并将结果信息直观展示在手机界面上。
在计算机视觉领域中,图像分类是非常重要的组成部分也是基本问题之一,行为检测、目标识别等复杂的视觉任务也是以它为基础进行研究的。传统的图像分类算法一般需要对图像进行手工特征提取来对图像进行描述,在进行分类时,需要将整幅图像作为输入,导致算法的计算量非常大,计算速度较慢,分类效率以及正确率也会因为图像的背景等冗余信息的干扰而降低,其次分类效果随着特征提取算法的不同而各有优劣,算法对不同图像的自适应程度较差。目前,基于深度学习的图像分类算法融合了特征提取及分类,无需人工进行图像特征提取,算法实现简单明了,实验结果精度较高,模型的鲁棒性较好。
在MobileNetV1网络结构基础上对其进行了改进并提出了MobileNetV2网络。相较于MobileNetV1,MobileNetV2的改进主要体现在如下四个方面。
1) 引入残差结构,先升维再降维,增强梯度的传播,显著减少推理期间所需的内存占用(Inverted Residuals)。
2) 去掉Narrow layer (low dimension or depth)后的ReLU,保留特征多样性,增强网络的表达能力(Linear Bottlenecks)。
3) 网络为全卷积的,使得模型可以适应不同尺寸的图像,使用RELU6 (最高输出为6)激活函数,使得模型在低精度计算下具有更强的鲁棒性。
4) 增加了MobileNetV2 building block,如下图2所示,若需要下采样,可在DWise时采用步长为2的卷积;小网络使用小的扩张系数(expansion factor),大网络使用大一点的扩张系数。
改进后的MobileNetV2网络完整结构如下图2所示,第一层是标准卷积,然后后面是前述的bottleneck结构。其中t是扩展因子,c是输出通道数,n是重复次数,s代表步长。如果步长为2,代表当前重复结构的第一个块步长为2,其余的步长为1,步长为2时则没有跳跃连接。

Figure 2. Structure of MobileNetV2 network
图2. MobileNetV2网络结构
经过使用ImageNet上的数据集进行模型训练和测试,MobileNetV2相较于MobileNetV1在降低参数量,缩小网络结构体积的前提下,Top1准确率有所提升,并且单帧图像检测耗时由113 ms下降到75 ms,分类识别速度显著提高。
针对手机相机视频流中的垃圾图像,采用MobileNetV2模型进行垃圾分类识别。MobileNetV2模型既可以满足高准确率要求,又可以进行对视频流中的垃圾图像进行实时分类,获得了分类速率以及分类效果之间的平衡。
5.1.2. 百度地图Android SDK
在开发APP中的投放点定位及导航模块时,首先需要在手机界面上显示网络地图图层,然后需要将投放点位置信息显示在网络地图上,并且能够对投放点位置发起导航。为了给用户带来良好的使用体验,在实现该功能时需要考虑网络地图操作的流畅性、投放点位置信息展示的明显性、导航路线的实时性等问题。
随着移动互联网的快速发展和人们对APP便利性的需求,旅游导航类、物流类、生活服务类APP在应用中标配了地图功能,这些功能越来越受到人们的欢迎,发挥着越来越重要的作用。另一方面,基于Android系统的移动终端设备,由于其便携性、稳定性和应用丰富性,拥有着大量的用户群体。基于此,国内对网络地图的研究取得了快速发展,出现了百度地图、腾讯地图、高德地图等地图应用,其中百度地图由于研究开展较早,用户基数较大,属于其中发展较好的。百度地图为安卓应用开发者提供了基于Android系统的地图SDK,SDK包含了丰富的功能接口,包括地图创建、与地图交互、在地图上绘制、导航、路线规划等。
在创建地图方面,基于百度地图Android SDK所创建的地图可清晰显示行政区划等信息并可以在普通线路地图、卫星地图和空白地图三种类型之间进行切换。所创建的地图支持双指操作进行放大和缩小,且操作流畅无卡顿,对道路、建筑物、绿地以及河流等重要的自然特征都有良好的展示。
在对地图进行绘制方面,百度地图Android SDK支持开发人员在网络地图界面上放置覆盖物,可支持放置的覆盖物种类丰富,包括绘制点标记、线、弧线和面等。其中点标记所使用的覆盖物图标可进行自定义修改,以满足不同场景下的不同需求。
在导航方面,百度地图Android SDK为开发人员提供了三种导航功能,包括步行导航、市内步行导航和骑行导航,并为每一种导航提供了调用接口。此外在步行导航功能里,SDK还额外支持了步行AR导航以及偏航纠正等功能,大大提升了用户体验。
5.2. Android端设计与实现
5.2.1. 垃圾信息上传功能模块与实现
垃圾信息填写与上传界面分为四个部分,分别为垃圾名称填写、垃圾种类选择、垃圾描述信息填写、垃圾示例图像采集以及垃圾信息确认上传。其中,垃圾名称填写输入框功能通过安卓原生自带的EditView组件实现,用户可在输入框内输入具体垃圾名称,系统会将输入或改动内容自动保存;垃圾种类选择功能是由安卓原生自带的CheckedTextView组件实现,用户点击该组件,则会弹出下拉选择框,共四种类型可选择,分别为厨余垃圾、可回收垃圾、其它垃圾、有害垃圾,系统会自动保存用户最新选择的结果;垃圾描述信息填写同垃圾名称填写功能一样,基于安卓原生自带的EditView组件实现,系统同样会将输入或改动内容自动保存;垃圾示例图像采集功能分为两种情况,第一种情况是选择相册内已存在的照片为示例图像,首先需要创建安卓自带的activity跳转工具类Intent,并为其配置Intent.ACTION_PICK属性,然后调用XUI框架里的XPageFragment.java类里的startActivityForResult方法并传入上面创建的工具类Intent,便可进入相册选择照片,选择完成后系统将保存结果图像并弹窗展示;另外一种情况则是选择使用手机相机进行拍照获取示例图像,首先同样需要创建安卓自带的activity跳转工具类Intent,并为其配置MediaStore.ACTION_IMAGE_CAPTURE属性,然后调用安卓自带FileProvider类中的getUriForFile方法传入当前上下文、APP文件包路径、照片占位文件等参数并获取返回结果,然后将该返回结果以及创建的Intent类传入XPageFragment.java类里的startActivityForResult方法作为参数,即可进入相机拍摄界面,拍摄完成后系统将保存结果图像并弹窗展示,此外,两种情况所获得的图像均可在弹窗中进行裁剪,该操作是基于UCrop开源的安卓端图像裁剪工具中的UCropActivity实现的,可对图像进行裁剪以及放大缩小等操作;垃圾信息上传确认由安卓原生提供的Button组件实现,并为其添加点击监听事件,当用户点击确认上传按钮时,系统将用户之前所填写或选择的垃圾名称、垃圾种类、垃圾描述信息数据进行封装,然后通过网络传输,将数据上传至云端服务器应用程序,并保存至数据库中,而垃圾示例图像数据则会由系统调用阿里云OSS所提供的Android SDK,将图像数据上传保存至阿里云OSS,即阿里云提供的对象存储服务。本功能模块实现效果如图3所示。

Figure 3. Design of garbage information upload function module
图3. 垃圾信息上传功能模块设计
5.2.2. 投放点信息上传功能模块设计与实现
投放点信息上传界面分为五个部分,分别为地理信息、位置描述、周围环境图像信息、备注信息以及确认上传按钮,其中地理信息是对当前位置的省市区乡镇街道信息进行描述,位置描述是对当前位置参考描述(如北京林业大学五号楼附近),两者都是通过调用BaiduMap Android SDK获取到的,在APP内调用BaiduMap Android SDK获取地理位置信息的步骤如下:① 位置信息数据的获取可通过新建子类MyListener并使之继承抽象类BDAbstractListener,然后重写子类中的onReceieveLocation方法;② onReceieveLocation方法会传入一个BDLocation类参数,该参数包含了获取当前位置相关信息的方法;③ 通过BDLocation的getProvince方法可以获取到当前所在省份,getCity方法可以获取到当前所在市,getDistrict方法可以获取到当前所在区县,getStreet方法可以获取到当前所在街道,getTown方法可以获取到当前所在乡镇,getLongitude方法可以获取到当前所在位置的经度,getLatitude方法可以获取到当前所在位置的纬度,getLocationDescribe方法可以获取到当前位置描述信息。
另外三个部分,即周围环境图像信息的采集、备注信息的填写以及确认上传按钮的功能与垃圾信息上传功能模块的垃圾示例图像采集、垃圾描述信息填写、垃圾示例图像采集所使用的技术基本一致,此处不再赘述。本功能模块实现效果如图4所示。

Figure 4. Design of the function module for uploading information on garbage disposal points
图4. 垃圾投放点信息上传功能模块设计
5.2.3. 垃圾分类图鉴功能模块设计与实现
垃圾类型选择列表分为四项,分别为厨余垃圾、可回收垃圾、其它垃圾以及有害垃圾,每个选项对应一个Button组件,点击Button即可跳转至对应类型的垃圾图谱卡片列表。该界面的设计实现过程如下:首先创建该界面对应的XML布局文件,父布局使用嵌套的双层LinearLayout,内部配置四个由XUI框架提供的基于安卓原生Button美化的RippleView用于展示四种垃圾类型按钮,并为其分别添加不同颜色,采用的是北京市推行的四大垃圾种类代表色,即绿色为厨余垃圾、灰色为其它垃圾、蓝色为可回收垃圾、红色为有害垃圾;然后创建对应的Fragment用于定义具体的执行逻辑,在该Fragment内为上述四个RippleView按钮配置具体的点击监听事件,即点击不同类型的RippleView按钮跳转至不同类型的垃圾图谱卡片列表界面。
垃圾图谱卡片列表界面用于展示所选择垃圾类型下,系统所有已存储的垃圾信息卡片列表,该界面的实现方式主要是通过如下方式:首先创建该界面的XML布局文件,父布局使用LinearLayout,在父布局内部嵌入在GitHub上开源的scwangUI框架中的SmartRefreshLayout布局,在SmartRefreshLayout布局中配置MaterialHeader、RecyclerView、MaterialFooter三个组件,分别用于下拉刷新样式、卡片样式、列表触底展示样式,由此便组成了垃圾图谱卡片列表界面整体布局;然后创建垃圾图谱卡片列表界面对应的Fragment用于定义具体的执行逻辑,在该Fragment内为RecyclerView内的每一项(即垃圾图谱卡片)配置具体的点击监听事件,即点击不同具体的卡片则会跳转至具体垃圾的垃圾图谱卡片界面。当用户由垃圾类型选择列表界面进入到该界面时,系统会自动向服务端应用程序发送获取指定种类垃圾数据的请求,应用程序收到请求后,从数据库中读取出所有该类型的垃圾数据,封装成JSON数据格式并返回给APP,当APP获取到该数据之后,解析成一个数据集合List,List中每一项数据代表一种垃圾,并将每一项数据对应到RecyclerView内的每一项数据,进行最终的展示。
垃圾图谱卡片界面用于展示具体某一垃圾的详细信息,该界面包含四个部分,从上至下,依次为垃圾名称、垃圾示例图像、所述类别、垃圾描述信息。此界面所采用的技术原理为:首先,创建此界面的XML布局文件,在父布局LinearLayout中嵌套一个ConstraintLayout,然后在ConstraintLayout内部由上至下,分别配置一个XUI框架提供的图像展示组件XUIAlphaImageView用于展示垃圾示例图像,一个TextView用于展示垃圾名称,一个TextView用于展示垃圾所属种类,一个TextView用于展示垃圾描述信息;其次,创建该界面的逻辑处理类Fragment.java,然后在该类内部为垃圾示例图像展示组件添加点击事件,具体为当首次点击该图像时,图片可放大,再次点击即可缩小至原来大小,并可重复点击。本功能模块实现效果如图5所示。

Figure 5. Design of function module of garbage classification picture book
图5. 垃圾分类图鉴功能模块设计
5.2.4. 语音识别功能模块设计与实现
为实现讯飞语音识别SDK的下载与导入,需进入科大讯飞开发者平台的控制台,在控制台里创建新应用,在创建新应用里输入所要创建的应用的基本信息,平台选择Android,创建完成后可在我的应用里看到APPID,此ID唯一且在APP开发中会使用到。点击添加新服务可以选择所要使用的服务,选择完成后点击下载即可进行下载,下载完成后进行解压,解压后的文件夹包括assets、libs、res等文件,将这些文件夹内的文件移至APP项目根目录下相同名称文件下内即可。
完成SDK的导入后,即可进行语音识别模块的开发,主要过程如下:创建该界面的XML布局文件,使用三层LinearLayout布局进行嵌套以保证内部组件位于屏幕中央,然后在内部添加TextView组件用于展示语音输入内容和Button按钮组件用于开始语音识别的点击;在语音识别逻辑实现类SpeechFragment.java中定义InitVoice方法,并在该方法内初始化SDK提供的语音识别监听器类RecognizerListener,在该RecognizerListener类的onResult方法(即监听结果回调方法)中编写逻辑判断代码,逻辑为当用户询问的问题包含某一垃圾名称时,则弹窗询问用户是否要查看该垃圾的详细信息,用户点击是便跳转至该垃圾的图谱界面,点击否弹窗则会消失;当用户询问的问题包含投放点、垃圾桶、垃圾箱等关键词时,则弹窗询问用户是否导航至离当前位置最近的垃圾投放点,用户点击是便跳转至导航界面,点击否则弹窗消失;当APP无法识别用户的语音输入时,则会提示用户匹配不到语音识别内容对应结果,请使用标准普通话重试。弹窗界面使用的是XUI框架内的DialogLoader类实现。本功能模块实现效果如图6所示。
5.2.5. 智能垃圾分类功能模块设计与实现
本模块的开发过程主要分为模型训练以及模型部署两个部分,接下来将对每部分的主要流程进行介绍。

Figure 6. Design of speech recognition function module
图6. 语音识别功能模块设计
1) 模型训练
进行图像分类模型的训练,首先需要安装深度学习环境,本文所使用的模型训练机器主要配置如表1所示。
完成环境配置后,需要准备数据集进行训练,本文所使用的垃圾图像数据集均通过Python爬虫脚本从网络上爬取得到,通过人工筛选爬取结果,最终确定了包含4种垃圾类型,119种垃圾,8万多张图像的数据集。
完成数据集的收集与整理之后,即可开始模型的训练,模型训练主要过程如下:
① 下载models-1.12.0并解压,为GitHub上谷歌开源的一个TensorFlow框架研究项目,其包含了模型训练所需要用到的脚本以及网络结构文件等;

Table 1. Table structure of model training machine configuration
表1. 模型训练机器配置表
② 将解压后的models文件夹中的slim文件夹加入环境变量;
③ 下载预训练的量化模型MobileNet_v2_0.75_224_quant.pb;
④ 修改MobileNetV2结构参数,进入slim/nets/MobileNet_v1.py文件,修改MobileNetV2以及MobileNet_v2_base方法中的depth_mutiplier为0.75;
⑤ 将③中下载的预训练模型解压至slim文件夹里,并将该预训练模型的绝对路径作为训练脚本中checkpoint_path参数的值,在slim中新建train_dir文件夹,用来保存训练模型后生成的ckpt节点文件;
⑥ 开始训练,调用slim文件夹内的train_image_classifier.py训练脚本并将准备完成的数据集路径传入。训练过程中的模型准确率以及Loss变化分别如图7和图8所示,模型训练完成经验证集测试,准确率为92%;

Figure 7. Graph of model training accuracy change
图7. 模型训练准确率变化图

Figure 8. Diagram of model training Loss change
图8. 模型训练Loss变化图
⑦ 导出pb模型文件,通过调用slim文件夹内的export_inference_graph.py脚本实现;
⑧ 转换pb模型为tflite模型,调用tensorflow依赖包下的lite/toco.py实现。
2) 模型部署
将上述得到的graph.tflite模型,分类标签文件label.txt文件,以及存有119种垃圾中英文名称对照和所属类别的data.txt文件移动至APP项目中的assets文件夹内。然后修改图像分类逻辑类ImageClassifier.java中的相关属性配置,将MODEL_PATH的值设置为模型文件graph.tflite的路径,将LABEL_PATH设置为标签文件labels.txt,将识别结果现实个数修改为1,即仅显示可能性最高的垃圾名称。在主界面逻辑处理类MainActivity.java中为智能识别图标添加点击事件,当用户点击该图标时,APP跳转至ImageClassifier.java,开启手机相机镜头,并将模型以及标签文件读取进内存对相机视频流图像中的垃圾物体进行分类识别,实现效果如下图9所示。

Figure 9. Design of functional modules for intelligent garbage classification
图9. 智能垃圾分类功能模块设计
5.2.6. 投放点定位及导航功能模块设计与实现
投放点定位功能开发主要过程如下,首先在AndroidManifest.xml中配置service,service内容包括三个属性:name、enabled、process,值分别为:com.baidu.location.f、true、:remote,目的是开启间隔定位功能(每隔n秒定位一次);然后创建地图界面的XML布局文件,布局内容为RelativeLayout父布局内嵌套一个com.baidu.mapapi.map.MapView组件,百度地图将会在此组件上进行展示,布局文件编辑完成后,创建地图逻辑处理类MapFragment.java,后续操作均在该类中进行。在initViews方法内加载刚创建的地图XML布局文件以及标记图标文件;创建继承自安卓原生自带的AsyncTask的子类MyTask进行异步编程(之所以采用异步编程,主要因为在程序开发中,相较于CPU处理的速度,网络请求的速度比之要慢很多,若用户处在网络状态较差的环境且APP在主线程中进行了网络请求操作,那么主线程就会进入阻塞等待网络返回,达到5秒之后应用便会崩溃重启)并重写doInBackground方法,在该方法内编写向服务端应用程序发送投放点信息请求,并将返回结果中每一投放点的经纬度信息封装为SDK中的MarkerOptions类集合,然后将该集合传入SDK中BaiduMap类里的addOverlays方法,即可在地图上指定经纬度位置进行定位与标记;在上述定位功能开发中所设置的标记图标添加点击监听事件,点击标记物会在屏幕底部进行弹窗,弹窗内容包括该投放点的位置描述信息、环境示例图像以及两个按钮——发起导航和取消,该弹窗由安卓原生自带的BottomSheetDialog类为基础进行设计实现,投放点的位置描述信息、环境示例图像均为投放点信息上传功能模块上传的数据,当用户点击发起导航按钮,即跳转至该投放点的步行导航界面,下面将对投放点导航功能开发进行简要介绍。
投放点导航功能开发主要过程如下,首先在地图逻辑处理类MapFragment.java中创建routePlanWithWalkParam方法,并以经纬度为参数,在该方法内部将传入的经纬度封装为SDK中的WalkNaviLaunchParam类实例,然后以WalkNaviLaunchParam类实例为参数实例化SDK中的WalkNavigateHelper类的实例,即导航控制类,并重写WalkNavigateHelper类中的onRoutePlanSuccess方法,在该方法内部实现导航界面的跳转;接着实现导航界面开发,创建导航界面逻辑处理类NavigateActivity.java,主要逻辑处理是在其onCreate方法中设置步行导航状态监听。本模块实现效果如下图10所示。

Figure 10. The design of location and navigation function module of the placement point
图10. 投放点定位及导航功能模块设计
5.3. 服务端设计
服务端应用程序搭建方面,使用IntelliJ IDEA编译器搭建基于SpringBoot框架的后台应用程序项目,项目分为三层架构,即Controller接口层、Service业务层以及Mapper持久层。开发阶段使用Swagger-2框架进行后台接口测试。持久层使用Mybatis-plus框架与MySQL数据库进行交互。同时,在基于Centos7系统的阿里云服务器上安装docker,在docker内安装Nginx及MySQL和Redis镜像并配置端口映射。项目开发完成后将代码打包为jar格式文件,再以此文件为基础制作docker镜像,创建项目的docker容器,将服务端应用程序运行于docker环境中,便于后续的更新与管理。
5.4. 数据库设计
智能垃圾分类及投放点定位系统使用了MySQL关系型数据库管理系统以及Redis非关系型数据库。MySQL数据库保用于保存用户上传的垃圾信息数据以及投放点信息数据。Redis数据库用于缓存服务端从数据库中取出的数据,加快访问数据,缓解MySQL数据库的读写压力。根据系统需求共有2张MySQL数据库表格。
垃圾信息表:记录所有用户上传的垃圾种类相关信息,其表结构如下表2所示。

Table 2. Table structure of garbage information
表2. 垃圾信息表结构
投放点信息表:记录所有用户上传的投放点相关信息,其表结构如下表3所示。

Table 3. Table structure of placement point information
表3. 投放点信息表结构
6. 系统测试
能否正确实现用户的功能需求,是评价APP实用性的关键,因此对智能垃圾分类及投放点定位系统的各个功能模块的测试是至关重要的,以此来确保功能的正确运行,下面将通过设计测试用例来对本文系统进行综合性测试。
服务端是系统的重要组成部分,对系统数据的存取与共享起到关键性作用。为测试服务端功能,表4为服务端应用程序的测试用例。

Table 4. Table of test cases for server applications
表4. 服务端应用程序测试用例表
客户端APP是软件的使用关键,由于其是直接面向用户的,因此对其测试需要更加的严密和周到。测试客户端是否能正常工作,其测试用例如表5。

Table 5. Table of test cases for client APP
表5. 客户端APP测试用例表
7. 结束语
为了响应国家推行垃圾分类的措施,开发了一个智能垃圾分类及投放点定位系统,系统主要包括垃圾信息上传、投放点信息上传、垃圾分类图鉴、语音识别、智能垃圾分类、垃圾投放点定位及导航等功能,分为Android端APP以及服务器后端应用程序。经过实际测试,本系统可以满足人们的日常垃圾分类需求。相比较于目前已有相似的系统或平台,该系统设计垃圾图鉴功能模块,收集大量的垃圾种类信息,帮助人们查找了解生活中遇到的垃圾及其对应的分类信息;设计语音识别模块,帮助人们便捷地查询所需要的垃圾种类信息或投放点信息,对于老人小孩等文字操作不便的人群,语音识别功能很好地解决了这一不便;设计投放点定位及导航模块,帮助人们了解所在地理位置周围的投放点信息,将身边的垃圾及时投放进对应分类的垃圾桶内;设计智能垃圾分类模块,在使人们在感受人工智能技术带来的便捷之外,提高了人们对于垃圾分类的兴趣,也使得人们可以对生活中的垃圾进行快速的识别与分类。
参考文献