[TOC]
一. CRNN概論
重點:原論文一定要得看!?。∮⒄Z好的直接看原論文,不懂的地方查資料。英語不好的(比如筆者),先看中文資料,然后再看原論文。
簡介
CRNN全稱是:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition說自己是端到端的的網(wǎng)絡(luò),其實嚴(yán)格意義根本不是的,而是一種識別網(wǎng)絡(luò)而已。
嚴(yán)格意義端到端的網(wǎng)絡(luò):Fast Oriented Text Spotting with a Unified Network
請看下圖為CRNN網(wǎng)絡(luò)的輸入,得檢測到文字之后才能去識別文字。

不嚴(yán)格的端到端是啥意思呢?
下圖1-2所示為傳統(tǒng)的文字識別,還得把每個文字分割再去識別(這方面的東西不進行說明,很簡單的傳統(tǒng)方法)

而CRNN直接輸入上圖得到結(jié)果。
網(wǎng)絡(luò)
CRNN網(wǎng)絡(luò)結(jié)構(gòu)入下圖1-3所示:

- 特征提取
正常的圖像提取,提取到的特征以序列方式輸出,這里不懂的讀者可以去看<u>RNN訓(xùn)練手寫數(shù)字識別</u>
- BLSTM
特征輸入到BLSTM,輸出每個序列代表的值(這個值是一個序列,代表可能出現(xiàn)的值),對輸出進行softmax操作,等于每個可能出現(xiàn)值的概率。
- CTC
相當(dāng)于一個LOSS,一個計算概率到實際輸出的概率,具體后面章節(jié)介紹。
- 創(chuàng)新點
- 使用雙向BLSTM來提取圖像特征,對序列特征識別效果明顯
- 將語音識別領(lǐng)域的CTC—LOSS引入圖像,這是質(zhì)的飛越
- 不足點
- 網(wǎng)絡(luò)復(fù)雜,尤其是BLSTM和CTC很難理解,且很難計算。
- 由于使用序列特征,對于角度很大的值很難識別。
二. CRNN局部之特征提取

假設(shè)上圖2-1為提取到的特征(特征是一塊一塊的,這肯定不是特征圖,為了看著舒服)
圖像經(jīng)過VGG的特征提取之后就是普通的feature map,然后進行上述的劃分,形成特征序列!
如果你的文字很斜或者是縱向的,那就得把特征豎向劃分序列了!
三. CRNN局部之BLSTM
基本原理不懂讀者可以看看這個教程
懂了原理這部分還是比較簡單的(理解簡單,實現(xiàn)太難了),筆者這里只介紹幾個使用過程難理解的點

- RNN輸入序列數(shù)量
從上圖可以得到的是X1---X6,總共6個序列
- RNN的層數(shù)

從上圖3-2可以看出,是由五層網(wǎng)絡(luò)構(gòu)成
- RNN神經(jīng)元數(shù)量

這里引用知乎大神的一個圖,上圖中序列為4,層數(shù)為3層(當(dāng)然不加輸入和輸出也可以說是1層,這里按正常CNN去說就是3層了)
從圖中可以看出每個序列包含一個CNN,圖中的隱藏層神經(jīng)元數(shù)量為24個,由于RNN使用權(quán)值共享,那么不同的神經(jīng)元個數(shù)就為6個。
- 單個序列長度
以上圖知乎大神的圖為例子,每個輸入序列長度8
假設(shè)這個網(wǎng)絡(luò)是一個RNN識別手寫數(shù)字識別的圖,那么圖像的寬為4,高為8
<u>注意</u>:輸入序列的數(shù)量和輸入序列的長度和神經(jīng)元個數(shù)無關(guān)!?。∵@里想象RNN即可理解
- BLSTM

