Arsala Grey
added loading and sorted detected objects
3529c31
raw
history blame
4.49 kB
const { createApp, ref, onMounted, computed } = Vue;
import { HfInference } from "https://cdn.skypack.dev/@huggingface/inference@latest";
const getRandomImageUrl = async () => {
const randomImageRequest = await fetch("https://source.unsplash.com/random/640x480")
return randomImageRequest.url
}
const ObjectDetectionModels = ["facebook/detr-resnet-50", "hustvl/yolos-tiny", "facebook/detr-resnet-101"]
const getImageBuffer = async (imageUrl) => {
const imageRequest = await fetch(imageUrl)
const imageBuffer = await imageRequest.arrayBuffer()
return imageBuffer
}
const drawDetectedObjects = (img, detections) => {
const container = document.createElement('div');
container.id = 'detected-objects-container';
container.style.top = `${img.offsetTop}px`;
container.style.left = `${img.offsetLeft}px`;
container.style.width = `${img.width}px`;
container.style.height = `${img.height}px`;
img.parentNode.insertBefore(container, img);
const detectedObjectBoxes = []
detections.forEach(detection => {
const { xmin, ymin, xmax, ymax } = detection.box;
const label = detection.label;
const confidence = Math.floor(detection.score * 100) + '%';
const box = document.createElement('div');
box.classList.add('bounding-box');
box.style.left = `${xmin}px`;
box.style.top = `${ymin}px`;
box.style.width = `${xmax - xmin}px`;
box.style.height = `${ymax - ymin}px`;
const tooltip = document.createElement('div');
tooltip.classList.add('tooltip');
tooltip.innerText = `${label}: ${confidence}`;
box.appendChild(tooltip);
detectedObjectBoxes.push(box)
});
detectedObjectBoxes.sort((a, b) => {
const aSize = a.style.width * a.style.height
const bSize = b.style.width * b.style.height
return aSize - bSize
}).forEach(box => container.appendChild(box))
};
const app = createApp({
setup() {
const token = ref(localStorage.getItem("token") || "");
const models = ref(ObjectDetectionModels);
const selectedModel = ref("");
const imageUrl = ref("");
const detectedObjects = ref([]);
const loading = ref(false);
const statusMessage = computed(() => {
if (loading.value) return "Loading...";
if (detectedObjects.value.length === 0) return "No objects detected";
if (detectedObjects.value.length === 1) return "1 object detected";
return `${detectedObjects.value.length} objects detected`;
})
const run = async () => {
loading.value = true;
try {
const hf = new HfInference(token.value);
const imageData = await getImageBuffer(imageUrl.value);
const result = await hf.objectDetection({
data: imageData,
model: selectedModel.value,
});
detectedObjects.value = result
drawDetectedObjects(document.getElementById('current-image'), result)
console.log(detectedObjects.value)
loading.value = false;
} catch (e) {
console.error(e);
loading.value = false;
}
};
const reset = () => {
document.getElementById('detected-objects-container').remove()
document.getElementsByClassName('bounding-box').forEach(box => box.remove())
detectedObjects.value = []
}
const shuffle = async () => {
imageUrl.value = await getRandomImageUrl()
reset()
};
onMounted(async () => {
const localStorageToken = localStorage.getItem("token")
if (localStorageToken) {
token.value = localStorageToken;
}
selectedModel.value = models.value[0]
imageUrl.value = await getRandomImageUrl()
window.onresize = () => {
document.getElementById('detected-objects-container').remove()
document.getElementsByClassName('bounding-box').forEach(box => box.remove())
}
});
return {
token,
run,
shuffle,
models,
selectedModel,
imageUrl,
loading,
statusMessage
};
},
});
app.mount("#generate-text-stream-app");