object-detection
Version:
Detect single objects in small, background-blurred and close-focused images
231 lines (155 loc) • 5.74 kB
JavaScript
var detectObject = require("./../objectDetection");
function getImageName() {
var imgInfo = document.querySelector("#hello").value;
var imageName = imgInfo.split("-")[0];
return imageName;
}
function hideCriticalElements() {
document.querySelectorAll(".critical").forEach(function(criticalElement) {
criticalElement.setAttribute("hidden", true);
});
}
function unhideCriticalElements() {
document.querySelectorAll(".critical").forEach(function(criticalElement) {
criticalElement.removeAttribute("hidden");
});
}
function refresh(optimize, detail) {
if (!optimize) {
var noImageOption = document.querySelector("#no-image");
if (noImageOption) {
noImageOption.remove();
}
document.querySelectorAll("fieldset").forEach(function(fieldset) {
fieldset.removeAttribute("hidden");
});
var sensitivity = document.querySelector("#sensitivity").value,
tolerance = document.querySelector("#tolerance").value,
imageName = getImageName();
document.querySelector("#bye").setAttribute("src", "/" + imageName);
hideCriticalElements();
} else {
var sensitivity = detail.cur.sensitivity,
tolerance = detail.cur.tolerance,
imageName = detail.imageName;
}
var config = { imageName, sensitivity, tolerance };
detectObject(config)
.then(function(base64ImgResponse) {
if (!optimize) {
var base64Img = base64ImgResponse.base64Img,
tada = document.querySelector("#tada");
tada.setAttribute("src", "data:image/jpeg;base64," + base64Img);
unhideCriticalElements();
}
return {
optimal: base64ImgResponse.optimal,
optimalClusterSize: base64ImgResponse.optimalClusterSize
};
})
.then(function(optimalInfo){
if (optimize) {
detail.optimal = optimalInfo.optimal;
detail.optimalClusterSize = optimalInfo.optimalClusterSize;
var event = new CustomEvent("optimize", { detail });
document.dispatchEvent(event);
}
});
}
document.querySelector("#hello").addEventListener("change", function(event){
var imgInfo = document.querySelector("#hello").value;
var sensitivity = imgInfo.split("-")[1],
tolerance = imgInfo.split("-")[2];
document.querySelector("#sensitivity").value = sensitivity;
document.querySelector("#sensitivitySetter").value = sensitivity;
document.querySelector("#tolerance").value = tolerance;
document.querySelector("#toleranceSetter").value = tolerance;
refresh();
});
document.querySelector("#sensitivity").addEventListener("change", function(event) {
document.querySelector("#sensitivitySetter").value = this.value;
refresh();
});
document.querySelector("#sensitivitySetter").addEventListener("change", function(event) {
if (this.value < 1) {
this.value = 1;
} else if (this.value > 100) {
this.value = 100;
}
document.querySelector("#sensitivity").value = this.value;
refresh();
});
document.querySelector("#tolerance").addEventListener("change", function(event) {
document.querySelector("#toleranceSetter").value = this.value;
refresh();
});
document.querySelector("#toleranceSetter").addEventListener("change", function(event) {
if (this.value < 1) {
this.value = 1;
} else if (this.value > 100) {
this.value = 100;
}
document.querySelector("#tolerance").value = this.value;
refresh();
});
document.querySelector("#accuracy").addEventListener("change", function(event) {
document.querySelector("#accuracySetter").value = this.value;
});
document.querySelector("#accuracySetter").addEventListener("change", function(event) {
if (this.value < 1) {
this.value = 1;
} else if (this.value > 100) {
this.value = 100;
}
document.querySelector("#accuracy").value = this.value;
});
document.addEventListener("optimize", function(event) {
var detail = event.detail;
var cur = detail.cur;
if (detail.optimal && !detail.lastOptimal || detail.optimalClusterSize > detail.lastOptimalClusterSize) {
detail.lastOptimal = cur;
detail.lastOptimalClusterSize = detail.optimalClusterSize;
}
var step = detail.step;
if (cur.tolerance-step > 1) {
cur.tolerance -= step;
} else if (cur.sensitivity+step < 100) {
cur.sensitivity += step;
cur.tolerance = 100;
detail.optimizeProgress.value += detail.step;
} else {
// dispatch end event
detail.optimizeProgress.value = 100;
unhideCriticalElements();
if (detail.lastOptimal) {
document.querySelector("#sensitivity").value = detail.lastOptimal.sensitivity;
document.querySelector("#sensitivitySetter").value = detail.lastOptimal.sensitivity;
document.querySelector("#tolerance").value = detail.lastOptimal.tolerance;
document.querySelector("#toleranceSetter").value = detail.lastOptimal.tolerance;
} else {
throw new Error("Done, but no optimal solution found");
}
refresh();
throw new Error(`Done! sensitivity: ${detail.lastOptimal.sensitivity}, tolerance: ${detail.lastOptimal.tolerance}`);
}
refresh(true, detail);
});
document.querySelector("#optimize").addEventListener("click", function(event) {
var accuracy = document.querySelector("#accuracy").value,
optimizeProgress = document.querySelector("#optimize-progress"),
imageName = getImageName();
var step = 25 - accuracy * 25 / 100;
var detail = {
imageName,
optimizeProgress,
step,
cur: {
sensitivity: 1,
tolerance: 100
}
};
optimizeProgress.value = 0;
hideCriticalElements();
optimizeProgress.removeAttribute("hidden");
refresh(true, detail);
});