當人臉識別技術遇上了口罩……
功能完全失靈,以往看一眼就能解鎖、支付的人工智能,現在宛如“廢柴”。
這不,網友們紛紛吐槽:
更有網友建議各大手機廠商開發新功能:
最初我們知道AI人臉識別技術,是作為一種重要的個人身份鑒別方法,用于罪犯照片管理和刑偵破案,現在這種技術在安全系統和商貿系統中都有很多的應用。
如今,我們每時每刻依賴著這項功能。
早上起床對準手機看一下便自動解鎖;
網上購物“刷臉”支付;
外出購物不需要帶現金、在機器面前“刷臉”支付即可,上班“刷臉”打卡;
搭乘高鐵、飛機實行無紙質的“刷臉”安檢通道......
這項逐漸融入日常生活各個領域的技術,給我們的生活帶來了天翻地覆的便利。接下來讓我帶著大家簡單學習這項技術~
01.AI人臉識別
人臉識別是計算機視覺和模式識別的交叉領域,又將兩者結合在一起。
20 世紀 80 年代后期在人臉識別中引入了神經生理學、腦神經學、視覺知識等,結合計算機技術的迅猛發展以及計算成本的迅速下降使得以前比較費時費空間的一些模式匹配算法,如大樣本的引入、多維特征參 數的提取、建模等。
人臉識別這一領域的研究除了具有重大理論價值外,也極具實用價值,是基于人的臉部特征信息進行身份識別的一種生物識別技術。
02.識別領域
人臉檢測
是指檢測并定位圖片中的人臉,返回高精度的人臉框坐標,是對人臉進行分析和處理的第一步。
早期的檢測過程稱為“滑動窗口”,也就是選擇圖像中的某個矩形區域作為滑動窗口,在這個窗口中提取一些特征對這個圖像區域進行描述,最后根據這些特征描述來判斷這個窗口是不是人臉(如下圖所示)。
人臉檢測的過程就是不斷遍歷需要觀察的窗口
人臉關鍵點檢測
是指定位并返回人臉五官與輪廓的關鍵點坐標位置(如下圖所示)。
關鍵點包括人臉、輪廓、眼睛、眉毛、嘴唇以及鼻子輪廓。
現在某些人臉識別公司,如 Face++能提供高精度的關鍵點,最多可達 106 點。
無論是靜態圖片還是動態視頻流,均能完美貼合人臉。
人臉關鍵點定位技術
關鍵點定位技術主要有級聯形回歸(cascaded shape regression,CSR),目前人臉識別一般是基于 DeepID 網絡結構。
DeepID 網絡結構和卷積神經網絡結構類似,主要區別在倒數第二層,DeepID 網絡結 構有一個 DeepID 層,它與卷積層4和最大池化層3相連,由于卷積神經網絡層數越高視野域越大,這種連接方式可以既考慮局部的特征,又考慮全局的特征(下圖所示)。
人臉驗證
是指分析兩張人臉屬于同一個人的可能性大小。
輸入兩張人臉,得到一個置信度分數和相應的閾值,以便評估相似度。
下圖是調用 Face++的人臉驗證在線接口得到的結果。對比結果為:是同一個人的可能性很高。
人臉屬性檢測
分為人臉屬性辨識和人臉情緒分析。
例如,給出人的年齡、是否有胡子、情緒(高興、正常、生氣、憤怒)、性別、是否帶眼鏡、膚色等來進行人臉屬性辨識和人臉情緒分析。
下圖給出的一張照片的測試結果因為化妝和燈光的原因,結果并不是很準確。
02.數據預處理
在圖像識別中,數據預處理是很重要的一步。
這里使用 facenet 源代碼下的 align 模塊去校準。我們需要將檢測所使 用的數據集校準為和預訓練模型所使用的數據集大小一致。
為了能正確運行校準程序,需要設置一下環境變量:
- export PYTHONPATH=$YOURHOME/facenet/src
校準命令如下:
- 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 上提供的預訓練模型 20170216-091149.zip,采用的訓練集是 MS-Celeb-1M 數據集。
MS-Celeb-1M 是微軟的一個非常大的人臉識別數據庫,它是從名人榜上選擇前 100 萬的名人,然后通過 搜索引擎采集每個名人大約 100 張人臉圖片而形成的。這個預訓練模型的準確率已經達到 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.進行檢測
運行
進入 facenet 目錄,用如下命令運行腳本:
- python src/validate_on_lfw.py datasets/lfw/lfw_mtcnnpy_160 models
得到的結果如下:
- 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
比較
為了和基準進行比較,這里采用 facenet/data/pairs.txt 文件,它是官方隨機生成的數據,里面包含匹配和不 匹配的人名和圖片編號。
匹配的人名和圖片編號示例如下:
- Abel_Pacheco 1 4
表示 Abel_Pacheco 的第 1 張和第 4 張是一個人。
不匹配的人名和圖片編號示例如下:
- Abdel_Madi_Shabneh 1 Dean_Barker 1
表示 Abdel_Madi_Shabneh 的第 1 張和 Dean_Barker 的第 1 張不是一個人。
檢測
下面我們看一下 validate_on_lfw.py 是如何檢測人臉的。可以分為 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))
獲取文件路徑和是否匹配的關系對
- 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. 使用前向傳播來驗證
- 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))
- 總共的批次數 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. 計算
這里計算準確率和驗證率,使用了十折交叉驗證的方法
- 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)
- 得到等錯誤率(eer)
- eer = brentq(lambda x: 1. - x - interpolate.interp1d(fpr, tpr)(x), 0., 1.)
- print('Equal Error Rate (EER): %1.3f' % eer)
這里采用十折交叉驗證(10-fold cross validation)的方法來測試算法的準確性。十折交叉驗證是常用的 精度測試方法,具體策略是:將數據集分成 10 份,輪流將其中 9 份做訓練集,1 份做測試集,10 次的結 果的均值作為對算法精度的估計,一般還需要進行多次 10 折交叉驗證求均值,例如,10 次 10 折交叉驗 證,再求其均值,作為對算法準確性的估計。
04.AI人臉識別技術在進步
當下,正確佩戴口罩外出是必要的防護措施。
但由于口罩具備不透光性,使得攝像頭拍攝到的畫面無法捕捉到嘴巴、鼻子等臉部特征。
而人臉識別模型都要使用完整的面部特征,所以戴著口罩會造成AI人臉識別失敗,使用人工檢查的手段又效率太低。
幸好各大科創巨頭紛紛投身研究,如何讓AI人臉識別比以前更智能化。
口罩識別模型
是百度工程師開發的AI口罩督查官。
可以在公共場所使用場景中,無接觸、快速精準地識別出實時畫面中未戴口罩或者佩戴不正確的人。
戴口罩人臉身份識別模型
商湯科技推出了AI智慧防疫解決方案。
宣稱其區域通行模塊可以識別出戴口罩人臉的身份,在人員戴口罩的情況下,只要露出50%鼻梁,通過率可達85%。
動態人臉識別
漢王科技最新推出了亮銀鉆石款動態人臉識別機。
其在戴口罩人員的識別率也達到85%。
當前該套系統在北京地區用戶已達20余家,應用設備近200套。
阿里、和華為識別率更高的模型也正在研發當中......
之前,我們單純依賴全臉信息特征來識別身份,今后,我們可以做到半臉、甚至是眼部即可讓AI人臉識別系統準確識別出我們每一個人,科技在我們的大力發展下幫助我們對抗各種生活中出現的難題。
還想了解更多AI人臉識別技術嗎?這本《TensorFlow技術解析與實戰》推薦給大家。
TensorFlow是谷歌公司開發的深度學習框架,也是目前深度學習的主流框架之一。本書從深度學習的基礎講起,深入TensorFlow框架原理、安裝、模型、源代碼和統計分析等各個方面。全書分為基礎篇、實戰篇和提高篇三部分。最后附錄中列出一些可供參考的公開數據集,并結合作者的項目經驗介紹項目管理的一些建議。