PaddleHub扣脸和换脸

主要思路

  1. 利用人脸关键点检测检测出脸部位置,然后根据检测结果将目标背景与目标脸脸部轴心放齐
  2. 再根据检测结果裁剪出脸部区域,对脸部区域进行分割,分割出脸和背景,根据分割结果将脸抠出来备用
  3. 将分割出来的脸经过亮度变化(很重要),大小变化,贴合再背景图的脸部中心位置

环境介绍

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 = imgFile
        self.origLandMark = None
        self.faceImg = None
        self.resLandMark = None
        self.mapImg = None
        self.resFaceImg = None
        self.oriMapImg = None
        self.orgBox = None
    
    @staticmethod
    def keypoint_detection(images):
        return hub.Module(name="face_landmark_localization").keypoint_detection(images=images)
    
    @staticmethod
    def 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 None
            self.origLandMark = np.array(res[0]['data'][0])
        return self.origLandMark
    '''
    获取面部图片的裁剪后图像
    '''
    def getFaceImg(self):
        if np.all(self.faceImg == None):
            LandMark = self.getOrLandMark()
            x = LandMark
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值