Spaces:
Running
Running
Update index.js
Browse files
index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
import {
|
| 2 |
|
| 3 |
// Since we will download the model from the Hugging Face Hub, we can skip the local model check
|
| 4 |
env.allowLocalModels = false;
|
|
@@ -13,7 +13,11 @@ const EXAMPLE_URL = 'https://huggingface.co/datasets/Xenova/transformers.js-docs
|
|
| 13 |
|
| 14 |
// Create a new object detection pipeline
|
| 15 |
status.textContent = 'Loading model...';
|
| 16 |
-
const
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
status.textContent = 'Ready';
|
| 18 |
|
| 19 |
example.addEventListener('click', (e) => {
|
|
@@ -42,18 +46,21 @@ async function detect(img) {
|
|
| 42 |
imageContainer.style.backgroundImage = `url(${img})`;
|
| 43 |
|
| 44 |
status.textContent = 'Analysing...';
|
| 45 |
-
const
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
status.textContent = '';
|
| 50 |
output.forEach(renderBox);
|
| 51 |
}
|
| 52 |
|
| 53 |
// Render a bounding box and label on the image
|
| 54 |
-
function renderBox(
|
| 55 |
-
const { xmax, xmin, ymax, ymin } = box;
|
| 56 |
-
|
| 57 |
// Generate a random color for the box
|
| 58 |
const color = '#' + Math.floor(Math.random() * 0xFFFFFF).toString(16).padStart(6, 0);
|
| 59 |
|
|
@@ -70,7 +77,7 @@ function renderBox({ box, label }) {
|
|
| 70 |
|
| 71 |
// Draw label
|
| 72 |
const labelElement = document.createElement('span');
|
| 73 |
-
labelElement.textContent = label
|
| 74 |
labelElement.className = 'bounding-box-label';
|
| 75 |
labelElement.style.backgroundColor = color;
|
| 76 |
|
|
|
|
| 1 |
+
import { env, AutoModel, AutoProcessor, RawImage } from 'https://cdn.jsdelivr.net/npm/@xenova/transformers@2.17.1';
|
| 2 |
|
| 3 |
// Since we will download the model from the Hugging Face Hub, we can skip the local model check
|
| 4 |
env.allowLocalModels = false;
|
|
|
|
| 13 |
|
| 14 |
// Create a new object detection pipeline
|
| 15 |
status.textContent = 'Loading model...';
|
| 16 |
+
const model_id = 'onnx-community/yolov10n';
|
| 17 |
+
const model = await AutoModel.from_pretrained(model_id, {
|
| 18 |
+
quantized: false, // (Optional) Use unquantized version.
|
| 19 |
+
});
|
| 20 |
+
const processor = await AutoProcessor.from_pretrained(model_id);
|
| 21 |
status.textContent = 'Ready';
|
| 22 |
|
| 23 |
example.addEventListener('click', (e) => {
|
|
|
|
| 46 |
imageContainer.style.backgroundImage = `url(${img})`;
|
| 47 |
|
| 48 |
status.textContent = 'Analysing...';
|
| 49 |
+
const image = await RawImage.read(url);
|
| 50 |
+
const { pixel_values } = await processor(image);
|
| 51 |
+
const { output0 } = await model({ images: pixel_values });
|
| 52 |
+
const predictions = output0.tolist()[0];
|
| 53 |
+
const threshold = 0.5;
|
| 54 |
+
for (const [xmin, ymin, xmax, ymax, score, id] of predictions) {
|
| 55 |
+
if (score < threshold) continue;
|
| 56 |
+
renderBox(xmin, ymin, xmax, ymax, score, model.config.id2label[id]);
|
| 57 |
+
}
|
| 58 |
status.textContent = '';
|
| 59 |
output.forEach(renderBox);
|
| 60 |
}
|
| 61 |
|
| 62 |
// Render a bounding box and label on the image
|
| 63 |
+
function renderBox(xmin, ymin, xmax, ymax, score, label) {
|
|
|
|
|
|
|
| 64 |
// Generate a random color for the box
|
| 65 |
const color = '#' + Math.floor(Math.random() * 0xFFFFFF).toString(16).padStart(6, 0);
|
| 66 |
|
|
|
|
| 77 |
|
| 78 |
// Draw label
|
| 79 |
const labelElement = document.createElement('span');
|
| 80 |
+
labelElement.textContent = `${label} (${(score * 100).toFixed(2)}%)`;
|
| 81 |
labelElement.className = 'bounding-box-label';
|
| 82 |
labelElement.style.backgroundColor = color;
|
| 83 |
|