import { AutoProcessor, VitMatteForImageMatting, RawImage, Tensor, cat } from 'https://cdn.jsdelivr.net/npm/@xenova/transformers@2.14.2'; env.allowLocalModels = false; // Load processor and model const processor = await AutoProcessor.from_pretrained('Xenova/vitmatte-small-composition-1k'); const model = await VitMatteForImageMatting.from_pretrained('Xenova/vitmatte-small-composition-1k'); // Load image and trimap const image = await RawImage.fromURL('https://huggingface.co/datasets/Xenova/transformers.js-docs/resolve/main/vitmatte_image.png'); const trimap = await RawImage.fromURL('https://huggingface.co/datasets/Xenova/transformers.js-docs/resolve/main/vitmatte_trimap.png'); // Prepare image + trimap for the model const inputs = await processor(image, trimap); // Predict alpha matte const { alphas } = await model(inputs); // Tensor { // dims: [ 1, 1, 640, 960 ], // type: 'float32', // size: 614400, // data: Float32Array(614400) [ 0.9894027709960938, 0.9970508813858032, ... ] // } // Visualize predicted alpha matte const imageTensor = new Tensor( 'uint8', new Uint8Array(image.data), [image.height, image.width, image.channels] ).transpose(2, 0, 1); // Convert float (0-1) alpha matte to uint8 (0-255) const alphaChannel = alphas .squeeze(0) .mul_(255) .clamp_(0, 255) .round_() .to('uint8'); // Concatenate original image with predicted alpha const imageData = cat([imageTensor, alphaChannel], 0); // Save output image const outputImage = RawImage.fromTensor(imageData); outputImage.save('output.png');