天天看点

(记录)PaddleHub创意赛:AI人像抠图及图像合成

文章目录

  • ​​PaddleHub创意赛:AI人像抠图及图像合成​​
  • ​​一、安装环境(这里面有几个坑)​​
  • ​​二、接下来就``开始P图​​
  • ​​1. 引入包​​
  • ​​2. 加载预训练模型(挺厉害的不得不说)​​
  • ​​3. 图像合成​​

PaddleHub创意赛:AI人像抠图及图像合成

本项目根据DeepLabv3+模型一键抠图示例,主要采用PaddleHub DeepLabv3+模型(deeplabv3p_xception65_humanseg)和python图像处理库opencv、PIL等完成。在最新作中,作者通过encoder-decoder进行多尺度信息的融合,同时保留了原来的空洞卷积和ASSP层, 其骨干网络使用了Xception模型,提高了语义分割的健壮性和运行速率,在 PASCAL VOC 2012 dataset取得新的state-of-art performance,该PaddleHub Module使用百度自建数据集进行训练,可用于人像分割,支持任意大小的图片输入。在完成一键抠图之后,通过图像合成,实现扣图比赛任务。

PaddleHub 是基于 PaddlePaddle 开发的预训练模型管理工具,可以借助预训练模型更便捷地开展迁移学习工作,目前的预训练模型涵盖了图像分类、目标检测、词法分析、语义模型、情感分析、视频分类、图像生成、图像分割、文本审核、关键点检测等主流模型。

PaddleHub官网:​​PaddleHub官网​​

PaddleHub项目地址:​​PaddleHub github​​

更多PaddleHub预训练模型应用可见:​​教程合集课程​​

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

一、安装环境(这里面有几个坑)

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

虽然说这样就可以了,但是你会发现,你打开本地运行环境以后会出错???

以下为出错的内容

JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)      

既然如此我们就进源码看一下到底怎么回事

(记录)PaddleHub创意赛:AI人像抠图及图像合成

最主要就是这个东西出了问题,在Github上的issue里面说了,在最新版里面已经解决,但其实在windows里面,仍然存在该类问题

然后分析代码后我得知,原来在C盘当中,缺失了config.json文件,然后把这个放到这个根目录的文件里面去.paddle/conf/config.json,如果没有就自己建立一个

{
"server_url": [
"http://paddlepaddle.org.cn/paddlehub"
],
"resource_storage_server_url": "https://bj.bcebos.com/paddlehub-data/",
"debug": false,
"log_level": "DEBUG"
}      

然后还有一个坑就是,虚拟环境里面运行可能会出错,所以最好在Pycharm真实环境运行

二、接下来就``开始P图

1. 引入包

# 测试图片路径和输出路径
test_path = 'image/test/'
output_path = 'image/out/'

# 待预测图片
test_img_path = ["test.jpg"]
test_img_path = [test_path + img for img in test_img_path]
img = mpimg.imread(test_img_path[0]) 

# 展示待预测图片
plt.figure(figsize=(10,10))
plt.imshow(img) 
plt.axis('off') 
plt.show()      

这是效果图!!

(记录)PaddleHub创意赛:AI人像抠图及图像合成

2. 加载预训练模型(挺厉害的不得不说)

通过加载PaddleHub DeepLabv3+模型(deeplabv3p_xception65_humanseg)实现一键抠图

module = hub.Module(name="deeplabv3p_xception65_humanseg")
input_dict = {"image": test_img_path}

# execute predict and print the result
results = module.segmentation(data=input_dict)
for result in results:
    print(result)

# 预测结果展示
out_img_path = 'humanseg_output/' + os.path.basename(test_img_path[0]).split('.')[0] + '.png'
img = mpimg.imread(out_img_path)
plt.figure(figsize=(10,10))
plt.imshow(img) 
plt.axis('off') 
plt.show()      

测试结果还挺不错的!!!但是在处理其他图片还有瑕疵,比如手里拿了手机,可能会给你P调

(记录)PaddleHub创意赛:AI人像抠图及图像合成

3. 图像合成

# 合成函数
def blend_images(fore_image, base_image, output_path):
    """
    将抠出的人物图像换背景
    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(output_path)
    return res_image

    output_path_img = output_path + 'blend_res_img.jpg'
    blend_images('humanseg_output/test.png', 'image/test/bg.jpg', output_path_img)

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