[15.07] CRNN
我全都要!
OCR 是個古老的學科,但在深度學習的推動下,它又變得熱門起來。
定義問題
隨著深度學習的普及,OCR(光學字元辨識)領域迎來了新的發展機遇。與傳統的基於手工設計特徵的分類方法相比,基於 CNN(卷積神經網路)的 OCR 方法表現出更高的性能和更強的泛化能力。
這其中最重要的優勢之一是 CNN 能夠自動從圖像中學習特徵,無需人工設計和挑選特徵,這不僅節省了大量的人力成本,還能減少計算資源的消耗。
然而,文字辨識中的一個關鍵問題仍然存在:如何有效地進行分類?
對於最後的文字分類,有幾個主流的方法,我們先跟隔壁的 CHAR 借一張圖片來看看:
1. 定義詞典
Dictionary Encoding,這是最簡單和直接的方法,也稱為詞典編碼。在這種方法中,系統會先定義一個詞典,這個詞典包含了所有可能的標籤(通常是詞或詞組)。當系統處理一張圖片時,辨識出的文字會被分類到詞典中的某個詞條。簡單來說,模型的任務是從一個預定的詞列表中選擇出最合適的詞。
當圖像中的文字不在詞典中時,這種方法會失效,模型無法辨識出詞典外的內容。這對於處理詞典外的隨機字元串(例如隨機生成的密碼、電話號碼等)來說,效果不佳。
另外,如果需要處理的詞典非常大(例如幾十萬個詞條),系統的效率會受到嚴重影響,且詞典的擴展性較差。
2. 字元序列編碼
Character Sequence Encoding,字元序列編碼是另一種常見的分類方法,與詞典編碼不同,它不依賴於一個預定義的詞典,而是將文字直接分類到一個字元序列中。這意味著,系統不需要知道具體的詞,而是依據圖像中的每個字元進行分類,最終構建出一個完整的字元序列來表示圖像中的文字。
字元序列編碼比詞典編碼更具挑戰,因為模型需要學習每個字元的特徵,並能夠準確地將字元組合成完整的序列,這對於模型的能力要求更高。由於字元序列間存在依賴關係,模型需要具備良好的上下文理解能力,否則可能會產生錯誤的字元組合。
3. N-gram 編碼
Bag-of-N-gram Encoding,N-gram 編碼是一種折衷的解決方案,它將圖片中的文字分類為 N-gram 序列,這種方法可以理解為一種詞和字元的混合方法。
N-gram 是由 N 個字元組成的序列,N 可以是 2(即 bi-gram),也可以是 3(即 tri-gram),甚至是更長的序列。這種編碼方法不僅能夠辨識單個字元,也能辨識字元組合,從而更好地捕捉上下文信息。
隨著 N 的增加,N-gram 組合的數量會急劇上升,這會導致計算成本增高,特別是在處理長文本序列時,效率可能會降低。對於某些詞彙,N-gram 可能無法準確捕捉到整體詞彙的語義,尤其是在 N 值較小的情況下,辨識的精度可能不如詞典編碼或字元序列編碼。
綜合以上,作者希望一個優秀的模型可以滿足幾個訴求:
- 端到端訓練:不需要預處理或分步驟操作,直接從圖像中學習特徵。
- 卷積特徵:使用從訓練圖像中學習到的卷積特徵,而非手工設計的特徵。
- 無需字元級標註:不需要字元級標註來訓練模型,直接從圖像中學習文字序列。
- 無限制:不受限於特定詞典,能夠處理任意文字序列。
- 模型規模小:模型存儲空間小,運行效率高。
看起來是有點貪心了,我們來看看作者是怎麼做的。
解決問題
模型架構
CRNN 模型由三個部分組成,我們搭配上圖來看: