MODNet / README.md
wuchendi's picture
docs(README): Updated MODNet-related links
0a393d9
metadata
library_name: transformers.js
tags:
  - vision
  - background-removal
  - portrait-matting
license: apache-2.0
pipeline_tag: image-segmentation

wuchendi/MODNet (Matting Objective Decomposition Network)

Trimap-Free Portrait Matting in Real Time

πŸ“¦ Usage with Transformers.js

First, install the @huggingface/transformers library from PNPM:

pnpm add @huggingface/transformers

Then, use the following code to perform portrait matting with the wuchendi/MODNet model:

/* eslint-disable no-console */
import { AutoModel, AutoProcessor, RawImage } from '@huggingface/transformers'

async function main() {
  try {
    console.log('πŸš€ Initializing MODNet...')

    // Load model
    console.log('πŸ“¦ Loading model...')
    const model = await AutoModel.from_pretrained('wuchendi/MODNet', {
      dtype: 'fp32',
      progress_callback: (progress) => {
        // @ts-ignore
        if (progress.progress) {
          // @ts-ignore
          console.log(`Model loading progress: ${(progress.progress).toFixed(2)}%`)
        }
      }
    })
    console.log('βœ… Model loaded successfully')

    // Load processor
    console.log('πŸ”§ Loading processor...')
    const processor = await AutoProcessor.from_pretrained('wuchendi/MODNet', {})
    console.log('βœ… Processor loaded successfully')

    // Load image from URL
    const url = 'https://res.cloudinary.com/dhzm2rp05/image/upload/samples/logo.jpg'
    console.log('πŸ–ΌοΈ Loading image:', url)
    const image = await RawImage.fromURL(url)
    console.log('βœ… Image loaded successfully', `Dimensions: ${image.width}x${image.height}`)

    // Pre-process image
    console.log('πŸ”„ Preprocessing image...')
    const { pixel_values } = await processor(image)
    console.log('βœ… Image preprocessing completed')

    // Generate alpha matte
    console.log('🎯 Generating alpha matte...')
    const startTime = performance.now()
    const { output } = await model({ input: pixel_values })
    const inferenceTime = performance.now() - startTime
    console.log('βœ… Alpha matte generated', `Time: ${inferenceTime.toFixed(2)}ms`)

    // Save output mask
    console.log('πŸ’Ύ Saving output...')
    const mask = await RawImage.fromTensor(output[0].mul(255).to('uint8')).resize(image.width, image.height)
    await mask.save('src/assets/mask.png')
    console.log('βœ… Output saved to assets/mask.png')

  } catch (error) {
    console.error('❌ Error during processing:', error)
    throw error
  }
}

main().catch(console.error)

πŸ–ΌοΈ Example Result

Input Image Output Mask