目录

前言

开源项目介绍

项目结构

模型下载

测试数据下载

训练数据下载

依赖下载

测试图片的抠图效果

测试视频的抠图效果

总结


前言

本文主要介绍一个神奇有意思的开源项目: BackgroundMattingV2

该项目可以将照片或者视频中人的背景扣掉,变成带alpha通道的图片。怎么样?可以设想一下有什么其他用法,可以给个思路,如果可以拿到抠出背景后的图片,可以贴在任意背景上,不就可以任意替换照片人物的背景了吗?还挺有意思哦。

该项目的训练部分,我会简述。

开源项目介绍

我们进入项目GitHub页面,在README部分,我们可以看到作者给出的一些效果。还是很不错的。

项目对照片与视频的效果不太一样。

1)照片是通过原始照片与原始照片的背景图,两张图,抠出带透明通道的png。

2)视频是通过原始视频与背景图,抠出纯绿色背景的人物视频。

项目给出的素材下载的地址很全。我下面按照项目验证效果的顺序,来把项目跑起来。

项目结构

Pycharm把Github地址项目clone下来。

颜色不一致的是我自己添加的代码,可忽略。

我们看到作者提供了现成的inference,可以直接去使用。

模型下载

模型下载地址项目README给出了:模型地址

选择pytorch里面pytorch_resnet50.pth,另一个也可以,看心情。

测试数据下载

我们下载一些测试数据:测试数据

选择一些图片、视频以及对应的背景图,下载下来做测试使用。

训练数据下载

这部分数据看你的需要,如果直接使用作者提供的模型可以忽略这部分。地址:dataset地址

数据还是

依赖下载

项目中的requirements.txt提供了项目所需要的依赖。如下:

kornia==0.4.1
tensorboard==2.3.0
torch==1.7.0
torchvision==0.8.1
tqdm==4.51.0
opencv-python==4.4.0.44
onnxruntime==1.6.0

需要注意一下,本机电脑的NVIDIA显卡驱动是否安装正确。具体可以参考我的另一篇文章,里面有介绍:Pycharm代码docker容器运行调试 | 机器学习系列_阿良的博客-CSDN博客介绍常规的本地化运行机器学习代码,安装Anaconda+cuda显卡驱动支持,许多文章都有介绍,不在此多做赘述了。本文主要是为了解决在工作环境中,本机电脑没有显卡,需要将程序运行在带显卡的远程服务器上。本文会介绍如何部署使用显卡的docker容器、如何使用pycharm连接docker容器运行机器学习代码。版本Pycharm: 2020.1.3docker:19.03.12python: 3.6.13demo算法: BackgroundMattingV2部署下面我会按照.https://huyi-aliang.blog.csdn.net/article/details/120556923

测试图片的抠图效果

先观察一下作者给的inferance_images.py,需要那些参数:

parser = argparse.ArgumentParser(description='Inference images')parser.add_argument('--model-type', type=str, required=True, choices=['mattingbase', 'mattingrefine'])
parser.add_argument('--model-backbone', type=str, required=True, choices=['resnet101', 'resnet50', 'mobilenetv2'])
parser.add_argument('--model-backbone-scale', type=float, default=0.25)
parser.add_argument('--model-checkpoint', type=str, required=True)
parser.add_argument('--model-refine-mode', type=str, default='sampling', choices=['full', 'sampling', 'thresholding'])
parser.add_argument('--model-refine-sample-pixels', type=int, default=80_000)
parser.add_argument('--model-refine-threshold', type=float, default=0.7)
parser.add_argument('--model-refine-kernel-size', type=int, default=3)parser.add_argument('--images-src', type=str, required=True)
parser.add_argument('--images-bgr', type=str, required=True)parser.add_argument('--device', type=str, choices=['cpu', 'cuda'], default='cuda')
parser.add_argument('--num-workers', type=int, default=0, help='number of worker threads used in DataLoader. Note that Windows need to use single thread (0).')
parser.add_argument('--preprocess-alignment', action='store_true')parser.add_argument('--output-dir', type=str, required=True)
parser.add_argument('--output-types', type=str, required=True, nargs='+', choices=['com', 'pha', 'fgr', 'err', 'ref'])
parser.add_argument('-y', action='store_true')args = parser.parse_args()

主要看一下required为True的参数,都属于必填参数。为了比较直观的看到参数的使用,我们不采用直接命令执行的方式。我们通过subprocess调用命令,代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/13 22:43
# @Author  : 至尊宝
# @Site    :
# @File    : main1.py
import subprocesscmd = 'python inference_images.py \--model-type mattingrefine \--model-backbone resnet50 \--model-backbone-scale 0.25 \--model-refine-mode sampling \--model-refine-sample-pixels 80000 \--model-checkpoint "content/pytorch_resnet50.pth" \--images-src "content/img/" \--images-bgr "content/bgr/" \--output-dir "content/output/" \--output-type com'
print(cmd)
child = subprocess.Popen(cmd, shell=True)
child.wait()

