基于Paddlehub实现的秒换证件照底色

秒换证件照底色

现实生活中,不同证件上需要不同底色的照片。比如结婚需要的红色,身份证需要的白色,考试报名需要的蓝色。同时准备三种颜色的证件照也不是不可能,但是有时候迫于时间关系,又没有准备好照片的情况下,依靠PhotoShop手动处理旧照片或者是出门拍一张照片需要一定的时间,还要一定的软件使用技能。
这个时候,AI自动处理图像的优势就显现出来了。速度快,效果好,操作成本低(将本程序封装成exe)。
在此之前,先介绍一个线上的AI平台百度飞浆PaddlePaddle

PaddlePaddle

在这里插入图片描述

AI,很多人第一反应就是高门槛,要面对复杂的网络结构与框架、算法调优、支付昂贵的物理设备费用(GPU)。百度飞浆PaddlePaddle都能解决这些问题,提供线上的运行环境,高质量的教学课程
本项目就是通过飞浆的一个工具——Paddlehub实现。下面回归正题

模型概述

在这里插入图片描述

DeepLabv3+ 是Google DeepLab语义分割系列网络的最新作,其前作有 DeepLabv1, DeepLabv2, DeepLabv3。在最新作中,作者通过encoder-decoder进行多尺度信息的融合,同时保留了原来的空洞卷积和ASSP层, 其骨干网络使用了Xception模型,提高了语义分割的健壮性和运行速率,在 PASCAL VOC 2012 dataset取得新的state-of-art performance。该PaddleHub Module使用百度自建数据集进行训练,可用于人像分割,支持任意大小的图片输入。

代码实现

首先声明的是,此项目运行环境是Paddle上的AI studio。所以代码以jupyter的风格展示。

#安装对应版本的paddlehub
!pip install paddlehub==1.6.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

#照片选择
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg
#pycharm环境下可以取消注释,以UI界面方式选择图片
#import win32ui
#paddlehub 不支持UI界面选择照片文件路径,这里以输入的方式做测试
#dlg = win32ui.CreateFileDialog(1)
#dlg.SetOFNInitialDir('C:/')
#dlg.DoModal()
#photo_path = dlg.GetPathName()

photo_path = ['lyh.jpg']

#显示选择的图片
img = mpimg.imread(photo_path[0])
plt.figure(figsize=(10,10))
plt.imshow(img) 
plt.axis('off') 
plt.show()

运行结果:
<Figure size 720x720 with 1 Axes>
加载模型
paddlehub上的预训练模型:deeplabv3p_xception65_humanseg
这一步是为了实现抠取图片的人像部分

import paddlehub as hub

output_path = 'output'
module = hub.Module(name="deeplabv3p_xception65_humanseg")
input_dict = {"image": photo_path}
results = module.segmentation(data=input_dict,visualization=True,
                 output_dir=output_path)
#显示处理好的图片
import glob
import os
img_path = glob.glob(os.path.join(output_path, '*.png'))
img_path.sort()

for path in img_path:
    img= mpimg.imread(path)

plt.figure(figsize=(10,10))
plt.imshow(img) 
plt.axis('off') 
plt.show()

运行结果:
在这里插入图片描述
图片中除人像部分其实都是透明的,这里显示为白色。
换底色处理

from PIL import Image

#定义证件照底色RGB值
blue = 0,191,243
red = 255,0,0
white =255,255,255
#底色默认值
color = 0,0,0
your_choice=input("你想要的证件照底色")
if your_choice =="red":
    color = red
elif your_choice == "white":
    color = white
elif your_choice == "blue":
    color = blue
else:
    color=white
    print("颜色不正确,默认白")
#填充图片A通道,即透明部分
img =Image.open(img_path[0])
finish_path = img_path[0]+"_finish.png"
x, y = img.size
p = Image.new('RGBA', img.size, (color))
p.paste(img, (0, 0, x, y), img)
p.save(finish_path)

img = mpimg.imread(finish_path)
plt.figure(figsize=(10,10))
plt.imshow(img) 
plt.axis('off') 
plt.show()

运行结果
在这里插入图片描述

总结

其实整体思路就是抠取人像后,对图片的A通道填充想要的颜色。

项目的出发点是操作方便且不需要专业技能,可以封装一个exe版本,运用easy_install实现,这里不作实现。

这里感谢李彦宏先生的照片。

同类对比

去年流行的一个python库函数removebg,它是以去除背景为出发点。在处理图像上也有很优秀的表现。唯一的缺点就是不能“白嫖!”,使用此库函数需要注册账号,获得API的使用次数。超过一定的次数需要付费(不便宜)。
下面放出一段由removebg实现的代码:

from removebg import RemoveBg
from PIL import Image
locat = "C:/Users/acer/Desktop"
name = input("请输入图片文件名")
new = '/new'
blue = 0,0,255
white = 255,255,255
red = 255,0,0
cloro = 0,0,0
def get_photo(locat,name):
    try:

        API = '1DccssUWFceWoomRBuTs1sV6'
        rmb = RemoveBg(API,'error.log')
        t= '/'
        all = locat+t+name
        print("操作中,请等待二十秒....")
        rmb.remove_background_from_img_file(all)
        temp = '_no_bg.png'
        all = all+temp
        return all
    except:
        print("API或者图片路径有误,请重新启动程序")
def chang_backgound():
    img = Image.open(get_photo(locat,name))
    x, y = img.size
    print("请选择要添加的背景色")
    a = input("红色:red   蓝色: blue  白色:white   黑色:black\n")
    if(a == 'red'):
        cloro = red
    if(a == 'blue'):
        cloro = blue
    if(a == 'white'):
        cloro = white
    if (a == 'black'):
        cloro = 0,0,0
    p = Image.new('RGBA', img.size, (cloro))
    p.paste(img, (0, 0, x, y), img)
    p.save(locat+new+name+'.png')
    print("操作成功,处理后的图片路径为:%s"%locat+new+name)


chang_backgound()

以封装exe可执行文件为出发点,选择PaddlePaddle版本的程序是最合适的,相当于永久免费使用的程序。
当然,除了图像分割,PaddlePaddle还支撑CV、NLP、REC、SPEECH方面的开发研究。

项目地址
AI Studio:https://aistudio.baidu.com/aistudio/projectdetail/749857

END

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值