0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Xây Dựng Pipeline Nhận Diện Văn Bản Tiếng Ba Tư với YOLO + CRNN

Đăng vào 6 tháng trước

• 5 phút đọc

Xây Dựng Pipeline Nhận Diện Văn Bản Tiếng Ba Tư với YOLO + CRNN

Nhận diện văn bản tiếng Ba Tư (OCR) là một nhiệm vụ thách thức. Khác với tiếng Anh, các ký tự tiếng Ba Tư (và tiếng Ả Rập) được viết từ phải sang trái, hình dạng các ký tự thay đổi dựa trên vị trí trong từ, và số lượng bộ dữ liệu nguồn mở có sẵn rất hạn chế. Trong bài viết này, chúng ta sẽ xây dựng một pipeline OCR tùy chỉnh sử dụng YOLO để phát hiện văn bản và CRNN để nhận diện ký tự.

Tại Sao Chọn YOLO + CRNN?

YOLO (You Only Look Once) rất hiệu quả trong việc phát hiện các đối tượng — ở đây, các đối tượng là các vùng văn bản. CRNN (Convolutional Recurrent Neural Network) lý tưởng cho việc nhận diện chuỗi như văn bản. Kết hợp lại, chúng tạo thành một pipeline hai giai đoạn: phát hiện → cắt → nhận diện.

Chuẩn Bị Dữ Liệu

Để thực hiện OCR cho tiếng Ba Tư, chúng ta cần hai bộ dữ liệu:

  1. Bộ dữ liệu phát hiện (cho YOLO): hình ảnh với các bounding box xung quanh từ hoặc dòng chữ.
  2. Bộ dữ liệu nhận diện (cho CRNN): hình ảnh đã cắt của từ/dòng với văn bản chính xác.

Bạn có thể:

  • Sử dụng các công cụ như labelImg hoặc Roboflow để chú thích bounding box.
  • Tạo dữ liệu tổng hợp: render văn bản Ba Tư trên các nền ngẫu nhiên bằng cách sử dụng các phông chữ khác nhau để tăng kích thước dữ liệu.

YOLO mong đợi các chú thích theo định dạng sau:

Copy
class x_center y_center width height

Trong đó, các giá trị được chuẩn hóa giữa 0 và 1.

Đào Tạo YOLO Để Phát Hiện Văn Bản

Sử dụng YOLOv8 để có kết quả tốt nhất:

Copy
yolo detect train data=persian_text.yaml model=yolov8s.pt epochs=50 imgsz=640

Sau khi đào tạo, YOLO sẽ xuất ra các bounding box cho các vùng văn bản.

Đào Tạo CRNN Để Nhận Diện Văn Bản

CRNN = CNN + RNN + CTC loss. Bạn cần định nghĩa bộ ký tự tiếng Ba Tư của mình (32 chữ cái + dấu cách) và mã hóa nhãn thành các chuỗi.

Mẫu Mô Hình PyTorch:

python Copy
import torch
import torch.nn as nn

class CRNN(nn.Module):
    def __init__(self, num_classes):
        super(CRNN, self).__init__()
        self.cnn = nn.Sequential(
            nn.Conv2d(1, 64, 3, 1, 1), nn.ReLU(),
            nn.MaxPool2d(2, 2),
            nn.Conv2d(64, 128, 3, 1, 1), nn.ReLU(),
            nn.MaxPool2d(2, 2)
        )
        self.rnn = nn.LSTM(128 * 8, 256, bidirectional=True, num_layers=2)
        self.fc = nn.Linear(512, num_classes)

    def forward(self, x):
        x = self.cnn(x)
        b, c, h, w = x.size()
        x = x.permute(3, 0, 1, 2).contiguous().view(w, b, c * h)
        x, _ = self.rnn(x)
        x = self.fc(x)
        return x  # [T, B, num_classes]

Sử dụng CTC Loss để căn chỉnh các dự đoán với giá trị thực tế.

Kết Hợp YOLO + CRNN

  1. Đưa hình ảnh vào → YOLO → các bounding box.
  2. Cắt từng box và điều chỉnh kích thước về chiều cao cố định.
  3. Truyền vào CRNN → văn bản dự đoán.
  4. Nối kết quả (theo thứ tự từ phải sang trái).

Thách Thức và Mẹo

  • Văn bản từ phải sang trái: đảo ngược các chuỗi đầu ra của CRNN trước khi ghép lại.
  • Phông chữ và tiếng ồn: sử dụng tăng cường dữ liệu (mờ, xoay, độ sáng) để cải thiện khả năng tổng quát.
  • Dữ liệu nhỏ? Cân nhắc việc học chuyển giao hoặc tinh chỉnh các mô hình PaddleOCR cho tiếng Ba Tư.

Kết Luận

Bằng cách kết hợp YOLO và CRNN, chúng ta đã tạo ra một pipeline OCR linh hoạt cho văn bản tiếng Ba Tư. Phương pháp này có thể mở rộng cho các ngôn ngữ viết từ phải sang trái khác như tiếng Ả Rập hoặc tiếng Urdu.

Bạn có thể kiểm tra kho GitHub để xem mã mẫu và thử nghiệm với bộ dữ liệu của riêng bạn!

Các Thực Hành Tốt Nhất

  • Luôn đảm bảo rằng dữ liệu được phân loại chính xác trước khi đào tạo.
  • Thực hiện kiểm tra nghiệm vụ thường xuyên để phát hiện lỗi trong quá trình phát triển.

Những Cạm Bẫy Thường Gặp

  • Không chú ý đến việc chuẩn hóa dữ liệu đầu vào có thể dẫn đến kết quả không chính xác.
  • Quá phụ thuộc vào một bộ dữ liệu nhỏ có thể khiến mô hình không tổng quát tốt.

Mẹo Tối Ưu Hiệu Suất

  • Sử dụng GPU để tăng tốc độ đào tạo và dự đoán.
  • Tinh chỉnh các siêu tham số cho phù hợp với dữ liệu của bạn.

Câu Hỏi Thường Gặp

  1. Pipeline OCR là gì?
    Pipeline OCR là một chuỗi các bước để nhận diện văn bản từ hình ảnh.

  2. Tại sao chọn YOLO và CRNN?
    YOLO rất hiệu quả trong phát hiện văn bản, trong khi CRNN tốt cho nhận diện ký tự.

  3. Có cần dữ liệu lớn để đào tạo không?
    Có, nhưng bạn có thể sử dụng học chuyển giao hoặc tạo dữ liệu tổng hợp để tăng cường.

Tham Khảo Thêm

Bài viết này hy vọng sẽ giúp bạn hiểu rõ hơn về cách xây dựng một hệ thống OCR hiệu quả cho tiếng Ba Tư.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào