Cách bóc chứng minh thư
1. Lời mở đầuGần đây chắc hẳn các bạn đã nghe nhiều tới các khái niệm như định danh điện tử, Ekyc,... Nếu như trước đây, khách hàng muốn mở tài khoản ngân hàng, mở thẻ ATM... sẽ phải đến trực tiếp quầy giao dịch để thực hiện các thủ tục đăng kí, xác minh thông tin, thì giờ đây các thao tác này đều có thể thực hiện qua chiếc điện thoại nhờ giải pháp định danh khách hàng điện tử (eKYC). Và bài toán Trích xuất thông tin từ chứng minh thư chính là bài toán nhỏ trong ứng dụng định danh điện từ này. Hôm nay mình xin giới thiệu các bước giúp các bạn thực hiện bài toán này. Tuy cách này chưa thực sự là cách giải quyết tốt nhất nhưng qua bài này các bạn mới học về AI cũng có thể học thêm được kiến thức qua bài toán này. Toàn bộ source code các bạn có thể xem tại link github của mình. Show Nguồn TP Bank 2. Các bước xử lýTrong bài này, mình đề xuất một hướng xử lý như sau :
2.1. Detect 4 góc chứng minh thưDo ảnh đầu vào là ảnh chụp từ điện thoại, có thể ảnh bị nghiêng, bị xoay ngược do đó chúng ta cần bước xoay thẳng lại để có thể dễ dàng xử lý. Vì lý do như vậy, nếu chúng ta dùng phương pháp bình thường detect nguyên cả chứng minh thư thì chúng ta khó có thể xoay lại được bằng xử lý ảnh hoặc phải dùng các phương pháp phức tạp hơn. Để đơn giản, ở bài này mình đề xuất một phương pháp đó là chúng ta sẽ coi bốn góc của chứng minh thư như là một object chúng ta cần detect sau đó chúng ta sẽ xoay thẳng bằng tọa độ của bốn góc này. Nếu như các bạn đã làm quen với các bài toán detect face, bike, car,... , trong đó bike hay car là object thì ở đây bốn góc : bottom left, bottom right, top left, top right chính là 4 object chúng ta cần tìm. Các bạn có thể thực hiện nhanh chóng bước này bằng cách sử dụng dữ liệu của bản thân kết hợp với mô hình detect đã được cung cấn sẵn bởi Tensorflow API. Các bạn có thể tìm bài viết hướng dẫn Tensorflow API của mình ở bài viết này. Ta sẽ có kết quả như hình sau: Step 1: Detect 4 corners 2.2. Xoay chứng minh thưỞ đây ta cần bốn góc để xoay nhưng mô hình chúng ta lại chỉ detect được có 3 góc . Vậy làm thế nào ta có thể tính được ra tọa độ góc còn lại bây giờ ? Đơn giản thôi, chúng ta chỉ cần áp dụng một kiến thức hình học cấp hai, ta dễ dàng nội suy ra tọa độ của 3 góc ra tọa độ góc còn lại. Các bác thử ngâm cứu vẽ vời ra giấy tính toán thử xem. Còn nếu lười thì dùng luôn code của tôi dưới đây nhé :Đầu tiên chúng ta cần phải tính ra tọa độ trung tâm của mỗi bouding box hay tọa độ của bốn góc bằng hàm get_center_point(). Hàm này nhận dữ liệu đầu vào là dictionary chứa key là tên góc và value: tọa độ của bounding box tương ứng. Đẩu ra là một dictionary chứa key là tên góc và value: tọa độ trung tâm bounding box tương ứng hay chính là tọa độ các góc.
Sau đó chúng ta đưa dictionary thu được bên trên vào hàm calculate_missed_coord_corner để nội suy ra góc còn thiếu và trả dữ liệu dạng dictionary chứa tên và tọa độ bốn góc tương ứng. Ở đây hàm này chỉ khắc phục trong trường hợp thiếu một góc, những trường hợp thiếu hai góc không khắc phục được. Cách khắc phục nhược điểm thiếu nhiều góc là cải thiện model detect trở nên tốt hơn.
Sau khi có được tọa độ 4 góc của chứng minh thư, ta xoay thẳng ảnh lại dựa vào kích thước thực tế có chiều dài 500, chiều rộng 300. Ở đây, mình dùng PerspectiveTransform của OpenCV:
Và kết quả cuối cùng, mình sẽ thu được về như sau: Step 2: Xoay ảnh 2.3. Detect vùng chữ có trong chứng minh thưTương tự như ý tưởng detect các góc, ở task này chúng ta sẽ sử dụng các mô hình detect có sẵn trong thư viện Tensorflow API như ở bước 1 đã làm để huấn luyện detect ra các chữ có trong ảnh chứng minh thư đã được crop ở bước trên. Các bạn có thể xem hướng dẫn ở đây. Mình chia các chữ ra thành 5 class tương ứng với 5 trường thông tin cần thu: id, name, birth, home và add. Chúng ta sẽ thu được ảnh kết quả trả về như sau: Ảnh 1: Trước khi dùng NMS Trong ảnh thu được, để tránh hiện tượng cùng một object nhưng có nhiều bouding box đè lên nhau (overlap), chúng ta sử dụng một thuật toán có tên là NMS (Non Maximum Suppression) giúp loại bỏ đi box thừa giữ lại box tốt nhất cho object.
Các bạn để ý các box ở trường home và add đã ít hơn hẳn so với ảnh trước. Ảnh 2: Sau khi dùng NMS 2.4. OCROCR hay nhận dạng kí tự là kĩ thuật nhận dạng chữ có trong ảnh đầu vào. Với các box chữ chúng ta thu được từ bước trên, ta crop và đưa qua mô hình OCR để đọc. Để giải quyết bài toán nhanh gọn, không mất thời gian các bạn có thể sử dụng thư viện VietOcr của tác gỉa Phạm Quốc, lý thuyết về Transformer OCR các bạn có thể theo dõi tại bài viết của mình nhé. Ở đây do tác giả chưa hỗ trợ dự đoán theo batch_size nên các bạn có thể custom lại file Predictor.py như sau để dự đoán theo theo batch_size nhanh hơn nhé:
3. Kết quảTrong bài viết lần này, mình có xây dựng một API bằng thư viện FastApi để các bạn dễ hình dung hơn, các bạn có thể chạy demo bằng cách sau đây:
Và kết quả API trả về như sau:
4. Lời kếtMọi người có nhu cầu ứng dụng hệ thống trích xuất thông tin chứng minh thư/chứng minh nhân dân cũ mới, giấy phép lái xe, ... có thể liên lạc mình qua email với giá thành hấp dẫn ưu đãi nhất thị trường. Cảm ơn các bạn đã theo dõi bài viết của mình. Bài toán trích xuất từ chứng minh thư đã không còn xa lạ trong cộng đồng học machine learning nhưng mình vẫn hy vọng bài viết của mình sẽ giúp cho nhiều bạn có thêm được nhiều kiến thức mới mẻ. |