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);
}