前言
????因工作需要途凫,最近研究了一些人臉合成的東西桐汤。之前并沒有接觸過cv方面的東西而克,一切都要從零開始學(xué)起。學(xué)著學(xué)著怔毛,發(fā)現(xiàn)cv真的挺有意思的员萍,想深入鉆研下,當(dāng)然也想在簡(jiǎn)書上記錄下足跡拣度。好久之前也零零星星寫過幾篇文字碎绎,就沒有然后了。這次一定要堅(jiān)持下來:)
????人臉合成學(xué)名叫face morph. 最簡(jiǎn)單的是2d圖片的融合抗果,比如把幾個(gè)不同人的臉融合在一起筋帖,再比如插值生成兩圖之間的中間狀態(tài)等。這里既包含了人臉處理里的幾個(gè)重要的算法冤馏,實(shí)現(xiàn)起來又不復(fù)雜(注:主要參考????learnopencv(https://www.learnopencv.com)里的內(nèi)容日麸,同時(shí)結(jié)合自己的理解和實(shí)踐)
一般我會(huì)分兩塊來說技術(shù),第一塊是背景和理論;第二塊是實(shí)現(xiàn)和代碼代箭。處理人臉的第一步一般都是Landmark Detection(標(biāo)記檢測(cè))墩划,所以先說它。
背景和理論
????計(jì)算機(jī)處理人臉嗡综,先要找到face在哪乙帮。怎么找?就是檢測(cè)landmark极景。landmark是什么意思呢察净?就是在臉上繪制的若干標(biāo)記點(diǎn),標(biāo)記點(diǎn)一般畫在邊盼樟、角氢卡、輪廓、交叉恤批、等分等關(guān)鍵位置异吻,借助它們就可以描述人臉的形態(tài)(shape).
????現(xiàn)在常用的開源landmark檢測(cè)工具是dlib,其開源模型中的landmark包含68個(gè)點(diǎn)喜庞,按順序來說: 0-16是下頜線(紅)诀浪,17-21是右眼眉(橙),22-26是左眼眉(黃)延都,27-35是鼻子(淺綠)雷猪,36-41是右眼(深綠),42-47是左眼(淺藍(lán))晰房,48-60是嘴外輪廓(深藍(lán))求摇,61-67是嘴內(nèi)輪廓(紫)。
????那么dlib是如何做到的呢殊者?算法是基于histogram of oriented gradients (HOG) 和linear classifier与境,論文是這篇:One Millisecond Face Alignment with an Ensemble of Regression Trees by# Vahid Kazemi and Josephine Sullivan, CVPR 2014, 以后會(huì)研究一下猖吴。其開源model(shape_predictor_68_face_landmarks)是用300w的圖片庫訓(xùn)練的( iBUG 300-W face landmark dataset)摔刁,直接拿來用就是了。
實(shí)現(xiàn)
????dlib有python的封裝海蔽,所以用起來非常簡(jiǎn)單共屈。shape_predictor_68_face_landmarks.dat是模型,可以直接下載(http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2),get_facial_landmarks函數(shù)返回一個(gè)68*2的numpy array就是landmark了。
import dlib
import cv2
predictor_path = 'shape_predictor_68_face_landmarks.dat'
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)
def get_facial_landmarks(image):
# detect face(s)
dets = detector(image, 1);
shape = np.empty([1,1])
for k, d in enumerate(dets):
# Get the landmarks/parts for the face in box d.
shape = predictor(image, d);
shape = face_utils.shape_to_np(shape);
return shape;
img = cv2.imread('pic/obama.jpg')
landmarks = get_facial_landmarks(image)
print(landmarks)