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