【传知代码】Modnet 人像抠图-论文复现

文章目录

  • 概述
  • 原理介绍
  • 核心逻辑
    • ModNet 的结构
  • 环境配置
    • WebUI
  • 小结

论文地址
论文GitHub

本文涉及的源码可从Modnet 人像抠图该文章下方附件获取

概述

人像抠图技术在多个领域有着广泛的应用场景,包括但不限于:

  1. 展馆互动拍照:展馆中使用的抠像拍照系统能够吸引用户,扩大展馆的知名度。用户可以通过抠像拍照软件体验丰富的拍照效果,从而愿意走进展馆。
  2. 商场引流:商场中的人流量较大,使用抠像拍照系统可以吸引更多顾客前来打卡拍照,聚集人气,引发潮流现象。
  3. 展会展示:展会中使用抠像拍照系统,不仅能给参观者留下回忆,还能展示上次展会使用抠像拍照软件所拍的照片,增加用户对参展商的好感。
  4. 图像编辑:在图像编辑软件中,人像抠图是常用操作之一。通过抠图可以将人物从原背景中分离出来,放到新背景中,实现人物换背景的效果。这在电影后期特效、游戏角色置换等领域有很广泛的应用。
  5. 商业广告:广告制作公司通常需要从各种原始图像中抠出人物,用于广告海报、网站设计、产品宣传等。使用AI人像分割技术,可以减少制作时间,提高制作效率,更加快速准确地实现广告设计。
  6. 数码相册:AI人像分割人像抠图技术可以帮助数码相册用户抠出自己照片中的人物,使得相册的美观程度得到大幅提升。
  7. 视频制作:在视频制作中,使用AI人像分割技术可以轻松地将视频中的人物与背景分离,提高视频制作的效率和品质。
  8. 电商行业:AI抠图技术可以快速地抠出商品图片,帮助商家实现更好的商品展示效果,提高销售量。同时,也可以帮助商家更快速地制作广告、海报等宣传素材。

随着技术的不断进步和应用场景的不断扩展,人像抠图技术将在更多领域发挥重要作用。

原理介绍

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

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

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

在这里插入图片描述

核心逻辑

ModNet 的结构

在这里插入图片描述

ModNet 基于三个基础模块构建:

  • 语义预测(semantic estimation),
  • 细节预测(detail prediction),
  • 语义-细节混合(semantic-detail fusion)。

分别对应图中的左下(S)、上(D)、右下(F)三个模块。

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

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

在这里插入图片描述

MODNet 中使用 SOC 作为自监督学习策略。在不输入 trimap 的前提下,三个模块之间存在不一致性,所以需要保持三者的一致从而得到一个较好的结果。其具体策略为:

  1. F 模块与 D 模块在 unknown 区域的取值一致
  2. F 模块与 S 模块在确定前景与背景区域的取值一致

环境配置

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

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

项目的结构如下图

在这里插入图片描述

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

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 Imagemodnet = 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_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_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 文件夹中,例如上面的图像得到的就是下图:

在这里插入图片描述

小结

在深度学习中,人像抠图通常使用全卷积网络(FCN)或类似U-Net的编解码器架构来实现。这些网络模型通过训练学习如何区分图像中的人像和背景,并生成一个掩码(mask),该掩码标识了人像的像素位置。

实现高质量的人像抠图:

  1. 选择适当的模型架构:你可以考虑使用U-Net、DeepLab、Mask R-CNN等流行的语义分割模型作为基础。这些模型已经在多个数据集上证明了其有效性。
  2. 收集并标注数据集:为了训练你的模型,你需要一个包含人像和背景标注的图像数据集。你可以使用开源数据集,如PASCAL VOC、COCO或自定义数据集。确保数据集足够大且多样化,以涵盖不同场景下的人像。
  3. 数据增强:为了提高模型的泛化能力,你可以应用各种数据增强技术,如旋转、缩放、裁剪、翻转和颜色变换等。
  4. 损失函数:选择适当的损失函数对于训练高质量的抠图模型至关重要。常用的损失函数包括交叉熵损失、Dice损失、Focal损失等。你可以根据你的任务需求和数据集特点选择合适的损失函数或组合使用。
  5. 优化器和学习率调度:选择合适的优化器(如Adam、SGD等)和学习率调度策略(如固定学习率、阶梯学习率衰减等)对于模型的训练过程至关重要。确保你的模型能够稳定地收敛并达到最佳性能。
  6. 后处理:在生成最终的人像抠图结果之前,你可以应用一些后处理技术来改进结果。例如,你可以使用形态学操作(如膨胀、腐蚀)来平滑掩码的边界,或者使用条件随机场(CRF)等模型来进一步优化掩码的质量。
  7. 评估与调整:在训练过程中和训练结束后,使用适当的评估指标(如像素准确率、IoU等)来评估你的模型性能。根据评估结果调整模型的超参数或架构以提高性能。

