最强抠图模型 RMBG-2.0 ONNX模型 本地部署

模型介绍
RMBG-2.0是BRIA AI推出的最新开源图像背景移除模型,基于先进的AI技术实现高精度的前景与背景分离,达到SOTA水平。RMBG-2.0在性能上超越前代版本,从1.4版本的73.26%准确率大幅提升至2.0版本的90.14%,支持各类图像高精度背景移除,抠图效果十分出色

官方仓库:https://huggingface.co/briaai/RMBG-2.0

如果上面的huggingface仓库打不开,可以试试下面的镜像仓库

https://hf-mirror.com/briaai/RMBG-2.0

不同模型图片处理效果对比

在这里插入图片描述

1.4 模型下载
X-AnyLabeling 项目仓库 RMBG模型

https://github.com/CVHub520/X-AnyLabeling/releases/download/v2.4.3/bria-rmbg-1.4.onnx

2.0 模型下载
上面的官方仓库中可以下载,但是速度可能有点慢,可以在 ModelScope 中下载

ModelScope 社区中模型下载

https://www.modelscope.cn/models/AI-ModelScope/RMBG-2.0/files

在这里插入图片描述

推理脚本
这个脚本程序是由 X-AnyLabeling 项目 rmbg.py 程序修改而来的,修改之后方便本地部署和项目集成

import cv2
import numpy as np
from PIL import Image
import onnxruntime as ort
import time

def show_img(img):
    cv2.imshow("01",img)
    cv2.waitKey(0)

class RMBG2():
    def __init__(self, model_ptah) -> None:

        self.sess_opts = ort.SessionOptions()
        self.sess_opts.log_severity_level = 3

        provider = ["CPUExecutionProvider"]        # CPU 推理
        #provider = ["CUDAExecutionProvider","CPUExecutionProvider"]   # GPU 推理

        self.session = ort.InferenceSession(model_ptah, providers=provider,sess_options=self.sess_opts)

        self.input_name = self.session.get_inputs()[0].name
        self.input_shape = (1024,1024)   # [1024, 1024]
        #print(f"模型输入:{self.input_shape}")

        #self.output_name = self.session.get_outputs()[0].name
        #print(f"模型输出:{self.output_name}")
        #self.output_shape = self.session.get_outputs()[0].shape
        #print(f"模型输出:{self.output_shape}")

    def preprocess(self, image: np.ndarray) -> np.ndarray:
        """
        Preprocess the input image for the model.

        Args:
            image (np.ndarray): Input image as a numpy array.

        Returns:
            np.ndarray: Preprocessed image.
        """
        if len(image.shape) < 3:
            image = np.expand_dims(image, axis=2)
        image = cv2.resize(
            image, self.input_shape, interpolation=cv2.INTER_LINEAR
        )
        image = image.astype(np.float32) / 255.0
        image = (image - 0.5) / 1.0
        image = np.transpose(image, (2, 0, 1))
        return np.expand_dims(image, axis=0)

    def forward(self, blob):
        outs = self.session.run(None, {self.input_name: blob})
        outs = outs[0].squeeze(axis=0)
        return outs

    def postprocess(self, result: np.ndarray, original_size: tuple) -> np.ndarray:
        """
        Postprocess the model output.

        Args:
            result (np.ndarray): Model output.
            original_size (tuple): Original image size (height, width).

        Returns:
            np.ndarray: Postprocessed image as a numpy array.
        """
        result = cv2.resize(
            np.squeeze(result),
            original_size[::-1],
            interpolation=cv2.INTER_LINEAR,
        )
        max_val, min_val = np.max(result), np.min(result)
        result = (result - min_val) / (max_val - min_val)
        return (result * 255).astype(np.uint8)

    def infer(self, image):
        """
        Remove the background from an image and save the result.

        Args:
            image (np.ndarray): Input image as a numpy array.
        """

        blob = self.preprocess(image)
        output = self.forward(blob)
        # 输出为前景掩膜
        result_mask = self.postprocess(output, image.shape[:2])
        #print(result_mask.shape)
        #show_img(result_mask)

        pil_mask = Image.fromarray(result_mask)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 掩膜图像转为pil格式图像
        pil_image = Image.fromarray(image)              # 原图转为pil格式图像
        pil_image = pil_image.convert("RGBA")           # 增加透明图层通道
        pil_mask = pil_mask.convert("L")                # 转换为 L(灰度)格式

        output_image = Image.new("RGBA", pil_image.size, (0, 0, 0, 0))
        output_image.paste(pil_image, (0, 0), pil_mask)
        return output_image

if __name__ == '__main__':
    # bria-rmbg-1.4.onnx (1.4模型)或 model_quantized.onnx (2.0模型)
    model_path = r"bria-rmbg-1.4.onnx"          # 模型路径 
    tast = RMBG2(model_path )

    img_path = r"1.png"                         # 输入图片路径
    img =cv2.imread(img_path)

    start = time.time()

    output_image = tast.infer(img)

    end = time.time()
    total = round((end - start), 2)
    print(f"耗时:{total} s")
    print("完成抠图")

    output_image.save('11.png')                 # 保存结果图像
    # 显示去除背景的结果图像
    output_image.show()

说明: 修改模型路径、输入图片路径和图片保存路径即可

1.4 模型 cpu推理 不到 1s

2.0 模型 cpu推理 约 9 s

原图
原图
1.4 模型抠图效果:
1.4
2.0 模型抠图效果
2.0

### 如何使用 RMBG 2.0 训练自定义背景移除模型 RMBG是一个多平台的图像背景移除工具,利用开源AI模型来实现背景移除功能,并强调本地化处理以保护用户隐私[^2]。然而,对于特定应用场景可能需要更精准的背景识别能力,这时可以考虑训练定制化的背景移除模型。 #### 准备环境与数据集 为了能够有效地训练新的模型版本,首先需准备合适的开发环境以及高质量的数据集: - **安装依赖项**:确保已安装Python及相关机器学习库如PyTorch或TensorFlow。 - **收集标注好的图片样本**:这些图像是指带有前景物体标记的信息,用于监督学习过程中的正负样例区分。 #### 修改现有架构适应新需求 考虑到官方并未直接提供详细的教程关于如何调整预构建网络结构来进行个性化改进,可以从以下几个方面入手: - **探索官方文档和支持社区**:查找是否有其他开发者分享过相似的经验案例;也可以尝试联系维护团队询问更多细节指导。 - **研究当前使用的算法原理**:理解其背后的数学逻辑和技术要点有助于决定哪些部分值得保留而哪些地方存在优化空间。 ```python import torch from torchvision import transforms, datasets from torch.utils.data import DataLoader from rmbg.model import CustomModel # 假设这是你要修改的核心模块路径 transform = transforms.Compose([ transforms.Resize((256, 256)), transforms.ToTensor(), ]) dataset = datasets.ImageFolder(root='path/to/dataset', transform=transform) data_loader = DataLoader(dataset, batch_size=8, shuffle=True) model = CustomModel() optimizer = torch.optim.Adam(model.parameters(), lr=1e-4) criterion = torch.nn.BCELoss() for epoch in range(num_epochs): for inputs, labels in data_loader: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() ``` 此代码片段展示了基本的训练循环设置方式,实际应用时还需根据具体情况进行适当调整。 #### 验证与部署 完成初步训练之后,应该对生成的结果进行全面评估测试,确认满足预期效果后再考虑将其集成至生产环境中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值