120
-
-
科学技术创新 2020.26
基于神经网络的智能垃圾分类软件设计与实现
(桂林理工大学信息科学与工程学院,广西 桂林 541004)
余 东 敬 超 *
摘 要:为了解决居民垃圾分类知识储蓄不足,难以对垃圾进行分类的问题,开发一款 Android 平台的应用软件,以满足居民
对日常生活垃圾分类的需要。在 Android 本地部署垃圾分类神经网络模型 ResNeXt-101-32x16d-wsl 实现实时智能垃圾分类,同时
在 Android 本地使用 SQLite 存储垃圾物品信息,实现离线文字查询垃圾类别,同时借助“讯飞开放平台”的语音识别功能和本地
SQLite 数据库实现语音查询垃圾类别功能。Android 开发采用 Jetpack 组件和 MVVM 模式,经测试,软件及其各模块功能均能正常
运行,能够实现辅助居民对垃圾物品进行分类。
关键词:智能识别;语音查询;文字检索;垃圾分类;神经网络;Android 系统
中图分类号:TP311.52
文献标识码:A
文章编号:2096-4390(2020)26-0120-03
我国垃圾分类始于 20 世纪 90 年代,但垃圾分类仍然处于
本文设计的神经网络可以识别生活中常见的 4 大类 40 小
原地踏步的窘境,没有被居民接受,长期处于“试行”状态。直到
类垃圾物品,收集到的网上开源数据有 14000 张图片左右。此
2019 年 1 月 31 日,《上海市生活垃圾管理条例》 正式成为地方
外,使用多线程爬虫爬取百度图片 17 万张图片,爬取的图片是
性法规,并于 2019 年 7 月 1 日起强制实施,当地垃圾分类才取
根据关键词搜索出来的结果图片,除了我们需要的图片,还有
得显著效果。2020 年初,桂林市就宣布开始在全市全面启动生
许多相关图片,如搜索“烟头”的图片,会有烟蒂柱、戒烟图片等
活垃圾分类工作,垃圾分类已成为居民日常生活中所必须面对
脏数据,此外,还有图片是非 RGB 三通道图片,也是脏数据,都
的问题。
需要进行数据清洗。进行数据清洗之后,一共还有 73600 张图
本文设计的是一款运行在 Android 手机系统的 APP[1],通过
片,按照 8:2 的比例对数据进行划分为训练集和验证集。
在 Android 应 用 本 地 部 署 预 训 练 神 经 网 络
训练前需对数据进行预处理,将图片等比例缩放到 1:1,然
ResNeXt-101-32x16d-wsl 模型,实现视频实时智能垃圾分类,同
后再进行中心剪切,尺寸为 224*224,最后对图片进行水平翻
时在 APP 中构建生活中常见的垃圾物品,具有 6800 多条数据
转,高斯噪声,旋转角度等。
信息的数据库,从而实现语音和文字查询垃圾类别功能。最后
1.3 模型训练及部署
整体采用 C\S 模式,使用 Flask 构建远程服务器,实现客户端和
在本节主要过程为加载数据集,构建神经网络,训练神经
服务器之间的数据传输。经过单元测试和确认测试,AI 识别准
网络及神经网络部署。
确率在 90%以上,APP 各个功能模块运行正常,性能稳定可靠。
(1)加载数据集。使用 Torch 的 DataLoader 接口,加载本地
Android 程序设计采用 MVVM 模式,实现数据驱动、低耦合度、
磁盘已经经过清洗的数据集,在加载过程中,对数据进行打乱、
可复用性,同时做到了垃圾分类离线识别,大大提供了用户体
增强,其中数据增强的 Python 相关代码如下:
验。
1 神经网络设计
1.1 神经网络概述[2]
transforms.Compose([
Resize(img),# 调整图片大小
transforms.CenterCrop(size),# 中心裁剪
在缺乏大规模数据标注数据集的情况下,本文设计采用迁
transforms.ToTensor(),# 转化成张量
移学习来获得能够提取特征的 CNN 网络,采用的是神经网络
transforms.Normalize(mean=mean,std=std)
ResNeXt-101-32x16d-wsl 预训练模型,该模型对 Instagram(9.4
])
亿)数据集进行弱监督训练,对 ImageNet-1k 中 finetune 的参数
(2) 构 建 神 经 网 络 。 这 里 采 用 预 训 练 模 型
进行微调,具有很强的图片特征提取能力。
ResNeXt-101-32x16d-wsl,加载预训练参数之后,冻结网络参
首先根据图片类别数目确定神经网络结构,然后制作数据
数,最后修改网络的全连接层,使神经网络能够做到对 40 类图
集,对获取数据进行清洗、增强,确定超参数之后,开始训练神
片进行分类,其构建过程的 Python 相关代码如下:
经网络,在训练过程中记录损失函数值和验证集通过率,用于
def resnext101_32x16d_wsl(model_name):
参数调优,最后将神经网络部署到其他平台进行应用,实现 AI
# 加载预训练模型 resnext101_32x16d_wsl
识别功能。
1.2 构建数据集
model = torch.hub.load(model_name)
# 冻结参数:可以达到快速训练网络的目的
基金项目:本文受到广西高等教育本科教学改革工程项目(一般项目 B 类)资助。
作者简介:余东(1997-),男,汉族,河南信阳人,桂林理工大学信息科学与工程学院本科生,研究领域为计算机应用技术。
通讯作者:敬超(1983-),男,汉族,河南长葛人,副教授,博士,研究领域为人工智能,大数据处理及云计算。
2020.26 科学技术创新
121
-
-
for param in model.parameters():
转化工具 PyTorchMobile。
param.requires_grad = False
使用 PyTorchMobile 进行模型转化的 Python 相关代码如下:
# 修改全连接层
model.fc = nn.Sequential(
nn.Dropout(0.2),# 防止过拟合
nn.Linear(2048,classes_num)
)
return model
model = make_model() # 构建神经网络
model.load_state_dict() # 加载神经网络参数
model.eval() # 模型设置为评估模式
input_tensor = torch.rand() # 定义模型输入
mobile = torch.jit.trace() # 模型转换
mobile.save() # 保存转换后的模型
(3)模型训练。这个过程中涉及定义优化器和损失函数、是
否断点续训、参数保存等等,整体训练的 Python 相关代码如下:
def train_network(**arg):
# 加载模型
model = resnext101_32x16d_wsl()
# 定义优化器和损失函数
optimization = torch.optim.SGD()
loss_func = nn.CrossEntropyLoss()
# 是否断点续训
if resume:
# resume 为真时,加载过程参数
# 训练网络
for epoch in range(state_epoch,end_epoch):
loss_train = train() # 训练
acc_val = val() # 验证
# 保存模型
if acc_val >= best_acc:
图 1 损失函数值和验证集通过率变化图
2 软件实现
2.1 AI 识别垃圾类别功能实现
通 过 Jetpack CameraX 组 件 调 用 手 机 摄 像 头 ,在
# 保存网络参数和相关数据
PreviewView 控件中实现画面预览,自定义一个 Image analysis
训练和验证的过程相似,这里给出训练时的 Python 相关代
图像分析器,CameraX 会将视频画面的每一帧图片传入这个图
码:
def train():
model.train() # 训练模式
loss_data = []
# 损失值列表
# 开始训练
像分析器,在图像分析器中,调用神经网络模型对图片进行识
别,对识别结果进行解析之后,通过回调,将识别结果也就是图
片中物品所属的垃圾类别返回并显示在手机页面上,同时为了
防止光线过暗,添加了手电筒功能。
2.2 语音查询垃圾类别功能实现
for step,(x,y) in enumerate(train_data):
在科大讯飞官网注册一个账号并创建一个具有语音识别
out = model(x)
功能的应用,拿到 APPID 用于初始化语音识别 API。自定义一
loss = loss_func(out,y) # 计算损失值
个按钮控件 AudioButton 和录音弹窗 AudioDialog,重载录音按钮
loss_data.append(loss.item())
的 onTouchEvent()函数,并实现录音动画。
optimization.zero_grad()
loss.backward() # 反向传播
optimization.step() # 优化器
# 返回平均损失值
return np.mean(loss_data)
AudioButton 按钮具有三种状态:未按住按钮的正常状态、
一直按住的录音状态和手指移动到按钮范围之外的取消录音
状态,其中后两者分别对应 onTouchEvent 的 ACTION_DOWN 和
ACTION_MOVE 事件,不同的状态会触发不同的事件和弹窗效
果。按钮按下时,触发录音弹窗并开始录音,实时将录音发送到
讯 飞 开 放 平 台 进 行 语 音 识 别 , 通 过 对 语 音 识 别 API 的
SpeechRecognizer 设置,使得返回的结果是已经经过了分词处
经 过 测 试 确 定 模 型 训 练 的 超 参 数 , 对 预 训 练 模 型
理。如:“西瓜皮是什么垃圾”,返回的结果为:西瓜皮、是、什么、
ResNeXt-101-32x16d-wsl 训练了 16 批次之后,损失值和准确率
垃圾,经过简单的字符串匹配,确定用户要查询的关键词为“西
变化如图 1 所示,其中损失函数值最低为 0.248,验证集准确率
瓜皮”,在得到语音识别结果和关键词之后,通过回调将信息传
最高为 90.8%。
给 AudioButton,再回调给 Fragment,之后通过关键词查询数据
(4)模型部署。本设计需要将神经网络部署到 Android 客户
库,最后将语音识别结果和查询结果展示给用户。具体实现如
端,这里使用 PyTorch 官方在 PyTorch 版本 1.3 以上提供的模型
图 2 所示。
122
-
-
科学技术创新 2020.26
fun shareFuncation(context:Context) {
val intent = Intent(Intent.ACTION_SEND).apply {
putExtra(Intent.EXTRA_TEXT,shareText)
type = "text/plain"
}
context.startActivity(Intent.createChooser(intent," 分享 "))
}
反馈功能是通过第三方库 okhttp3 实现服务器和客户端之
间的数据传输,主要是将用户输入到文本框 EditText 中的信息
发送到远程服务器,服务器在成功接收信息之后向客户端返回
一个成功标志,并将反馈信息记录到服务器数据库中。
图 2 智能垃圾分类界面
2.3 文字检索垃圾类别功能实现
将 SearchView 和 RecyclerView 控件结合构成一个带下拉列
表的搜索框,在搜索框 SearchView 中输入垃圾物品的名称或关
键词,会实时对数据库进行查询并将搜索结果显示在下拉列表
RecyclerView 中 。 实 时 搜 索 主 要 是 重 载 SearchView.
OnQueryTextListener 中的 onQueryTextChange()方法,每 当 搜 索
框 SearchView 中内容发生改变时,都会被 onQueryTextChange()
方法监听到,在 onQueryTextChange()方法中根据搜索框里的内
容对数据库进行模糊查询,并将查询结果显示在 RecyclerView
中。文字检索页面效果图如 3 所示。
图 4 生活垃圾百科页面
本文基于 Android 平台设计了一款具有实时 AI 识别、语音
查询、文字检索等对垃圾进行分类的功能的移动应用软件[4],能
够满足居民日常垃圾分类的需要。一方面能够及时且有效解决
居民因垃圾分类知识储备不足而难以对垃圾物品进行正确垃
圾的问题;另一方面从长期来看,潜移默化中提高居民垃圾分
类的本领,同时也是对我国环保事业的一份助力。
参考文献
[1]赵慧峰.基于 MVVM 的 Android App 快速开发框架的设计与
实现[D].太原:山西大学,2017.
[2]Christopher M Bishop.
Neural
Network
for
Pattern
Recognition[M]. Clarendon Press,1996.
[3]刘姝君.浅谈 Android 应用开发中的 UI 设计[J].数字通信世
图 3 文字检索页面
界,2017,13(5):229-230.
2.4 生活垃圾百科功能实现
[4]祝永志,申健,朱盼盼等.Android 移动应用开发教程[M].北京:
该功能主要是对垃圾数据库数据分类展示的效果,主要是
清华大学出版社,2018.
将 TabLayout 和 ViewPager2 控件结合起来实现不同类别垃圾数
据页面可以左右滑动和点击 TabLayout 进行切换[3],在每个页面
中都是通过 RecyclerView 和 PagedListAdapter 对数据进行展示
的。实现界面如图 4 所示。
2.5 分享与反馈功能实现
分享功能是通过 Android 自身提供的底层 API 实现的,可
以将要分享的内容分享到手机上可以被分享的软件。相关代码
如下: