Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Trang Chủ Hướng Dẫn Đồ Án Tạo hệ thống nhận dạng chữ viết từ phiếu khảo sát
Hướng Dẫn Đồ ÁnLập Trình AI

Tạo hệ thống nhận dạng chữ viết từ phiếu khảo sát

Chia sẻ
Chia sẻ

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.

  1. Truy cập https://colab.research.google.com
  2. Chọn File > New notebook
  3. 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)

from tensorflow.keras import layers, models

model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(26, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.summary()

Huấn luyện mô hình

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}')

Biểu đồ học tập

import matplotlib.pyplot as plt

plt.plot(history.history['accuracy'], label='Độ chính xác huấn luyện')
plt.plot(history.history['val_accuracy'], label='Độ chính xác kiểm tra')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

Trích xuất và nhận dạng ký tự từ phiếu khảo sát

Sử dụng OpenCV để phát hiện các vùng chứa chữ viết tay trên ảnh phiếu khảo sát, sau đó gọi model vừa huấn luyện để thực hiện nhận diện cho từng ký tự chữ đơn lẻ.

import cv2

image = cv2.imread('survey_form.jpg', cv2.IMREAD_GRAYSCALE)
thresh = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY_INV)[1]

contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    x, y, w, h = cv2.boundingRect(cnt)
    roi = thresh[y:y+h, x:x+w]
    roi_resized = cv2.resize(roi, (28, 28)).reshape(1, 28, 28, 1) / 255.0
    prediction = model.predict(roi_resized)
    predicted_label = chr(tf.argmax(prediction, axis=1).numpy()[0] + 65)
    print(f'Nhận dạng: {predicted_label}')

Gợi ý cải tiến

  1. Áp dụng data augmentation như xoay, dịch, làm mờ để tăng tính đa dạng.
  2. Sử dụng transfer learning với EfficientNet hoặc ResNet để cải thiện độ chính xác.
  3. Xây dựng pipeline OCR hoàn chỉnh từ ảnh đến dữ liệu text JSON.
  4. Triển khai hệ thống thành ứng dụng web với Flask hoặc FastAPI.
  5. Đưa mô hình lên cloud để xử lý phiếu khảo sát theo thời gian thực.

Kết luận

Bạn vừa hoàn thành một hệ thống nhận dạng chữ viết tay từ phiếu khảo sát với EMNIST Letters, từ tiền xử lý dữ liệu, huấn luyện mô hình CNN, đến trích xuất ký tự từ ảnh phiếu. Đây là một dự án thực tế, phù hợp để ứng dụng trong giáo dục, khảo sát khách hàng hoặc số hóa tài liệu.

Để nâng cao hơn, bạn có thể tích hợp hệ thống vào workflow tự động hóa, hoặc kết hợp thêm OCR đa ngôn ngữ để xử lý các phiếu khảo sát phức tạp hơn. Đây là nền tảng tuyệt vời để bước tiếp vào các dự án AI chuyên nghiệp.

Tham Gia Nhóm – Hỗ Trợ Lập Trình

Hỗ Trợ Đồ Án – ThueDoAn.vn

Liên quan
Hướng Dẫn Đồ Án

Checklist 10 bước kiểm tra cuối cùng trước khi nhấn nút nộp đồ án

Thời điểm chuẩn bị nhấn nút nộp đồ án luôn mang lại...

Hướng Dẫn Đồ Án

Tuyệt chiêu đối phó với những giảng viên hướng dẫn ‘khó tính’ nhất

Giai đoạn làm đồ án tốt nghiệp luôn đi kèm với vô...

Hướng Dẫn Đồ Án

Tại sao việc quản lý Source Code bằng Git lại quan trọng hơn bạn nghĩ?

Trong thế giới lập trình hiện đại, mã nguồn chính là linh...

Hướng Dẫn Đồ Án

Những chức năng ‘thừa’ khiến bạn tốn thời gian mà không được cộng điểm

Làm đồ án tốt nghiệp là một cuộc đua thực thụ với...

Hướng Dẫn Đồ Án

Cách xử lý khi đề tài bị trùng lặp ý tưởng với các khóa trước quá nhiều

Lựa chọn đề tài đồ án luôn là bước khởi đầu đầy...

Hướng Dẫn Đồ Án

Làm sao để giải trình với giảng viên khi code bị nghi ngờ là đi chép?

Trong quá trình thực hiện đồ án, việc tham khảo mã nguồn...

Hướng Dẫn Đồ Án

Cảnh báo: Những nguồn share code ‘rác’ trên mạng cần tuyệt đối tránh

Trong quá trình làm đồ án, việc tìm kiếm sự hỗ trợ...

Hướng Dẫn Đồ Án

Sai lầm khi chọn công nghệ quá khó so với năng lực thực tế của bản thân

Chọn đề tài và công nghệ cho đồ án luôn là bước...

Liên Hệ
Liên hệ để được tư vấn & hỗ trợ đồ án CNTT nhé bạn!