Welcome to HandDrawnDigitAI – an intuitive app for recognizing hand-drawn digits! Powered by CustomTkinter, a pre-trained Convolutional Neural Network (CNN), and a user-friendly GUI, this project brings machine learning right to your fingertips. Draw digits, recognize them instantly, and enjoy the seamless experience!
Interactive Drawing Canvas
Use the mouse to draw digits directly on the canvas.AI-Powered Digit Recognition
Recognize digits (0-9) using a pre-trained CNN model trained on the MNIST dataset.Dynamic Themes
Choose from multiple visually appealing themes:
🔵 Oceanic | 🌙 Dark Mode | 🎨 Vibrant | 🖤 Corporate | 🌸 Pink BlackModular Codebase
Clean and organized project structure for easy navigation.
| 🌙 Dark Mode | 🔵 Oceanic | 🌸 Pink Black |
|---|---|---|
- Draw a digit on the canvas.
- Press the "Predict" button, and the model will recognize the digit.
- If the prediction isn't clear, adjust and re-draw on the canvas!
- Use the "Clear Canvas" button to start over.
Make sure you have the following dependencies installed before running the app:
tensorflow==2.10.0
customtkinter==5.1.2
pillow==9.2.0
numpy==1.23.0
opencv-python==4.6.0
pip install -r requirements.txt
Follow these steps to get started:
- Clone the repository:
git clone https://github.com/asRot0/HandDrawnDigitAI.git
cd HandDrawnDigitAI
- Install the required dependencies:
pip install -r requirements.txt
- Run the app:
python run.py
- Draw digits and enjoy the magic!
Here are some important mathematical formulas used in this project
Convolutional layers apply filters to extract features from input images.
$O(i, j)$ → Output feature map at position$(i, j)$ .$I(i+m, j+n)$ → Input image pixels affected by the filter.$K(m, n)$ → Kernel (filter) values applied to the input.
Why Add?
- Represents how a filter (kernel) slides over an image to extract meaningful features.
- Core operation in Convolutional Neural Networks (CNNs).
ReLU Activation Function (Hidden Layers)
ReLU introduces non-linearity to the model by keeping only positive values.
$x$ → Input value to the activation function.
Why Add?
- Helps prevent vanishing gradients.
- Improves CNN’s ability to learn complex patterns.
Max pooling reduces the spatial size of feature maps while preserving key information.
$P(i, j)$ → Pooled output value at position$(i, j)$ .$F(i+m, j+n)$ → Input feature map values in the pooling region.$R$ → Pooling region (e.g., 2×2 or 3×3 window).
Why Add?
- Reduces computation and prevents overfitting.
- Keeps dominant features while discarding unnecessary details.
The softmax function converts model outputs into probability distributions.
$z_i$ → Raw score (logit) for class$( i )$ .$e^{z_i}$ → Exponential of the logit, ensuring positive values.$\sum_{j=1}^{n} e^{z_j}$ → Sum of exponentials across all$( n )$ classes (normalization factor).
Why Add?
- Softmax assigns probabilities to digit classes (0-9).
- Ensures outputs sum up to 1, making it interpretable.
Cross-entropy measures the difference between predicted and actual labels.
$\mathcal{L}$ → Cross-entropy loss value.$y_i$ → Actual label (ground truth) for class$( i )$ (1 for correct class, 0 otherwise).$\hat{y_i}$ → Predicted probability from thesoftmaxfunction.
Why Add?
- Penalizes incorrect predictions by increasing the loss.
- Common loss function for multi-class classification.
Adam adjusts learning rates based on gradients to optimize CNN performance.
$\theta_t$ → Model parameters at step$( t )$ .$m_t$ → First moment estimate (mean of gradients).$v_t$ → Second moment estimate (variance of gradients).$\eta$ → Learning rate (step size).$\epsilon$ → Small constant to avoid division by zero.
Why Add?
- Used as the optimizer in this project (
optimizer='adam'). - Combines momentum & adaptive learning rates for faster convergence.
These mathematical concepts power the CNN architecture used in this project. They help in feature extraction, classification, optimization, and learning to recognize hand-drawn digits efficiently and accurately.
- Asif Ahmed – GitHub
Creator and Maintainer
Want to contribute? Feel free to fork the repository and open a pull request!
If you find this project helpful, consider giving it a ⭐ on GitHub and sharing it with others!
