Nhận diện và trích xuất thông tin biển số xe Việt Nam

Tram Ho

1. Lời nói đầu

Cùng với sự phát triển về khoa học và tốc độ xử lý của máy tính ngày càng cao, việc áp dụng trí tuệ nhân tạo vào các lĩnh vực trong đời sống đã trở thành xu hướng phát triển không thể bỏ qua. Bằng các sử dụng các kỹ thuật xử lý ảnh và trí tuệ nhân tạo, bài toán nhận diện và trích xuất biển số xe đã trở nên phổ biến và tiện lợi hơn bao giờ hết, đóng vai trò quan trọng trong việc quản lý giao thông và đảm bảo an toàn cho người tham gia giao thông. Trong bài viết này, tôi sẽ giới thiệu về bài toán nhận diện và trích xuất thông tin biển số xe và thực hành xây dựng nó. Code và data để thực hiện dự án các bạn có thể tham khảo thêm tại đây.

2. Chuẩn bị dữ liệu

GreenParking là bộ dữ liệu được mình sử dụng để training với YOLOv7 (You Only Live Once), dữ liệu đã được mình tải trong github. Để train dữ liệu này với Yolo thì ta cần tực hiện gán nhãn mỗi ảnh tọa độ của vùng chứa biển số xe (x, y, w, h). Ở đay mình sử dụng công cụ LabelImage được hỗ trợ bởi python để thực hiện việc gán nhãn. Để cài đặt và sử dụng bạn có thể tham khảo tại đây.
Một số thao tác quan trọng mình liệt kê như sau:

Phím tắtChức năng
Ctrl + sLưu
Ctrl + uTải toàn bộ ảnh từ một folder
wMở chức năng vẽ bounding box
dẢnh tiếp theo
aẢnh trước đó
delxóa bounding box đang vẽ

3. Quy trình thực hiện bài toán

Quá trình mình thực hiện gồm 4 bước:

  • Xác định vùng ảnh chứa biển số xe bằng Yolov7 và lưu ảnh đã vẽ countour vào folder results_detect.
  • Cắt đối tượng đó và lưu vào folder results_crop.
  • Trích xuất thông tin bằng kỹ thuật OCR
  • In kết quả

3.1 Xác định vùng ảnh chứa biển số xe bằng YoloV7.

Cách train Yolo các bạn có thể tham khảo tại file code train_yolov7.ipynb. Vì đối tượng đầu ra của bài toán chỉ là biển số xe, vì vậy số lượng đối tượng là 1, tương đương với index class là 0 nhưng labelimg đã được huấn luyện sẵn một số đối tượng nên đầu ra sẽ có index class > 0 thì chúng ta không thể thực hiện huấn luyện được vì vậy cần phải chuyển index class về bằng 0. Đây là đoạn code được mình sử dụng để tự động chuyển đổi index class:

Sau khi thực hiện xử lý dữ liệu huấn luyện, tiếp theo các bạn cần đi đến bước nạp dữ liệu và điều chỉnh tham số:

Ở đây mình chọn số lượng class (nc) là 1 với tên của class là “license plate” với tập dữ liệu training và validation đều là giống nhau. Tiếp theo sẽ đi đến bước huấn luyện mô hình, để chọn model nào cho Yolo V7 thì tùy thuộc vào nhu cầu bài toán của bạn và chi phí xử lý cũng như khả năng tính toán của máy tính. Mình thực hiện trên colab và đánh giá 2 model được sử dụng như sau:

  • Với model v7 để đạt được các chỉ số Precision, Recall và mAP@0.5 lần lượt là 1, 1 và 0.995 cần 50-60 epochs để hội tụ.
  • Tương tự với model v7x thì chỉ cần 10 epochs, tuy nhiên chi phí và thời gian tính toán cho 1 epoch của v7x lớn hơn rất nhiều so với v7.
    Lưu ý: Nếu các bạn không muốn thực hiện training lại có thể tải file weight mình đã train sẵn ở đường link gắn bên trong file best_pt.txt

3.2 Trích xuất thông tin bằng kỹ thuật OCR.

Đầu tiên bạn cần biết OCR là gì: OCR là viết tắt của Optical Character Recognition, là một công nghệ (lưu ý rằng OCR không phải một mô hình hay thuật toán) dùng để nhận dạng và chuyển đổi hình ảnh hoặc tài liệu văn bản thành dữ liệu có thể sử dụng được bằng máy tính. Trước đây, khi cần đưa tài liệu giấy vào hệ thống máy tính để xử lý, người dùng phải gõ lại các thông tin từ tài liệu giấy thành văn bản trên máy tính. Tuy nhiên, với sự phát triển của OCR, quá trình này trở nên đơn giản hơn rất nhiều. OCR có thể quét hình ảnh hoặc tài liệu văn bản, phân tích các ký tự trong hình ảnh đó, sau đó chuyển đổi chúng thành văn bản có thể sửa đổi được. OCR được sử dụng rộng rãi trong nhiều lĩnh vực như quản lý tài liệu, xử lý ảnh y khoa, xử lý ngôn ngữ tự nhiên và nhiều lĩnh vực khác. OCR được áp dụng trong các ứng dụng như quét tài liệu, chuyển đổi tài liệu giấy thành định dạng điện tử, tạo bản sao điện tử của tài liệu, xử lý dữ liệu từ các tài liệu giấy, và nhiều ứng dụng khác.

Bạn có thể cài đặt OCR bằng dòng lệnh:

4. Kết quả


image.png

Project nhận diện và trích xuất thông tin biển số xe của mình đã thực hiện được. Tuy nhiên đây chỉ là một module được mình triển khai một cách sơ khai nên còn tồn tại một số nhược điểm: tốc độ xử lý còn khá kém, hoạt động kém với ảnh quá mờ, …. Ở đây mình cũng đã thử thực hiện phát hiện biển số bằng opencv:

image.png

Mình đã sử dụng opencv để xử lý ảnh cũng như kết hợp với phương pháp toán học để xoay ảnh, sau khi detect thành công các bạn có thể bo viền từng ký tự và sử dụng KNN để trích xuất. Ở bài viết sau mình sẽ làm rõ và chia sẻ hơn về phương pháp này.

Hy vọng bài viết của mình sẽ giúp ích cho các bạn. Các bạn có câu hỏi hay thắc mắc gì thì hãy comment cho mình nhé. Để tạo thêm động lực cho mình các bạn có thể giúp mình upvote bài viết nhé !!

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo