Saltar al contenido
ModelPublicadoExterno
Browse files

Alphabet Classifier

Two MobileNetV2-based ONNX models for classifying grayscale images of handwritten characters. Both models predict case-insensitively — they are trained on both upper and lowercase handwriting but always output a...

TipoOtherVersiónRevision cf2bb20Ccalidad

Fuente del modelo

Tipo
Other
Tamaño del archivo
153 KB–9,74 MB
Versión
vRevision cf2bb20
Actualizado
22 oct 2026
Descargas
0
Fuente
Hugging Face

Descripción de la fuente

Handwritten Character Classifier (EMNIST, MobileNetV2)

Two MobileNetV2-based ONNX models for classifying grayscale images of handwritten characters. Both models predict case-insensitively — they are trained on both upper and lowercase handwriting but always output a single canonical label per letter.

ModelClassesVal AccuracyONNX
AlphanumericDigits 0–9 + Letters A–Z + blank (37 total)91.42%outputs/exports/alphanumeric_model.onnx
AlphabetLetters A–Z + blank (27 total)96.18%outputs/exports/alphabet_model.onnx

Use the alphabet model when your input is guaranteed to be a letter (higher accuracy, no digit/letter confusion). Use the alphanumeric model when the input may be a digit or a letter.


Model Details

Shared architecture

PropertyValue
BackboneMobileNetV2 (pretrained ImageNet)
HeadLinear(1280→256) → BatchNorm → ReLU → Dropout(0.3) → Linear(256→N)
Parameters~2.56M
Input96 × 96 grayscale (expanded to 3-channel internally)
FormatONNX (opset 17)

Alphanumeric model — 37 classes

PropertyValue
Classes0–9 (indices 0–9), A–Z (indices 10–35), blank (index 36)
DatasetEMNIST byclass — both upper and lowercase handwriting, labels folded to uppercase
Train samples711,932
Val samples118,323
Val accuracy91.42%
Macro avg F10.917

Alphabet model — 27 classes

PropertyValue
ClassesA–Z (indices 0–25), blank (index 26)
DatasetEMNIST letters — upper and lowercase handwriting already merged at source
Train samples138,800
Val samples22,800
Val accuracy96.18%
Macro avg F10.960

Training Configuration

SettingValue
OptimizerAdamW — backbone lr × 0.1, head lr 5e-4, weight_decay 1e-4
SchedulerLinearLR warmup (5 epochs) → CosineAnnealingLR
LossCrossEntropyLoss with inverse-frequency class weights + label smoothing 0.10
Batch size256
Max epochs50
Early stoppingpatience 10
AugmentationRandomAffine, RandomPerspective, ColorJitter, GaussianBlur, RandomErasing
Mixed precisionAMP (CUDA only)
Blank classSynthetic white images; hard-floored weight ≥ 3.0

Per-class Performance

Alphanumeric model

Digits

ClassPrecisionRecallF1
00.7410.6860.712
10.7480.6930.719
20.9840.9490.967
30.9970.9950.996
40.9890.9740.981
50.9850.9280.956
60.9870.9760.981
70.9940.9970.995
80.9940.9880.991
90.9530.9620.958

Letters

ClassPrecisionRecallF1
A0.9770.9690.973
B0.9140.9710.942
C0.9660.9850.975
D0.9610.9760.969
E0.9920.9890.990
F0.9850.9830.984
G0.8180.8210.820
H0.9670.9820.974
I0.5450.6840.607
J0.9300.9500.940
K0.9870.9930.990
L0.5730.5370.554
M0.9920.9980.995
N0.9850.9840.984
O0.6480.6960.671
P0.9860.9940.990
Q0.7830.7610.772
R0.9860.9820.984
S0.9130.9780.944
T0.9890.9890.989
U0.9690.9550.961
V0.9120.9560.934
W0.9880.9970.992
X0.9760.9900.983
Y0.8960.9460.920
Z0.7620.9210.834

Blank

ClassPrecisionRecallF1
blank1.0001.0001.000

Hardest cases are I (F1=0.607) and L (F1=0.554), both confused with digit 1; and O (F1=0.671), confused with digit 0. These are inherent digit–letter ambiguities in alphanumeric OCR.


Alphabet model

ClassPrecisionRecallF1
A0.9590.9760.968
B0.9960.9860.991
C0.9840.9790.981
D0.9760.9740.975
E0.9840.9860.985
F0.9940.9760.985
G0.9270.8740.900
H0.9760.9780.977
I0.7600.7610.761
J0.9740.9650.969
K0.9960.9950.996
L0.7650.7700.768
M0.9860.9990.993
N0.9800.9810.981
O0.9750.9800.978
P0.9910.9910.991
Q0.8900.9280.908
R0.9790.9780.978
S0.9920.9890.991
T0.9750.9880.981
U0.9610.9440.952
V0.9450.9580.951
W0.9970.9900.993
X0.9900.9910.991
Y0.9650.9780.971
Z0.9950.9980.996
blank1.0001.0001.000

