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 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`; const width = xmax - xmin const height = ymax - ymin box.style.width = `${width}px`; box.style.height = `${height}px`; const area = width * height box.area = area const tooltip = document.createElement('div'); tooltip.classList.add('tooltip'); tooltip.innerText = `${label}: ${confidence}`; box.appendChild(tooltip); detectedObjectBoxes.push(box) }); let zIndex = 0 detectedObjectBoxes.sort((a, b) => { return b.area - a.area }).forEach(box => { box.style.zIndex = zIndex container.appendChild(box) zIndex++ }) }; const app = createApp({ setup() { const token = ref(localStorage.getItem("token") || ""); const models = ref(["facebook/detr-resnet-50", "hustvl/yolos-tiny", "facebook/detr-resnet-101"]); const selectedModel = ref(""); const imageUrl = ref(""); const detectedObjects = ref([]); const loading = ref(false); const didErrorOccur = ref(false) const statusMessage = computed(() => { if (loading.value) return "Loading..."; if (didErrorOccur.value) return "Error :( Check the console"; 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 () => { reset() 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) loading.value = false; } catch (e) { console.error(e); loading.value = false; didErrorOccur.value = true } }; const reset = () => { try { document.getElementById('detected-objects-container')?.remove() const boundingBoxes = document.getElementsByClassName('bounding-box') for (const box of boundingBoxes) { box.remove() } } catch (e) { console.error(e) } didErrorOccur.value = false detectedObjects.value = [] } const shuffle = async () => { imageUrl.value = "" reset() imageUrl.value = await getRandomImageUrl() }; onMounted(async () => { const localStorageToken = localStorage.getItem("token") if (localStorageToken) { token.value = localStorageToken; } selectedModel.value = models.value[0] imageUrl.value = await getRandomImageUrl() }); return { token, run, shuffle, models, selectedModel, imageUrl, loading, statusMessage }; }, }); app.mount("#generate-text-stream-app");