Trong kỷ nguyên số hóa, tự động hóa việc nhập liệu từ phiếu khảo sát viết tay trở thành một nhu cầu cấp thiết giúp các tổ chức tiết kiệm thời gian và giảm sai sót. Nếu bạn là người đã từng thử qua các dự án như nhận diện chữ viết tay MNIST hoặc phân tích dữ liệu y tế từ file CSV, bạn sẽ thấy bài toán này mở rộng thêm lớp thách thức thực tế — không chỉ nhận dạng ký tự rõ nét, mà còn phải trích xuất từ ảnh phiếu khảo sát có layout phức tạp và chữ viết đa dạng. Chính sự phong phú của ứng dụng thực tế khiến dự án này trở thành công cụ tuyệt vời để bổ sung vào portfolio Machine Learning.
Bài viết này sẽ hướng dẫn bạn xây dựng một hệ thống nhận dạng chữ viết tay từ phiếu khảo sát. Toàn bộ quy trình từ chuẩn bị dữ liệu, xử lý ảnh, phân vùng ký tự, xây dựng mô hình mạng nơ-ron tích chập (CNN), đến huấn luyện và đánh giá sẽ được trình bày chi tiết. Dataset EMNIST được sử dụng để thay thế MNIST truyền thống vì nó bao gồm chữ cái và số viết tay phong phú hơn, phù hợp hơn với yêu cầu nhận dạng từ phiếu khảo sát thực tế.
Tìm hiểu về EMNIST và tại sao nên sử dụng
EMNIST (Extended MNIST) là tập dữ liệu mở rộng từ MNIST, được phát triển để bổ sung khả năng nhận dạng chữ cái viết tay ngoài chữ số. Bộ dữ liệu này được xây dựng từ NIST Special Database 19 và định dạng lại thành chuẩn 28×28 pixel như MNIST, giúp dễ dàng tích hợp với các mô hình học sâu đã quen thuộc. EMNIST có nhiều phiên bản nhỏ như ByClass, ByMerge, Letters, Digits, Balanced và MNIST để phục vụ các nhu cầu khác nhau. Trong bài này, chúng ta sẽ sử dụng EMNIST Letters gồm 26 chữ cái tiếng Anh.
Trong các phiếu khảo sát thực tế, dữ liệu chữ viết tay không chỉ bao gồm chữ số mà còn cả chữ cái. EMNIST cung cấp lượng dữ liệu lớn và đa dạng hơn MNIST, giúp mô hình học được nhiều dạng chữ viết tay hơn, từ đó cải thiện khả năng tổng quát hóa khi áp dụng trên dữ liệu thực.
Chuẩn bị môi trường làm việc
Sử dụng Google Colab
Google Colab là một lựa chọn lý tưởng để huấn luyện mô hình vì cung cấp GPU miễn phí, dễ chia sẻ và không cần cài đặt phần mềm phức tạp.
- Truy cập https://colab.research.google.com
- Chọn File > New notebook
- Vào Runtime > Change runtime type > chọn GPU
Cài đặt thư viện
Chạy lệnh sau để cài đặt các thư viện cần thiết:
!pip install tensorflow numpy matplotlib seaborn scikit-learn opencv-python
Tải và xử lý dữ liệu EMNIST
Tải dữ liệu
Tải EMNIST Letters từ nguồn chính thức:
import tensorflow as tf
import tensorflow_datasets as tfds
(ds_train, ds_test), ds_info = tfds.load(
'emnist/letters',
split=['train', 'test'],
shuffle_files=True,
as_supervised=True,
with_info=True
)
Tiền xử lý dữ liệu
Chuẩn hóa dữ liệu để giúp mô hình học tốt hơn:
def normalize_img(image, label):
return tf.cast(image, tf.float32) / 255.0, label-1 # labels bắt đầu từ 1
ds_train = ds_train.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_train = ds_train.cache().shuffle(1000).batch(128).prefetch(tf.data.AUTOTUNE)
ds_test = ds_test.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_test = ds_test.batch(128).cache().prefetch(tf.data.AUTOTUNE)
Xây dựng mô hình mạng nơ-ron tích chập (CNN)
history = model.fit(
ds_train,
epochs=15,
validation_data=ds_test
)
Đánh giá mô hình
Độ chính xác
test_loss, test_acc = model.evaluate(ds_test)
print(f'Độ chính xác trên tập kiểm tra: {test_acc:.4f}')

