Trang chủTác giảLiên hệ

Concept of Bucketing in Seq2Seq model

By Nguyễn Công Thành
Published in Machine Learning
June 09, 2021
3 min read

Dear anh em, gần đây team AI đang làm nhiều về phần OCR. Mình muốn giới thiệu với anh em một concept khá hay đó là bucketing.

Trước tiên, Thử tìm hiểu cách hoặt động truyền thống của OCR:

alt text

Tuy nhiên có thể nhận ra một điều hiển nhiên là độ chính xác của OCR lúc này phụ thuộc khá nhiều vào:

1. việc cắt các kí tự ra:

Ví dụ: Trong trường hợp cắt 2 kí tự bị dính vào nhau thì chắc chắn là OCR sẽ sai:
alt text

Đây là hình ảnh của việc segment tốt nếu qua mô hình nhận diện kí tự thì sẽ có khả năng cao output sẽ là ZVYK

alt text

Còn đây là hình ảnh của segment sai 2 chữ dính vào nhau nên kết quả output chỉ có thể là 3 kí tự ZWM

2. Độ chính xác của mô hình:

Ví dụ: Càng phân biệt nhiều kí tự thì mô hình càng dễ bị sai nhầm số 3 thành 6 hoặc 8

Và nhiều lý do khác nữa ==> sự ra đời của các mô hình Attention + RNN, Attention + CTC + RNN, CTC + RNN

Có một điểm hạn chế của các mô hình (RNN + …) này đó là việc phải cố định kích thước của ảnh đầu vào. Việc đưa các ảnh có kích thước dài ngắn rộng hẹp khác nhau về cùng kích thước sẽ làm mất thông tin ảnh rất nhiều dẫn đến việc mô hình training sẽ không đạt được kết quả cao. Để giải quyết vấn đề này, các ảnh đầu vào đã được resize theo tỉ lệ về cùng một chiều cao sau đó padding thêm chiều dài đển được một kích thước cố định. Việc này cũng dẫn đến một điều bất lợi là các ảnh có tỉ lệ (w/h) lớn thì sẽ bị padding ít trong khi các ảnh có tỉ lệ (w/h) nhỏ sẽ bị padding nhiều. Điều này cũng ảnh hưởng trực tiếp tới sức mạnh hay độ chính xác của mô hình (đặc biệt là các mô hình CTC, CTC + beam search). Để giải quyết vấn đề này, hiện nay có một concept khá là thú vị đó là Bucketing. Vậy Bucketing hoạt động như thế nào ?

Thông thường để có thể tạo mô hình RNN, chúng ta cần phải xác định số steps của RNN (Thường thì số steps này sẽ phụ thuộc vào chiều dài của bức ảnh)

![alt text](https://kipalog.kaopiz.com/uploads/1abd/0b9e/Screenshot from 2019-07-31 18-18-58.png)

Do ta đang muốn train những bức ảnh có kích thước (w/h) khác nhau, do đó để có thể xác định được độ dài của RNN model, lúc này chúng ta chia Bucketing thành nhiều khoảng. Ví dụ: Sau khi ảnh dc rezise về (32,w), ta sẽ phân khoảng cho w bằng các bucket [120, 160, 200, 240, 280, 320] Như thế các ảnh w trong khoảng 120 - 160 sẽ được padding để xử lý như các ảnh (32,160) Các ảnh w trong khoảng 160 - 200 sẽ được padding để xử lý như các ảnh (32,200)

Có một điểm rất thú vị của bucketing concept đó là thông thưởng bức ảnh sẽ dc padding trực tiếp rồi mới cho qua CNN. Tuy nhiên với bucketing, phần padding sẽ được thêm ở phần feature map. Điều này vừa giúp tăng độ chính xác cho mô hình mà lại giảm thời gian training do ảnh đầu vào không cần phải padding thêm.

Vậy làm thế nào để train mô hình?

Thật ra việc train mô hình sẽ tương tự như train mô hình thông thường. Chỉ có điều các training_batch_size lúc này sẽ là các image trong cùng một bucket. Một cách hiểu đơn giản thì data lúc này được feed vào một dictionary (bucket_dict ) với key là độ dài của các butket và value là list các ảnh:

Thế là ta có thể traing được mô hình RNN với bucket rồi. được

Thank you anh em đã đọc bài viết.


Nguyễn Công Thành

Developer

Related Posts

Machine Learning
Cập nhật kiến thức trong Machine learning
June 07, 2021
4 min
© 2021, All Rights Reserved.

Quick Links

Liên hệ quảng cáoThông tinLiên hệ

Social Media