cv_effnetv2_video-human-matting视频人像抠图
视频人像抠图(Video human matting)是计算机视觉的经典任务,输入一个视频(图像序列),得到对应视频中人像的alpha图,其中alpha与分割mask不同,mask将视频分为前景与背景,取值只有0和1,而alpha的取值范围是0到1之间,返回数值代表透明度。VHM模型处理1080P视频每帧计算量为10.6G,参数量只有6.3M。
模型介绍
该模型由四部分构成:backbone
、中间处理层
、decoder
和高分辨率处理层
;
其中backbone是基于efficientnetv2实现,为了实现更小的计算量和更好的效果,我们对原网络模块进行了一定修改后重新与unet结构进行人像分割任务训练,结果的backbone参数作为预训练载入; 中间处理层使用ASPP模块作为基本单元,多层空洞卷积扩大感受野; decoder部分将会逐步融合backbone各层特征,同时将原始图像特征作为一部分输入来引导网络学习,此外,我们将gru作为基础模块嵌入网络以便于处理时序相关信息; 高分辨率处理层基于DGF(Deep Guided Filter),实现对低分辨率后超分至原有分辨率,该层仍具有可学习参数,效果远优于直接上采样效果。
部署教程
如果您是初学者,对于命令行不太理解,那么请按下键盘上的Win键+R键
后,在弹出的新窗口内输入CMD并按下回车,打开CMD窗口,按顺序执行如下的每一条命令。
首先我们需要确认一个工作目录,用来存放cv_effnetv2_video-human-matting
的相关环境依赖文件。本站所选择的目录为D盘的根目录下openai.wiki
文件夹,完整路径为:D:\openai.wiki\cv_effnetv2_video-human-matting
。
检测D盘是否在openai.wiki目录下有没有cv_effnetv2_video-human-matting
文件夹,没有则创建该文件夹。
if not exist D:\openai.wiki\cv_effnetv2_video-human-matting mkdir D:\openai.wiki\cv_effnetv2_video-human-matting
强制切换工作路径为D盘的openai.wiki\cv_effnetv2_video-human-mattin
文件夹。
cd /d D:\openai.wiki\cv_effnetv2_video-human-matting
为不影响电脑中的现有环境,请一定要安装Conda,如果您不知道什么是Conda,或者未安装过Conda,请参考如下文章,安装部署Conda之后再继续以下步骤。
在CMD中执行下面的命令行,创建Conda虚拟环境至该项目的目录中,方便日后重装系统也能够正常使用,无需重新部署环境。
conda create -p D:\openai.wiki\cv_effnetv2_video-human-matting\ENV python=3.7
执行完成上面的命令之后,将会在CMD窗口中看到Proceed ([y]/n)?
提示,我们直接按下回车即可。
初始化Conda环境,避免后续可能报错。
conda init cmd.exe
激活已创建的Conda环境,这样我们可以将我们后续所需要的所有环境依赖都安装至此环境下。
conda activate D:\openai.wiki\cv_effnetv2_video-human-matting\ENV
执行如下命令,安装阿里达摩院相关依赖。
pip install modelscope
执行如下命令,安装torch
依赖。
pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple
执行如下命令,安装moviepy依赖库。
pip install moviepy
执行如下命令,安装CV2依赖库。
pip install opencv-python
使用教程
推荐下载VS Code代码编辑器,然后在代码编辑器器内新建一个Python文件,粘贴如下代码,在代码编辑器的右下角选择Python环境为D:\openai.wiki\cv_effnetv2_video-human-matting\ENV
。
遮罩输出
默认情况下,使用该方式将会仅输出视频的黑白遮罩,如果您会使用PhotoShop或After Effects等软件,那么您肯定会了解遮罩的作用是什么,您可以理解为这个遮罩层的白色为保留区域,黑色删除的部分。
该模型官方并未给了示例,本站已经帮您写好了相关的代码,复制粘贴即可使用。
注意:请自行修改视频名称(Video_Name)为自己的视频文件名称,然后再执行,否则会报错。
# 本代码由openai.wiki提供,转载请注明出处。 import cv2 from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks from modelscope.outputs import OutputKeys # 原视频路径 input_video = 'D:/openai.wiki/cv_effnetv2_video-human-matting/Video_Name.mp4' # Mask遮罩路径 maskoutput_video = 'D:/openai.wiki/cv_effnetv2_video-human-matting/video_name_mask.mp4' video_matting = pipeline(Tasks.video_human_matting, model='damo/cv_effnetv2_video-human-matting') result_status = video_matting({'video_input_path':input_video, 'output_path':maskoutput_video}) result = result_status[OutputKeys.MASKS]
抠图输出
执行如下代码,将会自动输出遮罩层,并将遮罩层自动叠加至原视频的颜色层,输出您想要的最终视频。
# 本代码由openai.wiki提供,转载请注明出处。 import cv2 from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks from modelscope.outputs import OutputKeys # 源视频路径 input_video = 'D:/openai.wiki/cv_effnetv2_video-human-matting/Video_Name.mp4' # Mask遮罩路径 maskoutput_video = 'D:/openai.wiki/cv_effnetv2_video-human-matting/video_name_mask.mp4' # 输出视频路径 output_video = 'D:/openai.wiki/cv_effnetv2_video-human-matting/video_name_final.mp4' video_matting = pipeline(Tasks.video_human_matting, model='damo/cv_effnetv2_video-human-matting') result_status = video_matting({'video_input_path':input_video, 'output_path':maskoutput_video}) result = result_status[OutputKeys.MASKS] # 读取原始视频和抠图的mask视频 cap = cv2.VideoCapture(input_video) mask_cap = cv2.VideoCapture(maskoutput_video) # 获取视频帧率和大小 fps = cap.get(cv2.CAP_PROP_FPS) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 创建新的视频文件写入器 fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter(output_video, fourcc, fps, (width, height)) while True: # 读取原始视频和抠图的mask视频的下一帧 ret, frame = cap.read() ret_mask, mask_frame = mask_cap.read() # 如果没有读取到帧则退出循环 if not ret or not ret_mask: break # 将抠图的mask视频转换为二进制掩码 gray_mask = cv2.cvtColor(mask_frame, cv2.COLOR_BGR2GRAY) ret, binary_mask = cv2.threshold(gray_mask, 10, 255, cv2.THRESH_BINARY) # 将原始视频的每一帧与二进制掩码进行按位与运算 result = cv2.bitwise_and(frame, frame, mask=binary_mask) # 将生成的每一帧写入到新的视频文件中 out.write(result) # 释放资源 cap.release() mask_cap.release() out.release()
评论 (0)