人像抠图是一个具有挑战性的任务,特别是在处理复杂背景和遮挡情况时。因此,你可能需要多次迭代和调整你的模型以达到最佳性能。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KMP算法【C++】

KMP算法测试 KMP 算法详解 根据解释写出对应的C代码进行测试&#xff0c;也可以再整理成一个函数 #include <iostream> #include <vector>class KMP { private:std::string m_pat;//被匹配的字符串std::vector<std::vector<int>> m_dp;//状态二维数组…

线程---多线程--互斥--条件变量--生产消费模型

概念 线程是进程内部的执行分支&#xff0c;是CUP调度的基本单位 进程内核数据结构进程代码和数据 线程的理解&#xff1a; 产生的原因&#xff1a; 我们的代码在进程中是串行运行的&#xff0c;如果我们想要使他并行运行&#xff0c;分别完成不同的任务。之前的做法的创建子…

深入解析kube-scheduler的算法自定义插件

目录 ​编辑 一、问题引入 二、自定义步骤 三、最佳实践考虑 一、问题引入 当涉及到 Kubernetes 集群的调度和资源分配时&#xff0c;kube-scheduler 是一个关键组件。kube-scheduler 负责根据集群的调度策略&#xff0c;将 Pod 分配到适当的节点上。kube-scheduler 默认使…

cn.hutool.poi.excel 实现excel导出效果 首行高度,行样式,颜色,合并单元格,例子样式

需求 接了需求&#xff0c;下载excel模版&#xff0c;本来看着还是简单的&#xff0c;然后实现起来一把泪&#xff0c;首先是使用poi&#xff0c;我查了好久&#xff0c;才实现&#xff0c;然后是我用easyexcel又实现了一遍&#xff0c;用了一个周多才实现。 这是需求&#x…

web前端学习笔记11

