Spaces:
Sleeping
Improving Digit Recognition Accuracy
The updated version includes several improvements to increase recognition accuracy. Here's what changed and how to get the best results:
π§ Model Improvements
Better Neural Network Architecture
CNN (Convolutional Neural Network) instead of simple Dense layers
- Better at learning spatial patterns in images
- Multiple convolutional blocks with max pooling
More training epochs: 20 epochs instead of 10
- Longer training time but better accuracy
Data augmentation:
- Rotations (Β±20Β°)
- Shifts (Β±10%)
- Shear transformations
- Zoom variations
- Helps model generalize to different handwriting styles
Batch normalization: Stabilizes training
Higher dropout rates: Better regularization
Expected Model Accuracy
- On MNIST test set: ~99%
- On real handwriting: 70-95% (varies by writing style)
πΈ Image Processing Improvements
The backend now applies advanced preprocessing:
- Gaussian Blur: Reduces noise in the drawing
- Adaptive Thresholding: Better binarization (black and white conversion)
- Contour Detection: Finds and isolates the digit
- Automatic Centering: Centers the digit in the image
- High-quality Resizing: LANCZOS interpolation for sharp 28Γ28 image
This matches how MNIST dataset was prepared!
βοΈ Drawing Tips for Best Results
1. Draw Large & Bold
- Fill as much of the canvas as possible
- Use thick, confident strokes
- The model expects digits that fill most of the space
2. Keep It Simple
- Draw one digit at a time
- Don't add decorations or flourishes
- Stick to standard digit shapes
3. Clean Strokes
- Use smooth, continuous lines
- Avoid shaky or jerky movements
- Keep thickness consistent
4. Centered Position
- Keep the digit roughly centered
- Leave some margin around edges
- The model will auto-center anyway
5. Standard Style
- Write digits as you normally would
- Not too slanted or rotated
- Avoid unusual personal styles
6. Proper Timing
- Draw at a normal, comfortable pace
- Not too fast or slow
- Smooth pressure on mouse
π― Digit-Specific Tips
Easy to Recognize
- 0, 1, 4, 7: Simple, distinct shapes
- 6, 9: Distinct loop patterns
- 2, 5: Unique curves
Harder to Recognize
- 3, 8: Can look similar to each other
- 5, 6: Similar curves and loops
- 3, 5: Similar bends
Tip: Make distinctions clear:
- 3 vs 5: Make 3's curves more open
- 8 vs 6: Make 8's loops clearly separated
- 6 vs 9: Clear which way the loop faces
π§ͺ Testing & Troubleshooting
If accuracy is still low:
1. Check Model Training
# Delete old model to retrain
rm digit_model.h5
python app.py
The model will retrain and might perform better.
2. Verify Preprocessing
- Check that the digit is white on a black background
- Canvas should now be pure black (was blue)
- White strokes are critical
3. Clear Drawing Issues
- If canvas looks faded, refresh the page
- Ensure drawing is crisp and clean
- Use a mouse, not a touchpad if possible
4. Compare Different Digits
- Try drawing multiple digits
- See which ones are recognized well
- This helps identify writing style issues
π Model Architecture (Improved)
Input (28Γ28Γ1)
β
Conv2D 32 filters + BatchNorm + ReLU
β
Conv2D 32 filters + BatchNorm + ReLU
β
MaxPool (2Γ2) + Dropout(0.25)
β
Conv2D 64 filters + BatchNorm + ReLU
β
Conv2D 64 filters + BatchNorm + ReLU
β
MaxPool (2Γ2) + Dropout(0.25)
β
Conv2D 128 filters + BatchNorm + ReLU
β
MaxPool (2Γ2) + Dropout(0.25)
β
Flatten
β
Dense 256 + BatchNorm + ReLU + Dropout(0.5)
β
Dense 128 + BatchNorm + ReLU + Dropout(0.5)
β
Dense 10 (Softmax output for 0-9)
Total Parameters: ~650K Training Time: 5-10 minutes first run
π If You Want Even Better Accuracy
Option 1: Train on Custom Data
Collect samples of your own handwriting and retrain:
# Add your custom training data
custom_digits = [...] # Your digit images
custom_labels = [...] # Their labels
# Combine with MNIST
x_combined = np.concatenate([x_train, custom_digits])
y_combined = np.concatenate([y_train, custom_labels])
# Retrain model
model.fit(x_combined, y_combined, epochs=5, ...)
Option 2: Use Pre-trained Model
Download a pre-trained model from TensorFlow Hub or Keras Applications:
from tensorflow.keras.applications import MobileNetV2
# Use transfer learning for better performance
Option 3: Ensemble Predictions
Train multiple models and average their predictions:
model1 = train_model()
model2 = train_model_different_seed()
model3 = train_model_different_seed()
# Average predictions
avg_prediction = (
model1.predict(x) +
model2.predict(x) +
model3.predict(x)
) / 3
π Performance Expectations
| Drawing Style | Expected Accuracy |
|---|---|
| Clean, printed-like | 95-99% |
| Normal handwriting | 80-90% |
| Cursive/decorative | 60-75% |
| Very sloppy | 40-60% |
Remember: The model is trained on the MNIST dataset, which has specific digit styles. The more your handwriting matches those styles, the better the accuracy.
π Common Issues & Solutions
Issue: Low accuracy on certain digits
Solution:
- Make that digit more distinct
- Use clearer shapes
- Avoid mixing with other digits
Issue: Model says wrong digit with high confidence
Solution:
- Your drawing might not match training style
- Try different writing style
- Retrain model with your handwriting samples
Issue: Confidence is always low
Solution:
- Drawing might be too faint
- Use bolder, darker strokes
- Fill more of the canvas
- Check canvas background is pure black
Issue: Same drawing predicts different digits
Solution:
- Drawing might be ambiguous
- Make it clearer and more distinct
- Avoid overlapping strokes
- Draw more centered
β Checklist for Best Results
- Canvas background is pure black
- Drawing strokes are bright white
- Digit fills most of the canvas
- Strokes are smooth and continuous
- Digit is roughly centered
- No extra marks or decorations
- Using standard digit shapes
- Not too slanted or rotated
- Drawing at normal pace
- Model has been trained (first run takes 5-10 min)
π Quick Start with Improvements
# 1. Install dependencies (including opencv-python)
pip install --default-timeout=1000 -r requirements.txt
# 2. Run the app (will train improved model)
python app.py
# 3. Open http://localhost:5000
# 4. Draw with white on black background
# 5. Click predict and get results!
π Technical References
- CNN for digit recognition: https://keras.io/examples/vision/mnist_convnet/
- MNIST dataset: http://yann.lecun.com/exdb/mnist/
- Image preprocessing: https://en.wikipedia.org/wiki/Thresholding_(image_processing)
- Data augmentation: https://www.tensorflow.org/guide/keras/preprocessing_layers
Most Important: The model works best when you write naturally but clearly. Don't overthink it! The improvements in this version should handle most handwriting styles well.
Good luck! π―