引用来源
@article{MODNet,
author = {Zhanghan Ke and Kaican Li and Yurou Zhou and Qiuhua Wu and Xiangyu Mao and Qiong Yan and Rynson W.H. Lau},
title = {Is a Green Screen Really Necessary for Real-Time Portrait Matting?},
journal={ArXiv},
volume={abs/2011.11961},
year = {2020},
}

利用神经网络实现图片抠像,虽然比不上PS高手精细的抠像成果,但实现自动抠像还是蛮不错滴。本文介绍MODNet抠像。

克隆MODNet到本地目录 MODNet

git clone https://github.com/ZHKKKe/MODNet

requirements.txt包括如下:
numpy
gdown
opencv-python
pillow
torch == 1.1.0
torchvision == 0.3.0

安装运行所需的环境

pip install -r requirements.txt

预训练模型在这里 :
modnet_photographic_portrait_matting.ckpt

模型百度网盘:在这里

密码:gchf

把模型下载到目录:MODNet/pretrained,下面运行需要加载此模型。
现在,工作目录是MODNet,在其目录下建立输入图片和输出图片的目录:
input-img, output-img
把需要抠图的图片放到input-img
MODNet目录下,运行

python -m demo.image_matting.colab.inference-1   \--input-path input-img  \--output-path output-img  \--ckpt-path pretrained/modnet_photographic_portrait_matting.ckpt

现在可以从output-img中找到已经抠好的图片xxx_fg.png,遮罩图片xxx_matte.png
看看MODNet模型的抠图效果






python程序如下。原作者的程序中只给出遮罩matte,没有抠图结果。鄙人不才,添加了抠出的前景图片,供参考。

import os
import sys
import argparse
import numpy as np
from PIL import Image
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision.transforms as transforms
from src.models.modnet import MODNetif __name__ == '__main__':# define cmd argumentsparser = argparse.ArgumentParser()parser.add_argument('--input-path', type=str, help='path of input images')parser.add_argument('--output-path', type=str, help='path of output images')parser.add_argument('--ckpt-path', type=str, help='path of pre-trained MODNet')args = parser.parse_args()# check input argumentsif not os.path.exists(args.input_path):print('Cannot find input path: {0}'.format(args.input_path))exit()if not os.path.exists(args.output_path):print('Cannot find output path: {0}'.format(args.output_path))exit()if not os.path.exists(args.ckpt_path):print('Cannot find ckpt path: {0}'.format(args.ckpt_path))exit()# define hyper-parametersref_size = 512# define image to tensor transformim_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])# create MODNet and load the pre-trained ckptmodnet = MODNet(backbone_pretrained=False)modnet = nn.DataParallel(modnet).cuda()modnet.load_state_dict(torch.load(args.ckpt_path))modnet.eval()
# 注:程序中的数字仅表示某张输入图片尺寸,如1080x1440,此处只为记住其转换过程。# inference imagesim_names = os.listdir(args.input_path)for im_name in im_names:print('Process image: {0}'.format(im_name))# read imageim = Image.open(os.path.join(args.input_path, im_name))# unify image channels to 3im = np.asarray(im)if len(im.shape) == 2:im = im[:, :, None]if im.shape[2] == 1:im = np.repeat(im, 3, axis=2)elif im.shape[2] == 4:im = im[:, :, 0:3]im_org = im                                # 保存numpy原始数组 (1080,1440,3)# convert image to PyTorch tensorim = Image.fromarray(im)im = im_transform(im)# add mini-batch dimim = im[None, :, :, :]# resize image for inputim_b, im_c, im_h, im_w = im.shapeif max(im_h, im_w) < ref_size or min(im_h, im_w) > ref_size:if im_w >= im_h:im_rh = ref_sizeim_rw = int(im_w / im_h * ref_size)elif im_w < im_h:im_rw = ref_sizeim_rh = int(im_h / im_w * ref_size)else:im_rh = im_him_rw = im_wim_rw = im_rw - im_rw % 32im_rh = im_rh - im_rh % 32im = F.interpolate(im, size=(im_rh, im_rw), mode='area')# inference_, _, matte = modnet(im.cuda(), True)    # 从模型获得的 matte ([1,1,512, 672])# resize and save matte,foreground picturematte = F.interpolate(matte, size=(im_h, im_w), mode='area')  #内插,扩展到([1,1,1080,1440])  范围[0,1]matte = matte[0][0].data.cpu().numpy()    # torch 张量转换成numpy (1080, 1440)matte_name = im_name.split('.')[0] + '_matte.png'Image.fromarray(((matte * 255).astype('uint8')), mode='L').save(os.path.join(args.output_path, matte_name))matte_org = np.repeat(np.asarray(matte)[:, :, None], 3, axis=2)   # 扩展到 (1080, 1440, 3) 以便和im_org计算foreground = im_org * matte_org + np.full(im_org.shape, 255) * (1 - matte_org)         # 计算前景,获得抠像fg_name = im_name.split('.')[0] + '_fg.png'Image.fromarray(((foreground).astype('uint8')), mode='RGB').save(os.path.join(args.output_path, fg_name))

