文章目錄
- 友情提示
- 一. CRNN概論
-
- 簡介
- 網絡
- 二. CRNN局部之特征提取
- 三. CRNN局部之BLSTM
- 四. CRNN局部之CTC
-
- 關于CTC是什麼東西?
- CTC理論基礎
- 五. 參考文獻
友情提示
友情提示不針對第三方,為了給讀者更好的體驗
- 建議去我的部落格園進行閱讀
- 微信位址
- GitHub位址
- 歡迎大家關注我的微信公衆号

一. 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-2所示為傳統的文字識别,還得把每個文字分割再去識别(這方面的東西不進行說明,很簡單的傳統方法)
而CRNN直接輸入上圖得到結果。
網絡
CRNN網絡結構入下圖1-3所示:
- 特征提取
正常的圖像提取,提取到的特征以序列方式輸出,這裡不懂的讀者可以去看RNN訓練手寫數字識别
- BLSTM
特征輸入到BLSTM,輸出每個序列代表的值(這個值是一個序列,代表可能出現的值),對輸出進行softmax操作,等于每個可能出現值的機率。
- CTC
相當于一個LOSS,一個計算機率到實際輸出的機率,具體後面章節介紹。
- 創新點
- 使用雙向BLSTM來提取圖像特征,對序列特征識别效果明顯
- 将語音識别領域的CTC—LOSS引入圖像,這是質的飛越
- 不足點
- 網絡複雜,尤其是BLSTM和CTC很難了解,且很難計算。
- 由于使用序列特征,對于角度很大的值很難識别。
二. CRNN局部之特征提取
假設上圖2-1為提取到的特征(特征是一塊一塊的,這肯定不是特征圖,為了看着舒服)
圖像經過VGG的特征提取之後就是普通的feature map,然後進行上述的劃分,形成特征序列!
如果你的文字很斜或者是縱向的,那就得把特征豎向劃分序列了!
三. CRNN局部之BLSTM
基本原理不懂讀者可以看看這個教程
懂了原理這部分還是比較簡單的(了解簡單,實作太難了),筆者這裡隻介紹幾個使用過程難了解的點
- RNN輸入序列數量
從上圖可以得到的是X1—X6,總共6個序列
- RNN的層數
從上圖3-2可以看出,是由五層網絡構成
- RNN神經元數量
這裡引用知乎大神的一個圖,上圖中序列為4,層數為3層(當然不加輸入和輸出也可以說是1層,這裡按正常CNN去說就是3層了)
從圖中可以看出每個序列包含一個CNN,圖中的隐藏層神經元數量為24個,由于RNN使用權值共享,那麼不同的神經元個數就為6個。
- 單個序列長度
以上圖知乎大神的圖為例子,每個輸入序列長度8
假設這個網絡是一個RNN識别手寫數字識别的圖,那麼圖像的寬為4,高為8
注意:輸入序列的數量和輸入序列的長度和神經元個數無關!!!這裡想象RNN即可了解
- BLSTM
筆者隻是推導了單向的LSTM網絡,而沒有推導BLSTM網絡。
其實無論RNN如何變種,像現在最好的GRU等,無非都是在單元(unite)裡面的trick而已。
具體公式推導,就是鍊式求導法則!建議先推RNN、然後LSTM、最後不用推導BLSTM都明白了
四. CRNN局部之CTC
關于CTC的描述網上很多,也講解的比較清楚了,這裡主要是說一下我筆者看原理時候的幾個難點(弄了好久才想明白)
關于CTC是什麼東西?
- 讓我們來看一下正常分類CNN網絡:
CRNN網絡結構詳解友情提示一. CRNN概論二. CRNN局部之特征提取三. CRNN局部之BLSTM四. CRNN局部之CTC五. 參考文獻
這是鸢尾花分類網絡,其中輸入一張圖像,輸出是經過softmax的種類機率。
那麼這個網絡标簽是什麼???
标簽的制作都是需要經過
Incode
(分類的種類經過數字化編碼),測試過程需要
Encode
(把輸出的數字解碼成分類的種類)
這很簡單,讀者應該都了解,代碼為了計算機能看懂,編碼就是神經網絡能看懂。
- 那麼RCNN如何編碼呢?
假設有26個英文字母要識别,那麼種類數=27(還有一個空白blank字元)
假設CNN輸出以50個序列為基準(讀者這裡看不懂就去看RNN識别手寫數字識别),序列太大訓練不準,識别結果會漏字母。序列太小訓練不準,識别會多字母。
- 打個小比喻
假設CTC是一個黑盒子,它能把輸出那麼多序列變化為一個序列,這樣就能和CNN分類一樣計算Loss了。當然不會那麼簡單,CTC還是比較複雜的,後面具體看這個黑盒子如何工作的。。。。
CTC理論基礎
**注釋:**這裡筆者就不進行詳細的描述了,感覺别人比我寫的更好:非常詳細的CTC力理論
在這一章,主要針對筆者遇到的重難點進行介紹:
- 訓練–前向後相傳播
本來還去看了馬爾科夫的前後向傳播的理論,沒怎麼看懂(數學基礎太差)
針對本文的CTC前後向傳播還是比較簡單了解的
其實這裡可以了解為動态規劃的方式進行的,因為其使用遞歸的方式,以一個點為中心,向前和向後進行遞推,以動态規劃的方式了解就很簡單了。。。。不懂的讀者可以刷leetcode,做幾題就有感覺了
- 測試–CTC Prefix Search Decoding和CTC Beam Search Decoding
最簡單的搜尋追溯算法:
每個都列舉最後計算,可以看出來是指數級搜尋,效率肯定不行的
貪婪算法+動态規劃—CTC Prefix Search Decoding:
第一步是進行合并操作:
第二步輸出最大機率:
擴充CTC Prefix Search Decoding算法—CTC Beam Search Decoding
- 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實作細節