python实现面部特效_【AI美颜算法】300行Python实现基于人脸特征的美颜算法

先上效果图:

AI美颜

人类一直是一个看脸的物种,人人都希望可以变得更美是无可争议的,而美颜类应用的出现拯救了所有人,从此人类进入了美(照)颜(骗)时代。

。。。。

每次写技术blog都要写一堆废话引言,现在懒得写,大概就是美颜很重要,美女主播靠它活,没了它大部分妹子不敢发朋友圈blabla。

美颜算法的基础是人脸识别技术,市面上的美颜应用普遍使用了CV科技类公司的人脸识别(特征点提取)接口:MeituKiss超级自拍神器手机,前置摄像头搭载自动美颜技术。Face++为该款手机提供领先的人脸检测和关键点检测技术,实现实时美颜,自动美肌,智能美型,极致美瞳。

美颜相机是一款专为爱自拍的女生量身定制的美图软件。Face++为美颜相机提供领先的人脸检测和关键点检测技术,在图像中精准定位人脸和五官位置,让多款细腻的人像特效瞬间呈现,让用户快速拥有惊艳的面容。

也有小米新机所搭载的AI美颜技术:

需要人脸识别技术的原因是显而易见的,每张图片面部所占区域不同,五官位置各异,我们针对不同区域要做的美化操作也各不相同。我们需要人脸识别技术为我们定位面部并标记面部不同的区域。如果直接对整张图片进行暴力操作,效果会非常难看~

人脸识别(特征提取)技术目前已经较为成熟,旷视、face++提供的接口可以精确提取100个以上的特征点,根据这些特征点,我们可以针对不同部位进行美化:皮肤磨皮、美白,嘴唇增红、眼睛提亮、瘦脸等等。

在本项目中,使用了开源库dlib C++ Library来提取面部特征。这个库我在另外两篇人脸识别文章【换脸系列1】军装照刷爆朋友圈?教你用Python+深度学习自制换脸软件!(改进)和【换脸系列2】浪漫七夕♥和你的TA交♂换身体吧!(单身狗慎入)有过使用和介绍。这是一个优秀的cv&dl&人脸识别库,提供的预训练模型可以提取68个特征点,精确度较高。

实现

本章代码只起演示作用,不完整不保证运行,完整代码请看GitHub

对象分析

美颜算法的处理对象是人像图片(废话),我们分析一下一张人像图片内的对象:

图片里有若干人脸区域和非人脸区域,我们只希望处理那些人脸区域。

每个人脸,由五官、脸颊、下巴、额头等部件组成。(奇怪的名字,逃

每个部件都有自己的特点,美颜算法需要针对不同的部件进行具体的美化操作,即美颜操作的最小对象是部件。

现在,我们知道了一张图片有两种主要对象:脸、部件,若干部件构成一张脸。我们希望,每个部件对象都有若干方法来美化自身。

我们发现,脸和部件对象都需要坐标点来实例化,而且脸部整体也需要若干方法来美化自身。所以我们可以让脸对象继承自部件对象。

class Organ():

pass

class Forehead(Organ):

pass

勾画有效区域

我们首先要知道每个脸和部件的位置(坐标),我们用dlib来检测并提取特征点坐标。

PREDICTOR_PATH = "/home/matt/dlib-18.16/shape_predictor_68_face_landmarks.dat"

detector = dlib.get_frontal_face_detector()

predictor = dlib.shape_predictor(PREDICTOR_PATH)

def get_landmarks(im):

rects = detector(im, 1)

return [numpy.matrix([[p.x, p.y] for p in predictor(im, rect).parts()]) for rect in rects]

这样我们就得到了一个列表,每个元素是一个人脸的特征点坐标数

根据标记点序号,我们可以得到人脸和各个部件的特征坐标:

#五官名称

self.organs_name=['jaw','mouth','nose','left eye','right eye','left brow','right brow']

#五官等标记点

self.organs_points=[list(range(0, 17)),list(range(48, 61)),list(range(27, 35)),list(range(42, 48)),list(range(36, 42)),list(range(22, 27)),list(range(17, 22))]

我们怎么利用这些坐标来针对每个部件的有效区域进行美化处理呢?

首先,获得特征点坐标的边界,再根据区域大小,适当扩大一部分,取对应的储存图片数据的numpy数组的切片。这样我们就得到了全局图片的一个局部切片(引用)。

def get_rect(self):

'''获得定位方框'''

ys,xs=self.landmark[:,1],self.landmark[:,0]

self.top,self.bottom,self.left,self.right=np.min(ys),np.max(ys),np.min(xs),np.max(xs)

self.shape=(int(self.bottom-self.top),int(self.right-self.left))

self.size=self.shape[0]*self.shape[1]*3

self.move=int(np.sqrt(self.size/3)/20)

patch&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值