背景
有时候,在我们需要登记照片,去照相馆很又不方便。我们可以利用PaddleHub来生成登记照片,这样十分方便和快捷。
不过网上也有一些能使用照片生成登记照的软件,可是大多数都有水印,需要付费才能使用。还需要下载和注册,同时照片也要上传,十分容易泄露我们的隐私。
这时候,我们完全可以利用PaddleHub来实现这一切。
先给大家看看效果:
原图:
![3a8025779878f69d81c4111c362a2b75.png](https://i-blog.csdnimg.cn/blog_migrate/2e5eb5cb427a3543f89cfed959952a3a.jpeg)
登记照片:
![cf3731fe0973fe4b59fe2f82bc72a143.png](https://i-blog.csdnimg.cn/blog_migrate/1de6fe7256a0b5393c0a5b681e93dfd8.jpeg)
![078165b2ed77c03b2c67977de3f69e68.png](https://i-blog.csdnimg.cn/blog_migrate/a179ec7e702fae14522f113d17ba655e.jpeg)
![74b65c57540aad7ca6aa01b2090bd868.png](https://i-blog.csdnimg.cn/blog_migrate/63996cf9b1c7c618751436ee9a12ff55.jpeg)
思路:
- 首先,根据PaddleHub人脸定位,找到图片中人脸的位置。
- 由于一寸照片的宽度295,高度是413,用这个比例框选出含有人脸的图片,并且进行缩放到尺寸(295,413)。
- 用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](https://i-blog.csdnimg.cn/blog_migrate/72e6db180a8f0762502a240d4b835a1e.jpeg)
人像抠图
# 进行人物抠图
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](https://i-blog.csdnimg.cn/blog_migrate/63996cf9b1c7c618751436ee9a12ff55.jpeg)
替换登记照片的背景颜色,并保存照片
# 替换背景,并保存图像
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](https://i-blog.csdnimg.cn/blog_migrate/1de6fe7256a0b5393c0a5b681e93dfd8.jpeg)
![078165b2ed77c03b2c67977de3f69e68.png](https://i-blog.csdnimg.cn/blog_migrate/a179ec7e702fae14522f113d17ba655e.jpeg)
![74b65c57540aad7ca6aa01b2090bd868.png](https://i-blog.csdnimg.cn/blog_migrate/63996cf9b1c7c618751436ee9a12ff55.jpeg)
结果看起来还是很不错的,大家可以使用自己的图片试试看。项目地址:
paddlehub创意赛--1寸登记照片生成神器 - 百度AI Studio - 一站式AI开发实训平台aistudio.baidu.com总结
- 对照片的裁剪,这个裁剪必须保存1寸照片的比例,不然就会使得图像变形。
- 在做人物和背景分离的时候,不同的照片,分离的阈值是需要有一定调整的,这样才能达到很好的效果。
- 在改变背景颜色的时候,人物边缘会有一些色块、噪点出现,这就需要用到图像处理里面的腐蚀、膨胀了,我们对mask进行膨胀,使得人物和背景融合得更好。