PaddleHub创意赛:AI人像抠图及图像合成——基于paddleHub的韦小宝穿越

PaddleHub创意赛:AI人像抠图及图像合成——基于paddleHub的韦小宝穿越

本项目根据DeepLabv3+模型一键抠图示例(https://aistudio.baidu.com/aistudio/projectdetail/354462),主要采用PaddleHub DeepLabv3+模型(deeplabv3p_xception65_humanseg)和python图像处理库opencv、PIL等完成。

PaddleHub是百度的深度学习的一部分,它是基于百度的深度学习框架PaddlePaddle开发的预训练模型管理工具。我们可以借助预训练模型更便捷地开展迁移学习工作,通过PaddleHub开发者可以使用高质量的预训练模型结合Fine-tune API快速完成迁移学习到应用部署的全流程工作,其中Fine-tune API网址为:https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub-Finetune-API。
百度提供了飞桨生态下的高质量预训练模型,涵盖了图像分类、目标检测、词法分析、语义模型、情感分析、视频分类、图像生成、图像分割、文本审核、关键点检测等主流模型。

paddleHub的具体网址为https://www.paddlepaddle.org.cn/hub。
更详细的描述和内容可以参看该网址中的使用文档和官方课程,其中使用文档为中文,更加方便开发者的学习和使用。同时,也包括大量的具体实例,可以直接使用或根据自己的需求调整应用于自己的领域。

本例主要使用了PaddleHub中已训练好的人像分割模型:DeepLabv3+模型(deeplabv3p_xception65_humanseg),对《鹿鼎记》中的一个小片段进行了人像抠图,并将分割的人像和任意背景进行图像合成形成具有新的背景的视频,实现了该比赛的一个小的示例;同时由于产生的视频没有声音,故采用了手机软件“剪映”将音频加上。
注意: 如果您在本地运行该项目示例,需要首先安装PaddleHub。如果您在线运行,需要首先fork该项目示例到AI Studio中。
本内容参考:https://aistudio.baidu.com/aistudio/projectdetail/377462完成,如有侵权请联系本人删除。

本示例的具体流程为:

第一步 安装环境

安装paddlehub1.6.0版本和和已训练好的人像分割模型deeplabv3p_xception65_humanseg,具体命令为:

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

第二步 定义图像合成函数

2.1 导入包

import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
from matplotlib import animation
import cv2
import paddlehub as hub
from PIL import Image, ImageSequence, ImageDraw,ImageFont
from IPython.display import display, HTML
import numpy as np 
import imageio
import os

2.2 加载预训练模型

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

2.3 合成图像函数

def blend_images(fore_image, base_image, output_path):
"""
将抠出的人物图像换背景
    fore_image: 前景图片,抠出的人物图片
base_image: 背景图片
output_path:合成图片输出路径
    """
    # 读入图片
    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

第三步:视频处理(拆分-分割-合成-保存)

3.1 拆视频

cap = cv2.VideoCapture('image/video/xiaobao3.mp4')

imgs = []
num = 0
while(True):
    ret,frame = cap.read() 
    if ret:
        cv2.imwrite('image/video/frame/%d.jpg'%num, frame)
        # img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 
        # imgs.append(img_rgb)
        num += 1
    else:
        break
cap.release()#关闭相机

3.2 人像分割

frame_path = 'image/video/frame'
test_img_path = [os.path.join(frame_path, fname) for fname in os.listdir(frame_path)]
input_dict = {"image": test_img_path}

# execute predict and print the result

results = module.segmentation(data=input_dict, output_dir='image/video/frame_seg/')

3.3 合并输出视频

output_path = 'image/video'
humanseg_xiaobao = [filename for filename in os.listdir('image/video/frame_seg/')]
print(len(humanseg_xiaobao))
for i, img in enumerate(humanseg_xiaobao):
    if i <= 397:
        img_path = os.path.join('image/video/frame_seg/%d.png' % i)
        output_path_img = output_path + '/blend_out/%d.png' % i
        img = blend_images(img_path, 'image/video/bg/bg-x1.jpg', output_path_img)
print('hello world')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值