Skip to content

Commit 9a54418

Browse files
authored
Add files via upload
1 parent 7a29a6c commit 9a54418

File tree

2 files changed

+200
-0
lines changed

2 files changed

+200
-0
lines changed

js/app.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Get elements
2+
const canvas = document.getElementById("sketchpad");
3+
const ctx = canvas.getContext("2d");
4+
const predictButton = document.getElementById("predict_button");
5+
const resultSpan = document.getElementById("result");
6+
const confidenceSpan = document.getElementById("confidence_percentage");
7+
const tutorialDiv = document.getElementById("tutorial");
8+
let isDrawing = false;
9+
10+
// Set up canvas
11+
canvas.width = 300;
12+
canvas.height = 300;
13+
ctx.lineWidth = 15;
14+
ctx.lineCap = "round";
15+
ctx.strokeStyle = "#000";
16+
17+
// Draw on canvas
18+
canvas.addEventListener("mousedown", (e) => {
19+
isDrawing = true;
20+
ctx.beginPath();
21+
ctx.moveTo(e.offsetX, e.offsetY);
22+
});
23+
24+
canvas.addEventListener("mousemove", (e) => {
25+
if (!isDrawing) return;
26+
ctx.lineTo(e.offsetX, e.offsetY);
27+
ctx.stroke();
28+
});
29+
30+
canvas.addEventListener("mouseup", () => {
31+
isDrawing = false;
32+
});
33+
34+
// Clear the canvas
35+
function clearCanvas() {
36+
ctx.clearRect(0, 0, canvas.width, canvas.height);
37+
resultSpan.textContent = "-";
38+
confidenceSpan.textContent = "0%";
39+
}
40+
41+
// Predict the digit
42+
function predictDigit() {
43+
const imageData = canvas.toDataURL().split(",")[1];
44+
// This is where you'd add your prediction logic using TensorFlow.js
45+
// For now, simulating prediction with dummy data
46+
const predictedDigit = Math.floor(Math.random() * 10);
47+
const confidence = Math.floor(Math.random() * 100);
48+
49+
resultSpan.textContent = predictedDigit;
50+
confidenceSpan.textContent = confidence + "%";
51+
}
52+
53+
// Toggle Dark Mode
54+
function toggleDarkMode() {
55+
document.body.classList.toggle("dark-mode");
56+
}
57+
58+
// Toggle tutorial
59+
function toggleTutorial() {
60+
tutorialDiv.classList.toggle("hidden");
61+
}
62+
63+
// Show tutorial on load
64+
window.onload = function () {
65+
setTimeout(() => {
66+
tutorialDiv.classList.remove("hidden");
67+
}, 1000);
68+
};

js/main.js

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
var canvas, ctx;
2+
var lastX, lastY, mouseDown = 0;
3+
var touchX, touchY;
4+
let model;
5+
6+
// Initialize canvas and set up event listeners for mouse and touch interactions
7+
function init() {
8+
canvas = document.getElementById("sketchpad");
9+
ctx = canvas.getContext("2d");
10+
ctx.fillStyle = "black";
11+
ctx.fillRect(0, 0, canvas.width, canvas.height);
12+
13+
if (ctx) {
14+
// Mouse event listeners for desktop
15+
canvas.addEventListener("mousedown", sketchpad_mouseDown, false);
16+
canvas.addEventListener("mousemove", sketchpad_mouseMove, false);
17+
window.addEventListener("mouseup", sketchpad_mouseUp, false);
18+
19+
// Touch event listeners for mobile
20+
canvas.addEventListener("touchstart", sketchpad_touchStart, false);
21+
canvas.addEventListener("touchmove", sketchpad_touchMove, false);
22+
window.addEventListener("touchend", sketchpad_touchEnd, false);
23+
}
24+
}
25+
26+
// Drawing function for canvas
27+
function draw(ctx, x, y, isDown) {
28+
if (isDown) {
29+
ctx.beginPath();
30+
ctx.strokeStyle = "white";
31+
ctx.lineWidth = 15;
32+
ctx.lineJoin = ctx.lineCap = "round";
33+
ctx.moveTo(lastX, lastY);
34+
ctx.lineTo(x, y);
35+
ctx.stroke();
36+
}
37+
lastX = x;
38+
lastY = y;
39+
}
40+
41+
// Mouse event handlers
42+
function sketchpad_mouseDown(e) {
43+
mouseDown = 1;
44+
getMousePos(e);
45+
draw(ctx, mouseX, mouseY, false);
46+
}
47+
48+
function sketchpad_mouseUp() {
49+
mouseDown = 0;
50+
}
51+
52+
function sketchpad_mouseMove(e) {
53+
getMousePos(e);
54+
if (mouseDown) draw(ctx, mouseX, mouseY, true);
55+
}
56+
57+
// Get mouse position relative to canvas
58+
function getMousePos(e) {
59+
var rect = canvas.getBoundingClientRect();
60+
mouseX = e.clientX - rect.left;
61+
mouseY = e.clientY - rect.top;
62+
}
63+
64+
// Touch event handlers for mobile
65+
function sketchpad_touchStart(e) {
66+
mouseDown = 1;
67+
getTouchPos(e);
68+
draw(ctx, touchX, touchY, false);
69+
e.preventDefault();
70+
}
71+
72+
function sketchpad_touchMove(e) {
73+
getTouchPos(e);
74+
if (mouseDown) draw(ctx, touchX, touchY, true);
75+
e.preventDefault();
76+
}
77+
78+
function sketchpad_touchEnd() {
79+
mouseDown = 0;
80+
}
81+
82+
// Get touch position relative to canvas
83+
function getTouchPos(e) {
84+
var rect = canvas.getBoundingClientRect();
85+
touchX = e.touches[0].clientX - rect.left;
86+
touchY = e.touches[0].clientY - rect.top;
87+
}
88+
89+
// Clear canvas
90+
document.getElementById("clear_button").addEventListener("click", function () {
91+
ctx.clearRect(0, 0, canvas.width, canvas.height);
92+
ctx.fillStyle = "black";
93+
ctx.fillRect(0, 0, canvas.width, canvas.height);
94+
});
95+
96+
// Load the model
97+
(async function () {
98+
model = await tf.loadLayersModel("https://maneprajakta.github.io/Digit_Recognition_Web_App/models/model.json");
99+
})();
100+
101+
// Preprocess the canvas image for model input
102+
function preprocessCanvas(image) {
103+
let tensor = tf.browser
104+
.fromPixels(image)
105+
.resizeNearestNeighbor([28, 28])
106+
.mean(2)
107+
.expandDims(2)
108+
.expandDims()
109+
.toFloat();
110+
return tensor.div(255.0);
111+
}
112+
113+
// Predict digit on "Predict" button click
114+
document.getElementById("predict_button").addEventListener("click", async function () {
115+
let tensor = preprocessCanvas(canvas);
116+
let predictions = await model.predict(tensor).data();
117+
displayLabel(predictions);
118+
});
119+
120+
// Display prediction results
121+
function displayLabel(data) {
122+
var max = data[0];
123+
var maxIndex = 0;
124+
for (var i = 1; i < data.length; i++) {
125+
if (data[i] > max) {
126+
maxIndex = i;
127+
max = data[i];
128+
}
129+
}
130+
document.getElementById("result").innerHTML = maxIndex;
131+
document.getElementById("confidence").innerHTML = "Confidence: " + (max * 100).toFixed(2) + "%";
132+
}

0 commit comments

Comments
 (0)