Phân lớp hình ảnh bằng KNN

Phân lớp hiểu đơn giản là tìm nhãn của dữ liệu. Có nhiều bài toán về phân lớp, như là phân lớp động vật, ký tự, đồ vật,… Để làm được điều đó đầu tiên phải training bằng bộ dữ liệu đã được phân lớp sẵn, từ kết quả training mà phân lớp dữ liệu input. Để dễ so sánh mình sử dụng 2 thuật toán là SVM và KNN cho các bạn dễ hình dung.

Ngoài hình ảnh ký tự các bạn có thể dùng các bộ hình ảnh khác để test.

Các bạn có thể tham khảo thêm Nhận diện ký tự bằng KNN

Giới thiệu thuật toán

Hãy tưởng tượng hình bên dưới là bản đồ chụp từ vệ tinh. Có 2 khu rừng: rừng lá kim (màu đỏ) và rừng lá rộng (màu xanh) nằm cạnh bên nhau. Vậy cây mọc tại vị trí màu trắng là cây lá kim hay cây lá rộng? Ý tưởng của thuật toán KNN là tìm số lượng k cây gần với cây gần dự đoán. Số lượng cây nào nhiều hơn thì trả về kết quả là cây đó.

Giả sử lấy k=9 (9 cây xung quanh) có 2 cây lá rộng, 7 cây lá kim, vậy người ta sẽ dự đoán cây màu trắng là cây lá kim. Thuật toán này căn cứ vào phân bố xác suất.

Chuẩn bị dữ liệu

Trong bài này mình sẽ minh hoạ bằng phân lớp ký tự, link download bộ dữ liệu example nằm ở cuối bài. Download về giải nén các bạn sẽ có:

  • raw: thư mục chứa các ký tự chưa được sắp xếp
  • Trainset: thư mục chứa các ký tự đã được sắp xếp
  • 1.KNNtraining.bat: dùng để training model knn
  • 2.KNNclassifier.bat: dùng để phân lớp dùng model knn đã được training
  • 1.SVMtraining.bat: dùng để training model svm
  • 2.SVMclassifier.bat: dùng để phân lớp dùng model svm đã được training

Các file exe đã được file *.bat truyền tham số sẵn cho các bạn. Có thể mở xem file bat để xem cách truyền tham số như thế nào. Còn file opencv_world320.dll chứa các hàm cần thiết để chạy chương trình.

Do file ví dụ có cả KNN lẫn SVM vì sử dụng 2 thuật toán để so sánh trên cùng tập dữ liệu.

1.KNNtraining.bat
KnnTraining.exe -in Trainset -out char.knn -w 12 -h 28
Trainset là folder chứa các folder con, mỗi folder con chứa các hình ảnh cùng loại.
char.knn là file model đã huấn luyện xong, bản thân nó là file YAML
-w, -h là kích thước của hình ảnh sẽ dùng để huấn luyện. Nếu ảnh input khác -w, -h thì sẽ resize kích thước chỉ định.

2.KNNclassifier.bat
KnnClassifier.exe -file char.knn -in raw -out raw -w 12 -h 28
char.knn là file model đã huấn luyện xong ở bước 1
raw là folder, -in và -out cùng folder nghĩa là sắp xếp hình ảnh về cùng folder
-w, -h là kích thước của hình ảnh sẽ dùng để huấn luyện. Nếu ảnh input khác -w, -h thì sẽ resize kích thước chỉ định.

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

  1. Sắp xếp vài ký tự vào các folder trong thư mục Training (mình đã làm trước 1 vài ký tự)
  2. Chạy file 1.KNNtraining.bat để training, chương trình sẽ lấy các file trong thư mục Training và tạo ra file char.knn
  3. Chạy file 2.KNNclassifier.bat để sắp xếp các ký tự trong thư mục raw vào đúng chỗ
  4. Sau khi phân lớp, các ký tự nào bị phân lớp sai (sai folder) thì cut qua thư mục Trainset rồi chạy lại bước 1

Sau khi làm nhiều lần, khi file char.knn được học đầy đủ dữ liệu sẽ phân loại đúng hơn. Với SVM cũng làm các bước tương tự.

Download

training_example_char.zip (37MB)

Leave a Reply