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

简介: MODNet是一种轻量级、实时的无trimap人像抠图模型,强调高效和鲁棒性。它由语义预测、细节预测和语义-细节混合三个模块构成,通过自监督学习策略SOC保持模块间一致性。MODNet在人像抠图任务中表现出色,适用于多种场景,如展馆互动、商场引流、图像编辑、广告制作等。论文和源码可在给定链接中获取,项目还提供了WebUI方便用户直接使用。

论文地址
论文GitHub

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

概述

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

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

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

原理介绍

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

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

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

image-20240524221649704.png

核心逻辑

ModNet 的结构

image-20240524221753829.png

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

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

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

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

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

image-20240524222202401.png

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/ 即可进入网页。

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

项目的结构如下图

image-20240524222245791.png

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

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-20240524222334865.png

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'

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

image-20240524222426958.png

WebUI

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

image-20240524222521870.png

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

image-20240524222545960.png

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

image-20240524222620369.png

小结

在深度学习中,人像抠图通常使用全卷积网络(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等)来评估你的模型性能。根据评估结果调整模型的超参数或架构以提高性能。
人像抠图是一个具有挑战性的任务,特别是在处理复杂背景和遮挡情况时。因此,你可能需要多次迭代和调整你的模型以达到最佳性能。
相关文章
|
人工智能 Linux 开发工具
真人AI写真的制作方法-文生图换脸
AI写真最近火起来了,特别是某款现象级相机的出现,只需要上传自己的照片,就能生成漂亮的写真照,这一产品再次带火了AI绘画。今天我就来分享一个使用Stable Diffusion WebUI制作真人AI写真的方法,不用训练,快速出图。
845 1
|
4月前
|
人工智能 算法
瞬息全宇宙!来魔搭体验一键人像抠图换背景
在数字创意时代,魔搭的一键人像抠图技术让你瞬间穿越全球美景,从巴黎黄昏到悉尼黎明,无缝融合你的身影。访问[modelscope.cn/studios/iic/Change_Image_Background],上传照片,轻松点选,即使发丝细节也能精准抠取并换背景,20秒快速呈现惊艳效果,新手也能快速掌握,立即体验神奇变换!✨🚀🌍 *(字数:231)*
|
6月前
|
机器学习/深度学习 监控 算法
【传知代码】骨架行为识别-论文复现
骨架行为识别是计算机视觉中的关键技术,通过分析人体骨架轨迹和姿态来识别行为。它应用于人机交互、智能监控等领域,利用OpenPose等算法提取关键点信息。CTR-GCN是该领域的先进模型,优于2S-AGCN,通过通道拓扑优化和时间建模提高识别效果。模型包含通道细化、特征变换和维度增强三个部分。源码可在相关文章附件获取。骨架行为识别技术在视频理解、人机交互、运动分析等多个场景有广泛应用,并持续发展创新。
【传知代码】骨架行为识别-论文复现
|
6月前
|
算法 安全 测试技术
【传知代码】图像加密解密与数字水印处理-论文复现
该文主要介绍了图像加密解密和数字水印处理的重要性,并提供了相关技术的概述和原理。文章首先强调了信息安全和数据保护在数字化时代的需求,然后分别介绍了图像加密和解密以及数字水印处理的概念。 在图像加密解密部分,提到了两种方法:基于混沌Logistic映射的加密和基于三重DES的加密。前者通过混沌理论进行加密,后者使用经典的三重DES算法。文章提供了每种方法的基本原理,并展示了如何在Python中实现它们,包括使用`cryptography`库进行AES加密和利用PIL库进行图像处理。
【传知代码】图像加密解密与数字水印处理-论文复现
|
6月前
|
自然语言处理 数据可视化 算法
【传知代码】私人订制词云图-论文复现
本文介绍了词云图的原理和生成步骤,包括分词、统计词频、去除停用词等,并提供了Python实现示例,利用`wordcloud`和`jieba`库。此外,还分享了技巧,如处理中文乱码、选择背景图、词库转换及自定义文字颜色。词云图能直观展示文本关键信息,适用于数据分析和文本挖掘,但也有其局限性,如无法显示词汇的语法关系。源码和更多资源可在文章附件获取。
【传知代码】私人订制词云图-论文复现
|
机器学习/深度学习 编解码 算法
【阿里云OpenVI-视觉生产系列之图片上色】照片真实感上色算法DDColor ICCV2023论文深入解读
图像上色是老照片修复的一个关键步骤,本文介绍发表在 ICCV 2023 上的最新上色论文 DDColor
2699 10
【阿里云OpenVI-视觉生产系列之图片上色】照片真实感上色算法DDColor ICCV2023论文深入解读
|
机器学习/深度学习 人工智能 自然语言处理
「模型即服务AI」1分钟调用SOTA人脸检测,同时搭建时光相册小应用—【OpenVI—代码解读系列】
最近有两个计算机应用发展的方向正在潜移默化的汇拢中:1.)模型即服务 2.)人工智能(AI)。它们的会师正逐渐形成模型即服务AI热潮。 近几年模型即服务一直被人津津乐道,这是提升AI编程效率、加速AI创新应用的大趋势。人工智能领域近几年非常火热,基于AI的行业创新应用层出不穷,尤其今年的AI绘画又大有元年之势,相应介绍可查阅《人工智能内容生成元年—AI绘画原理解析》。如下章节将重点介绍如何通过模型即服务来完成AI功能调用以及相应AI应用搭建。
1404 3
「模型即服务AI」1分钟调用SOTA人脸检测,同时搭建时光相册小应用—【OpenVI—代码解读系列】
|
人工智能 编解码 移动开发
NeRF基于线稿生成逼真三维人脸,细节风格随意改,论文已上SIGGRAPH
NeRF基于线稿生成逼真三维人脸,细节风格随意改,论文已上SIGGRAPH
461 0
|
机器学习/深度学习 编解码 达摩院
【OpenVI-图像超分实战篇】别用GAN做超分了,快来试试基于扩散模型的图像超分吧!
近10年来,深度学习技术得到了长足进步,在图像增强领域取得了显著的成果,尤其是以GAN为代表的生成式模型在图像复原、老片修复,图像超分辨率等方面大放异彩。图像超分辨率是视频增强方面,用于提升画质的典型应用。生成对抗网络GAN使得在图像分辨率增加的同时,保持细节特征,补充生成真实的纹理,其中应用广泛的工作是Real-ESRGAN。 扩散模型DiffusionModel在图像超分辨率这方面的新的应用,展现出其超过GAN的生成多样性和真实性。看完后,你会发现,还在用GAN做图像超分辨率吗?已经OUT了,快来试试DiffusionModel吧!
26823 3
【OpenVI-图像超分实战篇】别用GAN做超分了,快来试试基于扩散模型的图像超分吧!
|
机器学习/深度学习 人工智能 搜索推荐
给张图就能反推Prompt,AI绘画神器Midjourney能够「看图说话」了
给张图就能反推Prompt,AI绘画神器Midjourney能够「看图说话」了
1156 0