数字文创:冰冰老婆带你去旅游---基于paddlehub的人像分割与视频合成

P粉084495128
发布: 2025-07-30 10:15:44
原创
220人浏览过
该项目基于PaddleHub的deeplabv3p_xception65_humanseg模型实现人像分割,可将人物从原始采访视频中抠出并贴合到背景视频。流程为:安装环境后,对背景和人像视频切片,平移人像,用模型抠像,合并抠像与背景图,最终合成带音乐的视频。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

数字文创:冰冰老婆带你去旅游---基于paddlehub的人像分割与视频合成 - php中文网

怪兽AI数字人
怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44
查看详情 怪兽AI数字人

冰冰老婆带你去旅游---基于paddlehub的人像分割

背景介绍

本项目是基于deeplabv3p_xception65_humanseg模型的人像分割,实现效果:将人物从原始采访视频中抠出,贴到一个背景视频中,实现了视频抠像。

简介:

deepLabv3+ 是Google DeepLab语义分割系列网络的最新作,其前作有 DeepLabv1, DeepLabv2, DeepLabv3。

在最新作中,作者通过encoder-decoder进行多尺度信息的融合,同时保留了原来的空洞卷积和ASSP层,

其骨干网络使用了Xception模型,提高了语义分割的健壮性和运行速率,在 PASCAL VOC 2012 dataset取得新的state-of-art performance。

该PaddleHub Module使用百度自建数据集进行训练,可用于人像分割,支持任意大小的图片输入。

原视频:

合成后效果:

一,安装环境

本项目使用paddlehub。PaddleHub是飞桨预训练模型管理和迁移学习工具,通过PaddleHub开发者可以使用高质量的预训练模型结合Fine-tune API快速完成迁移学习到应用部署的全流程工作。 PaddleHub GitHub: https://github.com/PaddlePaddle/PaddleHub

In [1]
!pip install -U paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple
登录后复制
In [2]
import numpy as npimport matplotlib.image as mpimgimport matplotlib.pyplot as pltimport osfrom PIL import Imageimport paddlehub as hubimport cv2from moviepy.editor import VideoFileClipimport shutil
登录后复制
In [3]
os.environ["CUDA_VISIBLE_DEVICES"]="0"#GPU模式
登录后复制

二,视频切片

In [4]
#背景视频转jpgdef video_to_pic():
    if os.path.exists('./background_pic'):
        shutil.rmtree('./background_pic')#删除文件夹以及文件       
    os.mkdir('./background_pic')#创建文件夹
    index = 0
    cap = cv2.VideoCapture('./background.mp4')
    ret,frame = cap.read()    while ret:
        cv2.imwrite('./background_pic/%d.jpg'%index, frame)
        index += 1
        ret,frame = cap.read()
    cap.release()    print('Video cut finish, all %d frame' % index)
video_to_pic()
登录后复制
Video cut finish, all 434 frame
登录后复制
In [5]
#人像视频转jpgdef video_to_pic():
    if os.path.exists('./video_pic'):
        shutil.rmtree('./video_pic')#删除文件夹以及文件       
    os.mkdir('./video_pic')#创建文件夹
    index = 0
    cap = cv2.VideoCapture('./xxm.mp4')
    ret,frame = cap.read()    while ret:
        cv2.imwrite('./video_pic/%d.jpg'%index, frame)
        index += 1
        ret,frame = cap.read()
    cap.release()    print('Video cut finish, all %d frame' % index)
video_to_pic()
登录后复制
Video cut finish, all 319 frame
登录后复制

三,人物平移

In [6]
#图片平移def tl(img_path):
    '''x轴平移输出两张jpg图片,dest1,dest2'''
    img = cv2.imread(img_path)
    rows,cols, channel = img.shape# 平移矩阵M:[[1,0,x],[0,1,y]]
    M1 = np.float32([[1,0,400],[0,1,0]])    #M2 = np.float32([[1,0,-400],[0,1,0]])
    dest1 = cv2.warpAffine(img,M1,(cols,rows), borderValue=(255, 255, 255))#仿射平移
    #dest2 = cv2.warpAffine(img,M2,(cols,rows), borderValue=(255, 255, 255))
    
    cv2.imwrite('./dest1'+'/'+file,dest1)#保存图片
   # cv2.imwrite('./dest2'+'/'+file,dest2)
    # print('保存平移图片成功')
