|
<!DOCTYPE html> |
|
<html> |
|
|
|
<head> |
|
<meta charset="utf-8" /> |
|
<meta name="viewport" content="width=device-width" /> |
|
<link rel="stylesheet" href="https://cdn.simplecss.org/simple.min.css"> |
|
<title>Heelo huggingface.js</title> |
|
</head> |
|
|
|
<body> |
|
<script type="module"> |
|
import { HfInference } from 'https://cdn.skypack.dev/@huggingface/[email protected]'; |
|
let hf = new HfInference() |
|
document.querySelector("#tokenBtn").addEventListener("click", (e) => { |
|
const token = document.querySelector("#token").value; |
|
hf = new HfInference(token) |
|
init() |
|
}) |
|
document.addEventListener("DOMContentLoaded", async () => { |
|
init(); |
|
}) |
|
function init() { |
|
const img = document.querySelector("#example-img"); |
|
fetch(img.src) |
|
.then((res) => res.blob()) |
|
.then((blob) => { |
|
detectObjects(blob, img.naturalWidth, img.naturalHeight); |
|
}) |
|
} |
|
async function detectObjects(imgBlob, imgW, imgH) { |
|
try { |
|
const objectDetectionRes = await hf.objectDetection({ |
|
data: imgBlob, |
|
model: "facebook/detr-resnet-50" |
|
}) |
|
document.querySelector("#output").innerText = JSON.stringify(objectDetectionRes, null, 2); |
|
const container = document.querySelector("#image-container"); |
|
container.querySelectorAll(".box").forEach((el) => el.remove()); |
|
const boxes = objectDetectionRes.map((obj) => { |
|
const w = (100 * (obj.box.xmax - obj.box.xmin)) / imgW; |
|
const h = (100 * (obj.box.ymax - obj.box.ymin)) / imgH; |
|
const box = document.createElement("div"); |
|
box.classList.add("box"); |
|
box.style.position = "absolute"; |
|
box.style.border = "solid 2px red"; |
|
box.style.top = (100 * obj.box.ymin) / imgH + "%"; |
|
box.style.left = (100 * obj.box.xmin) / imgW + "%"; |
|
box.style.width = w + "%"; |
|
box.style.height = h + "%"; |
|
box.appendChild(document.createTextNode(obj.label)); |
|
return box; |
|
}) |
|
boxes.forEach((box) => { |
|
container.appendChild(box); |
|
}) |
|
} catch (e) { |
|
document.querySelector("#output").innerText = e.message; |
|
} |
|
} |
|
document.querySelector("#image-file").addEventListener("change", async (e) => { |
|
const file = e.target.files[0]; |
|
const newImage = new Image(); |
|
newImage.src = URL.createObjectURL(file) |
|
const img = document.querySelector("#example-img"); |
|
img.src = newImage.src; |
|
newImage.onload = () => { |
|
detectObjects(file, newImage.naturalWidth, newImage.naturalHeight); |
|
} |
|
}); |
|
</script> |
|
<h1> Hello huggingface.js </h1> |
|
<div> |
|
<label for="token">HF Token</label> |
|
<div style="display: flex"> |
|
<input style="flex: 2 1 0%" type="password" id="token" /> |
|
<button style="flex: 1 1 0%" id="tokenBtn">Set Token</button> |
|
</div> |
|
</div> |
|
|
|
<input type="file" id="image-file" accept="image/*" /> |
|
<div style="position: relative;" id="image-container"> |
|
<img id="example-img" width="100%" |
|
src="https://raw.githubusercontent.com/huggingface/huggingface.js/main/packages/inference/test/cats.png"> |
|
</div> |
|
<pre><code id="output"></code></pre> |
|
</body> |
|
|
|
</html> |