Phân loại hình ảnh bằng KNN

Bài viết này tiếp theo bài Phân lớp (classifier) là gì. Phía đối tác của mình gửi rất nhiều hình ảnh biển số xe cho mình test thử phần mềm nhận diện biển số. Tuy nhiên bộ ảnh này rất lộn xộn, có cả ảnh xe máy, xe hơi, ảnh chụp phía trước, phía sau xe và ảnh không có biển số. Thuê người phân loại rất tốn công và tốn chi phí, do đó mình nghĩ ra cách áp dụng thuật toán xử lý ảnh để phân loại hình ảnh tự động.

Bài này sử dụng command line để truyền tham số nên yêu cầu phải hiểu được bat script.

Hiện tại có 2 thuật toán khá phù hợp cho ứng dụng phân loại là SVM và KNN. Nhưng khi chạy thử thì KNN cho kết quả chính xác hơn SVM rất nhiều. Do đó bài này sẽ tập trung vào KNN (k-nearest neighbor).

Data

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

  1. Phía trước xe hơi
  2. Phía sau xe hơi
  3. Phía trước xe máy
  4. Phía sau xe máy
  5. Ảnh không chứa biển số (ảnh rác)

Để phân loại hình ảnh dùng 2 chương trình sử dụng thuật toán KNN sử dụng lib opencv:

  1. KnnTraining.exe: dùng để training dữ liệu input tạo ra file *.yaml. Dữ liệu để training được phân loại thành các folder, tên mỗi folder là 1 ký tự 0-9 hoặc A-Z, trong mỗi folder chứa từ 10 ảnh trở lên
  2. KnnClassifier.exe: dùng để phân loại hình ảnh dựa vào file kết quả đã training. Chương trình sẽ phân loại ảnh vào đúng folder

Thực hành

Các bạn download bộ ảnh ở link cuối bài, trong đó kèm theo các file sau:

  1. KnnTraining.exeKnnClassifier.exe: là chương trình dùng để training và phân loại hình ảnh, truyền tham số bằng command line
  2. opencv_world320.dll: file DLL của opencv giúp cho 2 chương trình trên chạy được
  3. trainingknn.bat: truyền tham số cho chương trình KnnTraining.exe. Tham số đầu vào là folder chứa dữ liệu training (Trainset) và output là file data.knn
  4. classifierknn.bat: truyền tham số cho chương trình KnnClassifier.exe. Tham số đầu vào là folder chứa ảnh chưa phân loại và file data.knn vừa được training xong

Hình ảnh trước khi phân loại gồm nhiều loại ảnh lộn xộn, có cả xe máy xe hơi, mặt người lái xe
Screenshot 2017-06-28 10.53.27

Sau khi phân loại thì ảnh được sắp xếp vào các folder A,B,C,D,E trong folder output. Các folder từ A-Z và 0-9 là chương trình tự động tạo ra sẵn.
Screenshot 2017-06-28 11.06.28

Hiện tại mình đã viết command để truyền tham số sẵn hết rồi, các bạn chỉ cần chạy file trainingknn.bat rồi chạy file classifierknn.bat là được. Chương trình sẽ sắp xếp ảnh từ folder raw vào folder con A,B,C,D nằm trong output. Thử nghiệm trên máy CPU Core i5 2500 mất 50 giây.

Một số lưu ý:

– Khi phân loại ảnh, chương trình KnnClassifier.exe tự động tạo các folder rỗng từ 0-1 và A-Z trong output. Tuy nhiên do học từ folder trainset có các lớp A,B,C,D,E nên hình ảnh chỉ sắp vào các folder tương ứng.
– Giải thuật nào cũng có tỉ lệ sai nhất định. Do đó để chương trình chính xác hơn cần đem 1 số hình ảnh phân loại sai vào folder trainset để training lại rồi phân loại vài lần.
– Chương trình chỉ chạy được trên Windows 64bit

Download source code

Đầu tiên các bạn checkout repo: https://github.com/thigiacmaytinh/TGMTcpp. Trong repo này có nhiều example khác nhau, các bạn chỉ cần build KnnTraining.slnKnnClassifier.sln là được.

12 thoughts on “Phân loại hình ảnh bằng KNN

    1. VS 2013 vẫn chạy được nhé, nhưng khuyến khích nâng cấp lên VS2015 vì toàn bộ source code mình upload lên đang dần chuyển sang VS 2015 vì có rất nhiều điểm lợi. Nổi bật nhất là support nhiều tính năng của C++ 11

    2. anh có thể cho em xin code để nghiên cứu không ak
      của em chạy nó báo “the code execution canot proceed because MSVCP140.dll was not found

    1. opencv 3.2 chạy tốt trên Visual Studio 2013 mà. Nhưng mình recommend sử dụng Visual Studio 2015 community

    1. Mình đã upload lại source code ở cuối bài rồi nhé bạn

Leave a Reply