命令说明

1、我们下载的模型是pytorch_resnet50.pth,所以model-backbone选择resnet50。

2、注意图片抠图的images-src与images-bgr为图片目录,其中根据文件名产生对应关系。

3、output-types的类型可以支持'com', 'pha', 'fgr', 'err', 'ref',我们就取com,最终输出的带alpha通道的图片。

执行看看效果

效果很不错,头发也比较清楚的抠出来了。

测试视频的抠图效果

观察一下作者给出的inferance_video.py给出的参数。

parser = argparse.ArgumentParser(description='Inference video')parser.add_argument('--model-type', type=str, required=True, choices=['mattingbase', 'mattingrefine'])
parser.add_argument('--model-backbone', type=str, required=True, choices=['resnet101', 'resnet50', 'mobilenetv2'])
parser.add_argument('--model-backbone-scale', type=float, default=0.25)
parser.add_argument('--model-checkpoint', type=str, required=True)
parser.add_argument('--model-refine-mode', type=str, default='sampling', choices=['full', 'sampling', 'thresholding'])
parser.add_argument('--model-refine-sample-pixels', type=int, default=80_000)
parser.add_argument('--model-refine-threshold', type=float, default=0.7)
parser.add_argument('--model-refine-kernel-size', type=int, default=3)parser.add_argument('--video-src', type=str, required=True)
parser.add_argument('--video-bgr', type=str, required=True)
parser.add_argument('--video-target-bgr', type=str, default=None, help="Path to video onto which to composite the output (default to flat green)")
parser.add_argument('--video-resize', type=int, default=None, nargs=2)parser.add_argument('--device', type=str, choices=['cpu', 'cuda'], default='cuda')
parser.add_argument('--preprocess-alignment', action='store_true')parser.add_argument('--output-dir', type=str, required=True)
parser.add_argument('--output-types', type=str, required=True, nargs='+', choices=['com', 'pha', 'fgr', 'err', 'ref'])
parser.add_argument('--output-format', type=str, default='video', choices=['video', 'image_sequences'])args = parser.parse_args()

我们通过subprocess调用命令,代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/14 0:28
# @Author  : 至尊宝
# @Site    :
# @File    : main2.py
import subprocesscmd = 'python inference_video.py \--model-type mattingrefine \--model-backbone resnet50 \--model-backbone-scale 0.25 \--model-refine-mode sampling \--model-refine-sample-pixels 80000 \--model-checkpoint "content/pytorch_resnet50.pth" \--video-src "content/video/b8.mp4" \--video-bgr "content/video/b8.png" \--output-dir "content/output1/" \--output-type com'
print(cmd)
child = subprocess.Popen(cmd, shell=True)
child.wait()

参数说明

1、基本和图片处理的参数差不多,只是换了两个参数video-src与video-bgr。

2、准备好视频和背景图。

验证一下效果

效果还不错,头发还是可以看出来的。

总结

这个开源项目还是很优越的,之后我会把这个项目改造改造,变成可以直接用的工具。

说说项目缺点,都是小缺点。

1、图片的处理需要使用目录所谓参数,而不是一张图,如果需要对单一张图处理的话,仍然需要使用文件夹存储图片,有点麻烦。

2、每次都会询问是否需要创建output-dir,看一下代码中的逻辑:

# Create output directory
if os.path.exists(args.output_dir):if args.y or input(f'Directory {args.output_dir} already exists. Override? [Y/N]: ').lower() == 'y':shutil.rmtree(args.output_dir)else:exit()

总的来说,该模型的抠图效果还是很不错的,只是需要我们二次创作。

分享:

白马非马不算境界,白马是鹿才是境界。——《雪中悍刀行》

如果本文对你有用的话,请不要吝啬你的赞,谢谢!

