Sử dụng SVM trong OpenCV để nhận dạng ký tự

SVM là một kỹ thuật hay, đơn giản nhưng hiệu quả cao. Các bạn có thể đọc bài LIBSVM – giới thiệu tổng quan và ví dụ để có thể hiểu khái quát SVM là gì. Nhận diện ký tự hay là dự đoán nhãn của ảnh input, ở đây là ảnh ký tự.

Bài này sẽ hướng dẫn các bạn dùng SVM có sẵn trong lib OpenCV để nhận diện ký tự. Bài này khá đơn giản với mục đích cho các bạn thấy tính ứng dụng thực tế của SVM. Sau đó có thể đọc các bài viết nâng cao để hiểu sâu và nâng cao độ chính xác bằng các tham số phù hợp

Các bước thực hiện

  1. Chuẩn bị bộ dữ liệu ký tự
  2. Train SVM
  3. Test (predict) kết quả

Chuẩn bị bộ dữ liệu ký tự

Mình đã chuẩn bị sẵn cho các bạn, bao gồm 2 bộ dữ liệu (nằm chung trong source code cuối bài):

    Train set: 10 folder từ 0 – 9 chứa các ký tự tương ứng.
    Test set: 1 vài ký tự dùng để test độ chính xác

Mình vẽ ký tự màu đỏ vì màu đen – trắng khá là khó nhìn, còn thực tế là sẽ làm với ảnh xám – gray scale. Link download ở cuối bài.

Train SVM

Thuật toán như sau: với mỗi ảnh 2D chuyển thành ảnh 1D. Sau đó ghép các ảnh 1D thành ảnh 2D dùng để huấn luyện.

Ảnh 1D là ảnh có height = 1, có thể xem nó là mảng 1 chiều. Còn ảnh 2D có height > 1 và cũng xem như là mảng 2 chiều.
Thí dụ: ảnh 2D có kích thước 10 x 10 pixels chuyển thành ảnh 1D có kích thước là 100 x 1 pixels.

Ảnh ký tự 2D và chuyển sang 1D (mình tăng height cho các bạn dễ nhìn)
charater_3
matdata

Minh họa cho việc duỗi thẳng ảnh, các dòng được nối với nhau thành 1 dòng duy nhất.

Sau khi ghép các ký tự từ 0 – 9 được hình như sau:
digist
mMatdata

Tiếp theo là tạo 1 danh sách các nhãn của ảnh train, danh sách nhãn cũng là ảnh 1D theo thứ tự. Do đó danh sách nhãn là 0123456789

Code để train nằm ở cuối bài. Sau khi train thì được 1 file text.

Test (predict) kết quả

Lấy 1 ảnh bất kỳ chưa được train để dự đoán kết quả. Kết quả là nhãn mà chương trình dự đoán dựa trên tập dữ liệu mà các bạn đã cho học.

Source code

Source code SVM OpenCV nằm trong repo các example về Machine Learning. Bạn checkout branch SvmOpenCV để sử dụng.

Trong source code chứa sẵn 2 bộ dữ liệu Train set và Test set. Các bạn build SvmOpenCV_Training.sln để traning file model. Sau khi training model thành công build SvmOpenCV_Classifier.sln để phân lớp hình ảnh.

Các hàm cần thiết của SVM viết sẵn trong file TGMTsvm.cpp. Chúc các bạn thành công.

SvmOpenCV (GitHub)

37 thoughts on “Sử dụng SVM trong OpenCV để nhận dạng ký tự

  1. em tải về cho chạy nó báo Error 1 error C1083: Cannot open include file: ‘stdafx.h’: No such file or directory
    và không tìm dc nhiều nữa
    em phải thay đổi cái gì để nó chạy dc ak

    1. bạn build solution nào bị lỗi vậy? Mình thử download về build được bình thường.

      Lỗi mà bạn cung cấp là do thiếu file stdafx.h, bạn kiểm tra xem có lỡ tay xóa mất không

    1. Mình nghĩ trong quá trình download về source code bị sửa xóa gì rồi, bạn chịu khó download rồi build lại

    1. ok bạn, mình sẽ sắp xếp thời gian để làm video hướng dẫn

    1. Solution training dùng để huấn luyện, predict dùng để dự đoán 1 ảnh, còn Classifier dùng để dự đoán hàng loạt ảnh

    1. Nếu bộ data input có kích thước tương tự nhau, vị trí biển báo trong ảnh tương tự nhau về góc chụp, tỉ lệ width/height,… thì chương trình này đã có thể phân loại được rồi.

      Còn nếu bộ dữ liệu khác nhau khá nhiều về góc chụp, kích thước,… thì phải qua bước tiền xử lý nữa để cho dữ liệu được tương đồng.

    1. bộ nào vậy? mình chưa upload bộ ảnh biển báo giao thông

  2. Bộ ảnh có 16.000 ảnh, chia ra làm 5 loại:

    Phía trước xe hơi
    Phía sau xe hơi
    Phía trước xe máy
    Phía sau xe máy
    Ảnh không chứa biển số (ảnh rác)
    bộ này ak
    vì em cũng đang làm về đề tài này

    1. Bộ này là hình ảnh xe máy, xe hơi, biển số chứ không hề có biển báo giao thông

    1. Hiện tại thì mình chỉ chuyển qua ảnh xám mà thôi, cho nên độ chính xác chưa cao. Do ví dụ này chỉ là để giới thiệu thuật toán nên không đi sâu vào code tiền xử lý.

    1. Mỗi file có 1 chức năng riêng, không hiểu thì ráng đọc cho hiểu thôi

  3. em có ngồi lập trình lại nhưng mắc 1 vài lỗi em không sửa dc
    em khai báo
    void _tmain(int argc, _TCHAR*argv[]) thì nó lỗi ở -TCHAR và em tìm ra là tại em không có module tchar.h
    nhưng module em tưởng khi mình built dât nó có sẵn nhưng sao của em không có như của a
    mông a chỉ hộ e

    1. bạn thay _TCHAR bằng char là được, build bằng Visual Studio bản bao nhiêu?

Leave a Reply