本文主要是介绍PaddleHub扣脸和换脸,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
PaddleHub扣脸和换脸
- 主要思路
- 环境介绍
- 预训练模型介绍
- 合成代码
主要思路
- 利用人脸关键点检测检测出脸部位置,然后根据检测结果将目标背景与目标脸脸部轴心放齐
- 再根据检测结果裁剪出脸部区域,对脸部区域进行分割,分割出脸和背景,根据分割结果将脸抠出来备用
- 将分割出来的脸经过亮度变化(很重要),大小变化,贴合再背景图的脸部中心位置
环境介绍
PaddleHub, 依托于paddlepaddle的深度学习框架,里面包含有CV,NLP等的预训练模型,其安装代码为
pip install paddlehub
此外还有opencv,matplotlib,math等常用包。安装方法不再赘述。
预训练模型介绍
本次主要用到了两个与训练包,face_landmark_localization和ace2p。
face_landmark_localization:用于面部检测,其训练集为AFW/AFLW,网络结构为Face_Landmark。送入一张面部照片可以将一下面部点的坐标返回
ace2p:人体解析(Human Parsing)是细粒度的语义分割任务,其旨在识别像素级别的人类图像的组成部分(例如,身体部位和服装)训练集为LIP,网络结构为ACE2P。ACE2P通过融合底层特征,全局上下文信息和边缘细节,端到端地训练学习人体解析任务。该结构针对Intersection over Union指标进行针对性的优化学习,提升准确率。以ACE2P单人人体解析网络为基础的解决方案在CVPR2019第三届LIP挑战赛中赢得了全部三个人体解析任务的第一名。该PaddleHub Module采用ResNet101作为骨干网络,接受输入图片大小为473x473x3。
合成代码
这里将面部识别和分割进行封装在了一起
import cv2
import paddlehub as hub
import numpy as np
class face_Seg(object):'''imgFile:原始图片数据origLandMark:第一次detection的坐标faceImg:裁剪后的图片resLandMark:修改后的坐标mapImg:分割后的标注图片resFaceImg:最终分割后图片'''def __init__(self, imgFile):self.imgFile = imgFileself.origLandMark = Noneself.faceImg = Noneself.resLandMark = Noneself.mapImg = Noneself.resFaceImg = Noneself.oriMapImg = Noneself.orgBox = None@staticmethoddef keypoint_detection(images):return hub.Module(name="face_landmark_localization").keypoint_detection(images=images)@staticmethoddef human_parser(images):return hub.Module(name="ace2p").segmentation(images=images)'''获取原始图像'''def getOrgImgFile(self):return self.imgFile'''获取面部监测点信息'''def getOrLandMark(self):if np.all(self.origLandMark == None):try:res = self.keypoint_detection(images=[self.imgFile])except:print("无法打开图片或检测有问题!")return Noneself.origLandMark = np.array(res[0]['data'][0])return self.origLandMark'''获取面部图片的裁剪后图像'''def getFaceImg(self):if np.all(self.faceImg == None):LandMark = self
这篇关于PaddleHub扣脸和换脸的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!