身份验证错误错误指定的句柄无效_基于 Web 端的人脸识别身份验证「实践」
作者:沫沫 政采云前端團(tuán)隊(duì)
轉(zhuǎn)發(fā)鏈接:https://mp.weixin.qq.com/s/fRDpXixnLIy9c0Uh2tMezQ
前言
近些年來,隨著生物識別技術(shù)的逐漸成熟,基于深度學(xué)習(xí)的人臉識別技術(shù)取得了突破性進(jìn)展,準(zhǔn)確率顯著提高。現(xiàn)階段,人臉識別身份驗(yàn)證作為非常重要的身份驗(yàn)證方式,已被廣泛的應(yīng)用于諸多行業(yè)和領(lǐng)域,例如:支付寶付款、刷臉簽到等方面。
其優(yōu)點(diǎn)在于,以人臉為識別對象,識別過程更加友好、便捷,只需被識別者進(jìn)入攝像范圍內(nèi)即可,不會引起被識別者的反感和警惕。目前,市面上的應(yīng)用場景主要集中在移動端,而基于 Web 瀏覽器端的人臉識別身份驗(yàn)證方案較少。
本文將介紹基于 Web 瀏覽器端的人臉識別身份驗(yàn)證的整體方案,以及重點(diǎn)講解如何在 Web 瀏覽器中實(shí)現(xiàn)人臉自動采集。
場景描述及分析
- 適用場景:人臉識別身份實(shí)名認(rèn)證。用戶使用人臉識別身份驗(yàn)證功能時,只需要將人臉對準(zhǔn)攝像頭,程序自動對人臉進(jìn)行檢測。如果檢測到當(dāng)前攝像頭可視區(qū)域內(nèi)僅存在唯一一個人臉,則采集當(dāng)前人臉圖片進(jìn)行人臉對比、活體檢測、身份證識別等多項(xiàng)組合能力,快速完成用戶身份核驗(yàn)。
- 從上述場景描述中,分析出幾個關(guān)鍵問題及解決方案:
- 考慮到 Web 端性能,活體檢測交由服務(wù)端處理比較合適。具體可參考百度 AI 活體檢測 (https://ai.baidu.com/tech/face/faceliveness)
- 個人身份證上的高清照片是無法直接獲取到的。可以使用 百度 AI 的實(shí)名身份認(rèn)證服務(wù) (https://ai.baidu.com/tech/face/personverify),將待比對的人臉圖片 + 身份證號碼 + 姓名上傳到百度 AI 服務(wù),會返回圖片的匹配度(0~100)。其底層調(diào)用的也是公安的實(shí)名認(rèn)證接口
- 使用開源的人臉采集 JS 庫。需要支持單個和多個人臉檢測
- 經(jīng)橫向?qū)Ρ饶壳俺S玫拈_源人臉采集 JS 庫,Face-api.js 在性能和準(zhǔn)確度上更勝一籌
- face-api.js :基于 TensorFlow.js 內(nèi)核,實(shí)現(xiàn)了三種卷積神經(jīng)網(wǎng)絡(luò)架構(gòu),用于完成人臉檢測、識別和特征點(diǎn)檢測任務(wù),可以在瀏覽器中進(jìn)行人臉識別。其內(nèi)部實(shí)現(xiàn)了一個非常輕巧,快速,準(zhǔn)確的 68 點(diǎn)面部標(biāo)志探測器。支持多種 tf 模型,微小模型僅為 80kb。另外,它還支持 GPU 加速,相關(guān)操作可以使用 WebGL 運(yùn)行
- tracking.js : 一個獨(dú)立的 JavaScript 庫,主要實(shí)現(xiàn)了顏色和人(人臉、五官等)的跟蹤檢測。可以通過檢測到某特定顏色,或者檢測一個人體/臉的出現(xiàn)與移動,來觸發(fā) JavaScript 事件,然后對人臉進(jìn)行采集。Tracking.js 是使用 CPU 進(jìn)行計(jì)算的,在圖像的矩陣運(yùn)算效率上,相對 GPU 要慢一些
- 通過 navigator.mediaDevices.getUserMedia API(基于 WebRTC)可以獲取到攝像頭拍攝的實(shí)時視頻流數(shù)據(jù)
- 問題一:如何獲取到攝像頭拍攝的實(shí)時視頻流數(shù)據(jù)?
- 問題二:如何檢測到實(shí)時視頻流中存在唯一人臉,并進(jìn)行采集?
- 問題三:實(shí)名身份驗(yàn)證怎么實(shí)現(xiàn)?如何獲取到身份證上的高清照片進(jìn)行比對?
- 問題四:活體檢測怎么實(shí)現(xiàn)?
整體方案
- 主要分為以下幾個關(guān)鍵步驟:
- 調(diào)用攝像頭(需獲得用戶授權(quán)允許),獲取攝像頭的視頻流數(shù)據(jù)
- 使用 face-api.js 識別視頻流中的人臉特征點(diǎn),定位出人臉的位置
- 符合人臉特征時,暫停視頻流,根據(jù)視頻流當(dāng)前幀,繪制圖像
- 將圖像轉(zhuǎn)成 Base64 編碼,上傳到服務(wù)端
- 服務(wù)端調(diào)用百度 AI 的接口,與身份證上的圖片信息進(jìn)行比對,并進(jìn)行活體檢測
實(shí)現(xiàn)細(xì)節(jié)
在上述方案中,想必大家對攝像頭檢測、實(shí)時視頻流數(shù)據(jù)獲取、Canvas 圖片繪制這些都比較熟悉,我這邊就不詳細(xì)講解了。部分同學(xué)沒接觸過也沒關(guān)系,具體實(shí)現(xiàn)比較簡單,可以直接看 源碼 (https://github.com/Angela-Chen/face-api-demo),源碼里面關(guān)于這些都有詳細(xì)的注解。
下面我詳細(xì)講下,如何使用 face-api.js 在實(shí)時視頻流中進(jìn)行人臉的檢測
1、引入 face-api
script 標(biāo)簽方式,獲取 最新腳本 (https://github.com/justadudewhohacks/face-api.js/tree/master/dist)
或者 使用 npm 方式npm?install?face-api.js2、加載模型數(shù)據(jù)
“
加載模型數(shù)據(jù)是異步操作。需要等模型數(shù)據(jù)加載完成后,才能開始人臉檢測。
//?加載所有模型數(shù)據(jù),models?是存放模型數(shù)據(jù)文件的目錄await?faceapi.loadModels('/models');?//?加載單個指定的模型數(shù)據(jù)await?faceapi.loadTinyFaceDetectorModel('/models');await?faceapi.loadSsdMobilenetv1Model('/models');await?faceapi.loadMtcnnModel('/models');3、檢測人臉
“
當(dāng)人臉被檢測到符合模型的配置參數(shù)后,就會被認(rèn)為檢測到人臉了,然后返回一個detection對象,包括了人臉匹配度、人臉坐標(biāo)等信息。可用于后續(xù)自定義繪制人臉邊界框,以及閾值的邏輯判斷。
- faceapi.detectAllFaces :檢測圖像中的所有人臉
- faceapi.detectSingleFace :檢測單個人臉,返回圖像中具有最高置信度得分的人臉
4、常用人臉檢測模型介紹
(1) Tiny Face Detector 是一款性能非常高的實(shí)時人臉檢測模型,與 SSD Mobilenet V1 人臉檢測模型相比,它更快,更小,資源消耗更少,量化模型的大小僅為 190 KB(tiny_face_detector_model),但它在檢測小臉時的表現(xiàn)稍差。加載時長 8 ms左右
//?模型的配置參數(shù)new?faceapi.TinyFaceDetectorOptions({??//?輸入的數(shù)據(jù)源大小,這個值越小,處理速度越快。常用值:128, 160, 224, 320, 416, 512, 608??inputSize:?number,??//?default:?416??//?用于過濾邊界的分?jǐn)?shù)閾值,大于等于這個值才被認(rèn)為檢測到了人臉,然后返回一個detection對象??scoreThreshold:?number??//?default:?0.5});(2) SSD Mobilenet V1 對于面部檢測,該模型實(shí)現(xiàn)了基于 MobileNetV1 的 SSD(單次多核檢測器)。神經(jīng)網(wǎng)絡(luò)將計(jì)算圖像中每個面部的位置,并將返回邊界框以及每個面部的概率。該面部檢測器旨在獲得檢測面部邊界框而不是低推理時間的高精度。量化模型的大小約為 5.4 MB(ssd_mobilenetv1_model)。加載時長 2-3s 左右
//?模型的配置參數(shù)new?faceapi.SsdMobilenetv1Options({??//?最小置信值,大于等于這個值才被認(rèn)為檢測到了人臉,然后返回一個detection對象??minConfidence:?number,??//?default:?0.5??//?最多返回人臉的個數(shù)??maxResults:?number??//?default:?100});(3) MTCNN MTCNN(多任務(wù)級聯(lián)卷積神經(jīng)網(wǎng)絡(luò))代表了 SSD Mobilenet v1 和 Tiny Yolo v2 的替代面部檢測模型,它提供了更多的配置空間。通過調(diào)整輸入?yún)?shù),MTCNN 應(yīng)該能夠檢測各種面部邊界框大小。MTCNN 是一個 3 級級聯(lián) CNN,它同時返回 5 個面部標(biāo)志點(diǎn)以及每個面的邊界框和分?jǐn)?shù)。此外,型號尺寸僅為 2 MB。加載時長 1-2s 左右
//?模型的配置參數(shù)new?faceapi.MtcnnOptions({??//?人臉尺寸的最小值,小于這個尺寸的人臉不會被檢測到??minFaceSize:?number,??//?default:?20??//?用于過濾邊界的分?jǐn)?shù)閾值,分別可以設(shè)置3個階段盒子的閾值。??scoreThresholds:?number[],??//?default:?[0.6,?0.7,?0.7]??//?比例因子用于計(jì)算圖像的比例步長??scaleFactor:?number,??//?default:?0.709??//?經(jīng)過CNN的輸入圖像縮放版本的最大數(shù)量。數(shù)字越小,檢測時間越短,但相對準(zhǔn)確度會差一些。??maxNumScales:?number,??//?default:?10??//?手動設(shè)置縮放步長?scaleSteps??scaleSteps?:?number[],});- 特別說明:
- 模型的配置參數(shù)設(shè)置非常重要,需要慢慢的微調(diào),能優(yōu)化識別性能和比對的正確性
- 實(shí)測下來,Tiny Face Detector 模型的性能非常好,檢測的準(zhǔn)確度也不錯,只有人臉很小的時候,會有較大偏差,scoreThreshold 閾值為 0.6 時最佳
注意事項(xiàng)
- 由于 Web 端的人臉識別將依賴于本地?cái)z像頭的喚起,因此,對于本地?cái)z像頭的調(diào)用需要進(jìn)行詳細(xì)的錯誤捕獲和處理,以便明確的提示用戶該如何操作。下面已枚舉出所有可能出現(xiàn)的報(bào)錯:
- http 協(xié)議下,Chrome 瀏覽器無法調(diào)用本地?cái)z像頭
- Chrome 瀏覽器出于安全性的考慮,現(xiàn)只支持 HTTPS 協(xié)議 和 localhost 下,調(diào)用攝像頭。HTTP 協(xié)議下是無法調(diào)用攝像頭的。如果一定要在 HTTP下調(diào)用到攝像頭,只能修改 Chrome 瀏覽器的配置項(xiàng),但不建議這么做
源碼獲取
- 查看源碼 (https://github.com/Angela-Chen/face-api-demo)
推薦JavaScript經(jīng)典實(shí)例學(xué)習(xí)資料文章
《「前端進(jìn)階」高性能渲染十萬條數(shù)據(jù)(時間分片)》
《「前端進(jìn)階」高性能渲染十萬條數(shù)據(jù)(虛擬列表)》
《圖解 Promise 實(shí)現(xiàn)原理(一):基礎(chǔ)實(shí)現(xiàn)》
《圖解 Promise 實(shí)現(xiàn)原理(二):Promise 鏈?zhǔn)秸{(diào)用》
《圖解 Promise 實(shí)現(xiàn)原理(三):Promise 原型方法實(shí)現(xiàn)》
《圖解 Promise 實(shí)現(xiàn)原理(四):Promise 靜態(tài)方法實(shí)現(xiàn)》
《實(shí)踐教你從零構(gòu)建前端 Lint 工作流「干貨」》
《高性能多級多選級聯(lián)組件開發(fā)「JS篇」》
《深入淺出講解Node.js CLI 工具最佳實(shí)戰(zhàn)》
《延遲加載圖像以提高Web網(wǎng)站性能的五種方法「實(shí)踐」》
《比較 JavaScript 對象的四種方式「實(shí)踐」》
《使用Service Worker讓你的 Web 應(yīng)用如虎添翼(上)「干貨」》
《使用Service Worker讓你的 Web 應(yīng)用如虎添翼(中)「干貨」》
《使用Service Worker讓你的 Web 應(yīng)用如虎添翼(下)「干貨」》
《前端如何一次性處理10萬條數(shù)據(jù)「進(jìn)階篇」》
《推薦三款正則可視化工具「JS篇」》
《如何讓用戶選擇是否離開當(dāng)前頁面?「JS篇」》
《JavaScript開發(fā)人員更喜歡Deno的五大原因》
《僅用18行JavaScript實(shí)現(xiàn)一個倒數(shù)計(jì)時器》
《圖文細(xì)說JavaScript 的運(yùn)行機(jī)制》
《一個輕量級 JavaScript 全文搜索庫,輕松實(shí)現(xiàn)站內(nèi)離線搜索》
《推薦Web程序員常用的15個源代碼編輯器》
《10個實(shí)用的JS技巧「值得收藏」》
《細(xì)品269個JavaScript小函數(shù),讓你少加班熬夜(一)「值得收藏」》
《細(xì)品269個JavaScript小函數(shù),讓你少加班熬夜(二)「值得收藏」》
《細(xì)品269個JavaScript小函數(shù),讓你少加班熬夜(三)「值得收藏」》
《細(xì)品269個JavaScript小函數(shù),讓你少加班熬夜(四)「值得收藏」》
《細(xì)品269個JavaScript小函數(shù),讓你少加班熬夜(五)「值得收藏」》
《細(xì)品269個JavaScript小函數(shù),讓你少加班熬夜(六)「值得收藏」》
《深入JavaScript教你內(nèi)存泄漏如何防范》
《手把手教你7個有趣的JavaScript 項(xiàng)目-上「附源碼」》
《手把手教你7個有趣的JavaScript 項(xiàng)目-下「附源碼」》
《JavaScript 使用 mediaDevices API 訪問攝像頭自拍》
《手把手教你前端代碼如何做錯誤上報(bào)「JS篇」》
《一文讓你徹底搞懂移動前端和Web 前端區(qū)別在哪里》
《63個JavaScript 正則大禮包「值得收藏」》
《提高你的 JavaScript 技能10 個問答題》
《JavaScript圖表庫的5個首選》
《一文徹底搞懂JavaScript 中Object.freeze與Object.seal的用法》
《可視化的 JS:動態(tài)圖演示 - 事件循環(huán) Event Loop的過程》
《教你如何用動態(tài)規(guī)劃和貪心算法實(shí)現(xiàn)前端瀑布流布局「實(shí)踐」》
《可視化的 js:動態(tài)圖演示 Promises & Async/Await 的過程》
《原生JS封裝拖動驗(yàn)證滑塊你會嗎?「實(shí)踐」》
《如何實(shí)現(xiàn)高性能的在線 PDF 預(yù)覽》
《細(xì)說使用字體庫加密數(shù)據(jù)-仿58同城》
《Node.js要完了嗎?》
《Pug 3.0.0正式發(fā)布,不再支持 Node.js 6/8》
《純JS手寫輪播圖(代碼邏輯清晰,通俗易懂)》
《JavaScript 20 年 中文版之創(chuàng)立標(biāo)準(zhǔn)》
《值得收藏的前端常用60余種工具方法「JS篇」》
《箭頭函數(shù)和常規(guī)函數(shù)之間的 5 個區(qū)別》
《通過發(fā)布/訂閱的設(shè)計(jì)模式搞懂 Node.js 核心模塊 Events》
《「前端篇」不再為正則煩惱》
《「速圍」Node.js V14.3.0 發(fā)布支持頂級 Await 和 REPL 增強(qiáng)功能》
《深入細(xì)品瀏覽器原理「流程圖」》
《JavaScript 已進(jìn)入第三個時代,未來將何去何從?》
《前端上傳前預(yù)覽文件 image、text、json、video、audio「實(shí)踐」》
《深入細(xì)品 EventLoop 和瀏覽器渲染、幀動畫、空閑回調(diào)的關(guān)系》
《推薦13個有用的JavaScript數(shù)組技巧「值得收藏」》
《前端必備基礎(chǔ)知識:window.location 詳解》
《不要再依賴CommonJS了》
《犀牛書作者:最該忘記的JavaScript特性》
《36個工作中常用的JavaScript函數(shù)片段「值得收藏」》
《Node + H5 實(shí)現(xiàn)大文件分片上傳、斷點(diǎn)續(xù)傳》
《一文了解文件上傳全過程(1.8w字深度解析)「前端進(jìn)階必備」》
《【實(shí)踐總結(jié)】關(guān)于小程序掙脫枷鎖實(shí)現(xiàn)批量上傳》
《手把手教你前端的各種文件上傳攻略和大文件斷點(diǎn)續(xù)傳》
《字節(jié)跳動面試官:請你實(shí)現(xiàn)一個大文件上傳和斷點(diǎn)續(xù)傳》
《談?wù)勄岸岁P(guān)于文件上傳下載那些事【實(shí)踐】》
《手把手教你如何編寫一個前端圖片壓縮、方向糾正、預(yù)覽、上傳插件》
《最全的 JavaScript 模塊化方案和工具》
《「前端進(jìn)階」JS中的內(nèi)存管理》
《JavaScript正則深入以及10個非常有意思的正則實(shí)戰(zhàn)》
《前端面試者經(jīng)常忽視的一道JavaScript 面試題》
《一行JS代碼實(shí)現(xiàn)一個簡單的模板字符串替換「實(shí)踐」》
《JS代碼是如何被壓縮的「前端高級進(jìn)階」》
《前端開發(fā)規(guī)范:命名規(guī)范、html規(guī)范、css規(guī)范、js規(guī)范》
《【規(guī)范篇】前端團(tuán)隊(duì)代碼規(guī)范最佳實(shí)踐》
《100個原生JavaScript代碼片段知識點(diǎn)詳細(xì)匯總【實(shí)踐】》
《關(guān)于前端174道 JavaScript知識點(diǎn)匯總(一)》
《關(guān)于前端174道 JavaScript知識點(diǎn)匯總(二)》
《關(guān)于前端174道 JavaScript知識點(diǎn)匯總(三)》
《幾個非常有意思的javascript知識點(diǎn)總結(jié)【實(shí)踐】》
《都2020年了,你還不會JavaScript 裝飾器?》
《JavaScript實(shí)現(xiàn)圖片合成下載》
《70個JavaScript知識點(diǎn)詳細(xì)總結(jié)(上)【實(shí)踐】》
《70個JavaScript知識點(diǎn)詳細(xì)總結(jié)(下)【實(shí)踐】》
《開源了一個 JavaScript 版敏感詞過濾庫》
《送你 43 道 JavaScript 面試題》
《3個很棒的小眾JavaScript庫,你值得擁有》
《手把手教你深入鞏固JavaScript知識體系【思維導(dǎo)圖】》
《推薦7個很棒的JavaScript產(chǎn)品步驟引導(dǎo)庫》
《Echa哥教你徹底弄懂 JavaScript 執(zhí)行機(jī)制》
《一個合格的中級前端工程師需要掌握的 28 個 JavaScript 技巧》
《深入解析高頻項(xiàng)目中運(yùn)用到的知識點(diǎn)匯總【JS篇】》
《JavaScript 工具函數(shù)大全【新】》
《從JavaScript中看設(shè)計(jì)模式(總結(jié))》
《身份證號碼的正則表達(dá)式及驗(yàn)證詳解(JavaScript,Regex)》
《瀏覽器中實(shí)現(xiàn)JavaScript計(jì)時器的4種創(chuàng)新方式》
《Three.js 動效方案》
《手把手教你常用的59個JS類方法》
《127個常用的JS代碼片段,每段代碼花30秒就能看懂-【上】》
《深入淺出講解 js 深拷貝 vs 淺拷貝》
《手把手教你JS開發(fā)H5游戲【消滅星星】》
《深入淺出講解JS中this/apply/call/bind巧妙用法【實(shí)踐】》
《手把手教你全方位解讀JS中this真正含義【實(shí)踐】》
《書到用時方恨少,一大波JS開發(fā)工具函數(shù)來了》
《干貨滿滿!如何優(yōu)雅簡潔地實(shí)現(xiàn)時鐘翻牌器(支持JS/Vue/React)》
《手把手教你JS 異步編程六種方案【實(shí)踐】》
《讓你減少加班的15條高效JS技巧知識點(diǎn)匯總【實(shí)踐】》
《手把手教你JS開發(fā)H5游戲【黃金礦工】》
《手把手教你JS實(shí)現(xiàn)監(jiān)控瀏覽器上下左右滾動》
《JS 經(jīng)典實(shí)例知識點(diǎn)整理匯總【實(shí)踐】》
《2.6萬字JS干貨分享,帶你領(lǐng)略前端魅力【基礎(chǔ)篇】》
《2.6萬字JS干貨分享,帶你領(lǐng)略前端魅力【實(shí)踐篇】》
《簡單幾步讓你的 JS 寫得更漂亮》
《恭喜你獲得治療JS this的詳細(xì)藥方》
《談?wù)勄岸岁P(guān)于文件上傳下載那些事【實(shí)踐】》
《面試中教你繞過關(guān)于 JavaScript 作用域的 5 個坑》
《Jquery插件(常用的插件庫)》
《【JS】如何防止重復(fù)發(fā)送ajax請求》
《JavaScript+Canvas實(shí)現(xiàn)自定義畫板》
《Continuation 在 JS 中的應(yīng)用「前端篇」》
作者:沫沫 政采云前端團(tuán)隊(duì)
轉(zhuǎn)發(fā)鏈接:https://mp.weixin.qq.com/s/fRDpXixnLIy9c0Uh2tMezQ
總結(jié)
以上是生活随笔為你收集整理的身份验证错误错误指定的句柄无效_基于 Web 端的人脸识别身份验证「实践」的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓小镇游戏(安卓小镇)
- 下一篇: python使用elasticsearc