圖片識別,人臉識別,簽到小程序,借助百度AI智能識別功能
一,人臉簽到效果圖
我們做人臉識別簽到,其實(shí)就是要拿識別的人臉和數(shù)據(jù)庫里的人臉對比,相識度大于一定的值,就可以判定成功。

如我們識別的結(jié)果是98.295%,所以這里就可以認(rèn)定為簽到成功
1-1,效果圖
1-1-1,還未簽到

1-1-2,簽到

1-1-3,簽到成功

二,準(zhǔn)備工作
2-1,注冊百度開發(fā)者賬號
我們這里使用了百度的圖片識別技術(shù),所以在使用之前我們要現(xiàn)在注冊百度開發(fā)者賬號,官方地址:https://ai.baidu.com
注冊地址:https://login.bce.baidu.com
至于如何注冊,這里不需要我再教了吧,大家自行注冊就行了。
我們主要用到的是人臉識別技術(shù)


2-2,注冊完記得要實(shí)名下
現(xiàn)在使用百度圖片識別,必須要實(shí)名認(rèn)證下。

根據(jù)自己的情況選擇認(rèn)證方式
學(xué)習(xí)的話,只需要個人認(rèn)證即可。

2-3,創(chuàng)建人臉識別應(yīng)用
我們這里主要使用的是百度的人臉對比功能,就是事先把要識別人的照片存到百度數(shù)據(jù)庫,然后打卡時,讓對應(yīng)的人拍好照,和數(shù)據(jù)庫里存的人臉圖片進(jìn)行對比,相似度達(dá)到一定數(shù)值,比如90%相似度,就可以認(rèn)為識別成功,進(jìn)行簽到即可。

估計(jì)百度是在為后期收費(fèi)做準(zhǔn)備,但是目前還有免費(fèi)資源可以領(lǐng)取。既然可以白piao就先領(lǐng)取免費(fèi)的。即便后期收費(fèi)了,咱們學(xué)習(xí)使用估計(jì)也用不了太多,幾毛錢的估計(jì)就夠咱們學(xué)習(xí)用的了。
人臉識別官方文檔:https://cloud.baidu.com/product/face
點(diǎn)擊免費(fèi)領(lǐng)取資源

既然免費(fèi),當(dāng)然全部領(lǐng)取了啊。

領(lǐng)取完,耐心等待生效即可。如果你在學(xué)習(xí)的時候,不能在免費(fèi)領(lǐng)取了,那就花幾毛錢付費(fèi)下也行的,基本上幾毛錢就夠咱們學(xué)習(xí)使用了。

上面該領(lǐng)的都領(lǐng)完以后,我們就來創(chuàng)建應(yīng)用吧。

默認(rèn)人臉識別相關(guān)的都已經(jīng)勾選了

選個人即可。

創(chuàng)建好以后,下面兩個東西我們后面會用到,知道在哪里即可。

三,接入人臉識別
3-1,官方文檔
我們在自己的小程序里接入人臉識別,就必須去看百度官方的技術(shù)文檔。
文檔地址:https://ai.baidu.com/ai-doc/FACE/Lk37c1tpf
我們這里主要就看這個人臉對比文檔。

官方文檔里并沒有給出小程序里如何調(diào)用的代碼。

所以接下來的學(xué)習(xí)要跟緊石頭哥的腳步,石頭哥手把手的帶大家實(shí)現(xiàn)小程序端的調(diào)用。
3-2,人臉注冊
我們要想實(shí)現(xiàn)人臉識別,就需要一開始先在百度的可視化人臉庫里注冊人臉,要調(diào)用的接口如下。