登录后复制
In [7]
#保存平移后的图片(背景)#filename_list = os.listdir('background_pic')#if os.path.exists('dest2'):#    shutil.rmtree('dest2')#os.mkdir('dest2')#for file in filename_list:#    tl('./background_pic'+'/'+file)#print("文件已创建")
登录后复制
In [8]
#保存平移后的图片(人像)filename_list = os.listdir('video_pic')if os.path.exists('dest1'):
    shutil.rmtree('dest1')
os.mkdir('dest1')for file in filename_list:
    tl('./video_pic'+'/'+file)print("文件已创建")
登录后复制
文件已创建
登录后复制

四,人物抠像

In [9]
#扣出平移后图片中的人像def seg_pic(path,savepath):
    i = 0
    module= hub.Module(name="deeplabv3p_xception65_humanseg")
    pic_path = path    if os.path.exists(savepath):
        shutil.rmtree(savepath)
    os.mkdir(savepath)
    
    filename_list = os.listdir(pic_path)
    filename_list.sort(key=lambda x: int(x[:-4]))#图片排序
    
    for fname in filename_list:
        result = module.segmentation(images=[cv2.imread(pic_path+'/'+fname)], visualization=True, output_dir=savepath,use_gpu=True)        #print('已处理处理',pic_path,'图片:', i)
        i+=1
    
    filename_list = os.listdir(savepath)
    filename_list.sort()
    i=0
    for file in filename_list:
        os.rename(savepath+'/'+file,savepath+'/'+str(i)+'.jpg')#(修改前目录名,修改后名)
        i+=1
    print('抠图完成')#左边原图路径,右边抠图输出路径seg_pic('dest1','res_dest1')#seg_pic('dest2','res_dest2')
登录后复制
Download https://bj.bcebos.com/paddlehub/paddlehub_dev/deeplabv3p_xception65_humanseg.tar.gz
[##################################################] 100.00%
Decompress /home/aistudio/.paddlehub/tmp/tmpg981rhya/deeplabv3p_xception65_humanseg.tar.gz
[##################################################] 100.00%
登录后复制
[2021-09-27 09:46:31,837] [    INFO] - Successfully installed deeplabv3p_xception65_humanseg-1.1.2
[2021-09-27 09:46:31,974] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
登录后复制
抠图完成
登录后复制

五,抠出的人像与原图合并

In [10]
#将扣出的人像与原图合并def blend_images(fore_path, base_path ,savepath):
    """
    将抠出的人物图像换背景
    fore_image: 前景图片,抠出的人物图片
    base_image: 背景图片
    """
    filename_list = os.listdir(fore_path)    for fname in filename_list:
        fore_image = fore_path + '/' + fname 
        base_image = base_path + '/' + fname    # 读入图片
        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(savepath + '/' + fname)

savepath = 'result_picture'if os.path.exists(savepath):
    shutil.rmtree(savepath)
os.mkdir(savepath) 
blend_images('res_dest1', 'background_pic', savepath)#删除多余文件以免混淆shutil.rmtree('dest1')#shutil.rmtree('dest2')shutil.rmtree('res_dest1')#shutil.rmtree('res_dest2')print("图片成功合成")
登录后复制
图片成功合成
登录后复制

六,视频合成+音乐

In [11]
#图片变视频加配乐def merge_to_mp4():
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    video= cv2.VideoCapture('./background.mp4')
    fps = video.get(cv2.CAP_PROP_FPS)
    img = Image.open('./result_picture/1.jpg')#需要整合成视频的图片路径
    out = cv2.VideoWriter('result.mp4', fourcc, fps, (img.size[0], img.size[1]))
    files = os.listdir('./result_picture')
    files.sort(key=lambda x: int(x[:-4]))    for i in files:
        img = cv2.imread('./result_picture/'+i)
        out.write(img)#保存帧
    out.release()    print('ok!')def add_audio():
    video_origin = VideoFileClip('xxm.mp4')
    audio=video_origin.audio
    video_result = VideoFileClip('./result.mp4')
    video_result = video_result.set_audio(audio)
    video_result.write_videofile('成品.mp4')    
    print('ok!')

merge_to_mp4()
add_audio()
登录后复制
ok!
Moviepy - Building video 成品.mp4.
MoviePy - Writing audio in 成品TEMP_MPY_wvf_snd.mp3
登录后复制
<br/>
登录后复制
MoviePy - Done.
Moviepy - Writing video 成品.mp4
登录后复制
<br/>
登录后复制
Moviepy - Done !
Moviepy - video ready 成品.mp4
ok!
登录后复制

以上就是数字文创:冰冰老婆带你去旅游---基于paddlehub的人像分割与视频合成的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号