如何将照片或者视频中的背景图抠掉,机器学习开源项目使用 | 机器学习相关推荐

  1. 如何将模糊照片人脸恢复清晰,GFPGAN机器学习开源项目使用 | 机器学习

    目录 前言 环境安装 验证模型 总结 前言 最近看到一个有意思的机器学习项目--GFPGAN,他可以将模糊的人脸照片恢复清晰.开源项目的Github地址:https://github.com/Tenc ...

  2. 微信动态中的背景图更换

    初衷: 图一中的红框中的部分,作为用户自定义的背景图,如果用户没有上传也会为其自动设置一张背景图,当用户点击时则会出现图二中的选项 ,点击取消则选项消失,点击从相册选择则会跳转本机的相册,选择照片后会 ...

  3. php背景图添加字,怎样给视频后面加背景图 视频加背景图片并添加一行广告文字...

    有不少广告小视频中,视频画面是一张海报背景图片,图片上显示一个小视频播放,并且在画面上还有显示一行广告字幕.这样的宣传视频制作其实蛮简单的,怎样给视频后面加背景图片的方法倒是挺多,要给视频加背景图片的 ...

  4. 如何在eclipse制作的APP中添加背景图

    如何在eclipse制作的APP中添加背景图 1.首先把图片拉入drawable-hdpi中,a1.jpg(注:图片名不可为中文) 2.在.xml文件中加入android:background=&qu ...

  5. vue中动态绑定背景图, 图片水平垂直居中

    vue中动态绑定背景图,并且使宽高不等的图片水平垂直居中 外层父元素固定宽高,让图片垂直居中的方法 <div style="width:200px;height:200px;" ...

  6. 怎么把视频中动态的人物P掉,把视频中不要的人物去掉

    怎么把视频中动态的人物P掉?很多小伙伴试过ps抠图,但是你试过视频人物抠图吗?其实道理是一样的,但是操作过程却变难了.今天就给大家带来一个简单的方法,轻松去除视频中的人物.不影响整个画面的呈现. 在拍 ...

  7. Android项目中最火最常用的优秀开源项目(很有用)

    Android项目中最火最常用的优秀开源项目 分类 详细 框架名称 简介 Star 数 最近 更新 UI 刷新 SmartRefreshLayout Android 智能下拉刷新框架 7.7k 1天 ...

  8. 如何去除视频中的背景?

    我们生活在一个图像的时代!随着网络带宽的不断提升,尤其是即将到来的5G时代,我们交流.传播和表达内容的载体也在不断进化,视频已经成为越来越普遍的表达形式.很多网络平台都有非常火的短视频内容.视频和传统 ...

  9. 针对无人机航拍视频中动态背景下的目标检测

    目录 目录 传统目标检测技术 传统目标检测技术 1. 帧间差分 通过连续两帧相同位置像素点间的灰度差来确定目标移动.但只适用于静态背景和目标单一条件的目标检测.仅适用于无人机悬停状态下的目标检测. 2 ...

最新文章

  1. 【转】使用Javascript改变HTML内容
  2. Map获取键值,Map的几种遍历方法
  3. 患上乳腺癌后开发AI诊断模型,这位MIT女科学家获得AAAI首届百万美元最高奖
  4. HRBUST 1909——理工门外的树——————【离线处理,差分前缀和】
  5. Vim进阶2 map映射
  6. 2天后mysql_mysql 学习笔记 第二天
  7. Linux工作笔记024---Centos7 下查看本机公网IP
  8. 【岗位详情】腾讯广告后台开发工程师(北京)
  9. linux netperf的安装
  10. 台式电脑计算机怎么添加任务栏,win10系统任务栏添加计算机快捷图标的详细技巧...
  11. html列自动变高,HTML_CSS三行三列DIV高度自适应的设置,用脚本控制三行三列div高度自 - phpStudy...
  12. 【ICLR 2018】模型集成的TRPO算法【附代码】
  13. 跳过授权列表--skip-grant-list--案例
  14. 两年,关于我的四台3D打印机
  15. redhat 7.4系统安装英伟达独立显卡驱动步骤
  16. Spring Boot实训开发个人博客4
  17. 超算入门笔记:大型机上如何运行WRF模式?一文总结(并行运算、Linux基础、作业调度、WRF运行)
  18. PO,VO,DAO,BO,POJO之间的区别与解释
  19. 稳压二极管、肖特基二极管、ESD静电保护二极管、TVS瞬态抑制保护管
  20. 计算机安装重装出现错误,电脑重装系统老是失败要怎么办?我教你几个方法,一定能装上去!...

热门文章

  1. 3dMax 推拉(假山与水池)
  2. C#文件流转Base64
  3. unsqueeze()函数
  4. css 最后一行文字对齐,如何在CSS中居中对齐最后一行文本?
  5. 《教我兄弟学Android逆向07 IDAPro破解第一个so》
  6. Scrapy 2.6 Exceptions 异常处理使用指南
  7. C语言学习——八进制和十六进制的前缀
  8. 世界杯观赛神器,Z世代消费者首选海信电视
  9. 深入浅出解释旋转变换矩阵
  10. UG编程数控加工中心的各种切削方法