##はじめに
こんにちは streampack チームのメディです。
https://cloudpack.jp/service/option/streampack.html
###Copyrights of photos ・ 写真の著作権
https://www.pexels.com/photo/woman-sitting-on-top-of-volkswagen-2845631/
https://www.pexels.com/photo/photography-of-three-dogs-looking-up-850602/
https://www.pexels.com/photo/woman-in-blue-denim-jacket-holding-brushing-her-siberian-husky-4148879/
###What is tensorflowjs.js ・ tensorflowjsとは
tensorflow.js is a machine learning library that can be used directly in the browser.
tensorflow.jsは、ブラウザで直接使用できる機械学習ライブラリーです。
This demo is using tensorflow.js with the coco-ssd model.
このデモでは、coco-ssdモデルでtensorflow.jsを使用しています。
###Objective ・ 目的
Learning how to use tensorflow.js via a simple example.
簡単な例でtensorflow.jsの使用方法を学びます。
###Implementation
For every photo, if there are detections, there is a callback with the following information:
- Object type
- Detection reliability (between 0 and 1)
- Bounding box
すべての写真について、検出があると、次の情報を含むコールバックがあります。
- オブジェクトタイプ
- 検出の信頼性(0から1の間)
- 境界ボックス
The bounding boxes are drawn on a canvas over the original picture.
境界ボックスは、元の画像の上にキャンバスに描画されます。
<!DOCTYPE html>
<html>
<head>
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="//stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" crossorigin="anonymous" playsinline>
<!-- jQuery & Bootstrap JS -->
<script src="//code.jquery.com/jquery-3.3.1.slim.min.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" crossorigin="anonymous"></script>
<script src="//stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" crossorigin="anonymous"></script>
<!-- Load TensorFlow.js -->
<script src="//cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.7.2/dist/tf.min.js"></script>
<!-- Load the coco-ssd model. -->
<script src="//cdn.jsdelivr.net/npm/@tensorflow-models/coco-ssd@2.0.2/dist/coco-ssd.js"></script>
<style>
body {
text-align: left;
}
.img {
position: absolute;
z-index: 1;
max-width: 100%;
height: auto;
}
#main_container {
display: inline-block;
margin: 0 auto;
position: relative;
}
#cv1 {
position: relative;
z-index: 20;
}
#top_div {
padding: 1em;
}
#loader_div {
display: inline-block;
}
#spinner_div {
display: inline-block;
}
</style>
</head>
<body>
<div>
<div id="top_div">
<H2>Coco SSD + tensorflowjs</H2>
<div id="loader_div">
<p id="loader_info">Loading model...
<p />
</div>
<div id="spinner_div" class="spinner-border" role="status">
<span class="sr-only"></span>
</div>
<br></br>
<input id="input_btn" type='file' />
</div>
<br></br>
<div class="container" id="main_container">
<img class="img" id="img" width="640" width="360">
<canvas class="canvas" id="cv1"></canvas>
</div>
</div>
<script type="text/javascript">
var img;
var c = document.getElementById("cv1");
var ctx = c.getContext("2d");
var img = document.getElementById('img');
var isModelLoaded = false;
var globalModel = null;
//Load the model.
cocoSsd.load().then(model => {
isModelLoaded = true;
updateTitle();
if (document.getElementById("img").src != "") {
startPredictions(model, img);
}
});
function startPredictions(model, img) {
model.detect(img).then(predictions => {
predictions.map((item, index) => {
console.log(item);
let borderColor = getColorByIndex(index);
draw(item, borderColor);
});
});
}
function resizeCanvas(element) {
var w = element.offsetWidth;
var h = element.offsetHeight;
var cv = document.getElementById("cv1");
cv.width = w;
cv.height = h;
}
function draw(item, boderColor) {
let scorePercentage = (parseFloat(item.score) * 100).toFixed(2);
let fontBase = 1000;
let fontSize = 12;
let textColor = "#FF0000";
let backgroundColor = "rgba(255, 255, 255, 0.7)"; //"#fff";
ctx.beginPath();
ctx.rect(item.bbox[0], item.bbox[1], item.bbox[2], fontSize + 5);
ctx.fillStyle = backgroundColor;
ctx.fill();
ctx.font = `bold ${fontSize}px sans-serif`;
ctx.fillStyle = textColor;
ctx.fillText(" " + item.class + " " + scorePercentage + "%", item.bbox[0], item.bbox[1] + fontSize);
ctx.rect(item.bbox[0], item.bbox[1], item.bbox[2], item.bbox[3]);
ctx.strokeStyle = boderColor;
ctx.lineWidth = 3;
ctx.stroke();
}
function getColorByIndex(index) {
var color = "#FF0000";
var colors = ["#FF0000", "#fff000", "#ff7100", "#8fff00", "#7100ff", "#f000ff", "#00fff0"];
try {
if (index < colors.length - 1) {
color = colors[index];
} else {
let random = Math.floor(Math.random() * ((colors.length - 1) + 1));
color = colors[random];
}
} catch (e) {
console.log(e);
}
return color;
}
//Image loading
window.addEventListener('load', function() {
document.querySelector('input[type="file"]').addEventListener('change', function() {
if (this.files && this.files[0]) {
var img = document.querySelector('img');
img.src = URL.createObjectURL(this.files[0]);
img.onload = imageIsLoaded;
}
});
});
function imageIsLoaded() {
resizeCanvas(img);
cocoSsd.load().then(model => {
if (isModelLoaded) {
startPredictions(model, img);
}
});
}
function updateTitle() {
var title = document.getElementById("loader_info");
title.textContent = "Model loaded successfully";
var element = document.getElementById("spinner_div");
element.classList.remove("spinner-border");
}
function getFont(canvas, fontSize, fontBase) {
var ratio = fontSize / fontBase;
var size = canvas.width * ratio;
return (size | 0) + 'px bold sans-serif';
}
</script>
</body>
</html>
###DEMO ・ デモ
https://codepen.io/mr1985/pen/LYpWVyo
###Information sources ・ 情報元
https://www.tensorflow.org/
https://www.pexels.com/