识别 paddlehub_利用PaddleHub制作1寸登记照片

本文介绍如何利用PaddleHub进行人脸定位和人像分割,免费制作无水印的1寸登记照片。通过调整比例裁剪图片,分离人物与背景并填充不同颜色,实现个性化登记照。项目提供详细步骤,适合个人隐私保护。
摘要由CSDN通过智能技术生成

背景

有时候,在我们需要登记照片,去照相馆很又不方便。我们可以利用PaddleHub来生成登记照片,这样十分方便和快捷。

不过网上也有一些能使用照片生成登记照的软件,可是大多数都有水印,需要付费才能使用。还需要下载和注册,同时照片也要上传,十分容易泄露我们的隐私。

这时候,我们完全可以利用PaddleHub来实现这一切。

先给大家看看效果:

原图:

3a8025779878f69d81c4111c362a2b75.png

登记照片:

cf3731fe0973fe4b59fe2f82bc72a143.png

078165b2ed77c03b2c67977de3f69e68.png

74b65c57540aad7ca6aa01b2090bd868.png

思路:

  1. 首先,根据PaddleHub人脸定位,找到图片中人脸的位置。
  2. 由于一寸照片的宽度295,高度是413,用这个比例框选出含有人脸的图片,并且进行缩放到尺寸(295,413)。
  3. 用PaddleHub的人像分割,分离人物和背景,对背景分别填充白色,红色,蓝色,得到三种颜色的登记照片。

项目地址:

paddlehub创意赛--1寸登记照片生成神器 - 百度AI Studio - 一站式AI开发实训平台​aistudio.baidu.com

步骤:

引入paddlehub的人脸识别和人物识别

from PIL import Image
import paddlehub as hub
import cv2
import numpy as np

# 定义人脸识别和人物识别的paddlehub函数
face_landmark = hub.Module(name="face_landmark_localization")
human_seg = hub.Module(name="deeplabv3p_xception65_humanseg")

将原图进行人脸识别,并且进行裁剪

# 人脸识别
result = face_landmark.keypoint_detection(paths=[pic_path])
face=np.array(result[0]['data'][0],dtype=np.int64)

# 裁剪比例
rate=1.3

left = face[:,0].min()
right= face[:,0].max()
w = right-left
cw=int((right+left)/2)

upper = face[:,1].min()
lower = face[:,1].max()
h= lower-upper
ch=int((lower+upper)/2)

h = int(413*w/295)

box=(cw-rate*w, ch-rate*h, cw+rate*w, ch+rate*h)

img=Image.open(pic_path)
img=img.crop(box)
img=img.resize((295, 413),Image.ANTIALIAS)
display(img)

8e308569f5d91684048254c63ac4f78c.png

人像抠图

# 进行人物抠图
result = human_seg.segmentation(images=[cv2.cvtColor(np.array(img),cv2.COLOR_RGB2BGR)],
                                use_gpu=False,
                                visualization=True,
                                output_dir='humanseg_output')

print("抠图输出文件:",result[0]["save_path"])
display(Image.open(result[0]["save_path"]))

74b65c57540aad7ca6aa01b2090bd868.png

替换登记照片的背景颜色,并保存照片

# 替换背景,并保存图像
def cut_person(img,num=[255,255,255]):
    img=np.array(img).transpose((2,0,1))
    person=[]
    for i in range(3):
        a=img[i]
        mask=np.array((img[3]<100),dtype=np.uint8)
        # mask=cv2.erode(mask,None,iterations=1)
        mask=cv2.dilate(mask,None,iterations=2)
        mask=np.array(mask,dtype=np.bool)
        a[mask]=num[i]
        person.append(a)
    
    img=np.array(person).transpose((1,2,0))

    im=Image.fromarray(img)
    display(im)
    return im

cut=cut_person(Image.open(result[0]["save_path"]),num=[255,255,255])
cut.save("./yu_w.png", "PNG")
cut=cut_person(Image.open(result[0]["save_path"]),num=[255,0,0])
cut.save("./yu_r.png", "PNG")
cut=cut_person(Image.open(result[0]["save_path"]),num=[0,0,255])
cut.save("./yu_b.png", "PNG")

cf3731fe0973fe4b59fe2f82bc72a143.png

078165b2ed77c03b2c67977de3f69e68.png

74b65c57540aad7ca6aa01b2090bd868.png

结果看起来还是很不错的,大家可以使用自己的图片试试看。项目地址:

paddlehub创意赛--1寸登记照片生成神器 - 百度AI Studio - 一站式AI开发实训平台​aistudio.baidu.com

总结

  1. 对照片的裁剪,这个裁剪必须保存1寸照片的比例,不然就会使得图像变形。
  2. 在做人物和背景分离的时候,不同的照片,分离的阈值是需要有一定调整的,这样才能达到很好的效果。
  3. 在改变背景颜色的时候,人物边缘会有一些色块、噪点出现,这就需要用到图像处理里面的腐蚀、膨胀了,我们对mask进行膨胀,使得人物和背景融合得更好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值