在調(diào)用這個之前,我們需要先去獲取對應(yīng)的acess_token,所以接下來我們要做的第一步就是獲取acess_token
3-2-1,獲取acess_token
我們后面做的所有操作,基本上都要獲取這個。
所以我把源碼貼出來給到大家,client_id和client_secret記得換成你自己的。
wx.request({
? ? ?url: 'https://aip.baidubce.com/oauth/2.0/token',
? ? ?data: {
? ? ? ?grant_type: 'client_credentials',
? ? ? ?client_id:, //應(yīng)用的API Key
? ? ? ?client_secret: ?//應(yīng)用的Secret Key
? ? ?},
? ? ?header: {
? ? ? ?'Content-Type': 'application/json' // 默認(rèn)值
? ? ?},
? ? ?success: res => {
? ? ? ?this.setData({
? ? ? ? ?token: res.data.access_token //獲取到token
? ? ? ?})
? ? ? ?console.log('獲取到的token', this.data.token)
? ? ?}
? ?})
3-2-2,拍人臉照
第二步和第三步要同時進(jìn)行,所以我把代碼放到下面第三步
3-2-3,注冊人臉到百度人臉庫
我們在拍照以后,獲取到圖片,并通過 wx.getFileSystemManager().readFile()方法把圖片轉(zhuǎn)換為base64,因?yàn)榘俣刃枰@樣格式的數(shù)據(jù)
對應(yīng)的代碼如下:
? ?var that = this;
? ?//拍照
? ?const ctx = wx.createCameraContext()
? ?ctx.takePhoto({
? ? ?quality: 'high',
? ? ?success: (res) => {
? ? ? ?that.setData({
? ? ? ? ?src: res.tempImagePath //獲取圖片
? ? ? ?})
? ? ? ?//圖片base64編碼
? ? ? ?wx.getFileSystemManager().readFile({
? ? ? ? ?filePath: that.data.src, //選擇圖片返回的相對路徑
? ? ? ? ?encoding: 'base64', //編碼格式
? ? ? ? ?success: res => { //成功的回調(diào)
? ? ? ? ? ?that.setData({
? ? ? ? ? ? ?base64: res.data
? ? ? ? ? ?})
? ? ? ? ? ?//第三步:上傳人臉進(jìn)行注冊
? ? ? ? ? ?wx.request({
? ? ? ? ? ? ? ?url: 'https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=' + that.data.token,
? ? ? ? ? ? ? ?method: 'POST',
? ? ? ? ? ? ? ?data: {
? ? ? ? ? ? ? ? ?image: that.data.base64,
? ? ? ? ? ? ? ? ?image_type: 'BASE64',
? ? ? ? ? ? ? ? ?group_id: 'users', //自己建的用戶組id
? ? ? ? ? ? ? ? ?user_id: app.globalData.userInfo.phone, //學(xué)號
? ? ? ? ? ? ? ? ?user_info: app.globalData.userInfo.name //存儲學(xué)生姓名
? ? ? ? ? ? ? ?},
? ? ? ? ? ? ? ?header: {
? ? ? ? ? ? ? ? ?'Content-Type': 'application/json' // 默認(rèn)值
? ? ? ? ? ? ? ?},
? ? ? ? ? ? ? ?success(res) {
? ? ? ? ? ? ? ? ?that.setData({
? ? ? ? ? ? ? ? ? ?msg: res.data.error_msg
? ? ? ? ? ? ? ? ?})
? ? ? ? ? ? ? ? ?console.log("人臉注冊返回結(jié)果", res)
? ? ? ? ? ? ? ? ?//做成功判斷
? ? ? ? ? ? ? ? ?if (that.data.msg == 'SUCCESS') { //微信js字符串使用單引號
? ? ? ? ? ? ? ? ? ?wx.showToast({
? ? ? ? ? ? ? ? ? ? ?title: '注冊成功',
? ? ? ? ? ? ? ? ? ? ?icon: 'success',
? ? ? ? ? ? ? ? ? ? ?duration: 2000
? ? ? ? ? ? ? ? ? ?})
? ? ? ? ? ? ? ? ? ?// that.registerFace()
? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ?}),
? ? ? ? ? ? ?//失敗嘗試
? ? ? ? ? ? ?wx.showToast({
? ? ? ? ? ? ? ?title: '請重試',
? ? ? ? ? ? ? ?icon: 'loading',
? ? ? ? ? ? ? ?duration: 500
? ? ? ? ? ? ?})
? ? ? ? ?}
? ? ? ?})
? ? ?} //拍照成功結(jié)束
? ?}) //調(diào)用相機(jī)結(jié)束
這幾個參數(shù),要記得換成自己的
group_id: 'users', //自己建的用戶組id
? ?user_id: app.globalData.userInfo.phone, //學(xué)號或者用戶電話能唯一標(biāo)識用戶的
? ?user_info: app.globalData.userInfo.name //存儲用戶姓名
我們注冊完以后,可以在百度人臉庫里看到這條數(shù)據(jù),可以看到我們創(chuàng)建的users表。
3-3,查看人臉庫
我們進(jìn)入百度的控制臺,找到如下的類目
然后點(diǎn)開用戶123,就可以看到他注冊的人臉照片。
四,人臉比對
我們上面注冊好人臉以后,接下來就可以使用人臉打卡功能了。
使用之前還是第一步,獲取acess_token
4-1,獲取acess_token
?// acess_token獲取
?getTokenInfo() {
? ?var that = this
? ?wx.request({
? ? ?url: 'https://aip.baidubce.com/oauth/2.0/token',
? ? ?data: {
? ? ? ?grant_type: 'client_credentials',
? ? ? ?client_id: app.globalData.client_id, //應(yīng)用的API Key
? ? ? ?client_secret: app.globalData.client_secret //Secret Key
? ? ?},
? ? ?header: {
? ? ? ?'Content-Type': 'application/json' // 默認(rèn)值
? ? ?},
? ? ?success(res) {
? ? ? ?that.setData({
? ? ? ? ?token: res.data.access_token //獲取到token
? ? ? ?})
? ? ? ?console.log(that.data.token)
? ? ?}
? ?})
?},
4-2,人臉比對
核心代碼如下:
//拍照并編碼
?takePhoto() {
? ?let that=this
? ?const ctx = wx.createCameraContext()
? ?ctx.takePhoto({
? ? ?quality: 'high',
? ? ?success: (res) => {
? ? ? ?//圖片base64編碼
? ? ? ?wx.getFileSystemManager().readFile({
? ? ? ? ?filePath: res.tempImagePath, //選擇圖片返回的相對路徑
? ? ? ? ?encoding: 'base64', //編碼格式
? ? ? ? ?success: res => { //成功的回調(diào)
? ? ? ? ? ?that.signInFace(res.data)
? ? ? ? ?}
? ? ? ?})
? ? ?}
? ?})
?},
?//上傳人臉進(jìn)行 比對
?signInFace(base64) {
? ?var that = this
? ?if (base64 != "") {
? ? ?wx.request({
? ? ? ?url: 'https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=' + that.data.token,
? ? ? ?method: 'POST',
? ? ? ?data: {
? ? ? ? ?image: base64,
? ? ? ? ?image_type: 'BASE64',
? ? ? ? ?group_id_list: 'users' //自己建的用戶組id
? ? ? ?},
? ? ? ?header: {
? ? ? ? ?'Content-Type': 'application/json' // 默認(rèn)值
? ? ? ?},
? ? ? ?success(res) {
? ? ? ? ?console.log("人臉對比返回結(jié)果", res)
? ? ? ? ?if (res.data.error_msg == "match user is not found") {
? ? ? ? ? ?wx.showModal({
? ? ? ? ? ? ?title: '簽到失敗',
? ? ? ? ? ? ?content: '請先注冊人臉才可以人臉使用',
? ? ? ? ? ?})
? ? ? ? ?}
? ? ? ? ?if (res.data.error_msg == "SUCCESS") {
? ? ? ? ? ?that.setData({
? ? ? ? ? ? ?msg: res.data.result.user_list[0].score,
? ? ? ? ? ?})
? ? ? ? ? ?// console.log(res)
? ? ? ? ? ?if (that.data.msg > 80) { //相似度大于80
? ? ? ? ? ? ?console.log('人臉識別成功')
? ? ? ? ? ?} else {
? ? ? ? ? ? ?wx.showToast({
? ? ? ? ? ? ? ?title: '人臉識別失敗',
? ? ? ? ? ? ?})
? ? ? ? ? ?}
? ? ? ? ?} else {
? ? ? ? ? ?wx.showToast({
? ? ? ? ? ? ?title: '人臉識別失敗',
? ? ? ? ? ?})
? ? ? ? ?}
? ? ? ?}
? ? ?});
? ?}
? ?if (base64 == "") {
? ? ?wx.showToast({
? ? ? ?title: '請重試',
? ? ? ?icon: 'loading',
? ? ? ?duration: 500
? ? ?})
? ?}
?},
我們執(zhí)行代碼以后,會返回一個相識度,我這里規(guī)定相識度80%以上即為同一個人。
看日志可以知道我們的相識度是98.295%,所以這里就可以認(rèn)定為簽到成功