Hardest cases are I (F1=0.761) and L (F1=0.768), which are visually similar across handwriting styles. All other letters achieve F1 ≥ 0.90, and blank is perfect.


Usage

Alphanumeric model

from huggingface_hub import hf_hub_download
import onnxruntime as ort
import numpy as np
from PIL import Image

CHAR_CLASSES = list("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") + ["blank"]

path = hf_hub_download(
    repo_id="hermitkk/alphabet-classifier",
    filename="outputs/exports/alphanumeric_model.onnx",
)
session = ort.InferenceSession(path)

# Preprocess a 96x96 grayscale crop
img = Image.open("character.png").convert("L").resize((96, 96))
x = (np.array(img, dtype=np.float32) / 255.0 - 0.5) / 0.5
x = x[np.newaxis, np.newaxis, :, :]  # (1, 1, 96, 96)

logits = session.run(None, {"input": x})[0]
pred = int(np.argmax(logits))
print(CHAR_CLASSES[pred])  # e.g. "A", "3", "blank"

Alphabet model

from huggingface_hub import hf_hub_download
import onnxruntime as ort
import numpy as np
from PIL import Image

ALPHA_CLASSES = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ") + ["blank"]

path = hf_hub_download(
    repo_id="hermitkk/alphabet-classifier",
    filename="outputs/exports/alphabet_model.onnx",
)
session = ort.InferenceSession(path)

# Preprocess a 96x96 grayscale crop
img = Image.open("letter.png").convert("L").resize((96, 96))
x = (np.array(img, dtype=np.float32) / 255.0 - 0.5) / 0.5
x = x[np.newaxis, np.newaxis, :, :]  # (1, 1, 96, 96)

logits = session.run(None, {"input": x})[0]
pred = int(np.argmax(logits))
print(ALPHA_CLASSES[pred])  # e.g. "A", "blank"

Note: both models accept 96 × 96 single-channel float32 input, normalized to mean 0.5 / std 0.5. White pixels (blank paper) map to +1.0 and dark ink maps toward −1.0.


Reproduce Training

git clone https://huggingface.co/hermitkk/alphabet-classifier
cd alphabet-classifier
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

# Train alphanumeric model
python main.py train --config config/config.yaml

# Train alphabet model
python main.py train --config config/config_alphabet.yaml

License

MIT

Fuentes

1 fuente
Hugging FacePrincipalVersión cf2bb20a6606fa405afb8f0b3df986c22169760f
huggingface.co/hermitkk/alphabet-classifier/tree/cf2bb20a6606fa405afb8f0b3df986c22169760f

Verificado 22 oct

Download files

Artefactos del modelo

2 artefactos

outputs/exports/alphabet_model.onnx

onnx · 9,74 MB · SHA-256 a0c968787561…8688 · Hugging Face

Download file

outputs/exports/alphanumeric_model.onnx

onnx · 153 KB · SHA-256 8275b7a63cd7…85ad · Hugging Face

Download file

Extractos de fuentes

3 extractos

