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
- Chuẩn bị bộ dữ liệu ký tự
- Train SVM
- 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)
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:
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.
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
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
nó báo thiếu hết các file trong TGMT
mà trong project em thấy vẫn có
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
anh làm một video hướng dẫn code bài này thì tốt quá
ok bạn, mình sẽ sắp xếp thời gian để làm video hướng dẫn
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
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
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
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.
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
bộ nào vậy? mình chưa upload bộ ảnh biển báo giao thông
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
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
SvmOpenCV_Classifierd.exe has triggered a breakpoint.
lỗi này là gì ak
oh search breakpoint là gì nhé, cái này của Visual Studio
vâng em nhầm
thế bộ ảnh này thì có phải tiền xử lý không ak
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ý.
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
Mỗi file có 1 chức năng riêng, không hiểu thì ráng đọc cho hiểu thôi
vâng e sẽ cố gắng hì hì
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
bạn thay _TCHAR bằng char là được, build bằng Visual Studio bản bao nhiêu?
bản 2015 ak
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
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
chụp hình gửi lên đây
Directory \”%s\” does not exist nó chỉ nháy dòng chữ này rồi thoát luôn thôi ak
download source code lại rồi chạy lại từ đầu
em cũng làm như vậy rồi nhưng chạy Solution training thì nó đã bị như vậy rồi
anh có thể teamview sửa giúp em cho nó chạy với
chat fb đi
nick em là là Tuannobitom .Em vừa gửi tin nhắn cho anh rồi
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 đỡ 🙂
tự viết thôi bạn, đây nhé: https://thigiacmaytinh.com/su-dung-floodfill-de-tim-ky-tu/
Anh có face không ạ!! cho em hỏi anh kỹ hơn!! 🙂
Ở footer nhé