换发型算法_GitHub - fredliu168/yry: yry(颜如玉)—— 一个实现人脸融合的算法,可以接近腾讯天天P图疯狂变脸功能的效果...
顏如玉
顏如玉 —— python 人臉融合程序,可實現類似天天P圖瘋狂換臉、face++人臉融合效果
項目描述
最近隨著各種技術的發展,圖像方面的人臉處理技術越來越廣泛。各大相機軟件都有美顏、貼圖、換發型、變臉等功能。天天P圖與Face++也都推出人臉處理的 API,不過價格方面就有點不親民了。于是本人將之前研究完成的人臉融合算法開源出來。
效果對比
國際慣例,我們看看顏如玉與天天P圖、Face++合成效果的對比:
注:Face++ 為調用其官網 API 生成的效果,天天P圖則是直接使用該 APP 生成的效果
使用
安裝 requirements.txt 所需庫
pip install -r requirements.txt
運行 ModuleTest.py 的主函數
python ModuleTest.py
生成的結果圖片 output.jpg 儲存在 images 文件中
算法詳解
零、融合函數
先看看程序入口函數
core.face_merge(src_img='images/model.jpg',
dst_img='images/20171030175254.jpg',
out_img='images/output.jpg',
face_area=[50, 30, 500, 485],
alpha=0.75,
blur_size=(15, 10),
mat_multiple=0.95)
參數含義:
src_img —— 模特圖片
dst_img —— 待融合的圖片
out_img —— 結果圖片輸出路徑
face_area —— 指定模板圖中進行人臉融合的人臉框位置。四個正整數數組,依次代表人臉框左上角縱坐標(top),左上角橫坐標(left),人臉框寬度(width),人臉框高度(height),通過設定改參數可以減少結果的大范圍變形,把變形風險控制在人臉框區域
alpha —— 融合比例,范圍 [0,1]。數字越大融合結果包含越多融合圖 (dst_img) 特征。
blur_size—— 模糊核大小,用于模糊人臉融合邊緣,減少融合后的違和感
mat_multiple —— 縮放獲取到的人臉心型區域
一、 檢測及關鍵的定位
人臉的檢測以及關鍵點定位有多種實現方案
使用開源 Dlib 庫檢測及定位(定位68個關鍵點)
使用騰訊平臺的人臉識別及定位API (定位90個關鍵點)
使用Face++平臺的人臉識別定位API(定位106個關鍵點)
本文采用的是Face++的 api,因為商用情況下 Face++ 定位的定數最多
// 獲取兩張圖片的人臉關鍵點(矩陣格式與數組格式)
src_matrix, src_points, err = core.face_points(src_img)
dst_matrix, dst_points, err = core.face_points(dst_img)
二、對齊人臉角度
在待融合圖人像不是側臉的情況下,我們可以同過調整平面位置及角度讓其與模特圖的人臉重合
// opencv 讀取圖片
src_img = cv2.imread(src_img, cv2.IMREAD_COLOR)
dst_img = cv2.imread(dst_img, cv2.IMREAD_COLOR)
dst_img = transformation_points(src_img=src_img, src_points=src_matrix[core.FACE_POINTS],
dst_img=dst_img, dst_points=dst_matrix[core.FACE_POINTS])
注:src_points 已經 dst_points 傳入參數為第一步獲取的人臉關鍵點矩陣
對齊采用“常規 Procrustes 分析法”
具體算法來源:matthewearl 個人博客步驟2
對齊結果:
三、再次取點后融合臉部
對步驟二轉換后的帶融合圖片再次取關鍵的,然后與模特圖的關鍵點一起做三角融合成新的圖片
dst_img = morph_img(src_img, src_points, dst_img, dst_points, alpha)
融合結果:
具體的三角融合算法解說參考這篇文章
四、處理加工模特圖片
再次對上一步的結果圖進行取點,然后運用三角仿射將模特圖片臉部輪廓、關鍵點變形成上一步得到的臉部關鍵點
src_img = tran_src(src_img, src_points, dst_points, face_area)
處理結果:
五、將融合后的臉部貼到模特圖上
最后一步是將融合后的新圖片臉部區域用泊松融合算法貼到模特圖上。泊松融合可直接使用opencv提供的函數
dst_img = merge_img(src_img, dst_img, dst_matrix, dst_points, k_size, mat_multiple)
def merge_img(src_img, dst_img, dst_matrix, dst_points, k_size=None, mat_multiple=None):
face_mask = np.zeros(src_img.shape, dtype=src_img.dtype)
for group in core.OVERLAY_POINTS:
cv2.fillConvexPoly(face_mask, cv2.convexHull(dst_matrix[group]), (255, 255, 255))
r = cv2.boundingRect(np.float32([dst_points[:core.FACE_END]]))
center = (r[0] + int(r[2] / 2), r[1] + int(r[3] / 2))
if mat_multiple:
mat = cv2.getRotationMatrix2D(center, 0, mat_multiple)
face_mask = cv2.warpAffine(face_mask, mat, (face_mask.shape[1], face_mask.shape[0]))
if k_size:
face_mask = cv2.blur(face_mask, k_size, center)
return cv2.seamlessClone(np.uint8(dst_img), src_img, face_mask, center, cv2.NORMAL_CLONE)
函數示意圖:
總結
以上是生活随笔為你收集整理的换发型算法_GitHub - fredliu168/yry: yry(颜如玉)—— 一个实现人脸融合的算法,可以接近腾讯天天P图疯狂变脸功能的效果...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python问卷调查系统设计案例_从设计
- 下一篇: 对比四大企业级linux版本_Linux