百度AI神器paddlehub扣图随心所欲合成自己的图片

一、简介
https://www.paddlepaddle.org.cn/hub
PaddleHub是基于PaddlePaddle开发的预训练模型管理工具,可以便捷地获取PaddlePaddle生态下的预训练模型,完成模型的管理和一键预测。配合使用Fine-tune API,可以基于大规模预训练模型快速完成迁移学习,让预训练模型能更好地服务于用户特定场景的应用。
本示例用DeepLabv3+模型完成一键抠图。DeepLabv3+ 是Google DeepLab语义分割系列网络的最新作,其前作有 DeepLabv1,DeepLabv2, DeepLabv3。在最新作中,作者通过一张baby照片作为原始被抠图照片,然后利用 DeepLabv3+进行扣图,在完成一键抠图之后,通过图像合成,实现扣图合成任务。

本项目存储于AIstudio社区:https://aistudio.baidu.com/aistudio/projectdetail/706169

NOTE: 如果您在本地运行该项目示例,需要首先安装PaddleHub。如果您在线运行,需要首先fork该项目示例。之后按照该示例操作即可。

请务必使用GPU环境, 因为下方的代码基于GPU环境.
在这里插入图片描述
当前平台正在进行普遍赠送, 只要点击此处表单进行填写, 之后再度运行即可获赠.

二、准备工作
1.首先要安装paddlepaddle和paddlehub的包

!pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install paddlehub==1.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

2.准备两张需要处理的图片,一张是需要处理的人物图片,另一张背景图片,上传到work/文件夹下,这里建议上传到work/下,防止重启aistudio后,图片被重置了。

在这里插入图片描述
3.导入必要的包

import matplotlib.pyplot as plt 
import matplotlib.image as image 
import cv2
import paddlehub as hub
from PIL import Image
import numpy as np
import matplotlib.image as mpimg 
import matplotlib.pyplot as plt 

三、定义图片展示方法,由于这几行代码后面要反复使用,因此这里定义一个方法进行封装

def show_image(image_path):
    '''
    展示图片
    '''
    img = image.imread(image_path)
    plt.figure(figsize=(10,10))
    plt.imshow(img) 
    plt.axis('off') 
    plt.show()

四、加载预训练模型

# 加载deeplabv3p_xception65_humanseg模型
module = hub.Module(name="deeplabv3p_xception65_humanseg")

# 待分割图片展示展示
test_img_path = "data/baby1.jpg"
show_image(test_img_path)

test_img_path = "data/baby1.jpg"
test_backimg_path='work/greatwall2.jpg'
show_image(test_img_path)
show_image(test_backimg_path)
                                        visualization=True)

for result in results:
    result_path = result['save_path']
    show_image(result_path)

在这里插入图片描述
在这里插入图片描述

五、定义图像合成方法

def blend_images(fore_image, base_image):
    """
    将抠出的人物图像换背景
    fore_image: 前景图片,抠出的人物图片
    base_image: 背景图片
    """
    # 读入图片
    base_image = Image.open(base_image).convert('RGB')
    fore_image = Image.open(fore_image).resize(base_image.size)

    # 图片加权合成
    scope_map = np.array(fore_image)[:,:,-1] / 255
    scope_map = scope_map[:,:,np.newaxis]
    scope_map = np.repeat(scope_map, repeats=3, axis=2)
    res_image = np.multiply(scope_map, np.array(fore_image)[:,:,:3]) + np.multiply((1-scope_map), np.array(base_image))
    
    #保存图片
    res_image = Image.fromarray(np.uint8(res_image))
    res_image.save("blend_res_img.jpg")

六、展示合成后图像

#调用合成图像方法
blend_images('humanseg_output/ndarray_time=1597074488994841.png', 'work/greatwall2.jpg')

# 展示合成图片
plt.figure(figsize=(20,10))
img = mpimg.imread("./blend_res_img.jpg")
plt.imshow(img) 
plt.axis('off') 
plt.show()

在这里插入图片描述
后续
由于时间紧张,扣图和合成还是比较粗糙的,比如小孩头上原来有两个角,扣完以后变成独角了,合成原本想是把人变得更小些,让她有种在天上飞翔的效果,但是试了几次效果都不是很理,这也许就是一种缺憾,留作后面继续研究和学习的动力吧,也请大佬们多多指正批评!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值