|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var bounding_box_colors = {}; |
|
|
|
var user_confidence = 0.6; |
|
|
|
|
|
var color_choices = [ |
|
"#C7FC00", |
|
"#FF00FF", |
|
"#8622FF", |
|
"#FE0056", |
|
"#00FFCE", |
|
"#FF8000", |
|
"#00B7EB", |
|
"#FFFF00", |
|
"#0E7AFE", |
|
"#FFABAB", |
|
"#0000FF", |
|
"#CCCCCC", |
|
]; |
|
|
|
var canvas_painted = false; |
|
var canvas = document.getElementById("video_canvas"); |
|
var ctx = canvas.getContext("2d"); |
|
|
|
var model = null; |
|
|
|
|
|
function detectFrame() { |
|
|
|
|
|
|
|
if (!model) return requestAnimationFrame(detectFrame); |
|
|
|
model.detect(video).then(function(predictions) { |
|
|
|
if (!canvas_painted) { |
|
var video_start = document.getElementById("video1"); |
|
canvas.style.width = video_start.width + "px"; |
|
canvas.style.height = video_start.height + "px"; |
|
canvas.width = video_start.width; |
|
canvas.height = video_start.height; |
|
|
|
|
|
canvas.top = video_start.top; |
|
canvas.left = video_start.left; |
|
canvas.style.top = video_start.top + "px"; |
|
canvas.style.left = video_start.left + "px"; |
|
canvas.style.position = "absolute"; |
|
video_start.style.display = "block"; |
|
canvas.style.display = "absolute"; |
|
canvas_painted = true; |
|
|
|
var loading = document.getElementById("loading"); |
|
loading.style.display = "none"; |
|
} |
|
requestAnimationFrame(detectFrame); |
|
ctx.clearRect(0, 0, canvas.width, canvas.height); |
|
if (video) { |
|
drawBoundingBoxes(predictions, ctx) |
|
} |
|
}); |
|
} |
|
|
|
function drawBoundingBoxes(predictions, ctx) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < predictions.length; i++) { |
|
var confidence = predictions[i].confidence; |
|
|
|
console.log(user_confidence) |
|
|
|
if (confidence < user_confidence) { |
|
continue |
|
} |
|
|
|
if (predictions[i].class in bounding_box_colors) { |
|
ctx.strokeStyle = bounding_box_colors[predictions[i].class]; |
|
} else { |
|
var color = |
|
color_choices[Math.floor(Math.random() * color_choices.length)]; |
|
ctx.strokeStyle = color; |
|
|
|
color_choices.splice(color_choices.indexOf(color), 1); |
|
|
|
bounding_box_colors[predictions[i].class] = color; |
|
} |
|
|
|
var prediction = predictions[i]; |
|
var x = prediction.bbox.x - prediction.bbox.width / 2; |
|
var y = prediction.bbox.y - prediction.bbox.height / 2; |
|
var width = prediction.bbox.width; |
|
var height = prediction.bbox.height; |
|
|
|
ctx.rect(x, y, width, height); |
|
|
|
ctx.fillStyle = "rgba(0, 0, 0, 0)"; |
|
ctx.fill(); |
|
|
|
ctx.fillStyle = ctx.strokeStyle; |
|
ctx.lineWidth = "4"; |
|
ctx.strokeRect(x, y, width, height); |
|
ctx.font = "25px Arial"; |
|
ctx.fillText(prediction.class + " " + Math.round(confidence * 100) + "%", x, y - 10); |
|
} |
|
} |
|
|
|
function webcamInference() { |
|
|
|
var loading = document.getElementById("loading"); |
|
loading.style.display = "block"; |
|
|
|
navigator.mediaDevices |
|
.getUserMedia({ video: { facingMode: "environment" } }) |
|
.then(function(stream) { |
|
video = document.createElement("video"); |
|
video.srcObject = stream; |
|
video.id = "video1"; |
|
|
|
|
|
video.style.display = "none"; |
|
video.setAttribute("playsinline", ""); |
|
|
|
document.getElementById("video_canvas").after(video); |
|
|
|
video.onloadedmetadata = function() { |
|
video.play(); |
|
} |
|
|
|
|
|
video.onplay = function() { |
|
height = video.videoHeight; |
|
width = video.videoWidth; |
|
|
|
|
|
|
|
height = height * 0.75; |
|
width = width * 0.75; |
|
|
|
width = Math.round(width); |
|
height = Math.round(height); |
|
|
|
video.setAttribute("width", width); |
|
video.setAttribute("height", height); |
|
video.style.width = width + "px"; |
|
video.style.height = height + "px"; |
|
|
|
canvas.style.width = width + "px"; |
|
canvas.style.height = height + "px"; |
|
canvas.width = width; |
|
canvas.height = height; |
|
|
|
document.getElementById("video_canvas").style.display = "block"; |
|
}; |
|
|
|
ctx.scale(1, 1); |
|
|
|
|
|
|
|
roboflow |
|
.auth({ |
|
publishable_key: publishable_key, |
|
}) |
|
.load({ |
|
model: MODEL_NAME, |
|
version: MODEL_VERSION, |
|
}) |
|
.then(function(m) { |
|
model = m; |
|
|
|
m.configure({ threshold: CONFIDENCE_THRESHOLD }); |
|
|
|
detectFrame(); |
|
}); |
|
}) |
|
.catch(function(err) { |
|
console.log(err); |
|
}); |
|
} |
|
|
|
function changeConfidence () { |
|
user_confidence = document.getElementById("confidence").value / 100; |
|
} |
|
|
|
document.getElementById("confidence").addEventListener("input", changeConfidence); |
|
|
|
webcamInference(); |