一起养成写作习惯!这是我参与「日新计划 4 月更文挑战」的第29天,点击查看活动详情。

基于paddleSeg的证件照一键式生成工具

  • 基于图像Matting的全功能证件照生成。实现图像背景红,绿,蓝或自定义图像,自定义照片尺寸,自定义照片内存大小。能自动https域名输出git命令透明PNG,背景和人像的JPG。

  • 输入参数,一键运行,至「./dpython保留字ata」文件夹下可以直接下载所有文件。


  • 源码精灵永久兑换码入参数

    源码之家入图像均需要上传至「./work」文件夹下

基于PaddleSeg的证件照一键式生成工具

[1] Image_nam源码时代e

输入用户定义的图片名称,默认为示例图像,直接上传至「./worgithubk」文件夹下

注意输入不要带gitlab文件夹名称。| ‘kai.jpg’✔️ | ‘work/kai.jpg’✖️ |

[2] Image_background

输入用户需要更换的背景模式,可选:红色,蓝色,绿色。默认为绿色背景

将自定义背景图像直接上传至「./work」文件夹下

颜色可以选择|’red’✔️’blue’✔️’greed’✔️ | 或自定义图像 |’background.jpg’✔️ | ‘work/b源码1688ackground.jpg’✖️ |

[3] Image_Type

除生成默认分割结果外,还单独能生成[自定义图像]。该参数用于控制[自定义图像]的模式

[自定义图像]有几种选择:| 0 :输入人像换背python语言景 | 1 :分割人像前景 | 2 :分割的背景 |

由于该项目是生成证件照,因此默认是更换背景。

[4] Image_size

该参数用于控制[自定义图像]的宽高,输入为一维列表,使用逗号分隔。要求宽高为正整数

示例:| [256,400] ✔️ | [-100,400] ✖️ |

[5] Image_http协议memory

该参数用于控制[自定义图像]的占用内存,输入为正整数,单位为KB。

由于有的网页会限制上传图像的大小,例如小于200kb,因此特意开发此功能

示例:| 200 ✔️ |

默认为0,不对图像进行压缩。


  • 输出结果

    输出目录为「./data」文件夹。对生成的结果进行说明。

    基于PaddleSeg的证件照一键式生成工具

[1]. your_pic.jpg : 输入的原图换底照片

基于PaddleSeg的证件照一键式生成工具

[2]. your_pic.png : 分割giti轮胎人像png照片,该图除人物外为透明背景

基于PaddleSeg的证件照一键式生成工具

[3]. ori_pic.jpg : 输入的原图

基于PaddleSeg的证件照一键式生成工具

[4]. fore_pic.jpg : 分割人像jpg照片

基于PaddleSeg的证件照一键式生成工具

[5]. back_pic.jpg : 分割背景jpgiti轮胎g照片

基于PaddleSeg的证件照一键式生成工具

[6]. final.jpg : jpg格式的[自定义图像]

基于PaddleSeg的证件照一键式生成工具


注意 :如果需要第http代理二次运行,请不要重复运行模块[PaddleSeg及数据准备]

0 预备知识

Matting是一种通过计算图像的颜色和透明度从从背景中提取前景对象的技术。 这项技术被广泛用于电影等行业,实现精细地背景替换、图像构图,制造各种惊艳的视觉效果。

Matting可以看作是一个特殊的分割问题,它旨在估计Git明度,区分前景背景,主要目的是拿到前景,python保留字是一项真正实用的替换背景技术。分割和Matting的一个重要区别是:分割返回的是像素分类标签,源码交易平台其结果是整型数据;而Matting返回的是属于前景或背景的http 404概率P,从而在前景与背景交互区域产生渐变的效果,使得抠图更加自然。Matting分割模型训练完成后,对于原始图像每个位置上的像素,都将生成一个表示其前景透明度的值,称为 Alpha。 图像中所有 Alpha 值的集合称https认证为 Alpha Matte。最后,利用Alpha将原始图像的对应位置上的像素点做源码时代pixel-wise的运算,便可实现精细的背景替换。

1 输入参数设置源码编辑器下载

Image_name = 'kai.jpg'   # 输入用户定义的图片,默认为示例图像
Image_background = 'red'  # 输入颜色或自定义背景图像:'red','blue','greed' 或 'background.jpg' 默认为绿色背景
Image_Type = 0           # 输入目标图像的模式 0:换背景 1:人像前景 2:背景
Image_size = []          # 输入图像的宽,高,要求为整数。为空默认不改变图像尺寸
Image_memory = 0         # 输入最大大小,单位kb。为0默认不改变图像大小
# 基本没做什么异常处理,要是遇到问题直接评论。

2 PaddlePythonSeg及数据准备

! git clone --depth=1 https://gitee.com/paddlepaddle/PaddleSeg.git
%cd ./PaddleSeg
!pip install -e .
!pip install scikit-image
# 下载 PPM 数据集,如果不下需要修改推理的源码
%cd /home/aistudio/PaddleSeg/contrib/Matting
!mkdir data 
%cd data
!wget https://paddleseg.bj.bcebos.com/matting/datasets/PPM-100.zip
!unzip PPM-100.zip
import cv2
if Image_name!= 'kai.jpg':
    pic = cv2.imread('/home/aistudio/work/' + Image_name)
    cv2.imwrite('/home/aistudio/work/your_pic.jpg', pic,[int( cv2.IMWRITE_JPEG_QUALITY), 100])
