[Nhận diện biển số xe] Chương 5 – Nhận diện biển số xe bằng WPOD và SVM

Xin chào cả nhà, Tết đến nơi rồi nên bận kinh khủng, tuần vừa qua mình tối mắt tối mũi thanh ra không thể ra bài kịp thời mong các bạn thông cảm nhé. Hôm nay chúng ta sẽ cùng nhau Nhận diện biển số xe bằng WPOD và SVM nhé!

Hôm trước mình có guide các bạn cách nhận diện biển số bằng WPOD và Tesseract OCR tại đây. Cách đó thì đơn giản nhưng sẽ bị phụ thuộc vào Tess nhiều, và nhiều bạn nói nó “tù”. Do vậy bây giờ chúng ta sẽ cùng nhau tự làm bằng OpenCV và dùng SVM để nhận ký tự nhé.

Go go go!

Quên, mình share full bộ digit ở đây nhé: https://www.mediafire.com/file/3l3x7bd7rq91l5r/data_digit.zip/file

Phần 1 – Chuẩn bị nguyên vật liệu nào

Các bạn lại tạo thư mục như thường lệ với cái tên MiAI_LP_Detection_SVM đi, lưu cho nó máu. Sau khi tạo xong gõ lệnh git lấy source về thôi:

git clone https://github.com/thangnch/MiAI_LP_Detection_SVM .

Lấy git xong thì cài cắm các loại thư viện cần thiết nào:

pip install -r setup.txt

Done một phát là nhảy sang bước sau được ngay. Còn có lỗi thì các bạn chịu khó đọc tý tiếng Anh xem bị sao nhé.

Phần 2 – Tìm hiểu qua về pipeline của bài toán

Khác với bài trước cứ phang thằng Tess vào là xong, lần này sẽ khác chút nhé, các bạn chú ý đọc kỹ để hiểu các bước làm thì lúc đọc code sẽ dễ dàng hơn.

  • Bước 0: Chuẩn bị dữ liệu chữ số và train một model SVM để nhận diện ký tự sau đó lưu ra file.
  • Bước 1: Đọc file ảnh đầu vào. Ảnh này gồm toàn cảnh chiếc xe chẳng hạn.
  • Bước 2: Dùng WPOD để tách biển số ra khỏi ảnh và thực hiện skew ảnh để dễ xử lý tiếp. Các bước này khá phức tạp nhưng chúng ta đã có “thánh” WPOD làm hộ hết rồi.
  • Bước 3: Thực hiện threshold để phân tách trắng đen và đồng thời khử nhiễu qua một chút.
  • Bước 4. Tìm các contour trong ảnh đã threshold và giữ lại các contour có khả năng là số.
  • Bước 5. Nhận diện các contour đó bằng SVM đã train ở bước 0 và in kết quả biển số ra màn mình thôi.

Rồi, xong lý thuyết, anh em Mì sẽ tiến hành thực hành luôn và ngay cho nóng nhé!

Phần 3 – Tiến hành viết code nhận diện biển số SVM

Do bài này có khá nhiều bước nên các bạn chịu khó theo dõi và đọc kỹ nhé. Mình sẽ cùng nhau làm từng bước một.

Bước 1: Train model SVM

Các bạn chú ý trong thư mục data sẽ có nhiều thư mục: 0,1,2,3…. Đó là các thư mục chứa các ảnh các chữ số, kí tự và được đánh số theo thứ tự mã ASCII. Bên trong chứa toàn ảnh là ảnh và chúng ta sẽ dùng ảnh này để train SVM.

Bây giờ các bạn mở file trainSVM.py và đọc code. File này sẽ gồm các phần việc sau:

  • Load dữ liệu trong thư mục data
  • Train model SVM
  • Save model SVM ra file.

Mình đã comment đầy đủ, các bạn đọc nhé!

nhận diện biển số

Bước 2. Xử lý cái biến số và tìm các contour có khả năng là số

