1.人臉識(shí)別概述
人臉識(shí)別,是基于人的臉部特征信息進(jìn)行身份識(shí)別的一種生物識(shí)別技術(shù)。用攝像機(jī)或攝像頭采集含有人臉的圖像或視頻流,并自動(dòng)在圖像中檢測(cè)和跟蹤人臉,進(jìn)而對(duì)檢測(cè)到的人臉進(jìn)行臉部的一系列相關(guān)技術(shù)。其中技術(shù)包括圖像采集、特征定位、身份的確認(rèn)和查找等等。簡(jiǎn)單來(lái)說(shuō),就是從照片中提取人臉中的特征,比如眉毛高度、嘴角等等,再通過(guò)特征的對(duì)比輸出結(jié)果。
聽(tīng)著這么高大上,很高科技,然而目前很多人臉識(shí)別的落地應(yīng)用還處在一個(gè)非常初級(jí)的階段,在我國(guó)應(yīng)用最多還是1:1等級(jí),也就是人臉識(shí)別中最初級(jí)的“證明你是你”。 目前國(guó)內(nèi)已有一些人臉識(shí)別開(kāi)發(fā)平臺(tái),開(kāi)發(fā)者可以直接調(diào)用他們的開(kāi)發(fā)的API ,進(jìn)行一些簡(jiǎn)單的人臉識(shí)別應(yīng)用的開(kāi)發(fā)。
筆者直接采用市場(chǎng)上人臉識(shí)別開(kāi)發(fā)平臺(tái)的API,進(jìn)行人臉識(shí)別快速開(kāi)發(fā),不涉及原理、算法、模型等復(fù)雜東西,當(dāng)然如果對(duì)人臉識(shí)別原理比較感興趣,可以參考這篇博客:人臉識(shí)別(face recognition)。
筆者目前正在進(jìn)行智能設(shè)備上人臉識(shí)別研究,本文就記錄筆者在人臉識(shí)別這個(gè)項(xiàng)目的趟坑歷程,希望對(duì)人臉識(shí)別感興趣的各位作一些參考。
2. 人臉識(shí)別平臺(tái)選擇
目前人臉識(shí)別在國(guó)內(nèi)發(fā)展迅速,各種新興公司如雨后春筍,目前中國(guó)人臉識(shí)別的獨(dú)角獸:face++ 的曠視科技,senseTime的商湯科技,還有云從科技,依圖科技,他們依舊在繼續(xù)發(fā)力,搶奪市場(chǎng)。
而國(guó)內(nèi)的 BAT 對(duì)人臉識(shí)別這個(gè)方向也蠻重視,阿里巴巴控股曠視科技、依圖科技,并且開(kāi)發(fā)自己的人臉識(shí)別接口,已全面將人臉識(shí)別技術(shù)應(yīng)用到自己支付寶、淘寶等平臺(tái),并聯(lián)合系統(tǒng)旗下其他業(yè)務(wù)板塊,培養(yǎng)人臉識(shí)別的應(yīng)用場(chǎng)景;騰訊旗下有自己內(nèi)部的優(yōu)圖團(tuán)隊(duì),為 QQ 空間、騰訊地圖、騰訊游戲等 50 多款產(chǎn)品提供圖像技術(shù)支持;百度人臉識(shí)別也依靠龐大的數(shù)據(jù)資源進(jìn)步神速,已推出百度識(shí)圖、臉優(yōu)app等產(chǎn)品。
目前云從科技,依圖,商湯等知名的人臉識(shí)別公司主要做企業(yè)用戶,目前市面上能提供開(kāi)放平臺(tái)給開(kāi)發(fā)者,免費(fèi)進(jìn)行調(diào)試的就只有BAT三家旗下的產(chǎn)品
下面是筆者調(diào)研百度、騰訊、face++這三家人臉識(shí)別開(kāi)放平臺(tái)對(duì)比。
公司 | 免費(fèi)額度 | 收費(fèi) | 技術(shù)能力 | 知名應(yīng)用 |
---|---|---|---|---|
百度 | <=1000次/天 | 公測(cè)階段,未開(kāi)始收費(fèi) | 99.77%(LFW) | 百變魔圖 百度網(wǎng)盤 |
騰訊優(yōu)圖 | 2萬(wàn)張/月 | >=0.0005元/張,階梯價(jià)位 | 99.80%(LFW) 83.29%(MegaFace) | 微眾銀行 手機(jī)QQ |
face++ | 有限用量,共享的 QPS 配額,<=1000FaceSet,<=1000000faces | >=0.001次 | 技術(shù)先進(jìn) | 支付寶 滴滴 |
上面的三家企業(yè)均可以免費(fèi)接入,然后對(duì)比下來(lái),各位選擇誰(shuí)家呢?face++平臺(tái)開(kāi)放早,業(yè)內(nèi)名氣大,應(yīng)用多,背靠阿里,坐擁龐大的用戶群體;騰訊優(yōu)圖平臺(tái)后發(fā)先至,有龐大的社交平臺(tái)作依托,技術(shù)實(shí)力強(qiáng)悍;百度技術(shù)先進(jìn),免費(fèi)額度高。
筆者產(chǎn)品離大規(guī)模商業(yè)應(yīng)用還是有段距離,現(xiàn)階段還是技術(shù)體驗(yàn)階段,所以筆者就選擇免費(fèi)額度比較大的百度。現(xiàn)階段百度還是公測(cè)階段,正式收費(fèi)后,可以重點(diǎn)關(guān)注騰訊優(yōu)圖與百度,目前人臉識(shí)別開(kāi)發(fā)平臺(tái)中這兩家技術(shù)處于領(lǐng)先地位。
3. 人臉識(shí)別流程
從2015年3月馬云展示支付寶的刷臉支付,目前很多app中也加入了人臉識(shí)別功能,然而現(xiàn)在人臉識(shí)別應(yīng)用還在很初級(jí)階段,目前我國(guó)應(yīng)用最多還是1:1等級(jí),也就是人臉識(shí)別中最初級(jí)的“證明你是你”,一般應(yīng)用于身份核對(duì)方面。
下圖是目前人臉識(shí)別最常見(jiàn)的流程圖:
用戶拍攝自己身份信息并上傳系統(tǒng),系統(tǒng)經(jīng)過(guò)公民身份信息查詢獲取用戶信息,建立用戶檔案,關(guān)聯(lián)用戶人臉;下次掃描頭像,經(jīng)活體檢測(cè)、人臉質(zhì)量檢測(cè)、人臉圖像等處理后進(jìn)行人臉對(duì)比,核對(duì)結(jié)果,完成“你是你”的證明。
另外目前中國(guó)公民身份證上的圖片一般拍攝的比較早,與本人現(xiàn)在頭像差距較大,如果直接用身份證上面的圖片會(huì)加大識(shí)別難度,識(shí)別誤差大。目前通常做法是完成身份證信息提交后,還需添加人臉,即進(jìn)行活體檢測(cè)、人臉質(zhì)量檢測(cè)、處理人臉圖像,添加用戶的現(xiàn)在頭像并關(guān)聯(lián)用戶,下次人臉識(shí)別時(shí)與此頭像進(jìn)行對(duì)比。
目前市場(chǎng)上大部分帶有人臉識(shí)別的app,都是C端產(chǎn)品,用戶掃自己,實(shí)現(xiàn)在線用戶身份驗(yàn)證。當(dāng)人臉核對(duì)時(shí),app需將用戶信息及拍攝的人臉圖像上傳,根據(jù)用戶信息獲取該用戶之前人臉數(shù)據(jù),其實(shí)最終的是現(xiàn)在拍攝的人臉與該用戶所關(guān)聯(lián)之前的人臉圖像進(jìn)行對(duì)比,判斷是否為「真人」且為「本人」,快捷的完成身份核實(shí)工作。
筆者的小項(xiàng)目就沒(méi)有這么復(fù)雜的,而且信息少,是B端產(chǎn)品,商戶使用。商戶掃描用戶,識(shí)別用戶的人臉,查詢?nèi)四様?shù)據(jù)庫(kù),找到最相似的,當(dāng)相似度超過(guò)80%,就可以判斷該用戶就是我們所需要的客戶,完成身份的確認(rèn)。我們項(xiàng)目更像是一個(gè)會(huì)員的管理系統(tǒng)。詳細(xì)的流程圖如下:
拍攝會(huì)員頭像,上傳頭像并關(guān)聯(lián)會(huì)員的id,系統(tǒng)存儲(chǔ)他們關(guān)系,完成用戶注冊(cè);當(dāng)下次用戶過(guò)來(lái),掃描用戶進(jìn)行人臉檢測(cè)、人臉處理、上傳頭像、人臉識(shí)別,查詢到該頭像所對(duì)應(yīng)的會(huì)員id, 從而得到該用戶的所有信息,從而對(duì)該用戶進(jìn)行后續(xù)服務(wù)。
然而落實(shí)到具體項(xiàng)目中,我們發(fā)現(xiàn)如果我們進(jìn)行人臉識(shí)別過(guò)程、完成人臉捕獲、質(zhì)量檢測(cè)、頭像處理、人臉檢測(cè)、活體檢測(cè)、人臉識(shí)別等這么多流程,會(huì)導(dǎo)致我們耗時(shí)嚴(yán)重,體檢較差,我們必須精簡(jiǎn)流程,提高人臉識(shí)別速度。另外市場(chǎng)上app 要求用戶進(jìn)行眨眼、說(shuō)口令等操作,通過(guò)我們的一些微表情、微動(dòng)作判斷攝象頭面前的人是活生生的真人,完成活體檢測(cè),驗(yàn)證是否真人,而非是虛假的頭像。但是目前筆者還未找到免費(fèi)開(kāi)放的活體檢測(cè)API,而百度人臉識(shí)別API中含有活體檢測(cè)參數(shù)配置,可以進(jìn)行靜態(tài)的活體檢測(cè),筆者就采用此方案。
人臉識(shí)別方面的流程精簡(jiǎn)優(yōu)化為:
當(dāng)設(shè)備掃描人臉,預(yù)覽頭像自動(dòng)完成人臉定位與檢測(cè)。開(kāi)啟子線程處理掃描得到的圖片,進(jìn)行人臉檢測(cè),當(dāng)人臉檢測(cè)失敗時(shí)繼續(xù)獲取圖片開(kāi)始新一輪的檢測(cè)人臉,直至人臉檢測(cè)成功。當(dāng)人臉檢測(cè)返回成功,停止掃描人臉檢測(cè),開(kāi)始處理頭像、上傳頭像、進(jìn)行人臉識(shí)別。另外如果設(shè)備對(duì)準(zhǔn)了人臉頭像,確認(rèn)頭像無(wú)誤,也可以手動(dòng)拍攝頭像、上傳頭像、進(jìn)行人臉識(shí)別。
3. 人臉識(shí)別趟坑細(xì)節(jié)
3.1 圖片壓縮
目前市面的人臉識(shí)別開(kāi)發(fā)平臺(tái)的 API 對(duì)上傳的圖片都是有一定的限制的,好一點(diǎn)的是10M,很多API限制為2M, 例如筆者在用的百度人臉識(shí)別API中對(duì)人臉檢測(cè)的上傳圖片限制是小于2M, 人臉識(shí)別是小于10M;騰訊優(yōu)圖對(duì)整個(gè)請(qǐng)求包體限制為2M, 那上傳的圖片限制更小了;
在這里需要注意一個(gè)問(wèn)題,現(xiàn)在很多家人臉識(shí)別開(kāi)放平臺(tái)對(duì)圖片限制的大小是指base64編碼后大小。我們知道Base64編碼要求把3個(gè)8位字節(jié)轉(zhuǎn)化為4個(gè)6位的字節(jié),之后在6位的前面補(bǔ)兩個(gè)0,形成8位一個(gè)字節(jié)的形式。如果剩下的字符不足3個(gè)字節(jié),則用0填充,輸出字符使用’=’,因此編碼后輸出的文本末尾可能會(huì)出現(xiàn)1或2個(gè)’=’。由此可見(jiàn)圖片經(jīng)base64編碼后數(shù)據(jù)量會(huì)變大,簡(jiǎn)單計(jì)算大約是原來(lái)數(shù)據(jù)量的4/3倍。
(具體可以參見(jiàn)http://www.ruanyifeng.com/blog/2008/06/base64.html)
所以最終上傳圖片大小限制更小了,筆者使用百度人臉識(shí)別接口,限制為10M,實(shí)際上圖片限制大小為大約為10*3/4= 7.5M。
目前的手機(jī)攝像頭拍照出現(xiàn)的照片像素都很高,動(dòng)不動(dòng)就1200W像素,1600W像素,甚至是2000W也常見(jiàn),拍出來(lái)的圖片數(shù)據(jù)量都很大,一張圖片幾十M現(xiàn)在都很常見(jiàn)。然后這么大的圖片直接上傳給人臉識(shí)別API 肯定是不行的。我們必須要想方設(shè)法減少圖片的大小。
另外筆者發(fā)現(xiàn)當(dāng)我們上傳的圖片數(shù)據(jù)量比較大時(shí),API響應(yīng)比較慢,筆者曾經(jīng)測(cè)試過(guò)當(dāng)上傳圖片為10M,API 返回結(jié)果時(shí)間需要15s左右,當(dāng)減到5M為10s左右,當(dāng)圖片大小減到2M返回結(jié)果需要7s左右(統(tǒng)計(jì)數(shù)據(jù)不是很準(zhǔn)確,僅供參考)。
這個(gè)原因不難理解,當(dāng)我們上傳圖片數(shù)據(jù)量大,我們圖片上傳及服務(wù)器處理肯定耗時(shí)加長(zhǎng),為提高API 調(diào)用速度,減少響應(yīng)時(shí)間,也必須減少圖片大小,進(jìn)行圖片壓縮。
減少圖片數(shù)據(jù)量的原理無(wú)非就是兩條:一是縮小圖片的長(zhǎng)寬,二是降低圖片的質(zhì)量。應(yīng)用中一般我們采用方法如下:
- 采用預(yù)覽框,讓拍攝時(shí)讓頭像落在預(yù)覽框中,減少多余圖像。
- 進(jìn)行人臉檢測(cè),裁剪頭像外多余圖片
- 合理設(shè)置壓縮比,縮小圖片
- 降低圖片質(zhì)量
另外圖片壓縮算法Luban,號(hào)稱可能是最接近微信朋友圈的圖片壓縮算法,各位可以借鑒一下。
3.2 相機(jī)調(diào)整
目前的人臉識(shí)別都需要相機(jī)預(yù)覽頭像,并拍攝頭像照片,因此很多工作與相機(jī)相關(guān),我們需要設(shè)置好相機(jī)參數(shù)。
當(dāng)我們對(duì)準(zhǔn)人臉時(shí)候發(fā)現(xiàn),相機(jī)離人臉比較遠(yuǎn)時(shí),預(yù)覽的人臉比較小;當(dāng)相機(jī)靠近時(shí),預(yù)覽的人臉比較大。當(dāng)我們的人臉頭像過(guò)小時(shí),頭像質(zhì)量比較差,人臉檢測(cè)及人臉識(shí)別容易出差錯(cuò)。另外測(cè)試發(fā)現(xiàn)每個(gè)手機(jī)的放大倍數(shù)不是都是相同的,這可能與各個(gè)手機(jī)的型號(hào)相關(guān)。如果直接設(shè)置為一個(gè)固定值,這可能會(huì)在某些手機(jī)上過(guò)度放大,某些手機(jī)上放大的倍數(shù)不夠。索性相機(jī)的參數(shù)設(shè)定里給我們提供了最大的放大倍數(shù)值,通過(guò)取放大倍數(shù)值的N分之一作為當(dāng)前的放大倍數(shù),就完美地解決了手機(jī)的適配問(wèn)題。
private static final int TEN_DESIRED_ZOOM = 27;
private void setZoom(Camera.Parameters parameters) {
String zoomSupportedString = parameters.get("zoom-supported");
if (zoomSupportedString != null && !Boolean.parseBoolean(zoomSupportedString)) {
return;
}
int tenDesiredZoom = TEN_DESIRED_ZOOM;
String maxZoomString = parameters.get("max-zoom");
if (maxZoomString != null) {
try {
int tenMaxZoom = (int) (10.0 * Double.parseDouble(maxZoomString));
if (tenDesiredZoom > tenMaxZoom) {
tenDesiredZoom = tenMaxZoom;
}
} catch (NumberFormatException nfe) {
Log.e(TAG, "Bad max-zoom: " + maxZoomString);
}
}
String takingPictureZoomMaxString = parameters.get("taking-picture-zoom-max");
if (takingPictureZoomMaxString != null) {
try {
int tenMaxZoom = Integer.parseInt(takingPictureZoomMaxString);
if (tenDesiredZoom > tenMaxZoom) {
tenDesiredZoom = tenMaxZoom;
}
} catch (NumberFormatException nfe) {
Log.e(TAG, "Bad taking-picture-zoom-max: " + takingPictureZoomMaxString);
}
}
String motZoomValuesString = parameters.get("mot-zoom-values");
if (motZoomValuesString != null) {
tenDesiredZoom = findBestMotZoomValue(motZoomValuesString, tenDesiredZoom);
}
String motZoomStepString = parameters.get("mot-zoom-step");
if (motZoomStepString != null) {
try {
double motZoomStep = Double.parseDouble(motZoomStepString.trim());
int tenZoomStep = (int) (10.0 * motZoomStep);
if (tenZoomStep > 1) {
tenDesiredZoom -= tenDesiredZoom % tenZoomStep;
}
} catch (NumberFormatException nfe) {
// continue
}
}
if (parameters.isZoomSupported()) {
Log.e(TAG, "max-zoom:" + parameters.getMaxZoom());
if (SystemUtils.isMadGlass() && parameters.getMaxZoom() >= 8) {
parameters.setZoom(8);
} else {
parameters.setZoom(parameters.getMaxZoom() / tenDesiredZoom);
}
} else {
Log.e(TAG, "Unsupported zoom.");
}
// Most devices, like the Hero, appear to expose this zoom parameter.
// It takes on values like "27" which appears to mean 2.7x zoom
// if (takingPictureZoomMaxString != null) {
// parameters.set("taking-picture-zoom", tenDesiredZoom);
// }
}
另外拍攝頭像時(shí)聚焦、預(yù)覽尺寸/圖片尺寸選擇、掃描區(qū)域等等也需要進(jìn)行考慮。筆者前段時(shí)間做了Zxing優(yōu)化,涉及相機(jī)方面的優(yōu)化設(shè)置,可供參考。
3.3 預(yù)覽圖片轉(zhuǎn)換
目前筆者在拍攝預(yù)覽時(shí)不停地進(jìn)行人臉的檢測(cè),檢測(cè)出人臉后才開(kāi)始處理頭像
、進(jìn)行人臉識(shí)別。目前進(jìn)行拍攝預(yù)覽,獲取預(yù)覽頭像數(shù)據(jù)也很簡(jiǎn)單。只需給 camera 對(duì)象設(shè)置一個(gè) Camera.PreviewCallback
,在這個(gè)回調(diào)中實(shí)現(xiàn)一個(gè)方法 onPreviewFrame(byte[] data, Camera camera)
,
data 就是我們預(yù)覽得到的圖片數(shù)據(jù),我們只要將其轉(zhuǎn)換成bitmap即可,接下來(lái)進(jìn)行人臉檢測(cè)等后續(xù)工作。然而的預(yù)覽數(shù)據(jù)格式問(wèn)題,得到數(shù)據(jù)不是Bitmap格式,不能簡(jiǎn)單通過(guò)BitmapFactory.decodeByteArray
轉(zhuǎn)換成Bitmap。
Android相機(jī)預(yù)覽的時(shí)候支持幾種不同的格式,從圖像的角度(ImageFormat)來(lái)說(shuō)有NV16、NV21、YUY2、YV12、RGB_565和JPEG,從像素的角度(PixelFormat)來(lái)說(shuō),對(duì)應(yīng)的是YUV422SP、YUV420SP、YUV422I、YUV420P、RGB565和JPEG。
目前大部分Android手機(jī)攝像頭設(shè)置的默認(rèn)格式是yuv420sp,即圖像格式NV21,編碼成YUV的所有像素格式里,yuv420sp占用的空間是最小的。預(yù)覽得到數(shù)據(jù)可以經(jīng)過(guò)YuvImage
轉(zhuǎn)換成Bitmap格式。
private void decode(final byte[] data, int width, int height) {
YuvImage yuv = new YuvImage(data, ImageFormat.NV21, width, height, null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
yuv.compressToJpeg(new Rect(0, 0, width, height), 100, out);
byte[] bytes = out.toByteArray();
final Bitmap picture = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
......
3.4 Android官方人臉識(shí)別API
Android 4.1開(kāi)始提供人臉識(shí)別開(kāi)發(fā)API,我們可以根據(jù)其API進(jìn)行簡(jiǎn)單的人臉檢測(cè),判斷是否包含人臉,及確認(rèn)人臉大小,眼距等參數(shù)。
private static final int MAX_FACE_NUM = 4;//最大可以檢測(cè)出的人臉數(shù)量
public void faceDetect(Bitmap srcImg) {
Bitmap bm = srcImg.copy(Bitmap.Config.RGB_565, true);
//最關(guān)鍵的就是下面三句代碼
FaceDetector faceDetector = new FaceDetector(bm.getWidth(), bm.getHeight(), MAX_FACE_NUM);
FaceDetector.Face[] faces = new FaceDetector.Face[MAX_FACE_NUM];
int realFaceNum = faceDetector.findFaces(bm, faces);
Log.i(tag, "檢測(cè)到人臉:n = " + realFaceNum);
for (int i = 0; i < realFaceNum; i++) {
FaceDetector.Face f = faces[i];
PointF midPoint = new PointF();
float dis = f.eyesDistance();//獲取人臉兩眼的間距
f.getMidPoint(midPoint); //獲取人臉中心點(diǎn)
int dd = (int) (dis);
Point eyeLeft = new Point((int) (midPoint.x - dis / 2), (int) midPoint.y);
Point eyeRight = new Point((int) (midPoint.x + dis / 2), (int) midPoint.y);
Rect faceRect = new Rect((int) (midPoint.x - dd), (int) (midPoint.y - dd), (int) (midPoint.x + dd), (int) (midPoint.y + dd));
Log.i(tag, "左眼坐標(biāo) x = " + eyeLeft.x + "y = " + eyeLeft.y);
Canvas canvas = new Canvas(bm);
Paint p = new Paint();
p.setAntiAlias(true);
p.setStrokeWidth(8);
p.setStyle(Paint.Style.STROKE);
p.setColor(Color.GREEN);
canvas.drawCircle(eyeLeft.x, eyeLeft.y, 20, p);
canvas.drawCircle(eyeRight.x, eyeRight.y, 20, p);
canvas.drawRect(faceRect, p);
}
ImageUtil.saveJpeg(bm);
Log.i(tag, "保存完畢");
}
而人臉識(shí)別特性不是在所有的Android 4.1以上的設(shè)備上都支持,有網(wǎng)友測(cè)試了谷歌系列的設(shè)備,有的設(shè)備也不支持使用官方API方式實(shí)現(xiàn)人臉識(shí)別功能,具體問(wèn)題還是得追蹤底層是否開(kāi)放這個(gè)功能!我們可以調(diào)用getMaxNumDetectedFaces()來(lái)檢測(cè)設(shè)備是否支持。各位在使用官方的人臉檢測(cè) API 時(shí)需要注意這一點(diǎn)。
4. 總結(jié)
目前筆者按照自己的想法做個(gè)了一個(gè)人臉識(shí)別的demo, 研究下來(lái)發(fā)現(xiàn)人臉識(shí)別技術(shù)沒(méi)有網(wǎng)上宣傳的那么酷炫,那么高大上。
其實(shí)目前人臉識(shí)別的應(yīng)用還停留在基礎(chǔ)上,也就是在較好環(huán)境中實(shí)現(xiàn)1:1人臉識(shí)別,而拍照美顏更僅僅應(yīng)用到了人臉特征定點(diǎn)提取,連識(shí)別預(yù)處理都算不上。對(duì)應(yīng)復(fù)雜環(huán)境、拍攝條件差情況下,人臉識(shí)別檢測(cè)困難。而對(duì)于1:N級(jí)和N:N級(jí)的人臉識(shí)別,也就是單一特征對(duì)比多種特征和多種特征對(duì)比多種特征。而這兩種等級(jí)的人臉識(shí)別在應(yīng)用上也常常無(wú)法提供較好的環(huán)境,比如1:N級(jí)人臉識(shí)別可以應(yīng)用于失蹤人口搜索中,在特殊情況下拍的照片存在角度、光線的復(fù)雜性,加大了特征提取、對(duì)比的難度。可見(jiàn)人臉識(shí)別大規(guī)模商業(yè)應(yīng)用還是有很長(zhǎng)一條路要走,但目前技術(shù)進(jìn)步神速,相信我們未來(lái)完全依靠刷臉的時(shí)代會(huì)來(lái)臨。