筆者只是推導(dǎo)了單向的LSTM網(wǎng)絡(luò),而沒有推導(dǎo)BLSTM網(wǎng)絡(luò)。
其實無論RNN如何變種,像現(xiàn)在最好的GRU等,無非都是在單元(unite)里面的trick而已。
具體公式推導(dǎo),就是鏈?zhǔn)角髮?dǎo)法則!建議先推RNN、然后LSTM、最后不用推導(dǎo)BLSTM都明白了
四. CRNN局部之CTC
關(guān)于CTC的描述網(wǎng)上很多,也講解的比較清楚了,這里主要是說一下我筆者看原理時候的幾個難點(弄了好久才想明白)
關(guān)于CTC是什么東西?
-
讓我們來看一下正常分類CNN網(wǎng)絡(luò):
圖4-1
這是鳶尾花分類網(wǎng)絡(luò),其中輸入一張圖像,輸出是經(jīng)過softmax的種類概率。
那么這個網(wǎng)絡(luò)標(biāo)簽是什么???

標(biāo)簽的制作都是需要經(jīng)過Incode(分類的種類經(jīng)過數(shù)字化編碼),測試過程需要Encode(把輸出的數(shù)字解碼成分類的種類)
這很簡單,讀者應(yīng)該都理解,代碼為了計算機能看懂,編碼就是神經(jīng)網(wǎng)絡(luò)能看懂。
- 那么RCNN如何編碼呢?

假設(shè)有26個英文字母要識別,那么種類數(shù)=27(還有一個空白blank字符)
假設(shè)CNN輸出以50個序列為基準(zhǔn)(讀者這里看不懂就去看RNN識別手寫數(shù)字識別),序列太大訓(xùn)練不準(zhǔn),識別結(jié)果會漏字母。序列太小訓(xùn)練不準(zhǔn),識別會多字母。
- 打個小比喻

假設(shè)CTC是一個黑盒子,它能把輸出那么多序列變化為一個序列,這樣就能和CNN分類一樣計算Loss了。當(dāng)然不會那么簡單,CTC還是比較復(fù)雜的,后面具體看這個黑盒子如何工作的。。。。
CTC理論基礎(chǔ)
注釋:這里筆者就不進行詳細的描述了,感覺別人比我寫的更好:非常詳細的CTC力理論
在這一章,主要針對筆者遇到的重難點進行介紹:
- 訓(xùn)練--前向后相傳播
本來還去看了馬爾科夫的前后向傳播的理論,沒怎么看懂(數(shù)學(xué)基礎(chǔ)太差)
針對本文的CTC前后向傳播還是比較簡單理解的

其實這里可以理解為動態(tài)規(guī)劃的方式進行的,因為其使用遞歸的方式,以一個點為中心,向前和向后進行遞推,以動態(tài)規(guī)劃的方式理解就很簡單了。。。。不懂的讀者可以刷leetcode,做幾題就有感覺了
- 測試--CTC Prefix Search Decoding和CTC Beam Search Decoding
最簡單的搜索追溯算法:
每個都列舉最后計算,可以看出來是指數(shù)級搜索,效率肯定不行的

貪婪算法+動態(tài)規(guī)劃---CTC Prefix Search Decoding:
第一步是進行合并操作:

第二步輸出最大概率:

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

- CTC Prefix Search Decoding屬于貪心算法,為什么可以得到最優(yōu)解?
仔細看我上面的標(biāo)題,CTC Prefix Search Decoding特意加了一個動態(tài)規(guī)劃,動態(tài)規(guī)劃是屬于最優(yōu)解的算法。
因為CTC算法的前提是序列相互獨立,所以當(dāng)前的序列最大,那么整體的序列最大。
注意:得合并之后的序列最大,而不是單個序列的最大?。?!,如果是單個序列最大,那這就是單獨的貪心算法了。
- 為什么CTC序列之間相互獨立還可以計算有序列的文字,文字之間肯定有序列的???
這都得重新看網(wǎng)絡(luò)了,網(wǎng)絡(luò)用到了BLSTM,序列這個東西已經(jīng)使用過了,到達CTC已經(jīng)是使用序列之后的輸出了。
不得不佩服設(shè)計網(wǎng)絡(luò)的人RNN+CTC,語音是使用最早的。
其實回頭想一下,如果CTC是有序列的,那么前向和后項概率根本不能使用馬爾科夫模型(前提相互獨立)了,也不能使用CTC Prefix Search Decoding,只能使用最簡單的追溯算法,那效率那么低,怎么廣泛使用呢?
五. 參考文獻
[透視矯正網(wǎng)絡(luò)](Attentional Scene Text Recognizer with Flexible Rectification)