MODNet 图片抠像相关推荐

  1. android手机视频编辑,美册视频编辑剪辑制作

    美册视频编辑剪辑制作是一款非常靠谱的手机视频编辑软件,这款软件内含各种强大的功能,可以随意的挑选使用,美册视频编辑剪辑制作操作简单,只需要简单的上传素材就可以直接编辑生成视频,对美册视频编辑剪辑制作感 ...

  2. 蓝松视频编辑更新至4.5.2,更新内容

    蓝松视频编辑SDK 更新至4.5.2 绿幕直播: 增加美颜, 可瘦脸,大眼,小脸,长鼻等功能. 增加蓝牙键盘的遥控操作, 定义了15个快捷键,并可自定义扩展; 增加挂件(前景图), 前景图最大可增加4 ...

  3. 文本转语音有哪些好用的软件?给你推荐这几款转语音神器

    现在电子设备渗透到我们生活的每一个角落,我们去哪里都离不开手机,就连上课.看书都要用手机或者电脑来完成,这也导致我们现在很多人都近视了.我之前也是看电子屏幕看到眼睛发酸,甚至想流泪,但是资料又必须看完 ...

  4. ffmpeg php 抠像_PHP中使用ffmpeg截取视频图片笔记

    网上很多介绍的文章乱七八糟,说什么装扩展,还得编译... 等等都是些垃圾. 实现截取视频的封面图片简单的很,只需要3步: 1. 安装ffmpeg软件(什么系统都有对应的安装包),2.PHP中compo ...

  5. 带你「周游世界」的 MODNet 算法

    来源 | Jack Cui 责编 | 晋兆雨 头图 | CSDN下载自视觉中国 最近又有一个算法火了,不知道你们看到没?直接看效果! 效果这么稳定的人像 Image Matting 算法真的不多,并且 ...

  6. 《Photoshop修饰与合成专业技法》—第1章利用图层样式改进抠像

    本节书摘来自异步社区<Photoshop修饰与合成专业技法>一书中的第1章利用图层样式改进抠像,作者[英]Glyn Dewis(格林·杜伊斯),更多章节内容可以访问云栖社区"异步 ...

  7. python使用opencv会蓝屏_Opencv和DirectShow一起做蓝屏抠像

    Wikipedia,自由的百科全书 实时视频抠像 关键词: 抠像 色键 蓝屏 绿屏 实时抠像 合成 blue screen chromakey matte 背景介绍 一块绿屏或者蓝屏,一台普通的PC, ...

  8. 纯前端实现人体抠图背景融合-调用Face++抠像接口API实现人像抠图

    背景 H5项目需求,用户上传半身照,程序抠出人像,跟指定背景融合成一张海报. 解决方法 目前市面上只查到face++有这种 抠图接口. 调用URL: https://api-cn.facepluspl ...

  9. FFMPEG批量绿幕色度抠像BAT脚本实现

    平时拍抖音短视频和西瓜长视频需要用到绿幕抠像,除了PR和AE有没有批量抠像的简便方法?有的!用FFMPEG就可以! FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GP ...

最新文章

  1. 【数据结构】最小生成树 Prim算法 Kruskal算法
  2. mke2fs和mkfs命令使用
  3. servlet web.xml学习笔记
  4. Airflow的SimpleHttpOperator不支持https问题解决
  5. centos7安装DHCP服务器
  6. Multiple commands produce xxxxxxxxxx app/Info.plist':
  7. 用UIWebView加载本地图片和gif图
  8. Phase2 Day10 Tree3Set
  9. idea 之Java文件图标为红色解决办法
  10. 谈谈网络协议,常见的网络协议有那些?
  11. 基于winrm实现远程操作win
  12. steam饥荒存档备份_如何手动备份您的Steam游戏文件
  13. mac pro 系统升级带来的问题
  14. 嵌入式设备和固件中的自动漏洞检测(二):动态分析与符号执行技术
  15. angular数据绑定
  16. Rosalind Java|Longest Increasing Subsequence动态规划算法
  17. 达梦客户端工具的使用
  18. 2016/10/30 宝贝蛋,我好想你。
  19. [N1盒子] armbian 安装docker +portainer面板以及汉化教程
  20. 源代码和目标代码之间的区别

热门文章

  1. 可怜的不懂日文的孩子们啊...机翻大神正在拯救世界
  2. 美亚柏科JAVA实习面试题
  3. 将本地时间转换为UnixTimestamp(日期扩展类)
  4. 【Android 源码学习】Zygote启动原理
  5. 性格与中医养生7--平和体质
  6. SSM框架整合—详细整合教程(Spring+SpringMVC+MyBatis)
  7. 计算机设备和打印机打不开,教你win7电脑中的设备和打印机无法打开怎么办
  8. Eclipse配置SSM框架(非maven模式)
  9. Java 访问Hbase数据库
  10. qinglong-青龙面板部署