--- license: mit tags: - image-classification - onnx - pytorch - letters - digits - alphanumeric - emnist datasets: - emnist metrics: - accuracy --- # Handwritten Character Classifier (EMNIST, MobileNetV2) Two MobileNetV2-based ONNX models for classifying grayscale images of handwritten characters. Both models predict **case-insensitively** — they are trained on both upper and lowercase handwriting but always output a single canonical label per letter. | Model | Classes | Val Accuracy | ONNX | |---|---|---|---| | **Alphanumeric** | Digits 0–9 + Letters A–Z + blank (37 total) | **91.42%** | `outputs/exports/alphanumeric_model.onnx` | | **Alphabet** | Letters A–Z + blank (27 total) | **96.18%** | `outputs/exports/alphabet_model.onnx` | Use the **alphabet model** when your input is guaranteed to be a letter (higher accuracy, no digit/letter confusion). Use the **alphanumeric model** when the input may be a digit or a letter. --- ## Model Details ### Shared architecture | Property | Value | |---|---| | Backbone | MobileNetV2 (pretrained ImageNet) | | Head | Linear(1280→256) → BatchNorm → ReLU → Dropout(0.3) → Linear(256→*N*) | | Parameters | ~2.56M | | Input | 96 × 96 grayscale (expanded to 3-channel internally) | | Format | ONNX (opset 17) | ### Alphanumeric model — 37 classes | Property | Value | |---|---| | Classes | `0`–`9` (indices 0–9), `A`–`Z` (indices 10–35), `blank` (index 36) | | Dataset | EMNIST byclass — both upper and lowercase handwriting, labels folded to uppercase | | Train samples | 711,932 | | Val samples | 118,323 | | Val accuracy | **91.42%** | | Macro avg F1 | 0.917 | ### Alphabet model — 27 classes | Property | Value | |---|---| | Classes | `A`–`Z` (indices 0–25), `blank` (index 26) | | Dataset | EMNIST letters — upper and lowercase handwriting already merged at source | | Train samples | 138,800 | | Val samples | 22,800 | | Val accuracy | **96.18%** | | Macro avg F1 | 0.960 | --- ## Training Configuration | Setting | Value | |---|---| | Optimizer | AdamW — backbone lr × 0.1, head lr 5e-4, weight_decay 1e-4 | | Scheduler | LinearLR warmup (5 epochs) → CosineAnnealingLR | | Loss | CrossEntropyLoss with inverse-frequency class weights + label smoothing 0.10 | | Batch size | 256 | | Max epochs | 50 | | Early stopping | patience 10 | | Augmentation | RandomAffine, RandomPerspective, ColorJitter, GaussianBlur, RandomEr...

--- license: mit tags: - image-classification - onnx - pytorch - letters - digits - alphanumeric - emnist datasets: - emnist metrics: - accuracy --- # Alpha-Numeric Classifier (0–9, A–Z, blank) A lightweight CNN that classifies grayscale images of handwritten digits (0–9), uppercase letters (A–Z), and blank boxes, trained on a combined EMNIST Digits + Letters dataset with synthetic blank images. ## Model Details | Property | Value | |---|---| | Architecture | SmallAlphaNet (depthwise-separable CNN) | | Parameters | 38,373 | | Input | 64 × 64 grayscale image | | Output | 37-class softmax (0–9, A–Z, blank) | | Format | ONNX (opset 17) | | Val accuracy | **90.18%** | The architecture uses depthwise-separable convolutions (like MobileNet) to stay small and fast while achieving strong accuracy. ## Training Configuration | Setting | Value | |---|---| | Dataset | EMNIST Digits + Letters (`train` split) + synthetic blanks | | Train samples | 374,800 (240,000 digits + 124,800 letters + 10,000 blank) | | Val samples | 62,800 (40,000 digits + 20,800 letters + 2,000 blank) | | Optimizer | AdamW (lr=0.001, weight_decay=1e-4) | | Scheduler | CosineAnnealingLR | | Batch size | 256 | | Max epochs | 30 | | Early stopping | patience=8 | | Augmentation | RandomAffine, RandomPerspective, ColorJitter, GaussianBlur, RandomErasing | ## Classes | Index | Character | |---|---| | 0–9 | Digits `0`–`9` | | 10–35 | Uppercase letters `A`–`Z` | | 36 | Blank (empty box) | ## Per-class Performance ### Digits | Class | Precision | Recall | F1 | |---|---|---|---| | 0 | 0.834 | 0.979 | 0.900 | | 1 | 0.569 | 0.970 | **0.717** | | 2 | 0.950 | 0.975 | 0.962 | | 3 | 0.993 | 0.995 | 0.994 | | 4 | 0.966 | 0.980 | 0.973 | | 5 | 0.967 | 0.956 | 0.961 | | 6 | 0.977 | 0.985 | 0.981 | | 7 | 0.989 | 0.995 | 0.992 | | 8 | 0.977 | 0.987 | 0.982 | | 9 | 0.909 | 0.983 | 0.945 | ### Letters | Class | Precision | Recall | F1 | |---|---|---|---| | A | 0.913 | 0.933 | 0.923 | | B | 0.941 | 0.905 | 0.923 | | C | 0.950 | 0.976 | 0.963 | | D | 0.953 | 0.915 | 0.934 | | E | 0.973 | 0.963 | 0.968 | | F | 0.976 | 0.953 | 0.964 | | G | 0.861 | 0.658 | **0.746** | | H | 0.948 | 0.939 | 0.943 | | I | 0.676 | 0.471 | **0.555** | | J | 0.947 | 0.924 | 0.935 | | K | 0.985 | 0.971 | 0.978 | | L | 0.876 | 0.256 | **0.397** | | M | 0.974 | 0.995 | 0.985 | | N | 0.953 | 0.956 | 0.954 | | O | 0.696 | 0.1...

Source context: 0 downloads · 0 likes · Pipeline image-classification · Repo hermitkk/alphabet-classifier