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

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 Responses to Sử dụng SVM trong OpenCV để nhận dạng ký tự

  1. Tuan Ngo van says:

    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

    • vohungvi says:

      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

  2. Tuan Ngo van says:

    nó báo thiếu hết các file trong TGMT
    mà trong project em thấy vẫn có

    • vohungvi says:

      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

  3. Tuan Ngo van says:

    anh làm một video hướng dẫn code bài này thì tốt quá

    • vohungvi says:

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

  4. Tuan Ngo van says:

    theo như anh nói thì chỉ cần chạy file tranning vs predict
    thế file class không phải chạy hả a

    • vohungvi says:

      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

  5. Tuan Ngo van says:

    thực ra em ms học nên không hiểu lắm nhưng bh em muốn phân loại bộ ảnh biển báo giao thông của anh thì có phải thay đổi nhiều không ak

    • vohungvi says:

      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.

  6. Tuan Ngo van says:

    bộ ảnh biển báo giao thông trong bài phân loại ảnh bằng knn của anh thì có cần tiền xử lí không ak

  7. Tuan Ngo van says:

    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

    • vohungvi says:

      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

  8. Tuan Ngo van says:

    SvmOpenCV_Classifierd.exe has triggered a breakpoint.
    lỗi này là gì ak

  9. Tuan Ngo van says:

    vâng em nhầm
    thế bộ ảnh này thì có phải tiền xử lý không ak

    • vohungvi says:

      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ý.

  10. Tuan Ngo van says:

    ak cho em hỏi các file TGMT
    các file ah lập trình sẵn đó có chức năng gì ak
    vì em đọc nhưng không hiểu lắm

    • vohungvi says:

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

  11. Tuan Ngo van says:

    vâng e sẽ cố gắng hì hì

  12. Tuan Ngo van says:

    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

    • vohungvi says:

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

  13. Tuan Ngo van says:

    Anh VĨ cho em hỏi anh gán địa chỉ của data ở như thế nào ak.em tìm hoài không thấy

  14. Tuan Ngo van says:

    sao em built nó toàn báo lỗi thư mục không tồn tại vậy anh chỉ giúp em cái

  15. Tuan Ngo van says:

    Directory \”%s\” does not exist nó chỉ nháy dòng chữ này rồi thoát luôn thôi ak

  16. Tuan Ngo van says:

    em cũng làm như vậy rồi nhưng chạy Solution training thì nó đã bị như vậy rồi

  17. Tuan Ngo van says:

    anh có thể teamview sửa giúp em cho nó chạy với

  18. Tuan Ngo van says:

    nick em là là Tuannobitom .Em vừa gửi tin nhắn cho anh rồi

  19. HOÀNG Oai says:

    anh ơi, anh dùng phần mềm gì để cắt ảnh vậy!!! em tìm không có phần mềm nào cắt ảnh!! Mong được anh giúp đỡ 🙂

Leave a Reply