PaddleHub创意赛:抠图

本文介绍了一个使用PaddleHub的DeepLabv3+模型进行抠图的项目。作者通过切割视频得到图片,然后利用预训练模型deeplabv3p_xception65_humanseg(版本1.0.0)进行人像分割,最后合并图片以完成抠图任务。文中还提到了版本问题可能导致的抠图失败,并分享了完整的代码流程。
摘要由CSDN通过智能技术生成

# PaddleHub创意赛

本项目中使用DeepLabv3+模型完成抠图。使用预训练模型deeplabv3p_xception65_humanseg,版本号1.0.0。(注意:在目前的Notebook中运行,需要指定版本1.0.0。我之前使用默认版本,一直没法完成抠图。也没看见什么提示,困扰了不短时间。后来才发现是版本问题。)该PaddleHub Module使用百度自建数据集进行训练,可用于人像分割,支持任意大小的图片输入。在完成抠图之后,通过图像合成,实现扣图比赛任务。

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

吐槽一下,不知道是不是我找的地方不对,PaddleHub的API或者手册不好查。

# 一、数据准备

上传视频为MP4格式文件。文件名可自行命名,注意修改代码中对应的文件名就行。

# 二、拆分视频

通过cv2库中VideoCapture函数,将指定视频文件拆分成图片。

import cv2

import os

import numpy as np

from PIL import Image

import paddlehub as hub

 

Video_Path = 'work/demo3/mj.mp4'

ImageCut_Path = 'work/demo3/image_cut/'

 

def CutVideo2Image(video_path, img_path):

    cap = cv2.VideoCapture(video_path)

    index = 0

    while(True):

        ret,frame = cap.read() 

        if ret:

            cv2.imwrite('{}{}.jpg'.format(ImageCut_Path, index), frame)

            index += 1

        else:

            break

    cap.release()

    print('Video cut finish, we get %d images' % index)

 

if not os.path.exists(ImageCut_Path):

    os.mkdir(ImageCut_Path)

    CutVideo2Image(Video_Path, ImageCut_Path)

# 三、抠图

使用PaddleHub,加载模型deeplabv3p_xception65_humanseg,模型版本1.0.0。
我估计和NoteBook默认的PaddlePaddle的版本有关系。使用最新版本始终无法成功抠图。关键是没有任何提示信息,看起来运行成功了。

import cv2

import os

import numpy as np

from PIL import Image

import paddlehub as hub

 

ImageCut_Path = 'work/demo3/image_cut/'

ImageSeg_Path = 'work/demo3/image_seg/'

 

def GetHumanSeg(in_path, out_path):

    # load model

    module = hub.Module(name="deeplabv3p_xception65_humanseg", version="1.0.0")

    img_path = [os.path.join(in_path, fname) for fname in os.listdir(in_path)]

    input_dict = {"image": img_path}

    results = module.segmentation(data=input_dict, output_dir=out_path)

    # module = hub.Module(name="deeplabv3p_xception65_humanseg", version="1.1.1")

    # module.segmentation(paths=['/home/aistudio/work/demo3/image_cut/0.jpg'], output_dir=out_path)

    # module.segmentation(images=[cv2.imread('/home/aistudio/work/demo3/image_cut/0.jpg')], output_dir=out_path)

    print("GetHumanSeg finished, out_path: {}".format(out_path))

 

if not os.path.exists(ImageSeg_Path):

    os.mkdir(ImageSeg_Path) 

    GetHumanSeg(ImageCut_Path, ImageSeg_Path)

# 四、合并图片

我的目的是把两个视频中的人物分别抠出来,合并到一张背景图片中。如果找到合适的更有趣的背景图,或者视频,可以替换bg.jpg。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值