Amazing-Python-Scripts
295 строк · 7.0 Кб
1//-------------------
2// GLOBAL variables
3//-------------------
4let model;5
6var canvasWidth = 150;7var canvasHeight = 150;8var canvasStrokeStyle = "white";9var canvasLineJoin = "round";10var canvasLineWidth = 10;11var canvasBackgroundColor = "black";12var canvasId = "canvas";13
14var clickX = new Array();15var clickY = new Array();16var clickD = new Array();17var drawing;18
19document.getElementById('chart_box').innerHTML = "";20document.getElementById('chart_box').style.display = "none";21
22//---------------
23// Create canvas
24//---------------
25var canvasBox = document.getElementById('canvas_box');26var canvas = document.createElement("canvas");27
28canvas.setAttribute("width", canvasWidth);29canvas.setAttribute("height", canvasHeight);30canvas.setAttribute("id", canvasId);31canvas.style.backgroundColor = canvasBackgroundColor;32canvasBox.appendChild(canvas);33if(typeof G_vmlCanvasManager != 'undefined') {34canvas = G_vmlCanvasManager.initElement(canvas);35}
36
37ctx = canvas.getContext("2d");38
39
40//---------------------
41// MOUSE DOWN function
42//---------------------
43$("#canvas").mousedown(function(e) {44var rect = canvas.getBoundingClientRect();45var mouseX = e.clientX- rect.left;;46var mouseY = e.clientY- rect.top;47drawing = true;48addUserGesture(mouseX, mouseY);49drawOnCanvas();50});51
52//-----------------------
53// TOUCH START function
54//-----------------------
55canvas.addEventListener("touchstart", function (e) {56if (e.target == canvas) {57e.preventDefault();58}59
60var rect = canvas.getBoundingClientRect();61var touch = e.touches[0];62
63var mouseX = touch.clientX - rect.left;64var mouseY = touch.clientY - rect.top;65
66drawing = true;67addUserGesture(mouseX, mouseY);68drawOnCanvas();69
70}, false);71
72//---------------------
73// MOUSE MOVE function
74//---------------------
75$("#canvas").mousemove(function(e) {76if(drawing) {77var rect = canvas.getBoundingClientRect();78var mouseX = e.clientX- rect.left;;79var mouseY = e.clientY- rect.top;80addUserGesture(mouseX, mouseY, true);81drawOnCanvas();82}83});84
85//---------------------
86// TOUCH MOVE function
87//---------------------
88canvas.addEventListener("touchmove", function (e) {89if (e.target == canvas) {90e.preventDefault();91}92if(drawing) {93var rect = canvas.getBoundingClientRect();94var touch = e.touches[0];95
96var mouseX = touch.clientX - rect.left;97var mouseY = touch.clientY - rect.top;98
99addUserGesture(mouseX, mouseY, true);100drawOnCanvas();101}102}, false);103
104//-------------------
105// MOUSE UP function
106//-------------------
107$("#canvas").mouseup(function(e) {108drawing = false;109});110
111//---------------------
112// TOUCH END function
113//---------------------
114canvas.addEventListener("touchend", function (e) {115if (e.target == canvas) {116e.preventDefault();117}118drawing = false;119}, false);120
121//----------------------
122// MOUSE LEAVE function
123//----------------------
124$("#canvas").mouseleave(function(e) {125drawing = false;126});127
128//-----------------------
129// TOUCH LEAVE function
130//-----------------------
131canvas.addEventListener("touchleave", function (e) {132if (e.target == canvas) {133e.preventDefault();134}135drawing = false;136}, false);137
138//--------------------
139// ADD CLICK function
140//--------------------
141function addUserGesture(x, y, dragging) {142clickX.push(x);143clickY.push(y);144clickD.push(dragging);145}
146
147//-------------------
148// RE DRAW function
149//-------------------
150function drawOnCanvas() {151ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);152
153ctx.strokeStyle = canvasStrokeStyle;154ctx.lineJoin = canvasLineJoin;155ctx.lineWidth = canvasLineWidth;156
157for (var i = 0; i < clickX.length; i++) {158ctx.beginPath();159if(clickD[i] && i) {160ctx.moveTo(clickX[i-1], clickY[i-1]);161} else {162ctx.moveTo(clickX[i]-1, clickY[i]);163}164ctx.lineTo(clickX[i], clickY[i]);165ctx.closePath();166ctx.stroke();167}168}
169
170//------------------------
171// CLEAR CANVAS function
172//------------------------
173$("#clear-button").click(async function () {174ctx.clearRect(0, 0, canvasWidth, canvasHeight);175clickX = new Array();176clickY = new Array();177clickD = new Array();178$(".prediction-text").empty();179$("#result_box").addClass('d-none');180});181
182//-------------------------------------
183// loader for cnn model
184//-------------------------------------
185async function loadModel() {186console.log("model loading..");187
188// clear the model variable189model = undefined;190
191// load the model using a HTTPS request (where you have stored your model files)192model = await tf.loadLayersModel("models/model.json");193
194console.log("model loaded..");195}
196
197loadModel();198
199//-----------------------------------------------
200// preprocess the canvas
201//-----------------------------------------------
202function preprocessCanvas(image) {203// resize the input image to target size of (1, 28, 28)204let tensor = tf.browser.fromPixels(image)205.resizeNearestNeighbor([28, 28])206.mean(2)207.expandDims(2)208.expandDims()209.toFloat();210console.log(tensor.shape);211return tensor.div(255.0);212}
213
214//--------------------------------------------
215// predict function
216//--------------------------------------------
217$("#predict-button").click(async function () {218// get image data from canvas219var imageData = canvas.toDataURL();220
221// preprocess canvas222let tensor = preprocessCanvas(canvas);223
224// make predictions on the preprocessed image tensor225let predictions = await model.predict(tensor).data();226
227// get the model's prediction results228let results = Array.from(predictions);229
230// display the predictions in chart231$("#result_box").removeClass('d-none');232displayChart(results);233displayLabel(results);234
235console.log(results);236});237
238//------------------------------
239// Chart to display predictions
240//------------------------------
241var chart = "";242var firstTime = 0;243function loadChart(label, data, modelSelected) {244var ctx = document.getElementById('chart_box').getContext('2d');245chart = new Chart(ctx, {246// The type of chart we want to create247type: 'bar',248
249// The data for our dataset250data: {251labels: label,252datasets: [{253label: modelSelected + " prediction",254backgroundColor: '#f50057',255borderColor: 'rgb(255, 99, 132)',256data: data,257}]258},259
260// Configuration options go here261options: {}262});263}
264
265//----------------------------
266// display chart with updated
267// drawing from canvas
268//----------------------------
269function displayChart(data) {270var select_model = document.getElementById("select_model");271var select_option = "CNN";272
273label = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];274if (firstTime == 0) {275loadChart(label, data, select_option);276firstTime = 1;277} else {278chart.destroy();279loadChart(label, data, select_option);280}281document.getElementById('chart_box').style.display = "block";282}
283
284function displayLabel(data) {285var max = data[0];286var maxIndex = 0;287
288for (var i = 1; i < data.length; i++) {289if (data[i] > max) {290maxIndex = i;291max = data[i];292}293}294$(".prediction-text").html("Predicting you draw <b>"+maxIndex+"</b> with <b>"+Math.trunc( max*100 )+"%</b> confidence")295}
296
297