# 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。