背景介紹前端
你的項目跟人工智能無關?本身手寫不可行?看完本文小白也能2小時讓你的應用具有人臉識別活體檢測等等功能啦!近兩 年炒的最火的就是人工智能了,可是處處都講人工智能,區塊鏈啥啥的,總感受跟普通安卓應用開發沒多大關係。 最近有點閒得蛋疼啊,因而找了有關於指紋識別,人臉識別方面的技術博客,可是少之又少啊不能快速的集成到本身項目。基於本人對百度是比較偏心的,因而乎看了下官網就直接上車了,大概一天下來就ok了。我是小白啊,這篇文章是基於小白的,若是你是技術大牛,能夠忽略了。java
目前百度人臉識別調用徹底免費的(號稱宣佈永久無償使用哦,算是業界良心了),企業認證後能夠免費10QPS限制調用,所謂QPS限制也就是一秒鐘10次內的調用,每秒10次調用能夠知足一些小型企業了。免費和付費的惟一區別就是QPS限制調用量不一樣。再說了用戶量多了,給點錢也是應該的吧,老闆也不會在意這點錢的吧(幾百塊一月不等)。android
集成百度sdk基本上能夠直接copy示例demo直接在本身項目運行,順利的話大概半天,跟着個人文章大概兩小時足夠!不過你開始得有百度AI開放平臺帳戶及企業認證(工做日內認證大概4小時,最遲不會超過一天,週末都有人審覈這點和給力了),集成過程當中你看完整個文章,應該避免了一些問題,一天內應該可讓本身的項目跑起來。下面所有爲快速集成 Android離線採集sdk 人臉登陸示例過程(粗略大概3分鐘可看完本文,文末有巨型福利)。git
進去百度AI開發者官網,人臉識別提供了幾種解決方案,集成大多相似。由於咱們的業務場景是須要用到人臉登陸,人臉簽到功能,因此我選擇了 Android離線採集sdk。具體選擇哪一種根據本身的需求選擇便可。程序員
目前市面上作人臉方面的公司很是多,列舉幾個:github
百度人臉識別 Face++ 商湯科技 騰訊 虹軟數據庫
固然還有一些其餘的,目前比較出名的大概就這些,差異其實更可能是在技術支持上(至少我是這麼認爲的)以及費用,據我json
瞭解:百度、Face++、虹軟,大概對比下:api
百度人臉識瀏覽器
優勢:價格便宜,客服很友好
缺點:待發掘
Face++
優勢:技術更好,文檔很清晰,由於沒有接入暫且不知道技術支持怎麼樣不過應該不差
缺點:有點小貴 虹軟
優勢:全套離線,後臺前端均可以離線實現,文檔也挺詳細的
缺點:看了下他們技術論壇,貌似問題也很多,並且回覆也不是很及時的樣子,最主要是須要本身搭建一套,他們的人臉對
比竟然也是放在本地APP數據庫的(固然這不算是缺點了)
說了這麼多,想用啥本身選擇就行,咱們公司目前用的百度人臉識別,進入正題很少BB。
1、註冊百度開發者帳號
這個註冊企業認證(工做日內認證大概4小時,最遲不會超過一天,週末都有人審覈這點和給力了),並且須要公司的資質信息,咱們當時已經有了因此我就直接拿來用。若是你卡在沒有認證沒法下載sdk的話,我教你一招,問下你公司運營說你的項目須要某某功能微信某某認證,須要公司營業執照圖片,套路下不就有了啊,運營那裏有公司執照那些的。實在不行看個體工商戶執照行不行本身試試吧。http://ai.baidu.com/
2、新建項目獲取受權文件
這一步算是前期測試的重要步驟,先要到控制檯(默認第一步已經完成了)百度人臉識別連接 這個控制檯基本就是人臉識別的全部開發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上面全部的付費內容,沒錯,不要問全不全,什麼付費訂閱課,大師課通通都有。我如今本身就天天都在聽,很方便,路上在家有空的時候插上耳機收聽就好了。感受本身天天都有無形的收穫! 作程序員這麼多年,一生敲代碼是不可能的,永遠都不可能的。這會是程序員通往產品經理,程序員通往管理高層的成功必經之路!