通过预训练模型进行图像的自动抠图及整合。

代码已经共享在AIStudio上,链接:

https://aistudio.baidu.com/aistudio/projectdetail/242887

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

命令行预测示例 $ hub run deeplabv3p_xception65_humanseg --input_path "/PATH/TO/IMAGE" $ hub run deeplabv3p_xception65_humanseg --input_file test.txt test.txt 存放待分割图片的存放路径

API def segmentation(data) 用于人像分割

参数

data:dict类型,key为image,str类型;value为待分割的图片路径,list类型。 output_dir:生成图片的保存路径,默认为 humanseg_output

返回

result:list类型,每个元素为对应输入图片的预测结果。预测结果为dict类型,有以下字段:

origin 原输入图片路径 processed 分割图片的路径。

In[1]

cd work

/home/aistudio/work

先定义抠图的函数,通过调用图像分割模型抠图

In[7]

def body_seg_fore(imgname):

    module = hub.Module(name="deeplabv3p_xception65_humanseg")

    test_img_path = "./"+imgname+".jpg"

    # 预测结果展示

    img = mpimg.imread(test_img_path)

    plt.imshow(img)

    plt.axis('off')

    plt.show()

    # set input dict

    input_dict = {"image": [test_img_path]}


    # execute predict and print the result

    results = module.segmentation(data=input_dict)

    for result in results:

        print(result)

    test_img_path = "./humanseg_output/"+imgname+".png"

    img = mpimg.imread(test_img_path)

    plt.imshow(img)

    plt.axis('off')

    plt.show()

    return test_img_path

In[8]

body_seg_fore('body2')

[2020-01-10 06:39:53,705] [    INFO] - Installing deeplabv3p_xception65_humanseg module

2020-01-10 06:39:53,705-INFO: Installing deeplabv3p_xception65_humanseg module

[2020-01-10 06:39:53,753] [    INFO] - Module deeplabv3p_xception65_humanseg already installed in /home/aistudio/.paddlehub/modules/deeplabv3p_xception65_humanseg

2020-01-10 06:39:53,753-INFO: Module deeplabv3p_xception65_humanseg already installed in /home/aistudio/.paddlehub/modules/deeplabv3p_xception65_humanseg


PaddlePaddle : AI抠图及图片合成_第1张图片

[2020-01-10 06:39:54,539] [    INFO] - 0 pretrained paramaters loaded by PaddleHub

2020-01-10 06:39:54,539-INFO: 0 pretrained paramaters loaded by PaddleHub

{'origin': './body2.jpg', 'processed': 'humanseg_output/body2.png'}


PaddlePaddle : AI抠图及图片合成_第2张图片

'./humanseg_output/body2.png'

定义图片合成函数。

In[12]

#图片整合

#foreimage:前景照片,baseimage:景区照片,outputimage:数据结果,rate:前景照片缩放比例

def combine_image(foreimage,baseimage,outputimage,rate):

    from PIL import Image

    base_img = Image.open(baseimage)

    BL, BH = base_img.size

    #读取要粘贴的图片 RGBA模式   

    #当需要将一张有透明部分的图片粘贴到一张底片上时,如果用Python处理,可能会用到PIL,

    #但是PIL中 有说明,在粘贴RGBA模式的图片是,alpha通道不会被帖上,也就是不会有透明的效果,

    #当然也给出了解决方法,就是粘贴的时候,将RGBA的的alpha通道提取出来做为mask传入。

    fore_image = Image.open(foreimage)

    L, H = fore_image.size

    #缩放

    fore_image = fore_image.resize((int(L * rate), int(H * rate)))

    L, H = fore_image.size

    #分离通道   

    r,g,b,a = fore_image.split()    #粘贴


    box=(int(BL/2-L/2), BH-H, int(BL/2+L/2) ,BH)


    base_img.paste(fore_image,box,mask = a)

    base_img.save(outputimage)  # 保存图片


#输出程序

def show_image(originimage,baseimage,outputimage,rate):

    segname=body_seg_fore(originimage)

    combine_image(segname,baseimage,outputimage,rate)


    img = mpimg.imread(outputimage)

    plt.imshow(img)

    plt.axis('off')

    plt.show()

    return test_img_path

结果展示:

In[14]

show_image('body2','./desert.jpg','body2_desert.jpg',2)

[2020-01-10 06:42:43,724] [    INFO] - Installing deeplabv3p_xception65_humanseg module

2020-01-10 06:42:43,724-INFO: Installing deeplabv3p_xception65_humanseg module

[2020-01-10 06:42:43,746] [    INFO] - Module deeplabv3p_xception65_humanseg already installed in /home/aistudio/.paddlehub/modules/deeplabv3p_xception65_humanseg

2020-01-10 06:42:43,746-INFO: Module deeplabv3p_xception65_humanseg already installed in /home/aistudio/.paddlehub/modules/deeplabv3p_xception65_humanseg


PaddlePaddle : AI抠图及图片合成_第3张图片

[2020-01-10 06:42:44,629] [    INFO] - 0 pretrained paramaters loaded by PaddleHub

2020-01-10 06:42:44,629-INFO: 0 pretrained paramaters loaded by PaddleHub

{'origin': './body2.jpg', 'processed': 'humanseg_output/body2.png'}


PaddlePaddle : AI抠图及图片合成_第4张图片


PaddlePaddle : AI抠图及图片合成_第5张图片

'./humanseg_output/body2.png'

In[18]

show_image('body1','./desert.jpg','body2_desert.jpg',0.3)

[2020-01-10 06:44:26,397] [    INFO] - Installing deeplabv3p_xception65_humanseg module

2020-01-10 06:44:26,397-INFO: Installing deeplabv3p_xception65_humanseg module

[2020-01-10 06:44:26,423] [    INFO] - Module deeplabv3p_xception65_humanseg already installed in /home/aistudio/.paddlehub/modules/deeplabv3p_xception65_humanseg

2020-01-10 06:44:26,423-INFO: Module deeplabv3p_xception65_humanseg already installed in /home/aistudio/.paddlehub/modules/deeplabv3p_xception65_humanseg


PaddlePaddle : AI抠图及图片合成_第6张图片

[2020-01-10 06:44:27,592] [    INFO] - 0 pretrained paramaters loaded by PaddleHub

2020-01-10 06:44:27,592-INFO: 0 pretrained paramaters loaded by PaddleHub

{'origin': './body1.jpg', 'processed': 'humanseg_output/body1.png'}


PaddlePaddle : AI抠图及图片合成_第7张图片


PaddlePaddle : AI抠图及图片合成_第8张图片

'./humanseg_output/body2.png'