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