Spaces:
Running
Running
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"); | |