Spaces:
Running
Running
File size: 2,964 Bytes
d8af8f2 dd1b723 f5d33c2 69943f1 6296a62 dd1ef53 dd1b723 dab9cb2 dd1b723 dd1ef53 dd1b723 e14316a dd1b723 733ed24 6296a62 e14316a 6296a62 dd1b723 f5d33c2 6296a62 e14316a f5d33c2 54bbd6a f79e0db 69943f1 dd1b723 e14316a dd1b723 181d680 9fa49bb 5c804a1 7cb924a 181d680 dd1b723 181d680 dd1b723 181d680 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
import { pipeline, env } from 'https://cdn.jsdelivr.net/npm/@xenova/[email protected]';
// Since we will download the model from the Hugging Face Hub, we can skip the local model check
env.allowLocalModels = false;
// Reference the elements that we will need
const status = document.getElementById('status');
const fileUpload = document.getElementById('upload');
const imageContainer = document.getElementById('container');
const example = document.getElementById('example');
const labels = document.getElementById('labels');
const form = document.getElementById('form');
let parsedLabels = ['human face', 'rocket', 'helmet', 'american flag'];
let img = 'https://huggingface.co/datasets/Xenova/transformers.js-docs/resolve/main/astronaut.png';
// Create a new object detection pipeline
status.textContent = 'Loading model...';
const detector = await pipeline('zero-shot-object-detection', 'Xenova/owlvit-base-patch32');
status.textContent = 'Ready';
example.addEventListener('click', (e) => {
e.preventDefault();
detect();
});
fileUpload.addEventListener('change', function (e) {
const file = e.target.files[0];
if (!file) {
return;
}
const reader = new FileReader();
// Set up a callback when the file is loaded
reader.onload = (e2) => {
img = e2.target.result;
detect();
}
reader.readAsDataURL(file);
});
labels.addEventListener('blur', (e) => {
parsedLabels = e.target.value.split(",");
if (img) {
status.textContent = 'Analysing...';
detect();
}
});
form.addEventListener('submit', (e) => {
e.preventDefault();
parsedLabels = labels.value.split(",");
if (img) {
status.textContent = 'Analysing...';
detect();
}
})
// Detect objects in the image
async function detect() {
imageContainer.innerHTML = '';
imageContainer.style.backgroundImage = `url(${img})`;
status.textContent = 'Analysing...';
const output = await detector(img, parsedLabels, { percentage: true });
status.textContent = '';
output.forEach(renderBox);
}
// Render a bounding box and label on the image
function renderBox({ box, label }) {
const { xmax, xmin, ymax, ymin } = box;
// Generate a random color for the box
const color = '#' + Math.floor(Math.random() * 0xFFFFFF).toString(16).padStart(6, 0);
// Draw the box
const boxElement = document.createElement('div');
boxElement.className = 'bounding-box';
Object.assign(boxElement.style, {
borderColor: color,
left: 100 * xmin + '%',
top: 100 * ymin + '%',
width: 100 * (xmax - xmin) + '%',
height: 100 * (ymax - ymin) + '%',
})
// Draw label
const labelElement = document.createElement('span');
labelElement.textContent = label;
labelElement.className = 'bounding-box-label';
labelElement.style.backgroundColor = color;
boxElement.appendChild(labelElement);
imageContainer.appendChild(boxElement);
} |