Skip to content
ModelListedExternal
Download

MODNet

This repository provides a Hugging Face–compatible version of MODNet (Mobile Object Detection Network) for fast and high-quality foreground matting and background removal.

KindOtherVersionRevision a967175Bgrade

Model source

Kind
Other
File size
25.0–25.1 MB
Version
vRevision a967175
Updated
Oct 20, 2026
Downloads
23
Source
Hugging Face

Source description

MODNet – Fast Image Matting for Background Removal

This repository provides a Hugging Face–compatible version of MODNet (Mobile Object Detection Network) for fast and high-quality foreground matting and background removal.

The model is designed to produce pixel-perfect alpha mattes, handling fine details such as hair, fabric edges, and soft shadows, while remaining efficient enough for real-time CPU inference.


🔹 Model Details

  • Architecture: MODNet (custom architecture)
  • Task: Image matting / background removal
  • Framework: PyTorch
  • Backbone: MobileNetV2
  • Input: RGB image tensor (B, 3, H, W)
  • Output: (semantic, detail, matte) predictions

How to Load the Model

from transformers import AutoModel

model = AutoModel.from_pretrained(
    "boopathiraj/MODNet",
    trust_remote_code=True
)

model.eval()

Example Inference


import torch
import cv2
import numpy as np
from PIL import Image
from torchvision import transforms

# Preprocess
def preprocess(image_path, ref_size=512):
    image = Image.open(image_path).convert("RGB")
    w, h = image.size

    # Resize while maintaining aspect ratio
    scale = ref_size / max(h, w)
    new_w, new_h = int(w * scale), int(h * scale)
    image_resized = image.resize((new_w, new_h), Image.BILINEAR)

    # Create a new blank image of ref_size x ref_size and paste the resized image
    # This will pad the image to ref_size x ref_size
    padded_image = Image.new("RGB", (ref_size, ref_size), (0, 0, 0)) # Black padding
    padded_image.paste(image_resized, ((ref_size - new_w) // 2, (ref_size - new_h) // 2))

    transform = transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.5, 0.5, 0.5],
                             std=[0.5, 0.5, 0.5])
    ])

    tensor = transform(padded_image).unsqueeze(0)
    return tensor, (w, h)

# Run inference
inp, original_size = preprocess("/content/portrait.jpg")

import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

model.to(device)
inp = inp.to(device) # Assign the tensor to the device

with torch.no_grad():
    semantic, detail, matte = model(inp, True)

matte = matte[0, 0].cpu().numpy()
matte = cv2.resize(matte, original_size)

# Save alpha matte
matte = (matte * 255).astype(np.uint8)
Image.fromarray(matte).save("alpha_matte.png")

Visualization

import numpy as np
from PIL import Image

def combined_display(image, matte):
  # calculate display resolution
  w, h = image.width, image.height
  rw, rh = 800, int(h * 800 / (3 * w))
  
  # obtain predicted foreground
  image = np.asarray(image)
  if len(image.shape) == 2:
    image = image[:, :, None]
  if image.shape[2] == 1:
    image = np.repeat(image, 3, axis=2)
  elif image.shape[2] == 4:
    image = image[:, :, 0:3]
  matte = np.repeat(np.asarray(matte)[:, :, None], 3, axis=2) / 255
  foreground = image * matte + np.full(image.shape, 255) * (1 - matte)
  
  # combine image, foreground, and alpha into one line
  combined = np.concatenate((image, foreground, matte * 255), axis=1)
  combined = Image.fromarray(np.uint8(combined)).resize((rw, rh))
  return combined

# visualize all images
image_names = os.listdir(input_folder)
for image_name in image_names:
  matte_name = image_name.split('.')[0] + '.png'
  image = Image.open(os.path.join(input_folder, image_name))
  matte = Image.open(os.path.join(output_folder, matte_name))
  display(combined_display(image, matte))
  print(image_name, '\n')


Sources

1 source
Hugging FacePrimaryVersion a967175f8fd63de67a1c161d8daac966d2b57e3a
huggingface.co/boopathiraj/MODNet/tree/a967175f8fd63de67a1c161d8daac966d2b57e3a

Verified Oct 20

Model artifacts

2 artifacts

modnet/pretrained/modnet_photographic_portrait_matting.ckpt

ckpt · 25.0 MB · SHA-256 7c22235f0925…7ed8 · Hugging Face

Download

pytorch_model.bin

bin · 25.1 MB · SHA-256 fbbcc453dfb6…0fc0 · Hugging Face

Download

Source excerpts

3 excerpts

--- --- license: apache-2.0 tags: - image-segmentation - image-matting - background-removal - computer-vision - custom-architecture library_name: transformers pipeline_tag: image-segmentation --- # MODNet – Fast Image Matting for Background Removal This repository provides a Hugging Face–compatible version of **MODNet (Mobile Object Detection Network)** for fast and high-quality foreground matting and background removal. The model is designed to produce **pixel-perfect alpha mattes**, handling fine details such as hair, fabric edges, and soft shadows, while remaining efficient enough for real-time CPU inference. --- ## 🔹 Model Details - **Architecture**: MODNet (custom architecture) - **Task**: Image matting / background removal - **Framework**: PyTorch - **Backbone**: MobileNetV2 - **Input**: RGB image tensor `(B, 3, H, W)` - **Output**: `(semantic, detail, matte)` predictions ## How to Load the Model ```python from transformers import AutoModel model = AutoModel.from_pretrained( "boopathiraj/MODNet", trust_remote_code=True ) model.eval() ``` ## Example Inference ```python import torch import cv2 import numpy as np from PIL import Image from torchvision import transforms # Preprocess def preprocess(image_path, ref_size=512): image = Image.open(image_path).convert("RGB") w, h = image.size # Resize while maintaining aspect ratio scale = ref_size / max(h, w) new_w, new_h = int(w * scale), int(h * scale) image_resized = image.resize((new_w, new_h), Image.BILINEAR) # Create a new blank image of ref_size x ref_size and paste the resized image # This will pad the image to ref_size x ref_size padded_image = Image.new("RGB", (ref_size, ref_size), (0, 0, 0)) # Black padding padded_image.paste(image_resized, ((ref_size - new_w) // 2, (ref_size - new_h) // 2)) transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) ]) tensor = transform(padded_image).unsqueeze(0) return tensor, (w, h) # Run inference inp, original_size = preprocess("/content/portrait.jpg") import torch device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) inp = inp.to(device) # Assign the tensor to the device with torch.no_grad(): semantic, detail, matte = model(inp, True) matte = matte[0, 0].cpu().numpy() matte = cv2.resize(matte, original_size) # Save alpha...

Source context: 23 downloads · 0 likes · Pipeline image-segmentation · Library transformers · Repo boopathiraj/MODNet

Source context: 98 downloads · 0 likes · Pipeline image-segmentation · Library transformers · Repo boopathiraj/MODNet