當(dāng)人臉識(shí)別技術(shù)遇上了口罩……
功能完全失靈,以往看一眼就能解鎖、支付的人工智能,現(xiàn)在宛如“廢柴”。
這不,網(wǎng)友們紛紛吐槽:
更有網(wǎng)友建議各大手機(jī)廠(chǎng)商開(kāi)發(fā)新功能:
最初我們知道AI人臉識(shí)別技術(shù),是作為一種重要的個(gè)人身份鑒別方法,用于罪犯照片管理和刑偵破案,現(xiàn)在這種技術(shù)在安全系統(tǒng)和商貿(mào)系統(tǒng)中都有很多的應(yīng)用。
如今,我們每時(shí)每刻依賴(lài)著這項(xiàng)功能。
早上起床對(duì)準(zhǔn)手機(jī)看一下便自動(dòng)解鎖;
網(wǎng)上購(gòu)物“刷臉”支付;
外出購(gòu)物不需要帶現(xiàn)金、在機(jī)器面前“刷臉”支付即可,上班“刷臉”打卡;
搭乘高鐵、飛機(jī)實(shí)行無(wú)紙質(zhì)的“刷臉”安檢通道......
這項(xiàng)逐漸融入日常生活各個(gè)領(lǐng)域的技術(shù),給我們的生活帶來(lái)了天翻地覆的便利。接下來(lái)讓我?guī)е蠹液?jiǎn)單學(xué)習(xí)這項(xiàng)技術(shù)~
01.AI人臉識(shí)別
人臉識(shí)別是計(jì)算機(jī)視覺(jué)和模式識(shí)別的交叉領(lǐng)域,又將兩者結(jié)合在一起。
20 世紀(jì) 80 年代后期在人臉識(shí)別中引入了神經(jīng)生理學(xué)、腦神經(jīng)學(xué)、視覺(jué)知識(shí)等,結(jié)合計(jì)算機(jī)技術(shù)的迅猛發(fā)展以及計(jì)算成本的迅速下降使得以前比較費(fèi)時(shí)費(fèi)空間的一些模式匹配算法,如大樣本的引入、多維特征參 數(shù)的提取、建模等。
人臉識(shí)別這一領(lǐng)域的研究除了具有重大理論價(jià)值外,也極具實(shí)用價(jià)值,是基于人的臉部特征信息進(jìn)行身份識(shí)別的一種生物識(shí)別技術(shù)。
02.識(shí)別領(lǐng)域
人臉檢測(cè)
是指檢測(cè)并定位圖片中的人臉,返回高精度的人臉框坐標(biāo),是對(duì)人臉進(jìn)行分析和處理的第一步。
早期的檢測(cè)過(guò)程稱(chēng)為“滑動(dòng)窗口”,也就是選擇圖像中的某個(gè)矩形區(qū)域作為滑動(dòng)窗口,在這個(gè)窗口中提取一些特征對(duì)這個(gè)圖像區(qū)域進(jìn)行描述,最后根據(jù)這些特征描述來(lái)判斷這個(gè)窗口是不是人臉(如下圖所示)。
人臉檢測(cè)的過(guò)程就是不斷遍歷需要觀(guān)察的窗口
人臉關(guān)鍵點(diǎn)檢測(cè)
是指定位并返回人臉五官與輪廓的關(guān)鍵點(diǎn)坐標(biāo)位置(如下圖所示)。
關(guān)鍵點(diǎn)包括人臉、輪廓、眼睛、眉毛、嘴唇以及鼻子輪廓。
現(xiàn)在某些人臉識(shí)別公司,如 Face++能提供高精度的關(guān)鍵點(diǎn),最多可達(dá) 106 點(diǎn)。
無(wú)論是靜態(tài)圖片還是動(dòng)態(tài)視頻流,均能完美貼合人臉。
人臉關(guān)鍵點(diǎn)定位技術(shù)
關(guān)鍵點(diǎn)定位技術(shù)主要有級(jí)聯(lián)形回歸(cascaded shape regression,CSR),目前人臉識(shí)別一般是基于 DeepID 網(wǎng)絡(luò)結(jié)構(gòu)。
DeepID 網(wǎng)絡(luò)結(jié)構(gòu)和卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)類(lèi)似,主要區(qū)別在倒數(shù)第二層,DeepID 網(wǎng)絡(luò)結(jié) 構(gòu)有一個(gè) DeepID 層,它與卷積層4和最大池化層3相連,由于卷積神經(jīng)網(wǎng)絡(luò)層數(shù)越高視野域越大,這種連接方式可以既考慮局部的特征,又考慮全局的特征(下圖所示)。
人臉驗(yàn)證
是指分析兩張人臉屬于同一個(gè)人的可能性大小。
輸入兩張人臉,得到一個(gè)置信度分?jǐn)?shù)和相應(yīng)的閾值,以便評(píng)估相似度。
下圖是調(diào)用 Face++的人臉驗(yàn)證在線(xiàn)接口得到的結(jié)果。對(duì)比結(jié)果為:是同一個(gè)人的可能性很高。
人臉屬性檢測(cè)
分為人臉屬性辨識(shí)和人臉情緒分析。
例如,給出人的年齡、是否有胡子、情緒(高興、正常、生氣、憤怒)、性別、是否帶眼鏡、膚色等來(lái)進(jìn)行人臉屬性辨識(shí)和人臉情緒分析。
下圖給出的一張照片的測(cè)試結(jié)果因?yàn)榛瘖y和燈光的原因,結(jié)果并不是很準(zhǔn)確。
02.數(shù)據(jù)預(yù)處理
在圖像識(shí)別中,數(shù)據(jù)預(yù)處理是很重要的一步。
這里使用 facenet 源代碼下的 align 模塊去校準(zhǔn)。我們需要將檢測(cè)所使 用的數(shù)據(jù)集校準(zhǔn)為和預(yù)訓(xùn)練模型所使用的數(shù)據(jù)集大小一致。
為了能正確運(yùn)行校準(zhǔn)程序,需要設(shè)置一下環(huán)境變量:
- export PYTHONPATH=$YOURHOME/facenet/src
校準(zhǔn)命令如下:
- for N in {1..4}; do python src/align/align_dataset_mtcnn.py $YOURHOME/facenet /datasets/lfw/raw $YOURHOME/facenet/datasets/lfw/lfw_mtcnnpy_160 --image_size 160 --margin 32 --random_order --gpu_memory_fraction 0.25 done
這里采用 GitHub 上提供的預(yù)訓(xùn)練模型 20170216-091149.zip,采用的訓(xùn)練集是 MS-Celeb-1M 數(shù)據(jù)集。
MS-Celeb-1M 是微軟的一個(gè)非常大的人臉識(shí)別數(shù)據(jù)庫(kù),它是從名人榜上選擇前 100 萬(wàn)的名人,然后通過(guò) 搜索引擎采集每個(gè)名人大約 100 張人臉圖片而形成的。這個(gè)預(yù)訓(xùn)練模型的準(zhǔn)確率已經(jīng)達(dá)到 0.993±0.004。
我們將下載后的模型解壓到:
- $YOURHOME/facenet/models/facenet/20170216-091149
里面包含的文件如下:
- model-20170216-091149.ckpt-250000.data-00000-of-00001
- model-20170216-091149.ckpt-250000.index
- model-20170216-091149.met 10.4.3
03.進(jìn)行檢測(cè)
運(yùn)行
進(jìn)入 facenet 目錄,用如下命令運(yùn)行腳本:
- python src/validate_on_lfw.py datasets/lfw/lfw_mtcnnpy_160 models
得到的結(jié)果如下:
- Model directory: /media/data/DeepLearning/models/facenet/20170216-091149/ Metagraph file: model-20170216-091149.meta
- Checkpoint file: model-20170216-091149.ckpt-250000
- Runnning forward pass on LFW images
- Accuracy: 0.993+-0.004
- Validation rate: 0.97533+-0.01352 @ FAR=0.00100
- Area Under Curve (AUC): 0.999
- Equal Error Rate (EER): 0.008
比較
為了和基準(zhǔn)進(jìn)行比較,這里采用 facenet/data/pairs.txt 文件,它是官方隨機(jī)生成的數(shù)據(jù),里面包含匹配和不 匹配的人名和圖片編號(hào)。
匹配的人名和圖片編號(hào)示例如下:
- Abel_Pacheco 1 4
表示 Abel_Pacheco 的第 1 張和第 4 張是一個(gè)人。
不匹配的人名和圖片編號(hào)示例如下:
- Abdel_Madi_Shabneh 1 Dean_Barker 1
表示 Abdel_Madi_Shabneh 的第 1 張和 Dean_Barker 的第 1 張不是一個(gè)人。
檢測(cè)
下面我們看一下 validate_on_lfw.py 是如何檢測(cè)人臉的??梢苑譃?4 步,具體如下:
- def main(args):
- with tf.Graph().as_default():
- with tf.Session() as sess:
1. 讀入之前的 pairs.txt 文件
讀入后如
- [['Abel_Pacheco', '1', '4']
- ['Akhmed_Zakayev', '1', '3'] ['Slobodan_Milosevic', '2', 'Sok_An', '1']] pairs = lfw.read_pairs(os.path.expanduser(args.lfw_pairs))
獲取文件路徑和是否匹配的關(guān)系對(duì)
- paths, actual_issame = lfw.get_paths(os.path.expanduser(args.lfw_dir),
- pairs, args.lfw_file_ext)
2. 加載模型
- print('Model directory: %s' % args.model_dir)
- meta_file, ckpt_file = facenet.get_model_filenames(os.path.expanduser
- (args.model_dir))
- print('Metagraph file: %s' % meta_file)
- print('Checkpoint file: %s' % ckpt_file)
- facenet.load_model(args.model_dir, meta_file, ckpt_file)
3. 獲取輸入、輸出的張量
- images_placeholder = tf.get_default_graph().get_tensor_by_name("input:0")
- embeddings = tf.get_default_graph().get_tensor_by_name("embeddings:0")
- phase_train_placeholder = tf.get_default_graph().get_tensor_by_name
- ("phase_train:0")
- image_size = images_placeholder.get_shape()
- embedding_size = embeddings.get_shape()
4. 使用前向傳播來(lái)驗(yàn)證
- print('Runnning forward pass on LFW images')
- batch_size = args.lfw_batch_size
- nrof_images = len(paths)
- nrof_batches = int(math.ceil(1.0*nrof_images / batch_size))
- 總共的批次數(shù) emb_array = np.zeros((nrof_images, embedding_size))
- for i in range(nrof_batches):
- start_index = i*batch_size
- end_index = min((i+1)*batch_size, nrof_images)
- pathspaths_batch = paths[start_index:end_index]
- images = facenet.load_data(paths_batch, False, False, image_size)
- feed_dict = { images_placeholder:images, phase_train_placeholder:False }
- emb_array[start_index:end_index,:] = sess.run(embeddings,
- feed_ dict=feed_dict)
5. 計(jì)算
這里計(jì)算準(zhǔn)確率和驗(yàn)證率,使用了十折交叉驗(yàn)證的方法
- tpr, fpr, accuracy, val, val_std, far = lfw.evaluate(emb_array,
- actual_issame, nrof_folds=args.lfw_nrof_folds)
- print('Accuracy: %1.3f+-%1.3f' % (np.mean(accuracy), np.std(accuracy)))
- print('Validation rate: %2.5f+-%2.5f @ FAR=%2.5f' % (val, val_std, far))
- 得到 auc 值 auc = metrics.auc(fpr, tpr)
- print('Area Under Curve (AUC): %1.3f' % auc)
- 得到等錯(cuò)誤率(eer)
- eer = brentq(lambda x: 1. - x - interpolate.interp1d(fpr, tpr)(x), 0., 1.)
- print('Equal Error Rate (EER): %1.3f' % eer)
這里采用十折交叉驗(yàn)證(10-fold cross validation)的方法來(lái)測(cè)試算法的準(zhǔn)確性。十折交叉驗(yàn)證是常用的 精度測(cè)試方法,具體策略是:將數(shù)據(jù)集分成 10 份,輪流將其中 9 份做訓(xùn)練集,1 份做測(cè)試集,10 次的結(jié) 果的均值作為對(duì)算法精度的估計(jì),一般還需要進(jìn)行多次 10 折交叉驗(yàn)證求均值,例如,10 次 10 折交叉驗(yàn) 證,再求其均值,作為對(duì)算法準(zhǔn)確性的估計(jì)。
04.AI人臉識(shí)別技術(shù)在進(jìn)步
當(dāng)下,正確佩戴口罩外出是必要的防護(hù)措施。
但由于口罩具備不透光性,使得攝像頭拍攝到的畫(huà)面無(wú)法捕捉到嘴巴、鼻子等臉部特征。
而人臉識(shí)別模型都要使用完整的面部特征,所以戴著口罩會(huì)造成AI人臉識(shí)別失敗,使用人工檢查的手段又效率太低。
幸好各大科創(chuàng)巨頭紛紛投身研究,如何讓AI人臉識(shí)別比以前更智能化。
口罩識(shí)別模型
是百度工程師開(kāi)發(fā)的AI口罩督查官。
可以在公共場(chǎng)所使用場(chǎng)景中,無(wú)接觸、快速精準(zhǔn)地識(shí)別出實(shí)時(shí)畫(huà)面中未戴口罩或者佩戴不正確的人。
戴口罩人臉身份識(shí)別模型
商湯科技推出了AI智慧防疫解決方案。
宣稱(chēng)其區(qū)域通行模塊可以識(shí)別出戴口罩人臉的身份,在人員戴口罩的情況下,只要露出50%鼻梁,通過(guò)率可達(dá)85%。
動(dòng)態(tài)人臉識(shí)別
漢王科技最新推出了亮銀鉆石款動(dòng)態(tài)人臉識(shí)別機(jī)。
其在戴口罩人員的識(shí)別率也達(dá)到85%。
當(dāng)前該套系統(tǒng)在北京地區(qū)用戶(hù)已達(dá)20余家,應(yīng)用設(shè)備近200套。
阿里、和華為識(shí)別率更高的模型也正在研發(fā)當(dāng)中......
之前,我們單純依賴(lài)全臉信息特征來(lái)識(shí)別身份,今后,我們可以做到半臉、甚至是眼部即可讓AI人臉識(shí)別系統(tǒng)準(zhǔn)確識(shí)別出我們每一個(gè)人,科技在我們的大力發(fā)展下幫助我們對(duì)抗各種生活中出現(xiàn)的難題。
還想了解更多AI人臉識(shí)別技術(shù)嗎?這本《TensorFlow技術(shù)解析與實(shí)戰(zhàn)》推薦給大家。
TensorFlow是谷歌公司開(kāi)發(fā)的深度學(xué)習(xí)框架,也是目前深度學(xué)習(xí)的主流框架之一。本書(shū)從深度學(xué)習(xí)的基礎(chǔ)講起,深入TensorFlow框架原理、安裝、模型、源代碼和統(tǒng)計(jì)分析等各個(gè)方面。全書(shū)分為基礎(chǔ)篇、實(shí)戰(zhàn)篇和提高篇三部分。最后附錄中列出一些可供參考的公開(kāi)數(shù)據(jù)集,并結(jié)合作者的項(xiàng)目經(jīng)驗(yàn)介紹項(xiàng)目管理的一些建議。