摘要:的發(fā)布已經(jīng)有一些時(shí)日,其主要的提供的能力是給予前端直接可用的特征檢測(cè)的接口包括條形碼人臉文本檢測(cè)。本文將簡(jiǎn)單的對(duì)其進(jìn)行介紹,對(duì)前端進(jìn)行人臉檢測(cè)進(jìn)行普適性的講解。
Shape Detection API 的發(fā)布已經(jīng)有一些時(shí)日,其主要的提供的能力是給予前端直接可用的特征檢測(cè)的接口(包括條形碼、人臉、文本檢測(cè))。本文將簡(jiǎn)單的對(duì)其進(jìn)行介紹,對(duì)前端進(jìn)行人臉檢測(cè)進(jìn)行普適性的講解。(本文不講算法~望輕拍)
1 背景與場(chǎng)景人臉檢測(cè)(Face Detection)算是老生常談的課題了,在諸多行業(yè)應(yīng)用廣泛,例如金融、安防、電子商務(wù)、智能手機(jī)、娛樂圖片等行業(yè)。其中涉及的技術(shù)也在不斷的演變,下面簡(jiǎn)要介紹幾種思路:
基于特征的人臉檢測(cè)
例如opencv中內(nèi)置了基于Viola-Jones目標(biāo)檢測(cè)框架的Harr分類器,只需要載入一個(gè)配置文件(haarcascade_frontalface_alt.xml)就能直接調(diào)用detectObject去完成檢測(cè)過程,同時(shí)也支持其他特征的檢測(cè)(如鼻子、嘴巴等)。
基于學(xué)習(xí)的人臉檢測(cè),其實(shí)也是需要通過算子提取的圖像中的局部特征,通過對(duì)其進(jìn)行分類、統(tǒng)計(jì)、回歸等方式得到的具備更精確和快響應(yīng)的分類器。
2 套路集錦 2.1 后端處理前端通過網(wǎng)絡(luò)將資源傳輸?shù)胶蠖?,后端統(tǒng)一處理需要檢測(cè)的圖像或視頻流,對(duì)后端的架構(gòu)有一定的挑戰(zhàn),同時(shí)網(wǎng)絡(luò)的延時(shí)往往不能給用戶帶來實(shí)時(shí)的交互效果。
2.2 客戶端處理得益于OpenCV在跨語言和跨平臺(tái)的優(yōu)勢(shì),客戶端也能以較低的開發(fā)成本的提供人臉檢測(cè)的能力,并且可以通過JsBridge等方式向web容器提供服務(wù),然而一旦脫離這個(gè)容器,孤立的頁面將失去這種能力。直到有一天……
2.3 開放服務(wù)不知道從啥時(shí)候開始,云計(jì)算等概念拔地而起,計(jì)算的成本日益降低。各大研發(fā)團(tuán)隊(duì)(如阿里云、Face++)都蠢蠢欲動(dòng)又不緊不慢的上架了人臉檢測(cè)服務(wù),甚至還帶上了各種特!殊!服!務(wù)!,人臉識(shí)別、活體識(shí)別、證件OCR及人臉對(duì)比等等等。
盡管不僅提供了客戶端的SDK以及前后端的API,但是,怎么說也要講講我純前端的方案吧。
3 時(shí)代帶來了什么好吧,人臉識(shí)別在前端依然是在刀耕火種的遠(yuǎn)古時(shí)代,然而,我們的基礎(chǔ)建設(shè)已經(jīng)起步,希望后續(xù)的一些相關(guān)介紹能為各位看官帶來一定的啟發(fā)。
3.1 Shape Detection API隨著客戶端硬件的計(jì)算能力逐漸提高,瀏覽器層面得到的權(quán)限也越來越多,由于圖像處理需要耗費(fèi)大量的計(jì)算資源,實(shí)際上瀏覽器上也能承擔(dān)圖像檢測(cè)的一些工作,因此就搞出了個(gè)Shape Detection API。
以下幾個(gè)簡(jiǎn)單的例子介紹了基本的用法,在嘗試編輯并運(yùn)行這些代碼之前,請(qǐng)確保在你的Chrome版本以及該新特性已經(jīng)被激活,另外該API受同源策略所限制:
chrome://flags/#enable-experimental-web-platform-features
條形碼:Barcode Detection (For Chrome 56+)
var barcodeDetector = new BarcodeDetector(); barcodeDetector.detect(image) .then(barcodes => { barcodes.forEach(barcode => console.log(barcodes.rawValue)) }) .catch(err => console.error(err));
人臉:Face Detection (For Chrome 56+)
var faceDetector = new FaceDetector(); faceDetector.detect(image) .then(faces => faces.forEach(face => console.log(face))) .catch(err => console.error(err));
文本:Text Detection (For Chrome 58+)
var textDetector = new TextDetector(); textDetector.detect(image) .then(boundingBoxes => { for(let box of boundingBoxes) { speechSynthesis.speak(new SpeechSynthesisUtterance(box.rawValue)); } }) .catch(err => console.error(err));3.2 圖像中的人臉檢測(cè)
圖像的人臉檢測(cè)比較簡(jiǎn)單,只需要傳入一個(gè)圖片的元素,就能直接調(diào)起該API進(jìn)行人臉識(shí)別了。然后接住canvas我們可以將檢測(cè)的結(jié)果展示出來。
核心代碼如下:
var image = document.querySelector("#image"); var canvas = document.querySelector("#canvas"); var ctx = canvas.getContext("2d"); var scale = 1; image.onload = function () { ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height); scale = canvas.width / image.width; }; function detect() { if (window.FaceDetector == undefined) { console.error("Face Detection not supported"); return; } var faceDetector = new FaceDetector(); console.time("detect"); return faceDetector.detect(image) .then(faces => { console.log(faces) // Draw the faces on the3.3 視頻中的人臉檢測(cè)
視頻中的人臉檢測(cè)跟圖像相差不大,通過getUserMedia 可以打開攝像頭獲取視頻/麥克風(fēng)的信息,通過將視頻幀進(jìn)行檢測(cè)和展示,即可實(shí)現(xiàn)視頻中的人臉檢測(cè)。
核心代碼如下:
navigator.mediaDevices.getUserMedia({ video: true, // audio: true }) .then(function (mediaStream) { video.src = window.URL.createObjectURL(mediaStream); video.onloadedmetadata = function (e) { // Do something with the video here. }; }) .catch(function (error) { console.log(error.name); }); setInterval(function () { ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.drawImage(video, 0, 0); image.src = canvas.toDataURL("image/png"); image.onload = function() { detect(); } }, 60);3.4 時(shí)光倒流到?jīng)]有API的日子
實(shí)際上,在很久很久以前,也有不少解決方案存在。由于硬件條件以及沒有硬件加速等限制的情況,一直沒有被廣泛地投入生產(chǎn)。
tracking.js
tracking.js 是一款js封裝的圖像處理的庫,為瀏覽器帶來豐富的計(jì)算視覺相關(guān)的算法和技術(shù),通過它可以實(shí)現(xiàn)顏色追蹤、人臉檢測(cè)等功能,具體特性如下:
jquery.facedetection
jquery.facedetection 是一款jquery / zepto 人臉檢測(cè)插件,基于跨終端能力超強(qiáng)的ccv中的圖像分類器和檢測(cè)器。
2.5 Node.js & OpenCv
node-opencv 模塊已經(jīng)發(fā)布了有些年頭,盡管目前還不能完美兼容v3.x,提供的API也比較有限,但能完美兼容opencv v2.4.x。N-API的到來可能會(huì)帶來更多的驚喜。
設(shè)想一下在一個(gè)Electron或者Node-Webkit容器中,我們是否可以通過本地開啟websocket服務(wù)來實(shí)現(xiàn)實(shí)時(shí)的人臉檢測(cè)呢?實(shí)現(xiàn)的思路代碼如下:
后端處理邏輯
import cv from "opencv"; const detectConfigFile = "./node_modules/opencv/data/haarcascade_frontalface_alt2.xml"; // camera properties const camWidth = 320; const camHeight = 240; const camFps = 10; const camInterval = 1000 / camFps; // face detection properties const rectColor = [0, 255, 0]; const rectThickness = 2; // initialize camera const camera = new cv.VideoCapture(0); camera.setWidth(camWidth); camera.setHeight(camHeight); const frameHandler = (err, im) => { return new Promise((resolve, reject) => { if (err) { return reject(err); } im.detectObject(detectConfigFile, {}, (error, faces) => { if (error) { return reject(error); } let face; for (let i = 0; i < faces.length; i++) { face = faces[i]; im.rectangle([face.x, face.y], [face.width, face.height], rectColor, rectThickness); } return resolve(im); }); }); }; module.exports = function (socket) { const frameSocketHanlder = (err, im) => { return frameHandler(err, im) .then((img) => { socket.emit("frame", { buffer: img.toBuffer(), }); }); }; const handler = () => { camera.read(frameSocketHanlder); }; setInterval(handler, camInterval); };
前端調(diào)用接口
socket.on("frame", function (data) { var unit8Arr = new Uint8Array(data.buffer); var str = String.fromCharCode.apply(null, unit8Arr); var base64String = btoa(str); img.onload = function () { ctx.drawImage(this, 0, 0, canvas.width, canvas.height); } img.src = "data:image/png;base64," + base64String; });4 總結(jié) 4.1 未來的發(fā)展
這些前沿的技術(shù)將會(huì)在前端得到更為廣泛的應(yīng)用和支持是毋庸置疑的,未來的圖像在前端也會(huì)隨著傳統(tǒng)圖像處理->學(xué)習(xí)+圖像處理的方式前進(jìn),這一切的功勞離不開基礎(chǔ)設(shè)施(硬件、瀏覽器、工具、庫等)的逐漸增強(qiáng)和完善,其中包括但不僅限于:
getUserMedia/Canvas => 圖像 / 視頻的操作
Shape Detection API => 圖像檢測(cè)
Web Workers => 并行計(jì)算能力
ConvNetJS => 深度學(xué)習(xí)框架
4.2 實(shí)際上并沒有那么樂觀4.2.1 準(zhǔn)確率
對(duì)于正臉(多個(gè))的識(shí)別率還是比較高的,但是在側(cè)臉已經(jīng)有障礙物的情況下,檢測(cè)的效果并不理想。
4.2.2 處理速度
對(duì)于圖像中人臉檢測(cè)的例子2.2,耗費(fèi)時(shí)間300ms+(實(shí)際上無法滿足大分辨率視頻實(shí)時(shí)處理),是調(diào)用Opencv的檢測(cè)速度100ms的三倍之多。
4.2.3 特性
還有很多需要完善的地方:如不支持眼鏡狀態(tài)、性別、年齡估計(jì)、表情識(shí)別、人種、笑容、模糊檢測(cè)等主流服務(wù)提供商提供的服務(wù)。
4.3 想說又說不完的Demo:
https://github.com/x-cold/fac...
https://github.com/x-cold/fac...
關(guān)于人臉檢測(cè)在不同場(chǎng)景的適應(yīng)性,以及檢測(cè)消耗的時(shí)間暫時(shí)沒有數(shù)據(jù)支撐,后面考慮引入PASCAL VOC、AT&T提供的樣本進(jìn)行小規(guī)模的測(cè)試。
招資深前端安卓IOS視覺交互:[email protected]
5 參考人臉識(shí)別技術(shù)大總結(jié)(1):Face Detection & Alignment: http://blog.jobbole.com/85783/
阿里巴巴直播防控中的實(shí)人認(rèn)證技術(shù): https://xianzhi.aliyun.com/fo...
前端在人工智能時(shí)代能做些什么?:https://yq.aliyun.com/article...
ConvNetJS Deep Learning in your browser:http://cs.stanford.edu/people...
Face detection using Shape Detection API:https://paul.kinlan.me/face-d...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87196.html
摘要:前言過年了,來點(diǎn)有趣的東西最近一直在嘗試通過如何視頻,怎么捕捉視頻的行為,給視頻加點(diǎn)好玩的東西比如給視頻加一個(gè)胡子以下記錄一下最近的玩具點(diǎn)擊這里看自己的效果需要允許攝像頭呀效果效果大概如下就是給視頻的臉上加個(gè)胡子我手機(jī)上有防藍(lán)光的膜,各位大 前言 過年了,來點(diǎn)有趣的東西 最近一直在嘗試通過web如何DIY視頻,怎么捕捉視頻的行為,給視頻加點(diǎn)好玩的東西,比如給視頻加一個(gè)胡子? 以下記錄一...
摘要:前端日?qǐng)?bào)精選專題之函數(shù)柯里化前端可用性保障實(shí)踐入門指南頁面布局這個(gè)屬性你可能都不知道如何監(jiān)聽頁面變動(dòng)并高效響應(yīng)發(fā)布中文深入理解筆記集合與集合第期介紹譯系統(tǒng)設(shè)計(jì)入門之面試題解答設(shè)計(jì)一個(gè)網(wǎng)頁爬蟲掘金基于構(gòu)建的移動(dòng)端微應(yīng)用個(gè)人文章 2017-08-11 前端日?qǐng)?bào) 精選 JavaScript專題之函數(shù)柯里化前端可用性保障實(shí)踐CSS入門指南-4:頁面布局 這5個(gè)CSS屬性你可能都不知道!如何監(jiān)聽...
摘要:阿里安全圖靈實(shí)驗(yàn)室的算法程序媛于鯤在阿里巴巴這幾年的錘煉,于鯤已經(jīng)成長(zhǎng)為國(guó)內(nèi)人臉核心算法領(lǐng)域的頂級(jí)專家。在阿里巴巴是一種全新的體驗(yàn)從年到現(xiàn)在,于鯤一直在做人臉識(shí)別技術(shù)的研究和開發(fā)。 摘要: 一個(gè)專注人臉識(shí)別技術(shù)長(zhǎng)達(dá)11年的程序媛。 程序媛、AI、算法、人臉識(shí)別、阿里安全圖靈實(shí)驗(yàn)室……這些標(biāo)簽任何一個(gè)都極具話題性,但如果一個(gè)女子同時(shí)擁有這些標(biāo)簽,那會(huì)是怎樣的存在? 在見到于鯤之前,我的...
閱讀 2032·2023-04-25 22:50
閱讀 2845·2021-09-29 09:35
閱讀 3399·2021-07-29 10:20
閱讀 3169·2019-08-29 13:57
閱讀 3368·2019-08-29 13:50
閱讀 3043·2019-08-26 12:10
閱讀 3538·2019-08-23 18:41
閱讀 2646·2019-08-23 18:01