背景介紹
你的項目跟人工智能無關?自己手寫不可行?看完本文小白也能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 就可,建議一個個刪除自動導包還快省事。
以上兩步做完沒啥問題示例工程就可以跑起來了。
運行項目后,你可以自行看看人臉檢測的一些回調方法:
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,"
其實,在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 庫集合推薦:當你的產品經理需要你自定義根據心情改變手機主題顏色的時候,你就應該想到到這里找找輪子了,收藏吧,騷年。
http://www.lxweimin.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.程序員的導航之家:極客導航,分類了你幾乎想要了解的網址門戶
5.阿里矢量icon圖庫:有了這個你是不是可以和ui妹子多交流交流呢哈哈
得到全平臺付費內容打包帶走(共4T 含音頻+圖片及直播內容視頻等)
[我的小店進店鏈接]:dedaofree.taobao.com
淘口令:【混沌大大學堂王東岳創新院研習社商學院創業營創投營包更新】https://m.tb.cn/h.3NTTSIi 點擊鏈接,再選擇瀏覽器咑閞;或復·制這段描述¥Sgk7bPooUrp¥后到淘♂寳♀
你以為送完免費東東就完了,是不是還意猶未盡?沒錯,我必須給大伙點看家家當了,我本人收集了得到APP上面所有的付費內容,沒錯,不要問全不全,什么付費訂閱課,大師課統統都有。我現在自己就每天都在聽,很方便,路上在家有空的時候插上耳機收聽就行了。感覺自己每天都有無形的收獲!
做程序員這么多年,一輩子敲代碼是不可能的,永遠都不可能的。這會是程序員通往產品經理,程序員通往管理高層的成功必經之路!
比如說梁寧產品思維三十講,寧向東的清華管理學等等,得到平臺如果您不了解,你可以現在立刻馬上電子市場下載,它上面的付費內容含金量個人覺得數一數二了!
上面的大師級別的課都上99 ,199起步的,現在我這里拿去,僅99元全部打包帶走,加微信購買發百度云鏈接永久保存到您自己網盤!現在憑這篇文章截圖可以送喜馬拉雅全平臺2017,2018付費音頻!
![太多了不截圖了4.5T左右
一輩子敲代碼是不可能的,我覺得我們程序員要獲取的知識面應該更寬更廣,得到平臺上的內容很多就很符合,轉型其他崗位,行業,但是機會總是留給做好準備的人!所以抓緊學習吧,趁還年輕!2018年定價99元,2019年錯過這個村就就沒這個價啦。
如果您擔心音質問題,那是完全多余了,您可以5元視聽一個欄目,不是百分百原音質退全額。
另外有騰訊課堂著名的動腦學院Android VIP全套課程視頻源碼(大概2T,高清原畫質),價值6888元,不了解的可騰訊課堂搜Android課程排名第一的長沙--動腦學院,你官方報名同樣很多時候是看視頻的,講師講課很仔細,有源碼demo,我這里白菜價拿走不謝,看完這套視頻,工資上漲3-8k不在話下!高級安卓進階必會技術需要的微信聯系這里不私聊。
我的微信號(購買加微信必須注明簡書得到):together13ly14
加我注明:簡書
最后:如果你對我發知識沒有欲望,喜歡吃喝玩樂旅行?我可以給你推薦個旅行公眾號,微信搜:廣州小青蛙旅行網,那里都是一些上班白領周末純玩路線,主打年輕人社交旅行,多數都是廣州集合出發的,也有匯集到目的地集合出發的。一百多塊錢就可以玩好,報名后屏這里截圖同樣可以減免20元優惠不等。直接微信或電話咨詢報名即可!還可以找到未來的女朋友,想想都開心,哈哈