基于百度AI的垃圾分类系统
本部分包括2个模块:
PC端垃圾分类和移动端微信小程序,下面分别给出各模块的功能介绍及相关代码。
1.3.1 PC端垃圾分类
PC端共分为获取access_token、载入图片函数、百度AI调用函数、获得html、main函数和GUI。
1.获取access_token
根据百度AI开放平台的技术文档,调用AI相关的接口向API服务接口使用POST发送请求,必须在URL中带上参数access_token,相关代码如下:
import requests
#client_id为官网获取的AK,client_secret为官网获取的SK
host='https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=
[AK]&client_secret=[SK]'
response = requests.get(host)
if response:
print(response.json())
2.载入图片函数
垃圾分类图像识别的图片来自本地文件,而百度AI要求识别的图片用64位编码,所以导入win32ui和base64库。win32ui库用于生成文件对话框;base64库用于对图片文件进行编码。
defimage load):
#导人图片函数
dlg= win32ui.CreateFileDialog(1)
#获取一个 PyCFileDialog类的对象,通俗讲就是一个对话框,参数1表示"打开文件"对话框dlg.SetOFNInitialDir os.path.abspath(os.curdir))#指示对话框,并打开目录
dlg.DoModal()
#显示对话框,返回一个整数,这个整数指定对话框的操作image path =dlg.GetPathName()
#以字符串的形式返回完整的文件名
f=open(image path,'rb')
#打开一个文件,设置需要打开的选项image =base64.b64encode(f.read())#以二进制方式打开图片文件
f.close
#关闭文件
return image
3.百度AI调用函数
根据百度AI的技术文件修改而成,通过request库和access_token参数对接口进行请求,会返回一个列表,取出其中准确度最高的第一个字典,把root和keyword两个键值存为一个新的列表keyword并返回,如图16-5所示。
defbaiduai query( image):
request url= "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced general"'24.fdaa8f2c2686c85f8b2eca9f32c1289a.2592000 1588922347.282335-18675408access token=request url=requesturl+"?access token=+ access token
data = parse.urlencode(f"image":image})headers =i'Content-Type':'application/x-www-form-urlencoded')request = requests.post(request url, data= data, headers = headersr = json.loads(request.text)key1 = r'result'][0]['keyword'root1 = r'result'][0]['root'keyword =[key1,root1]
return keyword
图1-5 列表
4.get_html函数
在网站https://lajifenleiapp.com/中获取其网页源码。
5.main函数
相关步骤如下:
1)根据API返回的内容爬取垃圾分类内容
借助beautifulsoup库,对网页https://lajifenleiapp.com/sk/和查询的关键字进行爬取,使用soup.find函数查找标签为div class=“col-md-9 col-xs-12” /div的节点,如果节点存在,则代表没有关键字相匹配的内容;如果soup.find的结果是None,则说明有该垃圾的相关信息,用string获得内容。
2)根据输入的关键字进行垃圾分类
输入关键字,爬取垃圾分类相应结果,如果未搜索到,则返回“没有与此物品名称匹配的词条”。
6.GUI
1.3.2 移动端微信小程序
本部分包括获取access_token、baidu-token-util、拍照搜索、语音搜索和数据库模块。
1.baiduaccesstoken.js
constrg=require('request-promise'/*获取百度ai AccessToken*/
exports.main=async(event,context)=>let apiKey ='wPnvuS8NCKeAj60HfGGO1Y3R'
grantType ='client credentials'
secretKey ='ljoNDsp2HIlb0ePwg0tGxwNxoW9idak4url ='https://aip.baidubce.com/oauth/2.0/tokenreturn newPromise(async(resolve,reject)=>try i
let data = await rq(
method: 'PoST',
url
form:
grant type":grantType,
"client secret":secretKey
"client id": apiKey
json:true
resolve(
code:0
data,
info:'操作成功!
}catch(error)console.log(error)if(!error.code)reject(error)resolve(error)
用与PC端相似的方法获取access_token、apiKey和secretKey都是在百度智能云注册后获取。
2.baidu-token-util.js
本模块解决accesstoken每隔一个月就失效的问题,如果accesstoken不存在就重新申请。
const getBdAiAccessToken=function()
return new Promise((resolve,reject)=>
console.log('getBdAiAccessToken!');
var time = wx.getStorageSync("time");
var curTime = new Date().getTime();
console.log('time:'+time+'----curTime:'+ curTime);console.log(parseInt((curTime -time)/1000/60/60/24));var timeNum =parseInt((curTime-time)/1000/60/60/24)console.log("token生成天数timeNum:"+ timeNum);
var accessToken = wx.getStorageSync("access token")console.log("缓存中的accessToken==="+ accessToken)if(timeNum>28|(accessToken ==""
accessToken==nullaccessToken==undefined))//token超过28天或者不存在,则调用云函数重新获取wx.cloud.callEunetion(
name:'baiduAccessToken'
success:res>
console.log("云函数获取token:"+ JSON.stringify(res))var access token =res.result.data.access tokenwx,setStorageSync("access token",access token);wx,setStorageSync("time",new Date().getTime( ));resolve(
access token':access token
fail:error =>{
console.error(
3.camera.js
此模块作用为获得百度AI token调用API,进行拍照识别垃圾并返回搜索结果。
4.index.js(录音)
此模块功能为识别录音并返回搜索结果。
5.garbage-sort-data.js(数据库)
建立数据库进行数据存储,数据库内容为各类垃圾常见类型。
1.4 系统测试
本部分包括PC端和微信小程序效果展示。
1.4.1 PC端效果展示
图像测试结果如表1-1所示,文字测试结果如表1-2所示。
1.4.2 微信小程序效果展示
界面效果如图1-6所示;拍照识别效果如图1-7所示;语音识别时长按方块按钮,右上方会有麦克风标记出现,效果如图1-8所示;选择垃圾种类“可回收物”,得到投放要求,并以首字母索引形式给出属于可回收物的垃圾,如图1-9所示;文字搜索效果如图