銜接 Day 16 的 ml5.js 範例,我們可以把辨識流程改成上傳圖片的形式。
之前的範例使用 F12 查看 html,可以看到它 canvas 的 id 是 defaultCanvas0。
於是可以寫一個函數去取代它的拖拉動作。
function setdropupdate() {
var mycanvas = document.getElementById("defaultCanvas0");
var myimage = new Image();
var ctx = mycanvas.getContext("2d");
var fileReader = new FileReader();
mycanvas.ondragover = function (e) {
e.preventDefault();
}
mycanvas.ondrop = function (e) {
e.preventDefault();
let f = e.dataTransfer.files[0];
fileReader.readAsDataURL(f);
}
fileReader.onload = function () {
myimage.src = fileReader.result;
}
myimage.onload = function () {
ctx.drawImage(myimage, 0, 0, 400, 400);
classifier.classify(myimage, gotResult);
};
}
將修改拖拉事件的函式放在 createCanvas 後面,
因為呈現的 Canvas 是 createCanvas 後才製造出來的。
function setup() {
createCanvas(400, 400);
classifier.classify(img, gotResult);
image(img, 0, 0);
setdropupdate()
}
顯示資訊方面,在 index 中加入 <div id="log"></div>
做為輸出
<html>
<head>
<meta charset="UTF-8">
<title>Image classification using MobileNet and p5.js</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.0.0/p5.min.js"></script>
<script src="https://unpkg.com/ml5@latest/dist/ml5.min.js"></script>
</head>
<body>
<h1>Image classification using MobileNet and p5.js</h1>
<script src="sketch.js"></script>
<div id="log"></div>
</body>
</html>
修改 gotResult 的回應,改為將輸出寫在 div log 中。
// A function to run when we get any errors and the results
function gotResult(error, results) {
// Display error in the console
if (error) {
console.error(error);
} else {
// The results are in an array ordered by confidence.
console.log(results);
//createDiv(`Label: ${results[0].label}`);
//createDiv(`Confidence: ${nf(results[0].confidence, 0, 2)}`);
document.getElementById("log").innerText = `Label: ${results[0].label}\n` + `Confidence: ${nf(results[0].confidence, 0, 2)}`;
}
}
https://i.imgur.com/2wEzytl.mp4