CRNN網絡結構詳解


一. CRNN概論

重點:原論文一定要得看!!!英語好的直接看原論文,不懂的地方查資料。英語不好的(比如筆者),先看中文資料,然后再看原論文

簡介

CRNN全稱是:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition 說自己是端到端的的網絡,其實嚴格意義根本不是的,而是一種識別網絡而已。

嚴格意義端到端的網絡:Fast Oriented Text Spotting with a Unified Network

請看下圖為CRNN網絡的輸入,得檢測到文字之后才能去識別文字。

圖1-1

不嚴格的端到端是啥意思呢?

下圖1-2所示為傳統的文字識別,還得把每個文字分割再去識別(這方面的東西不進行說明,很簡單的傳統方法)

圖1-2

而CRNN直接輸入上圖得到結果。

網絡

CRNN網絡結構入下圖1-3所示:

圖1-3

  • 特征提取

正常的圖像提取,提取到的特征以序列方式輸出,這里不懂的讀者可以去看RNN訓練手寫數字識別

  • BLSTM

特征輸入到BLSTM,輸出每個序列代表的值(這個值是一個序列,代表可能出現的值),對輸出進行softmax操作,等於每個可能出現值的概率。

  • CTC

相當於一個LOSS,一個計算概率到實際輸出的概率,具體后面章節介紹。

  • 創新點
  1. 使用雙向BLSTM來提取圖像特征,對序列特征識別效果明顯
  2. 將語音識別領域的CTC—LOSS引入圖像,這是質的飛越
  • 不足點
  1. 網絡復雜,尤其是BLSTM和CTC很難理解,且很難計算。
  2. 由於使用序列特征,對於角度很大的值很難識別。

二. CRNN局部之特征提取

圖2-1

假設上圖2-1為提取到的特征(特征是一塊一塊的,這肯定不是特征圖,為了看着舒服)

圖像經過VGG的特征提取之后就是普通的feature map,然后進行上述的划分,形成特征序列!

如果你的文字很斜或者是縱向的,那就得把特征豎向划分序列了!

三. CRNN局部之BLSTM

基本原理不懂讀者可以看看這個教程

懂了原理這部分還是比較簡單的(理解簡單,實現太難了),筆者這里只介紹幾個使用過程難理解的點

圖3-1

  • RNN輸入序列數量

從上圖可以得到的是X1---X6,總共6個序列

  • RNN的層數

圖3-2

從上圖3-2可以看出,是由五層網絡構成

  • RNN神經元數量

圖3-3

這里引用知乎大神的一個圖,上圖中序列為4,層數為3層(當然不加輸入和輸出也可以說是1層,這里按正常CNN去說就是3層了)

從圖中可以看出每個序列包含一個CNN,圖中的隱藏層神經元數量為24個,由於RNN使用權值共享,那么不同的神經元個數就為6個。

  • 單個序列長度

以上圖知乎大神的圖為例子,每個輸入序列長度8

假設這個網絡是一個RNN識別手寫數字識別的圖,那么圖像的寬為4,高為8

注意:輸入序列的數量和輸入序列的長度和神經元個數無關!!!這里想象RNN即可理解

  • BLSTM

圖3-4

筆者只是推導了單向的LSTM網絡,而沒有推導BLSTM網絡。

其實無論RNN如何變種,像現在最好的GRU等,無非都是在單元(unite)里面的trick而已。

具體公式推導,就是鏈式求導法則!建議先推RNN、然后LSTM、最后不用推導BLSTM都明白了

四. CRNN局部之CTC

關於CTC的描述網上很多,也講解的比較清楚了,這里主要是說一下我筆者看原理時候的幾個難點(弄了好久才想明白)

關於CTC是什么東西?

  • 讓我們來看一下正常分類CNN網絡:
    圖4-1

這是鳶尾花分類網絡,其中輸入一張圖像,輸出是經過softmax的種類概率。

那么這個網絡標簽是什么???

圖4-2

標簽的制作都是需要經過Incode(分類的種類經過數字化編碼),測試過程需要Encode(把輸出的數字解碼成分類的種類)

這很簡單,讀者應該都理解,代碼為了計算機能看懂,編碼就是神經網絡能看懂。

  • 那么RCNN如何編碼呢?

圖4-3

假設有26個英文字母要識別,那么種類數=27(還有一個空白blank字符)

假設CNN輸出以50個序列為基准(讀者這里看不懂就去看RNN識別手寫數字識別),序列太大訓練不准,識別結果會漏字母。序列太小訓練不准,識別會多字母。

  • 打個小比喻

圖4-4

假設CTC是一個黑盒子,它能把輸出那么多序列變化為一個序列,這樣就能和CNN分類一樣計算Loss了。當然不會那么簡單,CTC還是比較復雜的,后面具體看這個黑盒子如何工作的。。。。

CTC理論基礎

注釋:這里筆者就不進行詳細的描述了,感覺別人比我寫的更好:非常詳細的CTC力理論

在這一章,主要針對筆者遇到的重難點進行介紹:

  • 訓練--前向后相傳播

本來還去看了馬爾科夫的前后向傳播的理論,沒怎么看懂(數學基礎太差)

針對本文的CTC前后向傳播還是比較簡單理解的

圖4-5

其實這里可以理解為動態規划的方式進行的,因為其使用遞歸的方式,以一個點為中心,向前和向后進行遞推,以動態規划的方式理解就很簡單了。。。。不懂的讀者可以刷leetcode,做幾題就有感覺了

  • 測試--CTC Prefix Search Decoding和CTC Beam Search Decoding

最簡單的搜索追溯算法

每個都列舉最后計算,可以看出來是指數級搜索,效率肯定不行的

圖5-6

貪婪算法+動態規划---CTC Prefix Search Decoding:

第一步是進行合並操作:

圖5-7

第二步輸出最大概率:

圖5-8

擴充CTC Prefix Search Decoding算法---CTC Beam Search Decoding

圖5-9

  • CTC Prefix Search Decoding屬於貪心算法,為什么可以得到最優解?

仔細看我上面的標題,CTC Prefix Search Decoding特意加了一個動態規划,動態規划是屬於最優解的算法。

因為CTC算法的前提是序列相互獨立,所以當前的序列最大,那么整體的序列最大。

注意:得合並之后的序列最大,而不是單個序列的最大!!!,如果是單個序列最大,那這就是單獨的貪心算法了。

  • 為什么CTC序列之間相互獨立還可以計算有序列的文字,文字之間肯定有序列的啊?

這都得重新看網絡了,網絡用到了BLSTM,序列這個東西已經使用過了,到達CTC已經是使用序列之后的輸出了。

不得不佩服設計網絡的人RNN+CTC,語音是使用最早的。

其實回頭想一下,如果CTC是有序列的,那么前向和后項概率根本不能使用馬爾科夫模型(前提相互獨立)了,也不能使用CTC Prefix Search Decoding,只能使用最簡單的追溯算法,那效率那么低,怎么廣泛使用呢?

五. 參考文獻

CRNN原論文

CTC論文

深度學習筆記

RNN形象圖

RCNN的pytorch實現-冠軍的試煉

一文讀懂CRNN+CTC文字識別

[透視矯正網絡](Attentional Scene Text Recognizer with Flexible Rectification)

簡化CTC講解

知乎beam search講解

非常詳細的CTC講解

一個CTC的小筆記

外國大神的講解,大部分人都是直接翻譯這個的

大神講解馬爾科夫的前后向計算

CTC詳細代碼實現+步驟講解

快速閱讀論文之扭曲矯正

2019CVPR論文匯總

ROI Align實現細節


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM