1. Giới thiệu về cuộc thi AIC
AI-Challenge là một cuộc thi về trí tuệ nhân tạo được tổ chức hàng năm. Trong đó chú trọng về học tập và ứng dụng trí tuệ nhân tạo vào chương trình xây dựng thành phố Hồ Chí Minh trở thành đô thị thông minh giải, quyết các bài toán quan trọng phục vụ cuộc sống.
2. Bài toán nhận diện chữ tiếng Việt trong ảnh ngoại cảnh và sinh hoạt hằng ngày
Bài toán trong cuộc thi AI năm 2021 là “Nhận diện chữ tiếng Việt trong ảnh ngoại cảnh và sinh hoạt hằng ngày”. Mục tiêu là phát hiện (detect) và nhận diện (recognize) chữ trong ảnh, cụ thể ở đây sẽ tập trung vào chữ trong khung cảnh (scene text) được thu lại từ nhiều nguồn camera kh ác nhau ở Việt Nam.
Vấn đề đặt ra là một phần quan trọng cho nhiều hệ thống thông minh hiện nay như robot, xe tự lái… Các hệ thống này yêu cầu hiểu được cảnh vật xung quanh và chữ trong cảnh vật nắm giữ rất nhiều thông tin quan trọng, có thể phục vụ phát triển du lịch thông minh, bảo tàng thông minh, xe tự lái, robot tự hành… Để tăng tính ứng dụng thực tiễn của giải pháp, mô hình cần đáp ứng tốt được cả về độ chính xác cũng như về thời gian xử lý.
3. Các bước triển khai mô hình
Phần này mình sẽ hướng dẫn tổng quan train model trên colab. Bật GPU: Runtime → Change runtime type và chọn GPU ở Hardware accelerator.
Tiếp theo là tải source code mà mình đã chuẩn bị sẵn cho dễ sử dụng (link repo gốc https://github.com/PaddlePaddle/PaddleOCR):!git clone https://github.com/hungcao0402/PaddleOCR-Vietnamese.git
Mình có tạo sẵn notebook lưu trong file Notebook.ipynb ở repo trên, bạn đọc có thể tham khảo.
Cài đặt thư viện cần thiết:
!pip install -r requirements.txt
!pip install paddlepaddle-gpu
Cả hai phần detect và recognize đều gồm các bước sau:- Bước 1: Tiền xử lý dữ liệu
- Bước 2: Cấu hình file config
- Bước 3: Train model
- Bước 4: Evaluation
- Bước 5: Convert sang model inference
- Bước 6: Predict
4. Model Detection (SAST)
4.1 SAST
SAST (A Single-Shot Arbitrarily-Shaped Text Detector based on Context Attended Multi-Task Learning) là một mô hình hiệu quả trong việc dự đoán văn bản có hình dạng tùy ý tuy nhiên các vùng chữ nhỏ đang là vấn đề với nó.
4.2. Chuẩn bị dữ liệu
Bạn có thể tập dữ liệu huấn luyện từ repo https://github.com/VinAIResearch/dict-guided và download dataset Original với format x1,y1,x2,y2,x3,y3,x4,y4,TRANSCRIPT.
4.3. Chuẩn bị file config
Trong bước này bạn chọn model detection mà mình sử dụng. Sau khi thử train các model detection mà PaddleOCR hỗ trợ thì mình thấy SAST đạt hiệu quả tốt nhất cho nên mình sử dụng SAST với Backbone là ResNet50_vd trong cuộc thi này.
4.4. Training
python3 tools/train.py -c ./configs/det/SAST.yml
Trong dòng code trên, sử dụng -c để chọn file cấu hình. Ngoài ra bạn còn có thể sử dụng -o để thay đổi các parameter mà không cần phải sửa file yml. Sau mỗi save_epoch_step, checkpoint sẽ được lưu ở đường dẫn được đặt tại dòng Global.save_model_dir trong file config gồm 3 file:
5. Model Recognition (SRN)
5.1. SRN
SRN (Semantic Reasoning Network) kết hợp cả phần visual information và global semantic information, hai phần này chạy song song trong quá trình huấn luyện và đưa ra kết quả. SRN là một end-to-end trainable pipeline cho bài toán scene text recognition, bao gồm 4 phần:
- Backbone network
- Parallel visual attention module (PVAM)
- Global semantic reasoning module (GSRM)
- Visual semantic fusion decoder (VSFD)
Pipeline: Khi đưa ảnh đầu vào, đầu tiên, backbone network sẽ được dùng để trích xuất các thuộc tính 2D (V). Sau đó, PVAM được dùng để tạo ra N thuộc tính 1D sau khi được căn chỉnh, tại đó, mỗi thuộc tính tương ứng với một ký tự trong văn bản. N thuộc tính 1D này sau đó sẽ được đưa vào GSRM để thu thập thông tin ngữ nghĩa (S). Cuối cùng, các thu ộc tính ảnh sau khi được căn chỉnh và ngữ nghĩa của nó sẽ được VSFD hợp nhất để dự đoán các ký tự.
5.2. Chuẩn bị dữ liệu
Data train model recognition thì nó sẽ khác so với model detection đó là data sẽ là các ảnh nhỏ và một file txt lưu đường dẫn ảnh cùng với chữ trong ảnh đó.
Có thể thấy rằng data để train model recognition là mỗi ảnh chứa một chữ trong khi data đã download lại là ảnh chứa nhiều chữ. Do vậy ta phải cắt nhỏ ảnh đã có từ các box chứa text.
5.3. Dictionary
Để dự đoán được tiếng việt thì ta cũng cần một file dictionary dành cho tiếng Việt chứa tất cả các kí tự. Vì PaddleOCR chưa hỗ trợ tiếng Việt nên mình đã tự làm một file dictionary riêng để train. Dictionary mình tạo lưu ở ppocr/utils/dict/vi_vietnam.txt.
5.5. Training
python3 tools/train.py -c ./configs/rec/SRN.yml \ -o Global.use_gpu=True \ Global.pretrained_model=pretrained_model \ Global.character_type=ch
6. Evaluation
Một bước không thể thiếu đó là đánh giá mô hình để biết mô hình có đang hoạt động tốt không, chuyện gì xảy ra với mô hình. Từ đó giúp ta xác định được nên làm gì tiếp theo. Dataset dùng để evaluation được set ở mục Eval.dataset trong file config.#evaluation model detection python3 tools/eval.py -c SAST.yml \ -o Global.checkpoints _model=path_checkpoints
7. Inference với model đã train xong
Cả 2 model detection và recognition được convert như sau:
python3 tools/export_model.py -c ./configs/det/SAST.yml \ -o Global.pretrained_model= #path_pretrained \ Global.save_inference_dir=./inference/SAST
python3 tools/export_model.py -c ./configs/rec/SRN.yml \ -o Global.pretrained_model= #path_pretrained \ Global.save_inference_dir=./inference/SRN