Giới thiệu
Như trong mô tả series này mình cũng đã đề cập đến việc nhận dạng văn bản từ một ảnh bất kì trước đây đều chia thành 2 phần đó là phát hiện được bao đóng (bounding box) chứa text sau đó sẽ đưa ảnh đã được cắt dựa trên tọa độ bao đóng đó để đưa nó vào mô hình nhận dạng văn bản. Việc phải sử dụng 2 mô hình tách biệt làm cho việc thời gian gán nhãn, huấn luyện và dự đoán trở nên lâu, rất khó cho việc đưa vào các sản phẩm, thiết bị biên. Do vậy text spotting được ra đời để giải quyết vấn đề này.
Tổng quan
Bài báo đưa ra một giải pháp mới cho bài toán text spotting, mô hình đã chứng minh được nó có tốc độ xử lí nhanh vì 2 tác vụ là phát hiện và nhận dạng văn bản đều sử dụng chung một mạng backbone sau đó sẽ chia về 2 nhánh. Việc sử dụng chung một mạng trích xuất giúp cho mô hình nhận dạng trở nên đơn giản hơn.
Hình 1: So sánh tốc độ của mô hình
Ở trong mô hình này, bài báo giới thiệu 3 đóng góp
Ý tưởng chính
Mô hình gồm 4 phần chính : Share_Conv, Roi_Rotate, Detector và Recognizer:
Hình 2: Cấu trúc chính của mô hình
Mô hình sử dụng một mạng Shared_Conv để trích xuất đặc trưng cho ảnh sau đó đưa vào nhánh Text Detection có nhiệm vụ phát hiện tọa độ box, Roi_Rotate có nhiệm vụ lấy các đặc trưng và biến đổi không gian từ Shared_Features sử dụng tọa độ bao đóng được dự đoán ra từ nhánh Detection thu được đặc trưng chứa văn bản rồi đưa vào Text Recognition để nhận dạng văn bản cần dự đoán.
Shared Convolutions
Mạng này sử dụng mạng backbone Resnet50 và kiến trúc Feature Paramid Network (FPN), một kiến trúc rất quan trọng trong hầu hết các mô hình Object Detection hiện này, nó giúp cho mô hình có thể học sâu, các đặc trưng được tổng quát hóa hơn và tránh bị mất các object nhỏ bằng cách tăng tỉ lệ kích thước của featured_map, các bạn có thể tham khảo thêm paper về FPN tại đây.
Kiến trúc chi tiết về mạng Shared Convolutions như sau: Hình 3: Kiến trúc mạng Shared Convolutions
Kiến trúc cũng khá đơn giản, từ ảnh đầu vào đưa qua 5 layer của resnet50 sau đó upsampling lên feature_map có kích thước bằng 1/4 so với kích thước ban đầu. Để upsampling thì mô hình sử dụng module Deconv gồm 1 layer Convolution để giảm số channels của feature và 1 bilinear upsampling. Ở đây thì bài báo sử dụng layer2, layer3 và layer4 của resnet50 để thực hiện ghép với featured_map tương ứng.
Ví dụ : input (N,3,512,512) -> Shared_Conv -> output(N,C,128,128)
Trong đó N là số batch_size, C là số channel đầu ra
Text Detection Branch
Sau khi nhận được featured_map từ Shared_Conv, đưa nó vào nhành Detection. Ở đây, bài báo sử dụng một layer Convolution để dự đoán văn bản trên từng pixel. Channel đầu tiên để tính toán xác suất của mỗi pixel để nó là một positive example, ở đây các pixel nằm trong vùng được gán nhãn là văn bản được coi là positive. 4 channels tiếp theo, với mỗi pixel là positive, mô hình dự đoán khoảng cách từ nó đến cạnh trên, dưới, trái, phải của bao đóng chưa pixel đó và channel cuối cùng để dự đoán hướng của bao đóng chứa văn bản đó.
Hàm loss thứ nhất là Cross Entropy để phạt những thằng dự đoán sai về lớp positive và tối ưu mô hình học được những pixel positive. Công thức như sau:
Trong đó |.| là số lượng phần tử trong batch đấy, và biểu diễn hàm Cross Entropy giữa và score map được dự đoán ra, là nhãn nhị phân cho nhãn text và non-text.
Hàm loss thứ 2 làm hàm regression, bài báo sử dụng kết hợp hàm IoU và hàm phạt góc để tối ưu tọa độ và hướng của box được dự đoán ra. Theo công thức sau:
Trong đó hàm là hàm loss giữa tọa độ bao đóng dự đoán và tọa độ bao đóng nhãn. và biểu diễn hướng góc dự đoán và nhãn.
Cuối cùng thì hàm loss cho nhánh Detection như sau:
Roi Rotate
Roi Rotate được sử dụng để trích xuất vùng thông tin trong tọa độ box mà nhãn hay nhánh Detection dự đoán ra. Roi Rotate sử dụng mô ma trận có tên là affine transformation để biển đổi không gian từ xiên về thắng đứng. Ngoài ra, Roi Rotate còn giữ được tỉ lệ của ảnh khi đưa về kích thước cố định, với box có chiều dài nhỏ hơn sẽ được padding thêm.
Dưới đây là ví dụ áp dụng Roi Rotate vào ảnh gốc : Hình 4: Áp dụng Roi Rotate vào ảnh gốc
Như ảnh trên các bạn cũng dễ dàng thấy nó biển đổi không gian rất tốt và vẫn giữ được đặc trưng của ảnh. Điều này làm cho việc mô hình Recognizer sẽ trở nên dễ dàng hơn khi học nó.
Text Recognition Branch
Ở nhánh này , bài báo sử dụng mô hình CRNN với một vài block convolutional và đi qua mô hình LSTM sau đó được decode bởi CTC. Cấu trúc cụ thể dưới hình sau:
Hình 5: Cấu trúc mô hình Recognition
Vì kiến trúc CRNN với CTC rất phổ biến nên mình sẽ không giải thích cụ thể phần này. Các bạn chưa biết có thể tham khảo bài viết này.
Ưu và nhược điểm
Ưu điểm
- 2 mô hình detection và recognition sử dụng chung một mạng backbone làm cho thời gian trở nên nhanh hơn rất nhiều cả lúc train và test.
- Áp dụng Roi Rotate làm cho mô hình Recognizer học tốt và dễ dàng hơn. Hơn nữa nó còn giúp mô hình có thể nhận dạng các text cong, xiên,...
- Ý tưởng đơn giản nhưng hiệu quả, rất dễ implement.
- Bài báo còn chỉ ra việc kết hợp cả 2 mô hình tốt hơn việc chỉ train mô hình detection ở hình 6. Hình 6: So sánh kết quả mô hình FOTS và mô hình chỉ riêng mô hình Detection
Nhược điểm
- Kinh nghiệm của mình cho thấy việc các tham số của mạng Share_Conv là rất quan trọng, ở đây có thể nói là kernel, nếu để kernel quá cao(>128) thì việc detection sẽ học rất chậm, ngược lại thì recognition thì học được tốt hơn.
- Với việc chia sẻ mạng trích xuất đặc trưng thì với các dữ liệu có nền và kí tự trong box đó hơi giống nhau sẽ làm cho mô hình không học được.
Tổng kết
Đây là bài báo đầu tiên trong series về Text spotting của mình, mong các bạn sẽ ủng hộ bằng cách like và subcribes, à quên upvote cho mình nhé (^^) để mình có động lực viết các bài tiếp theo. Xin chào và hẹn gặp lại !