Modnet 人像抠图(论文复现)

news2024/11/25 10:57:54

Modnet 人像抠图(论文复现)

本文所涉及所有资源均在传知代码平台可获取

文章目录

    • Modnet 人像抠图(论文复现)
      • 论文概述
      • 论文方法
      • 复现
      • WebUI
      • 部署

论文概述

人像抠图(Portrait matting)旨在预测一个精确的 alpha 抠图,可以用于提取给定图像或视频中的人物。

MODNet 是一个轻量级的实时无 trimap 人像抠图模型, 与以往的方法相比,MODNet在单个阶段应用显式约束解决抠图子目标,并增加了两种新技术提高效率和鲁棒性。

MODNet 具有更快的运行速度,更准确的结果以及更好的泛化能力。简单来说,MODNet 是一个非常强的人像抠图模型。下面两幅图展示了它的抠图效果

在这里插入图片描述

论文方法

在这里插入图片描述

ModNet 基于三个基础模块构建:语义预测(semantic estimation),细节预测(detail prediction),语义-细节混合(semantic-detail fusion)。分别对应图中的左下(S)、上(D)、右下(F)三个模块。

语义预测主要作用于预测人像的整体轮廓,但是仅仅是一个粗略的前景 mask,用于低分辨率监督信号。细节预测用于区分前景与背景的过度区域,判断该区域内的点属于前景还是背景,可以预测边缘细节,用于高分辨率监测信号。两个相结合便可以实现整体的人像分离。

语义预测模块(S)中使用 channel-wise attention 的 SE-Block。监督信号为使用下采样及高斯模糊后的GT,损失函数采用L2-Loss。

细节预测模块(D)的输入由三部分组成,原始图像,S 的中间特征, S 的输出(语义分割图)。D 整体上是一个 Encoder-Decoder 结构,D的监督信号为

在这里插入图片描述

复现

官方并没有给出训练代码以及训练数据集,因此本文主要介绍推理的步骤。

项目的结构如下图

在这里插入图片描述

首先导入库并加载模型,工作目录为代码所在文件夹。

import gradio as gr
import os, sys
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision.transforms as transforms
from src.models.modnet import MODNet
import numpy as np
from PIL import Image

modnet = MODNet(backbone_pretrained=False)
modnet = nn.DataParallel(modnet)
ckpt_path = "./pretrained/modnet_photographic_portrait_matting.ckpt"
    
if torch.cuda.is_available():
        modnet = modnet.cuda()
        weights = torch.load(ckpt_path)
else:
    weights = torch.load(ckpt_path, map_location=torch.device('cpu'))
modnet.load_state_dict(weights)
modnet.eval()

ref_size = 512

之后加载图片并处理数据,此处加载名称为1的图片

在这里插入图片描述

image = '1.jpg'
im = Image.open(image)
im = 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_transform = transforms.Compose(
    [
        transforms.ToTensor(),
        transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
    ]
)

im = Image.fromarray(im)
im = im_transform(im)
im = im[None, :, :, :]
im_b, im_c, im_h, im_w = im.shape
if max(im_h, im_w) < ref_size or min(im_h, im_w) > ref_size:
    if im_w >= im_h:
        im_rh = ref_size
        im_rw = int(im_w / im_h * ref_size)
    elif im_w < im_h:
        im_rw = ref_size
        im_rh = int(im_h / im_w * ref_size)
    else:
        im_rh = im_h
        im_rw = im_w
im_rw = im_rw - im_rw % 32
im_rh = im_rh - im_rh % 32
im = F.interpolate(im, size=(im_rh, im_rw), mode='area')

得到可以处理的数据im后,投入模型进行推理。将得到的结果保存为名为 temp.png 的图片

_, _, matte = modnet(im.cuda() if torch.cuda.is_available() else im, True)
matte = F.interpolate(matte, size=(im_h, im_w), mode='area')
matte = matte[0][0].data.cpu().numpy()
matte_temp = './temp.png'

运行之后得到结果,可以看见模型很好的得到了人像

在这里插入图片描述

WebUI

在原项目的基础上,构建了一个 WebUI 方便大家进行操作,界面如下所示

在这里插入图片描述

拖拽你想抠图的人像到左侧的上传框中,点击提交,等待片刻即可在右侧得到对应的结果。此处使用 flickr 的图片进行演示