11. CSS3高级特效 11.1 CSS3变形 CSS3变形是一些效果的集合, 如平移、旋转、缩放、倾斜效果 每个效果都可以称为变形(transform),它们可以分别操控元素发生平移、旋转、缩放、倾斜等变化 语法 transform:[transform-function] ; /* 设置变形函数,可以是一个,也可以是多…

python:__class_getitem__使用以及cached_property源码分析

python&#xff1a;__class_getitem__使用以及cached_property源码分析 1 前言 Python中如何模拟泛型类型&#xff1f; 当使用类型标注时&#xff0c;使用 Python 的方括号标记来形参化一个 generic type 往往会很有用处。 例如&#xff0c;list[int] 这样的标注可以被用来表…

如何通过OpenHarmony的音频模块实现录音变速功能?

简介 OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;是由开放原子开源基金会孵化及运营的开源项目&#xff0c;是面向全场景、全连接、全智能时代的智能物联网操作系统。 多媒体子系统是OpenHarmony系统中的核心子系统&#xff0c;为系统提供了相机、…

Python语法学习之 - 生成器表达式(Generator Expression)

第一次见这样的语法 本人之前一直是Java工程师&#xff0c;最近接触了一个Python项目&#xff0c;第一次看到如下的代码&#xff1a; i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。 当我第一眼看到这样…

Offline RL : Beyond Reward: Offline Preference-guided Policy Optimization

ICML 2023 paper code preference based offline RL&#xff0c;基于HIM&#xff0c;不依靠额外学习奖励函数 Intro 本研究聚焦于离线偏好引导的强化学习&#xff08;Offline Preference-based Reinforcement Learning, PbRL&#xff09;&#xff0c;这是传统强化学习&#x…

js二进制数据,文件---ArrayBuffer,二进制数组

1.二进制数据 在 JavaScript 中有很多种二进制数据格式&#xff0c;比如&#xff1a;ArrayBuffer&#xff0c;Uint8Array&#xff0c;DataView&#xff0c;Blob&#xff0c;File 及其他。 2.ArrayBuffer 基本的二进制对象是 ArrayBuffer —— 对固定长度的连续内存空间…

linux:信号深入理解

文章目录 1.信号的概念1.1基本概念1.2信号的处理基本概念1.3信号的发送与保存基本概念 2.信号的产生2.1信号产生的五种方式2.2信号遗留问题(core,temp等) 3.信号的保存3.1 信号阻塞3.2 信号特有类型 sigset_t3.3 信号集操作函数3.4 信号集操作函数的使用 4.信号的处理4.1 信号的…

Qt输入输出类使用总结

Qt输入输出类简介 QTextStream 类(文本流)和 QDataStream 类(数据流)Qt 输入输出的两个核心类,其作用分别如下: QTextStream 类:用于对数据进行文本格式的读/写操作,可在 QString、QIODevice或 QByteArray 上运行,比如把数据输出到 QString、QIODevice 或 QByteArray 对象…

Ubuntu切换内核版本

#安装内核安装工具 sudo apt-get install software-properties-common sudo add-apt-repository ppa:cappelikan/ppa sudo apt-get update sudo apt-get install mainline#安装指定内核版本(有些版本并不能安装成功) mainline install 5.14.10#更新GRUB配置 sudo update-grub#查…

Python实现将LabelMe生成的JSON格式转换成YOLOv8支持的TXT格式

标注工具 LabelMe 生成的标注文件为JSON格式&#xff0c;而YOLOv8中支持的为TXT文件格式。以下Python代码实现3个功能&#xff1a; 1.将JSON格式转换成TXT格式&#xff1b; 2.将数据集进行随机拆分&#xff0c;生成YOLOv8支持的目录结构&#xff1b; 3.生成YOLOv8支持的YAML文件…

操作教程|通过DataEase开源BI工具对接金山多维表格

前言 金山多维表格是企业数据处理分析经常会用到的一款数据表格工具&#xff0c;它能够将企业数据以统一的列格式整齐地汇总至其中。DataEase开源数据可视化分析工具可以与金山多维表格对接&#xff0c;方便企业更加快捷地以金山多维表格为数据源&#xff0c;制作出可以实时更…

【网络版本计算器的实现】

本章重点 理解应用层的作用, 初识HTTP协议理解传输层的作用, 深入理解TCP的各项特性和机制对整个TCP/IP协议有系统的理解对TCP/IP协议体系下的其他重要协议和技术有一定的了解学会使用一些分析网络问题的工具和方法 ⭐注意!! 注意!! 注意!! 本课是网络编程的理论基础.是一个服务…

Antd Vue项目引入TailwindCss之后出现svg icon下移,布局中的问题解决方案

目录 1. 现象&#xff1a; 2. 原因分析&#xff1a; 3. 解决方案&#xff1a; 写法一&#xff1a;扩展Preflight 写法二&#xff1a; 4. 禁用 Preflight 1. 现象&#xff1a; Antd Vue项目引入TailwindCss之后出现svg icon下移&#xff0c;不能对齐显示的情况&#xff0…

爬虫实训案例:中国大学排名

近一个月左右的时间学习爬虫&#xff0c;在用所积累的知识爬取了《中国大学排名》这个网站&#xff0c;爬取的内容虽然只是可见的文本&#xff0c;但对于初学者来说是一个很好的练习。在爬取的过程中&#xff0c;通过请求数据、解析内容、提取文本、存储数据等几个重要的内容入…

React-router 最佳实践

使用的是 BrowserRouter&#xff0c;Routes 和 Route&#xff0c;这是 react-router-dom v5 和 v6 都支持的 API。这种方式的优点是路由配置和应用的其它部分是紧密集成的&#xff0c;这使得路由配置更加直观和易于理解 // router/index.js import { BrowserRouter as Router,…

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 网格布局Grid Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 网格布局Grid Layout 文章编号&#xff1a…