背景介紹
你的項目跟人工智能無關?自己手寫不可行?看完本文小白也能2小時讓你的應用具備人臉識別活體檢測等等功能啦!近兩
年炒的最火的就是人工智能了,但是到處都講人工智能,區塊鏈啥啥的,總感覺跟普通安卓應用開發沒多大關系。
最近有點閑得蛋疼啊,於是找了有關於指紋識別,人臉識別方面的技術博客,但是少之又少啊不能快速的集成到自己項目。基於本人對百度是比較偏愛的,於是乎看了下官網就直接上車了,大概一天下來就ok了。我是小白啊,這篇文章是基於小白的,如果你是技術大牛,可以忽略了。
目前百度人臉識別調用完全免費的(號稱宣布永久免費使用哦,算是業界良心了),企業認證后可以免費10QPS限制調用,所謂QPS限制也就是一秒鍾10次內的調用,每秒10次調用可以滿足一些小型企業了。免費和付費的唯一區別就是QPS限制調用量不同。再說了用戶量多了,給點錢也是應該的吧,老板也不會在乎這點錢的吧(幾百塊一月不等)。
集成百度sdk基本上可以直接copy示例demo直接在自己項目運行,順利的話大概半天,跟着我的文章大概兩小時足夠!不過你開始得有百度AI開放平台賬戶及企業認證(工作日內認證大概4小時,最遲不會超過一天,周末都有人審核這點和給力了),集成過程中你看完整個文章,應該避免了一些問題,一天內應該可以讓自己的項目跑起來。下面全部為快速集成 Android離線采集sdk 人臉登錄示例過程(粗略大概3分鍾可看完本文,文末有巨型福利)。
進去百度AI開發者官網,人臉識別提供了幾種解決方案,集成大多類似。因為我們的業務場景是需要用到人臉登錄,人臉簽到功能,所以我選擇了 Android離線采集sdk。具體選擇哪種根據自己的需求選擇即可。
目前市面上做人臉方面的公司非常多,列舉幾個:
百度人臉識別 Face++ 商湯科技 騰訊 虹軟
當然還有一些其他的,目前比較出名的大概就這些,差別其實更多是在技術支持上(至少我是這么認為的)以及費用,據我
了解:百度、Face++、虹軟,大概對比下:
百度人臉識
優點:價格便宜,客服很友好
缺點:待發掘
Face++
優點:技術更好,文檔很清晰,因為沒有接入暫且不知道技術支持怎么樣不過應該不差
缺點:有點小貴
虹軟
優點:全套離線,后台前端都可以離線實現,文檔也挺詳細的
缺點:看了下他們技術論壇,貌似問題也不少,而且回復也不是很及時的樣子,最主要是需要自己搭建一套,他們的人臉對
比居然也是放在本地APP數據庫的(當然這不算是缺點了)
說了這么多,想用啥自己選擇就行,我們公司目前用的百度人臉識別,進入正題不多BB。
一、注冊百度開發者賬號
這個注冊企業認證(工作日內認證大概4小時,最遲不會超過一天,周末都有人審核這點和給力了),而且需要公司的資質信息,我們當時已經有了所以我就直接拿來用。如果你卡在沒有認證無法下載sdk的話,我教你一招,問下你公司運營說你的項目需要某某功能微信某某認證,需要公司營業執照圖片,套路下不就有了啊,運營那里有公司執照那些的。實在不行看個體工商戶執照行不行自己試試吧。http://ai.baidu.com/

二、新建項目獲取授權文件
這一步算是前期測試的重要步驟,先要到控制台(默認第一步已經完成了)百度人臉識別鏈接
這個控制台基本就是人臉識別的所有開發SDK,技術資料的地方了,前端的SDK在SDK管理里面進行下載
首先你需要在采集SDK管理里面下載授權文件,他會讓你跟你據包名跟key的MD5來進行生成,具體步驟按着他們的操作就行了。這里也有官網集成步驟文檔:http://ai.baidu.com/docs#/Face-Android-SDK/top
如下圖,最頂部 有問題找客服可以提交工單,有比較專業的專屬客服給你回答,回復速度大概也是4小時左右吧。下面有創建應用,左側有sdk下載入口。

進入下載授權文件是需要您的開發者賬號企業認證才可以進入的哦。


這個授權文件下載后放在Android項目的assets 文件夾
SDK下載跟示例工程下載
在采集SDK管理這里下拉會看到下載SDK跟示例工程這兩欄
但是我建議你可以直接根據你們公司的業務需求下載對應的示例工程,比如我下載的就是人臉登陸/考勤這個,這里面已經包含了全套的離線SDK功能(活體檢測,人臉追蹤,質量檢測等等),如果你要下載帶聲音的活體檢測demo,比如眨眨眼,張張嘴,下載帶有活體檢測功能的demo即可。如下圖:


這是人臉登錄示例demo運行效果

這是 張張嘴眨眨眼語音提示活體檢測demo運行效果