在这里插入图片描述

模型推导的 mask 会暂时保存在 temp 文件夹中,例如上面的图像得到的就是下图:

在这里插入图片描述

部署

运行 pip install -r requirements.txt 安装所需依赖,并确保你的环境中安装有 PyTorch。在文件夹中运行 python webui.py 即可启动网站,在浏览器中访问即可进入网页

文章代码资源点击附件获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2207766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宠物浮毛的危害有哪些?适合养宠家庭的宠物空气净化器推荐!

上周有位患者来医院&#xff0c;他说自从养猫以来&#xff0c;喉咙有毛的感觉日益明显&#xff0c;吐也吐不出来&#xff0c;鼻子里也觉得充斥着毛毛&#xff0c;半夜呼吸的时候也时常受阻&#xff0c;现在一直咳嗽鼻塞。让他拍了片子后发现猫毛吸入肺部导致了肺炎。作为一位呼…

如何用ChatGPT 8小时写出一篇完整论文(附完整提示词)

今天教大家如何利用ChatGPT完成一篇完整的论文。只需要一个标题&#xff0c;剩下全部由ChatGPT完成。总耗时8小时。 阅前提醒&#xff1a; 1.适用人群&#xff1a;这个方法适合应付简单的学术任务&#xff0c;比如日常小论文或投稿一般期刊。但如果你要写高水平的论文&#xf…

【磁盘清理】linux df -h 命令不更新磁盘大小解决方法

