Vụ nhận diện biển số là một điều khá thú vị được bàn luận khi nói tới biển số mới đang được cấp ở Việt Nam. Hiện tại hệ thống nhận diện biển số đang được nhiều chính phủ sử dụng để giám sát giao thông, phạt nguội, và nhiều thứ khác nữa. Những hệ thống này có độ chính xác cao, chạy ổn định và đáng tin cậy nhờ sự phổ biến của camera an ninh và những tiến bộ trong ngành AI.
Bài này mình có dùng một số ảnh trong series bài viết Nhận diện biển số bằng Python và OpenCV của bạn quangnhatnguyenle trên Medium. Anh em nào muốn thực hành, tự mình làm ra một model nhận diện biển số thì có thể làm theo.
Để nhận diện biển số, người ta phải làm gì?
Thứ nhất là camera
Camera ở đây là bất kì thiết bị nào có khả năng ghi hình. Thứ được dùng phổ biến trong các hệ thống công cộng chính là camera an ninh, thứ mà bạn thấy người ta hay gắn ở ngoài đường, trên cột điện hoặc trên các trụ biển báo. Ở Việt Nam giờ cũng đầy khu vực gắn camera an ninh, bạn có thể dễ dàng bắt gặp khi đi trên các tuyến đường lớn, đường chính.
Nhưng không nhất thiết đó phải là camera an ninh loại xịn. Ừ thì để chạy được ngoài trời, độ bền cao, có thể chống chọi với va đập, bụi, nước thì sẽ cần loại đắt tiền nhưng thực tế bạn cũng có thể nhận diện biển số chỉ từ ảnh chụp bởi điện thoại, hình ảnh từ webcam, hình từ máy ảnh… cũng được. Miễn là bạn có hình ảnh là ok. Hình ảnh rõ ràng, nét thì càng tốt, hình ảnh mờ quá thì thuật toán nhận diện sẽ hoạt động không hiệu quả bằng.
Về bản chất, video là một loạt các tấm ảnh được cho chạy với tốc độ rất cao, ví dụ là 25 tấm mỗi giây, hay 30 tấm mỗi giây (gọi là frame per second - FPS). Camera thường sẽ hoạt động ở các mức 24FPS, 25FPS hoặc 30FPS. Việc nhận diện, phân tích hình ảnh thực tế sẽ được làm trên mỗi tấm ảnh, có điều thời gian xử lý rất nhanh, chỉ vài mili giây hoặc vài chục, vài trăm mili giây mỗi khung ảnh mà thôi. Hệ thống có thuật toán tốt, hạ tầng mạnh mẽ và được tối ưu với các bộ xử lý đồ họa ngon có thể xử lý vài nghìn, thậm chí chục nghìn khung hình mỗi giây mà không gặp vấn đề gì.
Video khi được ghi nhận từ các camera an ninh trên đường sẽ được truyền bằng Internet đến các trung tâm xử lý dữ liệu. Các trung tâm này chính là nơi mà thuật toán sẽ xử lý các bước tiếp theo và đưa ra kết quả, chứ con người không cần phải ngồi xem thủ công từng luồng video một. Cả thành phố có đến hàng nghìn, thậm chí là chục nghìn cái camera, người đâu mà xem cho hết. Chưa kể con người thì thường không chính xác như máy ở những việc lặp đi lặp lại và có phần nhàm chán như thế này.
Sau đó bạn cần một vài thuật toán đủ tốt
Thuật toán sẽ làm nhiệm vụ nhận diện biển số và nhận diện số trên biển (sẽ nói kĩ hơn ở bên dưới). Ngoài ra bạn cũng sẽ cần thêm thuật toán để phát hiện xe vi phạm hoặc xe cần theo dõi, ví dụ như phát hiện xe đi quá tốc độ, xe đỗ sai vị trí, xe đi sai làn đường…
2 bước để nhận diện biển số xe
Khi nhìn vào tấm hình bên dưới bạn có thấy được ngay lập tức những kí tự trên biển số không?
Quảng cáo
Được đúng không? Thực ra là do não của bạn đã quen với việc đó rồi, và nó có thể xử lý khái niệm về “biển số” rất nhanh bởi bạn đã được dạy từ nhỏ rằng: Một tấm dài dài hoặc vuông vuông, gắn trên xe, thì đó có khả năng cao là biển số. Bạn được dạy điều đó vài lần, lặp đi lặp lại với vài chiếc xe, và khi nhìn qua những xe khác, bạn biết đó chính là biển số dù xe có màu khác, xe có thể là loại khác luôn. Rồi bạn còn được dạy chữ, nên nhìn vào bạn biết được các kí tự trên biển số là gì.
Não có tốc độ xử lý cực nhanh nên bạn không để ý rằng thực ra quá trình này có tới 2 giai đoạn lận: bước nhận biển số, và bước nhận kí tự trên biển. Máy nó cũng chạy theo cách y chang. Bạn phải dạy cho nó rằng đó là cái biển số, nó sẽ tách hình ảnh của biển số ra khỏi tấm ảnh lớn. Hình ảnh của biển số sau khi tách sẽ hình thành nên một vùng gọi là Region of Interest (RoI), và máy sẽ chỉ chạy thuật toán nhận diện kí tự trên đúng khu vực ROI này mà thôi để tăng tốc độ và độ chính xác. Hình bên dưới là ảnh biển số đã tách khỏi tấm ảnh lớn.
Tuy nhiên máy không thông minh như người, bạn phải dạy cho nó biển số mà phải theo nhiều hướng, nhiều góc nghiêng khác nhau. Nếu bạn chỉ chụp thẳng biển số rồi dạy cho nó thì nó sẽ bị “học thuộc lòng”, gọi là overfit khi huấn luyện model. Lúc đó nó không nhận ra biển số khi góc camera hơi nghiêng, khi camera đặt trên cao, khi camera bị giọt nước che, và nhiều tình huống khác có thể diễn ra ngoài đời thực.
Thế nên khi huấn luyện các mô hình machine learning để nhận diện hình ảnh (mà cụ thể là biển số), người ta phải đưa vào một tập dữ liệu hình ảnh bao gồm rất nhiều biển số được chụp thẳng, biển số méo mó, có khi phải thêm cả biến số bị chụp xiên, biển số bị cong, biển số bị mờ… Phải như vậy thì máy mới không học vẹt và có đủ mức độ “general” để nhận diện trong nhiều tình huống thực tế.
Quảng cáo
Với các hệ thống nhận diện biển số xuyên quốc gia, có nước xài màu này, có nước xài màu kia, chữ cũng khác nhau nên người ta cũng phải dạy các máy bằng ảnh mẫu biển số của những quốc gia này. Tập dữ liệu để đưa vào huấn luyện có thể lên đến hàng chục nghìn tấm ảnh. Thậm chí lên đến vài trăm nghìn ảnh thì cũng là bình thường thôi. Mình xem trên Medium thấy bài viết của bạn quangnhatlenguyen có hình minh họa cho vụ này, nên mình thêm vào bài để các bạn hiểu. Trong tập dữ liệu bên dưới có ảnh mẫu biển số của Trung Quốc, Ấn Độ, Nhật, Việt Nam, Nga, Thái Lan, Thổ Nhĩ Kỳ, Mỹ…
Trong quá trình xử lý, tách ảnh và nhận diện kí tự, người ta cũng phải áp dụng một vài bước nhỏ hơn để đổi ảnh màu thành ảnh trắng đen và thêm một chút mờ (blur) để việc xử lý tách kí tự được dễ dàng hơn. Vì sao phải làm vụ này thì mình không rõ lý do căn cơ, mình cũng chỉ đi học lóm được nhiêu đó à, đang tìm hiểu thêm.
Tương tự, máy không đủ thông minh để biết được kí tự khi nhìn từ nhiều góc khác nhau, thậm chí nhiều font chữ khác nhau. Nó chỉ biết những gì được dạy mà thôi, nên nếu bạn chỉ dạy cho nó kí tự của biển số xe Việt Nam cũ thì nó không nhận diện được kí tự trên biển số mới vì khác hình dáng, hoặc nhận được nhưng độ chính xác không cao. Thế nên khi huấn luyện, người ta phải đưa vào nhiều loại biển, nhiều nét kí tự, nhiều font chữ… để máy nó không bị “học tủ”.
Bên dưới là hình ví dụ của một tập dữ liệu đưa vào cho máy học các kí tự khác nhau.
Việc nhận diện kí tự từ hình ảnh (Optical Character Recognition - OCR) này thật ra không mới. Từ ngày xưa người ta đã xài nó rồi, mình còn nhớ Office 2003, 2007 gì đó đã có plugin để làm chuyện này. Rồi người ta cũng đã bắt đầu nghiên cứu về OCR từ đời nào, thậm chí các app di động cũng làm OCR được. Thuật toán AI hay deep learning hay machine learning chỉ đơn giản là một phương pháp để làm OCR, hiện nay nó cho độ chính xác cao và không tiêu tốn nhiều năng lực xử lý của máy tính nên đang được xài rộng rãi.
Tóm lại, hệ thống giám sát có thể lấy hình ảnh từ camera an ninh gắn trên đường → nhận diện xe vi phạm cần lấy số đăng kí → tách hình ảnh biển số của xe → nhận diện kí tự để biến số đăng kí → tra cứu số đăng kí này ở đâu, của ai, xe gì… → gửi biên bản phạt nguội 😁
Hi vọng mình đã giải thích ở bước cơ bản để các bạn hiểu. Chúc vui vẻ.