Bây giờ chúng ta đọc tiếp file read_plate.py, chúng ta sẽ thấy mình thực hiện load ảnh, tách biển số bằng WPOD và sau đó là threshold và khử nhiễu. Cuối cùng tìm các contour là số và hiển thị lên màn hình để kiểm tra.

nhận diện biển số

Về phần tìm contour là số thì các bạn chú ý cách làm là: duyệt hết các contour mà kiểm tra các bounding box của các contour đó, nếu có 1 tỷ lệ nhất định giữa width và height thì nó là số. Ở dây mình đang để là ratio này nằm trong khoảng 1.5 < ratio < 3.5. Ngoài ra mình chỉ chọn các contour có chiều cao từ 60% chiều cao biển số trở lên.

Và đây là các contour mình tìm được từ biển số.

biển số

Chi tiết các bạn đọc mã nguồn nhé.

Bước 3. Duyệt qua các contour và predict biển số

Bây giờ với các contour nói trên, chúng ta trích xuất ra và thực hiện đưa vào model SVM để predict xem số đó là số nào. Cuối cùng ghép cả chuỗi lại sẽ có được giá trị biển số.

Các bạn xem tiếp đoạn mã nguồn sau nhé.

Phần 4 – Chạy file và tận hưởng kết quả nhận diện biển số

Đầu tiên, nếu bạn muốn train lại thì chạy file trainSVM.py còn nếu không thì thôi, next luôn!

Bạn chạy file read_plate.py và sau đó tận hưởng thành quả, kết quả cuối cùng sẽ là hình ảnh biển số in lên ảnh nhé!

nhận diện biển số SVM

Okie, vậy là chúng ta đã cùng nhau tìm hiểu cách nhận diện biển số thành công rồi. Còn rất nhiều cách nhận diện khác nhau nữa như CTC, YOLO… nhưng tạm thời nếu bạn detect và skew tốt thì SVM là khá ổn rồi nhé. Xin tạm biệt các bạn tai đây và hẹn gặp lại trong các bài tiếp theo nhé!

Chú ý: Bài này mình làm sample với biển dài. Biển vuông các bạn chia đôi ra là xong nhé. Chúc các bạn thành công!

Hãy join cùng cộng đồng Mì AI nhé!

Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Website: https://miai.vn
Youtube: http://bit.ly/miaiyoutube

Related Post

19 Replies to “[Nhận diện biển số xe] Chương 5 – Nhận diện biển số xe bằng WPOD và SVM”

  1. Chào anh, anh có thể hướng dẫn chi tiết hơn về phần biển số vuông được không ạ. Em cảm ơn!

  2. Chào anh, anh cho em hỏi là số lượng chiều để phân loại kí tự trong project này là bao nhiêu và dựa vào đâu để xác định ạ?

  3. Dạ anh ơi, mỗi lần mình muốn train thêm dữ liệu mới, là mình cắt ký tự từ biển số rồi bỏ vào folder phù hợp( ví dụ ký tự 0 bỏ vào folder 0) rồi train. Em thấy thế hơi bất lợi. Có cách nào mà khi mình chạy nó tự cắt và bỏ vào folder phù hợp rồi train luôn không ạ. Em cảm ơn nhiều ạ

    1. Mình thấy cách đấy không bất lợi lắm. Vì các ảnh phải kèm label của nó. Ảnh toàn số 0 để trong folder 0. Khi lấy label thì chỉ cần lấy tên folder chứa ảnh đó là xong. Và cũng có thể đảm bảo đc số ảnh mỗi label là như nhau.

  4. Em không biết cách nào để cưa đôi dùng, a có chỉ qua cho e được không ạ

  5. Cho mình hỏi source code trên git chạy với python bản bao nhiêu, mình chạy bản 3.7.6 bị lỗi

Leave a Reply

Your email address will not be published. Required fields are marked *