else:
    pic = cv2.imread('/home/aistudio/work/demo_pictures/kai.jpg')
    cv2.imwrite('/home/aistudio/work/your_pic.jpg', pic,[int( cv2.IMWRITE_JPEG_QUALITY), 100])

3 代码实现

# 创建换底图
import numpy as np
import cv2
if Image_background == 'red':
    img_ = np.zeros_like(pic,np.uint8)
    img_[:,:,2] = img_[:,:,2]+255
    cv2.imwrite('/home/aistudio/work/background_pic.jpg', img_,[int( cv2.IMWRITE_JPEG_QUALITY), 100])
elif Image_background == 'blue':
    img_ = np.zeros_like(pic,np.uint8)
    # 输入想要颜色的BGR,创建纯色图
    img_[:,:,0] = img_[:,:,0]+2555
    cv2.imwrite('/home/aistudio/work/background_pic.jpg', img_,[int( cv2.IMWRITE_JPEG_QUALITY), 100])
elif Image_background != None:
    pic = cv2.imread('/home/aistudio/work/' + Image_background)
    cv2.imwrite('/home/aistudio/work/background_pic.jpg', pic,[int( cv2.IMWRITE_JPEG_QUALITY), 100])
else:
    img_ = np.zeros_like(pic,np.uint8)
    img_[:,:,1] = img_[:,:,1]+255
    cv2.imwrite('/home/aistudio/work/background_pic.jpg', img_,[int( cv2.IMWRITE_JPEG_QUALITY), 100])
!cp /home/aistudio/work/bg_replace.py /home/aistudio/PaddleSeg/contrib/Matting/bg_replace.py
%cd /home/aistudio/PaddleSeg/contrib/Matting/
!python bg_replace.py 
    --config configs/modnet/modnet_mobilenetv2.yml 
    --model_path /home/aistudio/work/modnet-mobilenetv2.pdparams 
    --image_path /home/aistudio/work/your_pic.jpg 
    --save_dir /home/aistudio/data 
    --bg_path /home/aistudio/work/background_pic.jpg 
# 生成各类图像
import numpy as np
import cv2
ori_pic = '/home/aistudio/work/your_pic.jpg'
pic_ori = cv2.imread(ori_pic)
cv2.imwrite('/home/aistudio/data/ori_pic.jpg', pic_ori,[int( cv2.IMWRITE_JPEG_QUALITY), 100])
mask_pic = '/home/aistudio/data/your_pic.png'
mask_pic = cv2.imread(mask_pic, cv2.IMREAD_UNCHANGED)
mask_ = mask_pic[:,:,3]
# 前景结果图
fore_pic = '/home/aistudio/data/fore_pic.jpg'
pic_fore = cv2.bitwise_and(pic_ori,pic_ori,mask=mask_)
cv2.imwrite(fore_pic, pic_fore,[int( cv2.IMWRITE_JPEG_QUALITY), 100])
# 背景结果图
back_pic = '/home/aistudio/data/back_pic.jpg'
pic_back = cv2.bitwise_and(pic_ori,pic_ori,mask=255-mask_)
cv2.imwrite(back_pic, pic_back,[int( cv2.IMWRITE_JPEG_QUALITY), 100])
True
# 根据要求生成目标图像
import numpy as np
import cv2
import os
def resizePng_memoery(Image,Image_size,Image_memory):
    save_name ='/home/aistudio/data/final.jpg'
    if len(Image_size)!=0:
        Image = cv2.resize(Image, (int(Image_size[0]), int(Image_size[1])))
    cv2.imwrite(save_name, Image,[int( cv2.IMWRITE_JPEG_QUALITY), 100])
    quality = 100
    fsize = os.path.getsize(save_name)
    while os.path.getsize(save_name)>Image_memory*1024 and Image_memory!=0 : # 如果图片太大进行压缩
        quality = quality - 10
        assert quality>0
        squeeze_img = cv2.imread(save_name)
        cv2.imwrite(save_name, squeeze_img,[int( cv2.IMWRITE_JPEG_QUALITY), quality])
        fsize = os.path.getsize(save_name)
    return (round(fsize/1024,2),'kb')
if Image_Type == 0: # 换背景的图
    changeBack_pic = cv2.imread('/home/aistudio/data/your_pic.jpg')
    memory_pic = resizePng_memoery(changeBack_pic,Image_size,100)
    print('最终生成的图片大小为:',memory_pic)
elif Image_Type == 1: # 人像前景
    memory_pic = resizePng_memoery(pic_fore,Image_size,Image_memory)
    print('最终生成的图片大小为:',memory_pic)
elif Image_Type == 2: # 人像背景
    memory_pic = resizePng_memoery(pic_fore,Image_size,Image_memory)
    print('最终生成的图片大小为:',memory_pic)
else:
    print('请选择正确的目标图像模式')
最终生成的图片大小为: (94.05, 'kb')

⛄4 总结

该项目是基于PaddleSeg的实际应用项源码时代目,希望能给大家带来便利。

灵感是论坛的一个需求,之giti轮胎后看了AISTUDIO平台类似的项目,都有一定门槛,单纯快速使用的话都不太合适。

所以是实现了这个项目,全程一键运行,可以在五分钟内获得所python123平台登录有结果。

欢迎大家积极Fork点赞,鼓励作者产出更多使用的项目

️5 参源码时代考项目

  • [1] aistudio.baidu.com/aistudio/pr…

  • [2] aistudio.baidu.com/aistudio/pr…