人脸美颜技术
人臉美顏技術(2019.10.8)
一、美顏技術發展現狀和應用場景
??美顏美顏”,顧名思義,對圖片里的人臉進行美化。在圖片類、短視頻類和直播類的APP中,都存在“美顏”的影子:圖片類的APP中,最具代表性的是美圖秀秀,美圖的人像美容,便用到了“美顏”技術;短視頻類的APP中,突出的是抖音和快手,這類APP在錄制短視頻的時候,有美顏、美妝等選項;直播類的APP中,像映客、YY等都在主播進行直播時加入了“美顏”技術。 ????????
??
二、美顏技術步驟
??“美顏”是一個深度學習+圖像處理+圖形學的技術?!懊李仭睜可娴竭@些技術包括:人臉檢測、人臉關鍵點定位、瘦臉、磨皮、美白等。其中,人臉檢測、人臉關鍵點定位是用深度學習技術來做的;而瘦臉、磨皮和美白就牽涉到計算機圖形學里的技術,使用OpenGL,Metal來對檢測到的人臉進行渲染。
?
三、詳細算法講解
1.人臉檢測
??人臉檢測技術指的是對圖片中的人臉進行檢測,并定位到圖片中人臉的位置。人臉檢測主要的技術難點在于,人臉在一張圖片中可能存在人臉區域光照條件,人臉姿態變化、人臉表情變化、遮擋等問題。準確的檢測出人臉相對來說是一件困難的事情。
? ? ? ?人臉檢測也可分為兩個時期:一個是深度學習之前的時期,另一個是深度學習時期。在深度學習之前,人們做人臉檢測,主要使用人工設計好的特征,根據人工特征來訓練檢測器檢測人臉。當深度學習在計算機視覺領域占據絕對主導地位之后,人們開始嘗試用深度神經網絡來做人臉檢測,目前,主流的人臉檢測方法大概有這么兩種:一種是使用通用的目標檢測網絡來訓練人臉檢測模型,如faster-rcnn(一種目標檢測網),ssd (Single Shot MultiBox Detector),yolo (You Only Look Once) 等等;另一種是使用專門的人臉檢測網絡,如cascadeCNN(Convolutional Neural Network Cascade for FaceDetection,級聯結構的卷積神經網絡,一種目標檢測網絡),MTCNN(Multi-task Cascaded Convolutional Neural Network,多任務級聯卷積神經網絡)等等。 ????????????
2.人臉關鍵點
??人臉關鍵點定位技術是對人臉中眉毛、眼睛、鼻子、嘴巴以及臉部的輪廓進行定位,人臉關鍵點定位是緊接在人臉檢測后:首先在一張圖片中檢測到人臉,然后才對檢測到的人臉做關鍵點定位。 ??
? ? ? 人臉關鍵點定位技術同人臉檢測技術一樣,在實際應用中,也存在人臉的尺度、光照、表情、姿態、遮擋等問題。要對絕大多數圖片獲得準確的人臉關鍵點,也是一個比較難的任務。 ??
? ? ? 人臉關鍵點定位技術也可分為深度學習前的時期和深度學習時期:傳統的人臉關鍵點技術,有ASM(Active Shape Model),AAM (Active Appearance Model),CPR(Cascaded Pose Regression)等等;深度學習時期,2013年,香港中文大學首次將卷積神經網絡應用到人臉關鍵點定位上來,2017年的DAN(Deep Alignment Network),LAB(Look at Boundary),2018年的SAN(Style Aggregated Network for Facial Landmark Detection)等等。目前,落地到產品上的人臉關鍵點定位,基本都是基于深度學習技術。 ?
? ? ? ?下圖展示了人臉檢測技術和人臉關鍵點定位技術的應用。
??有了關鍵點以后,便可以對圖片中人臉區域做瘦臉、磨皮、美白等“美顏”操作。這些算法一般應用在移動設備上:在Android上可以使用OpenGL ES(OpenGL for Embedded Systems,嵌入式系統的OpenGL),在iOS上可以使用Metal根據人臉關鍵點的位置,對人臉進行瘦臉、磨皮、美白之類的渲染。
3.瘦臉
??在OpenGL或Metal環境下,在shader(紋理)中通過對像素位置進行偏移來實現對臉部區域的放大縮小:由變形前坐標,根據變形映射關系,得到變形后坐標。這其中變形映射關系是最關鍵的,不同的映射關系,將得到不同的變形效果。平移、縮放、旋轉,對應的是不同的映射關系,即不同的變換公式。當然實際在計算過程中,用的是逆變換,即由變形后坐標,根據逆變換公式反算變形前坐標,然后插值得到該坐標RGB像素值,將該RGB值作為變形后坐標對應的像素值。這樣才能保證變形后的圖像是連續、完整的。 ????????????
4.磨皮
??所謂“磨皮”,是使皮膚變得更加光滑,其技術原理是:在圖片的人臉框部分再進行一次膚色檢測。只對人臉區域做磨皮,磨皮一般使用圖像處理的一些濾波算法。 ?
? ? ? ?膚色檢測可分兩大類,一類是用顏色空間統計信息,來計算出皮膚所在的區域,另一類是基于機器學習的方法。傳統方法是基于YCrCb顏色空間Cr,Cb范圍篩選法。深度學習方法有CNN、FCN、UNet、DenseNet,文獻中用的較多的就是UNet(Convolutional Networks for Biomedical Image Segmentation)。 ??濾波算法一般可以使用高斯濾波或者雙邊濾波等。 ??
?
5.美白
??圖片的美白,是操作這個圖片上的所有像素點,獲得像素點的R、G、B、A的值然后獲取到的值進行一定數目的增量。在圖像處理領域中,一張圖片會使用三原色 red、green、blue來保存圖片的顏色信息,三個值的取值范圍是0-255:越靠近0,圖像就越黑,等于0的時候就是純黑色;越靠近255,圖像就越白,等于255的時候就是白色。圖片的美白就是利用的這個原理。 ??
四、目前成果
??根據搜集的資料,可以發現除了部分需求較高的app,例如美圖秀秀等,需要完成以上整個流程,其余要求較低的app只是簡單的進行磨皮和美白,特點是美顏耗時短,且效果尚可。 ??
? ? ? ?如下是我使用YCrCb顏色空間Cr范圍篩選法方法進行膚色檢測,一次雙線性插值進行磨皮,調整像素值進行美白后得到的美顏后的圖片,cpu耗時33ms。
import cv2import timest = time.time()image = cv2.imread('D:/Download/res/5.png')img_ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)channels = cv2.split(img_ycrcb)img_cr = channels[1]# 對cr通道分量進行高斯濾波img_cr = cv2.GaussianBlur(img_cr, (5, 5), 0)# 膚色檢測_, skin = cv2.threshold(img_cr, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 美白image[np.where(skin)] = np.clip((whi * image[np.where(skin)] + 10), 0, 255)#雙線性濾波 磨皮image = cv2.bilateralFilter(image, 20, 50, 50) white = np.uint8(image)print(time.time()-st)cv2.imshow('bai',white)cv2.waitKey(0)?
五、展望和難點
??真正要做好美顏算法,需要用到深度學習里面的人臉檢測、人臉關鍵點定位(最少68個關鍵點)、人臉膚色檢測(Unet等,傳統的膚色檢測算法不夠細膩)這三個模型,目前已有人臉檢測模型(mtcnn)。人臉關鍵點定位用于瘦臉、大眼等操作。膚色檢測用于磨皮和美白階段,防止對非皮膚進行模糊。 ??
? ? ? ?研究者們不局限于美顏,研究美妝算法,增強用戶體驗。代表性的研究有PSGAN(Pose-Robust Spatial-Aware GAN for Customizable Makeup Transfer),LADN(Local Adversarial Disentangling Network for Facial Makeup and De-Makeup)等。親測可用的美妝代碼https://github.com/zllrunning/face-makeup.PyTorch,具體效果如下圖。 ??????????
六、引用
? ? ? ? ?博客:https://blog.csdn.net/princexiexiaofeng/article/details/89298776
? ? ? ? ? ? ? ? ? ?https://blog.csdn.net/cnbloger/article/details/77949949
? ? ? ? github:https://github.com/zllrunning/face-makeup.PyTorch
總結
- 上一篇: 程序化广告(5):广告投放
- 下一篇: 聪明的人脸识别3——Pytorch 搭建