人臉識(shí)別趟坑歷程

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)用中一般我們采用方法如下:

  1. 采用預(yù)覽框,讓拍攝時(shí)讓頭像落在預(yù)覽框中,減少多余圖像。
  2. 進(jìn)行人臉檢測(cè),裁剪頭像外多余圖片
  3. 合理設(shè)置壓縮比,縮小圖片
  4. 降低圖片質(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)臨。

5. 參考

  1. 百度人臉識(shí)別技術(shù)文檔
  2. 人臉識(shí)別(face recognition
  3. 關(guān)于Android 使用官方API 實(shí)現(xiàn)人臉檢測(cè)功能
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,472評(píng)論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,251評(píng)論 4 61
  • 隨意散步在布拉格的街道上時(shí),我們發(fā)現(xiàn)路邊有一家小型的話劇館,門外擺放出的海報(bào)主打是“The Beatles”甲殼蟲(chóng)...
    c1ce464d077b閱讀 810評(píng)論 2 3
  • 前言 不敢說(shuō)覆蓋OC中所有copy的知識(shí)點(diǎn),但最起碼是目前最全的最新的一篇關(guān)于 copy的技術(shù)文檔了。后續(xù)發(fā)現(xiàn)有新...
    zyydeveloper閱讀 3,421評(píng)論 4 35
  • 今天渾身腰酸背痛發(fā)燒的節(jié)奏。身體的抵抗力真是下降了,昨天似乎有點(diǎn)咳嗽,到了晚上就胸口痛了,今天去閔行上課更是如...
    fieldsky閱讀 134評(píng)論 0 0