寫在前面
- 態(tài)度決定高度烘浦!讓優(yōu)秀成為一種習(xí)慣疚脐!
- 世界上沒有什么事兒是加一次班解決不了的,如果有县昂,就加兩次0构瘛(- - -茂強(qiáng))
人臉識別一般步驟
- 人臉檢測
- 人臉特征提取
- 人臉識別
本文主要介紹人臉檢測
人臉檢測
人臉檢測就是從一張圖片中檢測出人臉的過程
這里主要看兩種檢測方式,一種是dlib一種是 mtcnn
文本對于其原理不再贅述倒彰,想了解原理的可以參考原論文审洞,如果有時間,后邊會專門介紹原理
dlib
dlib是c++開發(fā)開源的的機(jī)器學(xué)習(xí)庫
廢話不多說待讳,直接看下效果
import dlib
import cv2
# 初始化dlib人臉檢測器
detector = dlib.get_frontal_face_detector()
#2.使用官方提供的模型構(gòu)建特征提取器
predictor = dlib.shape_predictor("/Users/songyaheng/Downloads/shape_predictor_68_face_landmarks.dat")
img = cv2.imread("/Users/songyaheng/Downloads/faces.JPG")
faces = detector(img,1)
for k,d in enumerate(faces):
cv2.rectangle(img,(d.left(),d.top()),(d.right(),d.bottom()),(0,255,0),3)
cv2.imshow("capture", img)
cv2.imwrite("/Users/songyaheng/Downloads/faces2.JPG", img)
cv2.waitKey(0)
mtcnn
import tensorflow as tf
import align.detect_face as detect_face
import cv2
gpu_memory_fraction=0.0
with tf.Graph().as_default():
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_memory_fraction)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))
with sess.as_default():
pnet, rnet, onet = detect_face.create_mtcnn(sess, None)
#face detection parameters
minsize = 20 # minimum size of face
threshold = [ 0.6, 0.7, 0.7 ] # three steps's threshold
factor = 0.709 # scale factor
img = cv2.imread("/Users/songyaheng/Downloads/faces.JPG")
bounding_boxes, _ = detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)
for face_position in bounding_boxes:
face_position=face_position.astype(int)
cv2.rectangle(img, (face_position[0],
face_position[1]),
(face_position[2], face_position[3]),
(0, 255, 0), 2)
cv2.imwrite("/Users/songyaheng/Downloads/faces3.JPG", img)
cv2.waitKey(0)
另一組對比
這次我們從明暗程度對比
利用mtcnn是一個都沒能識別出來芒澜,所以對于一些背光的照片來說,還是利用dlib相對來說比較好一點(diǎn)
那么問題來了创淡,在人臉識別中痴晦,不同明暗程度的人臉即使是一個人,所提取的人臉特征向量也是相差很大的琳彩,所以要想提高人臉識別的精準(zhǔn)度誊酌,對于人臉圖片的曝光度歸一化還是相當(dāng)重要的部凑,我們?nèi)绾螝w一化這種背光度較高的臉呢?
我們可以先通過dlib把人臉提取出來碧浊,然后通過算法改變這個圖片的像素值砚尽,然后把人臉變亮,這樣我們就可以拿到歸一化的人臉了辉词,所以難點(diǎn)就放在了我們?nèi)绾伟巡煌毓舛鹊娜四槡w一化到相對統(tǒng)一的人臉曝光度上呢必孤?如下圖
比較暗的就是上邊dlib提取的三個原始圖片的,
我們在看一組圖
從該圖上可以看出瑞躺,該算法能夠?qū)⒈容^暗的圖變得亮一點(diǎn)敷搪,比較亮的圖變得暗一點(diǎn)。也就是又一個相對統(tǒng)一的亮度值
我們最終提取出來的人臉應(yīng)該是這樣的:
這些提取的人臉都基本擁有相對統(tǒng)一的曝光度幢哨,而且更接近于人的皮膚顏色赡勘。
算法
首先我們提取人臉區(qū)域,提取后的人臉我們首先計(jì)算平均的亮度值捞镰,然后基于人體膚色的RGB和平均的RGB值闸与,我們采用一種歸一化方式,這種歸一化方式可以把輸入的人臉RGB值相對歸一化到該膚色RGB值上岸售,其實(shí)就是一種映射關(guān)系
其中S(x)就是原始圖像空間践樱,T(x)就是人體膚色空間
本文采用的就是該方法進(jìn)行映射計(jì)算的
到此我們的人臉檢測部分已經(jīng)基本結(jié)束
下期我們將介紹基于以上提取出來的人臉進(jìn)行特征提取,歡迎關(guān)注凸丸。
如果對人臉識別拷邢,圖像處理等方面有興趣,歡迎一塊學(xué)習(xí)
QQ:458798698
微信號:songwindwind