centos-root df -h不更新磁盘大小 [rootkafka1 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 238G 194G 44G 82% / devtmpfs 7.8G 0 7.8G 0% /dev tmpfs 7.8G 0 7.8G …

深度学习基础知识-01 数据操作

三维数组&#xff1a;通常用于表示单个图像&#xff0c;如&#xff08;高度&#xff0c;宽度&#xff0c;通道数&#xff09;。 四维数组&#xff1a;用于表示图像批次&#xff0c;如&#xff08;批次大小&#xff0c;高度&#xff0c;宽度&#xff0c;通道数&#xff09;。 五…

公开选拔!产业实践教授

产业实践教授&#xff0c;这一相对新兴的概念旨在通过产教融合方式促进高校与产业界的深度融合。 通常由来自产业界、拥有丰富实践经验的企业专家担任&#xff0c;承担特定教学任务和科研指导&#xff0c;或利用自身产业资源为学生提供实践机会和就业指导。 随着产教融合政策…

博睿数据Bonree ONE全面适配HarmonyOS NEXT,守护鸿蒙原生应用稳健前行

10月8日&#xff0c;华为官方正式宣布&#xff0c;华为HarmonyOS NEXT&#xff08;也被称作“纯血鸿蒙”&#xff09;系统开启公测&#xff0c;迎来国产系统里程碑一刻。作为IT运维监控和可观测性领域的领导者&#xff0c;博睿数据&#xff08;股票代码&#xff1a;688229&…

交叉熵损失 在PyTorch 中的计算过程

其实就是根据 真实值的结果&#xff0c;当成索引去取的值 import torch import torch.nn as nnaaaa torch.tensor([[2.0,1.0,3.0],[2.0,4.0,2.0]])l1 nn.LogSoftmax(dim-1) result l1(aaaa) print(result) import torch import torch.nn as nn# 定义交叉熵损失函数 criterio…

电影《荒野机器人》观后感

上上周看了电影《荒野机器人》&#xff0c;电影整体是比较偏向温馨的&#xff0c;通过动物与机器人视角&#xff0c;展现人类为情感。 &#xff08;1&#xff09;承载-托举-学习-感情 在电影中&#xff0c;有个场景让自己感觉特别温馨&#xff0c;就是机器人为了让大雁宝宝学习…

盛⽔最多的容器 04

盛⽔最多的容器 算法思想&#xff1a;对撞指针&#xff1a; 我写的代码&#xff1a; class Solution {public int maxArea(int[] height) {int left0;int rightheight.length-1;int minHight-1;//防止[2,0]这种特殊情况int maxV0;while(left<right) {if(height[left]>…

【hot100-java】随机链表的复制

链表篇 /* // Definition for a Node. class Node {int val;Node next;Node random;public Node(int val) {this.val val;this.next null;this.random null;} } */class Solution {public Node copyRandomList(Node head) {if(headnull){return null;}java.util.Map<Node…

三品PLM系统赋能中小企业实现数字化转型迈向管理智能化

在全球化的浪潮中&#xff0c;发达国家的企业在管理体系上更具优势&#xff0c;常采用先进的PLM体系提升运营和战略规划效率。相较之下&#xff0c;国内中小企业在PLM系统的应用上明显滞后&#xff0c;中高层管理人员普遍缺乏相应的认知与实践经验&#xff0c;这限制了企业的创…

面向车辆路线问题的泛化神经方法

文章目录 Abstract1 Introduction2 相关工作3 PreliminariesAbstract 学习车辆路径问题(VRPs)的启发式方法由于减少了对手工制定规则的依赖而受到了广泛关注。然而,现有的方法通常在具有固定大小和节点分布的同一任务上进行训练和测试,因此在泛化性能上受到限制。本文研究…

权威骨传导耳机测评分享!2024骨传导耳机推荐榜单大盘点!

骨传导耳机的概念就是针对传统入耳式的不足创新出来的。配戴方式一般为夹耳式和挂耳式&#xff0c;配戴舒适性极高&#xff0c;不堵耳&#xff0c;不涨耳&#xff0c;不伤耳且稳固性非常好。特别适合运动健身&#xff0c;办公通勤等需要长久配戴的场景。 作为一个运动爱好者&a…

携手申威合力筑牢数字之基!麒麟信安参加申威产品发布暨申威产业发展联盟大会

9月20日&#xff0c;申威产品发布暨申威产业发展联盟大会在无锡成功召开&#xff0c;会上&#xff0c;申威新一代服务器处理器威鑫H8000及配套芯片、基础软件等新品集中首发&#xff0c;麒麟信安作为申威产业发展联盟成员单位&#xff0c;与院士专家、政府领导、科研院校、联盟…

125页满分PPT | 数据架构革新顶层规划方案

数据架构的重要性 数据架构规划是确保企业数据战略成功实施的基础。它不仅涉及数据的组织和管理&#xff0c;还关系到数据的价值实现。良好的数据架构规划可以帮助企业实现数据标准化、提高数据质量、保障数据安全&#xff0c;并最终推动业务创新和提升客户服务水平。本文重点展…

【C++篇】继承之韵:解构编程奥义,感悟面向对象的至高法则

文章目录 C 继承详解&#xff1a;初阶理解与实战应用前言第一章&#xff1a;继承的基本概念与定义1.1 继承的概念1.2 继承的定义 第二章&#xff1a;继承中的访问权限2.1 基类成员在派生类中的访问权限2.2 基类与派生类对象的赋值转换2.2.1 派生类对象赋值给基类对象2.2.2 基类…

Spark练习-RDD创建,读取hdfs上的数据,指定rdd分区

目录 RDD的创建 读取HDFS上文件数据 RDD分区指定 RDD的创建 将python数据转为rdd # 将Python数据转为rdd data [1,2,3,4] res sum(data) # 使用python的方法计算时&#xff0c;采用的单机资源计算&#xff0c;如果数据量较大时&#xff0c;可以将python数据转为spark的r…

QD1-P2 HTML 编辑器:HBuilderX

本节学习&#xff1a; HTML课程内容介绍HBuilderX编辑器的使用 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p2 HTML 内容 基础语法 标签整体架构DOCTYPE 常用标签 标题和水平线段落和换行列表div 和 span格式化标签图片超链接标签表格表单字符实体 编辑器 HBuilder…

C/C++逆向:函数逆向分析-总体流程(整型指针)

函数的初始化 在逆向工程中&#xff0c;函数的初始化操作是函数在开始执行时&#xff0c;为正确运行而进行的准备工作。通常&#xff0c;这些操作发生在函数的序言&#xff08;Prologue&#xff09;阶段&#xff0c;具体的内容和顺序会因编译器、调用约定和目标平台&#xff0…

【AIGC】ChatGPT提示词Prompt高效编写模式:思维链、Self-Consistency CoT与Zero-Shot CoT

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;思维链 (Chain of Thought, CoT)如何工作应用实例优势结论 &#x1f4af;一致性思维链 (Self-Consistency CoT)如何工作应用实例优势结论 &#x1f4af;零样本思维链 (Ze…