md5指紋:你自己的項目的簽名的md5指紋密碼,不懂的可以看下這篇文章。Android Studio生成簽名文件,自動簽名,以及獲取SHA1和MD5值:https://blog.csdn.net/it666dhw/article/details/80731021
我集成的是第一個人臉登錄sdk,下載完示例工程后把項目導入AS,下面就是改動下包名跟License
修改包名
在app build里面改成自己上圖里面的包名:com.test.facere(你自包名)
修改License
把剛下載的License文件導入到對應的 assets包下,修改工程里面Config.java類的licenseID(上圖的)以及licenseFileName(對應License的文件名,和你下載時起的自定義名字一致),把對應的ak,sk密碼改為你的對應的即可。

注意:包名改變后或導入到自己項目的時候,運行會報找不到R 文件錯誤,常見問題啦不要方哈,一個個用到R文件的類刪除R 文件的導包,然后自動導包即可,就幾個類用到而已。你也可以用切換項目packages 視圖下 ,將要改的包名改為你的項目的包名applicationId,然后必須clean ,在rebuild 就可,建議一個個刪除自動導包還快省事。

image.png
以上兩步做完沒啥問題示例工程就可以跑起來了。
運行項目后,你可以自行看看人臉檢測的一些回調方法:
3.faceDetectManager.setOnTrackListener設置人臉檢測監聽器
回調方法是
publicvoidonTrack(FaceFilter.TrackedModel trackedModel)
乍一看這個回調跟
faceDetectManager.setOnFaceDetectListener
差不多,其實如果仔細看FaceDetectManager這個類的話會發現在
privatevoidprocess(int[] argb,intwidth,intheight, ArgbPool pool)
這個方法里面有這樣一段代碼
if(value ==0) { faceFilter.filter(faces, frame);//等於0的時候才帶過去}if(listener !=null) { listener.onDetectFace(value, faces, frame);//檢測人臉把value值也帶過去,用於判斷人臉位置}
當value為0(表示是一張合格人臉)的時候會在FaceFilter中調用filter方法,並且在該方法中把一個單個face設置到onTrace回調中,如果listener不為空的話直接放到onDetectFace這個回調中,所以從這里也可以看出來其實
faceDetectManager.setOnFaceDetectListener
就是為了讓你獲取一張合格的人臉(可以在這個里面處理你具體的合格人臉操作)
回歸正題,既然onTrace回調是一個合格的人臉就好辦了,可以直接拿到TrackedModel里面的人臉圖片和服務器進行比對,具體代碼邏輯示例代碼里面也已經實現了,對比結束后會返回一定的分數給你,如果大於80或者你覺得的分數就認定這個是你在手機端注冊過的人臉,然后進行邏輯處理。
遇到的小問題
運行demo后發現用一張圖片就可以識別通過,明明上面標明了活體檢測呀,domo默認是沒有開啟活體檢測的,需要自行改下一個參數就好啦。
1.初始化application類初始化
tracker.set_isCheckQuality(true);
// 是否進行活體校驗
tracker.set_isVerifyLive(true);
2.在**APIService **這個類改動下三個請求接口的參數:
// 可以根據實際業務情況靈活調節
params.setQualityControl("NORMAL");
params.setLivenessControl("HIGH");//只有為HIGH時才會符合活體檢測要求。
改了這兩個地方一張圖片就通不過啦,我也納悶了底層是怎么識別一張圖片是否是活體的,唉,對我來說太高端了吧。。。
在線請求活體檢測的接口
3.當然文檔也給出了在線請求活體檢測的接口:http://ai.baidu.com/docs#/Face-Liveness-V3/top可以返回圖片的活體質量分數值,你可以根據這個返回值來判斷是否為活體。按照官網文檔操作的時候還是有點坑了,那個參數傳的不對導致返回的數據為空,調用在線活體檢測v3的api,一直報{"error_code":222200,"error_msg":"request body should be json format"

Map<String, Object> map = new HashMap<>(); List<Object> list = new ArrayList<Object>(); String imge = AuthService.getImge(); map.put("image", imge);//總數據大小應小於10M map.put("face_field", "face_liveness,thresholds"); map.put("image_type", "BASE64"); list.add(map); String param = GsonUtils.toJson(list);
復制拿去吧:
/** * 在線活體檢測 */ public class FaceVerify { /** * 重要提示代碼中所需工具類 * FileUtil,Base64Util,HttpUtil,GsonUtils請從 * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72 * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3 * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3 * 下載 * @param bmp */ public static String faceVerify(Bitmap bmp) { // 請求url String url ="https://aip.baidubce.com/rest/2.0/face/v3/faceverify"; Map map =new HashMap<>(); List list =new ArrayList(); byte[] bytes = Base64Util.bitmap2Bytes(bmp, Bitmap.CompressFormat.PNG); String encodeImg = Base64Util.encode(bytes); map.put("image", encodeImg);//總數據大小應小於10M map.put("face_field","face_liveness,thresholds,quality,gender,age,face_type"); map.put("image_type","BASE64"); list.add(map); try { String param = GsonUtils.toJson(list); // 注意這里僅為了簡化編碼每一次請求都去獲取access_token,線上環境access_token有過期時間, 客戶端可自行緩存,過期后重新獲取。 String accessToken = AuthService.getAuth("kSxIGaaTKu9NlV2gxEI8GvoF","VoYRYgIukv6fYUoZYqoVwfUDhKTpQ4WW"); String result = HttpUtil.post(url, accessToken,"application/json", param); System.out.println(result); return result; }catch (Exception e) { e.printStackTrace(); } return null; } }
圖片轉字節碼:
public static byte[] bitmap2Bytes(Bitmap bitmap, Bitmap.CompressFormat format) { ByteArrayOutputStream baos =new ByteArrayOutputStream(); bitmap.compress(format,100, baos); return baos.toByteArray(); }
原來先放到list里面在放到map里面就可以了,這了也是花了幾個小時,唉,平時太菜的緣故吧。
下面是我用圖片和真人請求的返回值:
真人:{"error_code":0,"error_msg":"SUCCESS","log_id":510175652579,"timestamp":1541496726,"cached":0,"result":{"thresholds":{"frr_1e-4":0.05,"frr_1e-3":0.3,"frr_1e-2":0.9},"face_liveness":0.9999917365,
圖片:"result":{"thresholds":{"frr_1e-4":0.05,"frr_1e-3":0.3,"frr_1e-2":0.9},"face_liveness":0.9205907483,"

image.png
其實,在APIService設置了請求參數,就可以無需在請求此接口達到活體檢測目的。
params.setQualityControl("NORMAL");
params.setLivenessControl("HIGH");
4.另外百度sdk的so庫提供的是三個平台的,建議你的項目只編譯'armeabi-v7a'平台即可,否則增加你的項目幾倍大,整個集成后大概多出6.5M吧還能接受。在你的app的build.grald 文件defaultConfig{}中
ndk {
//設置支持的SO庫架構
abiFilters'armeabi-v7a'// , 'armeabi-v7a', 'arm64-v8a',armeabi
}
最后待解決問題:
在我們的項目中現在bugly反饋日志有如下報錯,每天有少量報錯日志,有顯示后台和前台的,我在幾個真機上是問起沒問題的,不知道用戶是手機硬件什么原因,提交工單客服回復說只能拿到報錯手機運行官方demo才能說明問題,所有目前沒有找出原因。歡迎留言評論指正,有大佬有解決辦法可以私信告知哦。
14165 java.lang.Error
miscalculated data length!
com.baidu.aip.baidufacedemo.utils.Base64.decode(Base64.java:68)
好啦,關於百度人臉識別集成問題就大功告成啦,有什么問題歡迎指正私聊。
光寫文章沒有福利怎么可能,那是永遠都不可能的啦。
1.公眾號:推薦兩個郭霖,鴻洋,微信搜索其名字即可。這兩位都是知名博客大佬,但是關注公眾號可以每天在打發早上坐地鐵時間就吸收一波干貨了,一舉兩得有木有。當然我知道在地鐵里你只會關注美女的哈哈。。
2.Android 安卓UI 庫集合推薦:當你的產品經理需要你自定義根據心情改變手機主題顏色的時候,你就應該想到到這里找找輪子了,收藏吧,騷年。
https://www.jianshu.com/p/da1ca645b95c
3.工具類RxTools推薦:普通app幾乎大部分工具類,有這個夠用了。GitHub上7千+收藏量了。
https://github.com/vondear/RxTool
4.安卓博客門戶:除了apkbus,掘金,簡書,codekk也不錯http://p.codekk.com/,鴻洋的玩安卓:http://www.wanandroid.com/
5.程序員的導航之家:極客導航,分類了你幾乎想要了解的網址門戶
http://www.jikedaohang.com/
5.阿里矢量icon圖庫:有了這個你是不是可以和ui妹子多交流交流呢哈哈
http://www.iconfont.cn/
得到全平台付費內容打包帶走(共4T 含音頻+圖片及直播內容視頻等)
[我的小店進店鏈接]:dedaofree.taobao.com
淘口令:【混沌大大學堂王東岳創新院研習社商學院創業營創投營包更新】https://m.tb.cn/h.3NTTSIi 點擊鏈接,再選擇瀏覽器咑閞;或復·制這段描述¥Sgk7bPooUrp¥后到淘♂寳♀
你以為送完免費東東就完了,是不是還意猶未盡?沒錯,我必須給大伙點看家家當了,我本人收集了得到APP上面所有的付費內容,沒錯,不要問全不全,什么付費訂閱課,大師課統統都有。我現在自己就每天都在聽,很方便,路上在家有空的時候插上耳機收聽就行了。感覺自己每天都有無形的收獲!
做程序員這么多年,一輩子敲代碼是不可能的,永遠都不可能的。這會是程序員通往產品經理,程序員通往管理高層的成功必經之路!