垃圾分类微信小程序的设计开发.docx
- 文档编号:30870183
- 上传时间:2024-09-12
- 格式:DOCX
- 页数:24
- 大小:844.06KB
垃圾分类微信小程序的设计开发.docx
《垃圾分类微信小程序的设计开发.docx》由会员分享,可在线阅读,更多相关《垃圾分类微信小程序的设计开发.docx(24页珍藏版)》请在冰豆网上搜索。
信息系统设计
垃圾分类微信小程序设计报告
姓名:
学号:
班级:
专业:
指导教师:
目录
一、引言 3
二、项目背景 3
三、系统概述 3
2.1总体框架图 3
2.2系统流程图 4
2.3算法描述 6
2.4硬件环境 7
2.5软件环境 8
三、系统模块实现 9
3.1准备数据及数据集划分 9
3.2创建模型并编译 11
3.3模型训练及保存 12
3.4模型应用—微信小程序实现 14
四、系统测试 23
4.1图像识别算法测试 23
4.2垃圾分类微信小程序测试 23
五、问题分析 27
六、总结体会 27
参考书目及链接:
28
一、引言
垃圾分类,指按一定规定或标准将垃圾分类储存、分类投放和分类搬运,从而转变成公共资源的一系列活动的总称。
分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用;然而在日常生活中大部分人对垃圾分类还是有些不知所措的,对干垃圾、湿垃圾分的不是很清楚,由此本文就提出了使用深度学习的方法对垃圾进行分类,并将学习模型转移到微信小程序上,真正的方便居民的生活。
此项目主要由两大部分组成,首先基于python利用深度神经网络算法搭建图像识别算法,进而通过训练得到理想的模型,然后利用微信开发工具搭建垃圾分类微信小程序并利用训练出的模型实现垃圾分类整个系统的设计开发。
二、项目背景
国务院办公厅转发国家发展改革委、住房城乡建设部《生活垃圾分类制度实施方案》,部署推动生活垃圾分类工作,认为实施生活垃圾分类可以有效改善城乡环境,加快资源节约型、环境友好型社会建设,提高新型城镇化质量和生态文明建设水平。
在这一政策的推动下,上海、北京、广州、成都等相继推行强制垃圾分类举措。
然而,分类知晓率低、分类投放准确率低、资源利用率低等“三低”问题,成为了垃圾分类的“拦路虎”。
面对生活垃圾,有的居民表示不知道怎么分,比如困惑:
嗑瓜子吐的瓜子壳是餐厨垃圾还是其他垃圾?
用过的湿纸巾是可回收垃圾还是其他垃圾?
所以如果出现一个简单的微信小程序,能够随时随地通过手机拍照即可解决居民的垃圾分类困扰,方便居民进行垃圾分类,因此,本项目就是为了解决这一问题。
三、系统概述
对于图像分类任务,当前最先进的架构是卷积神经网络(CNN)。
无论是面部识别、自动驾驶还是目标检测,CNN均得到了广泛应用。
在本项目中,针对垃圾图片识别任务,设计了一个基于TensorFlow的VGG16卷积神经网络(CNN)模型,并将模型移植到移动端微信小程序中进行应用。
2.1总体框架图
图1-1总体框架图
2.2系统流程图
结合数据集的特点和任务需求,系统流程包括:
准备数据、创建模型并编译、训练模型并评估、模型存储、模型移植、微信小程序的调用。
python训练模型系统流程如图1-2:
图1-2训练模型系统流程
微信前端及后台系统流程如图1-3:
图1-3小程序后台系统框架
2.3算法描述
本次垃圾图片分类任务采用的是经典的深度学习模型VGG16。
VGG是Simonyan和Zisserman在文献《VeryDeepConvolutionalNetworksforLargeScaleImageRecognition》中提出卷积神经网络模型,其名称来源于作者所在的牛津大学视觉几何组(VisualGeometryGroup)的缩写。
该模型参加2014年的ImageNet图像分类与定位挑战赛,取得了优异成绩:
在分类任务上排名第二,在定位任务上排名第一。
针对VGG16进行具体分析发现,VGG16共包含:
13个卷积层(ConvolutionalLayer),分别用conv3-XXX表示,3个全连接层(FullyconnectedLayer),分别用FC-XXXX表示,5个池化层(Poollayer),分别用maxpool表示。
其中,卷积层和全连接层具有权重系数,因此也被称为权重层,总数目为13+3=16,这即是VGG16中16的来源。
(池化层不涉及权重,因此不属于权重层,不被计数)。
VGG16的突出特点是简单,具有很高的拟合能力,但同时缺点也很明显,即训练时间过长,调参难度大,需要的存储容量大,不利于部署。
例如存储VGG16权重值文件的大小为500多MB,不利于安装到嵌入式系统中。
图1-4Vgg16模型图
2.4硬件环境
描述系统的硬件环境,以及对系统有影响的关键硬件信息。
硬件名称
推荐配置
CPU
i7-6950X或i7-7700K及其以上高级型号
硬盘
品牌固态硬盘,容量256G以上
内存
总容量32G以上,根据主板组成4通道或8通道
显卡
NVIDIAGTXTITAN(XP)NVIDIAGTX1080ti、NVIDIAGTXTITAN、NVIDIAGTX1080、NVIDIAGTX1070、NVIDIAGTX1060等
主板
X299型号或Z270型号
电源
由主机机容量的确定,一般有显卡总容量后再加200W即可
手机
iOS6.5.8/安卓6.5.7及以上版本
2.5软件环境
1.Python环境
python环境建设推荐使用科学计算集成python发行版Anaconda,Anaconda是Python众多发行版中非常适用于科学计算的版本,里面已经集成了很多优秀的科学计算Python库。
建议安装Anconda34.2.0版本,目前新出的python3.6存在部分不兼容问题,所以建议安装python3.7注意:
windows版本下的tensorflow暂时不支持python2.7。
2.TensorFlow环境及Keras框架
由于Keras默认以Tensorflow为后端,本文默认采用Tensorflow作为Keras后端。
打开AnacondaPrompt
1)在C:
\Users\Lenovo\Anaconda3\envs(环境目录)里面新建一个环境目录,如:
DeepLearning,
2)在命令行窗口输入C:
\Users\Lenovo\Anaconda3>activateDeepLearning,激活DeepLearning。
3)在该环境中输入:
condainstalltensorflow-gpu,安装tensorflow-gpu,
Anaconda会自动显示匹配所需安装的包,你只需要输入y,同意后,等待数分钟,安装完成。
4)安装完tensorflow-gpu后,记得在新建的DeepLearning环境中安装基础的库
5)在CMD命令行或者Powershell中输入:
pipinstallkeras安装。
之后可以验证keras是否安装成功,在命令行中输入Python命令进入Python变成命令行环境:
importkeras没有报错,那么Keras就已经成功安装了
3.微信小程序及后台服务器环境
1)下载微信开发者工具v1.02.2003112,利用开发者微信扫描二维码登录后进行编写。
2)服务器配置为2核CPU,4GiB内存,CentOS7.664位操作系统,1Mbps带宽。
3)配置安全组,开放端口22,80,443,3306,5000。
4)后台需要安装Nginx及其编译工具和库文件,首先运行yum-yinstallmakezlibzlib-develgcc-c++libtoolopensslopenssl-devel,下载nginx源文件:
wgethttp:
//nginx.org/download/nginx-1.6.2.tar.gz后解压并编译安装。
5)安装php。
代码如下:
rpm-Uvhhttps:
//dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm-Uvh
yuminstallphp72wphp72w-cliphp72w-commonphp72w-develphp72w-embeddedphp72w-fpmphp72w-gdphp72w-mbstringphp72w-mysqlndphp72w-opcachephp72w-pdophp72w-xml
6)安装1.中的python环境。
三、系统模块实现
3.1准备数据及数据集划分
数据集包含10种垃圾,分别为cardboard(纸箱),glass(玻璃)、metal(金属)、paper(纸)、plastic(塑料)、其他废品(trash)、LED灯泡、瓜子、白菜、纽扣电池,数据数量小,每种大约300-400张图片,压缩后的尺寸为512*384,选用的数据集是从网上爬较然后筛选出具有明显特征的数据,主要是单一物体,单一背景的垃圾图片。
如表格1。
表格1数据集信息
序号
中文名
英文名
数据集大小
1
玻璃
Glass
497个图片
2
纸
Paper
590个图片
3
硬纸板
Cardboard
400个图片
4
塑料
Plastic
479个图片
5
金属
Metal
407个图片
6
一般垃圾
Trash
134个图片
7
纽扣电池
buttonbattery
171个图片
8
瓜子
Melonseed
228个图片
9
白菜
Chinesecabbage
258个图片
10
LED灯泡
LEDlamp
240个图片
然后将图片进行统一处理,对图片进行缩放和翻转,并将图片压缩为(150,150)大小,然后进行数据集划分,把10%的数据作为测试集,训练数据进行分批,每批16张图片。
具体代码如下:
defprocessing_data(data_path):
"""
数据处理
:
paramdata_path:
数据集路径
:
return:
train,test:
处理后的训练集数据、测试集数据
"""
train_data=ImageDataGenerator(
#对图片的每个像素值均乘上这个放缩因子,把像素值放缩到0和1之间有利于模型的收敛
rescale=1./225,
#浮点数,剪切强度(逆时针方向的剪切变换角度)
shear_range=0.1,
#随机缩放的幅度,若为浮点数,则相当于[lower,upper]=[1-zoom_range,1+zoom_range]
zoom_range=0.1,
#浮点数,图片宽度的某个比例,数据提升时图片水平偏移的幅度
width_shift_range=0.1,
#浮点数,图片高度的某个比例,数据提升时图片竖直偏移的幅度
height_shift_range=0.1,
#布尔值,进行随机水平翻转
horizontal_flip=True,
#布尔值,进行随机竖直翻转
vertical_flip=True,
#在0和1之间浮动。
用作验证集的训练数据的比例
validation_split=0.1
)
#接下来生成测试集,可以参考训练集的写法
validation_data=ImageDataGenerator(
rescale=1./255,
validation_split=0.1)
train_generator=train_data.flow_from_directory(
#提供的路径下面需要有子目录
data_path,
#整数元组(height,width),默认:
(256,256)。
所有的图像将被调整到的尺寸。
target_size=(150,150),
#一批数据的大小
batch_size=16,
#"categorical","binary","sparse","input"或None之一。
#默认:
"categorical",返回one-hot编码标签。
class_mode='categorical',
#数据子集("training"或"validation")
subset='training',
seed=0)
validation_generator=validation_data.flow_from_directory(
data_path,
target_size=(150,150),
batch_size=16,
class_mode='categorical',
subset='validation',
seed=0)
returntrain_generator,validation_generator
3.2创建模型并编译
数据加载进模型之后,需要定义模型结构,并优化函数、损失函数和性能指标。
这里直接调用VGG16模型作为卷积神经网络模型,包括13个卷积层(ConvolutionalLayer),3个全连接层(FullyconnectedLayer),5个池化层(Poollayer),然后接全连接层,神经元数目为256,再接relu激活函数。
再接全连接层,神经元个数为6,得到6维的特征向量,用于6个垃圾的分类训练,送入softmaxt分类,得到分类结果的概率output。
由于批量梯度下降法在更新每一个参数时,都需要所有的训练样本,所以训练过程会随着样本数量的加大而变得异常的缓慢。
随机梯度下降法(StochasticGradientDescent,简称SGD)正是为了解决批量梯度下降法这一弊端而提出的。
所以构建一个Optmizer优化器,optimizer=SGD(lr=1e-3,momentum=0.9),随机梯度下降1e-3的学习率。
最后数据分批训练,一批16张图片,分20轮训练。
具体代码如下:
defmodel(train_generator,validation_generator,save_model_path):
vgg16_model=VGG16(weights='imagenet',include_top=False,input_shape=(150,150,3))
top_model=Sequential()
top_model.add(Flatten(input_shape=vgg16_model.output_shape[1:
]))
top_model.add(Dense(256,activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(10,activation='softmax'))
model=Sequential()
model.add(vgg16_model)
model.add(top_model)
#编译模型,采用compile函数:
https:
//keras.io/models/model/#compile
pile(
#是优化器,主要有Adam、sgd、rmsprop等方式。
optimizer=SGD(lr=1e-3,momentum=0.9),
#损失函数,多分类采用categorical_crossentropy
loss='categorical_crossentropy',
#是除了损失函数值之外的特定指标,分类问题一般都是准确率
metrics=['accuracy'])
model.fit_generator(
#一个生成器或Sequence对象的实例
generator=train_generator,
#epochs:
整数,数据的迭代总轮数。
epochs=20,
#一个epoch包含的步数,通常应该等于你的数据集的样本数量除以批量大小。
steps_per_epoch=2704//16,
#验证集
validation_data=validation_generator,
#在验证集上,一个epoch包含的步数,通常应该等于你的数据集的样本数量除以批量大小。
validation_steps=272//16,
)
model.save(save_model_path)
returnmodel
3.3模型训练及保存
在定义模型架构和编译模型之后,要使用训练集去训练模型,使得模型可以识别图片。
这里,将使用训练集和测试集来拟合模型,并保存模型。
defevaluate_mode(validation_generator,save_model_path):
#加载模型
model=load_model('results/knn.h5')
#获取验证集的loss和accuracy
loss,accuracy=model.evaluate_generator(validation_generator)
print("\nLoss:
%.2f,Accuracy:
%.2f%%"%(loss,accuracy*100))
图表2测试详情
通过观察训练集和测试集的损失函数、准确率的大小来评估模型的训练程度,进而进行模型训练的进一步决策。
一般来说,训练集和测试集的损失函数(或准确率)不变且基本相等为模型训练的较佳状态。
对未知图片的泛化能力测试:
#把图片转换成为numpy数组
#导入图片
img=('test.jpg')
pil_im=Image.open(img)
img=Image.open(img)
"img.show()"
#对图片预处理
img=img.resize((150,150))
img=image.img_to_array(img)
x=np.expand_dims(img,axis=0)
#导入模型
model_path='results/knn.h5'
model=load_model(model_path)
#模型预测
y=model.predict(x)
3.4模型应用—微信小程序实现
1)后台服务器
A.Nginx部分配置
http{
server{
listen443ssl; //因为为https协议因此根据预定定义443端口
server_name;//此处填写域名
ssl_certificate/etc/nginx/certs/3558126.pem;//填写ssl证书位置
ssl_certificate_key/etc/nginx/certs/3558126.key;
ssl_session_timeout5m;
ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:
ECDHE:
ECDH:
AES:
HIGH:
!
NULL:
!
aNULL:
!
MD5:
!
ADH:
!
RC4;
ssl_protocolsTLSv1TLSv1.1TLSv1.2;
ssl_prefer_server_cipherson;
location~*\.php${
root/; //设置根目录
fastcgi_pass127.0.0.1:
9000;//设置fastcgiserver的地址
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAME/$fastcgi_script_name;
includefastcgi_params;//设置传递参数
}
location/{
proxy_passhttp:
//localhost:
7777;
proxy_http_version1.1;
proxy_read_timeout600s;
proxy_send_timeout12s;
root/wepro/; ///设置非php访问代理访问路径
}
}
B.图片接口API
php
header('Content-Type:
text/html;charset=utf-8');//定义ph
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 垃圾 分类 微信小 程序 设计 开发