重點:原論文必定要得看!!!英語好的直接看原論文,不懂的地方查資料。英語很差的(好比筆者),先看中文資料,而後再看原論文。git
CRNN全稱是:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
說本身是端到端的的網絡,其實嚴格意義根本不是的,而是一種識別網絡而已。github
嚴格意義端到端的網絡:Fast Oriented Text Spotting with a Unified Network
算法
請看下圖爲CRNN
網絡的輸入,得檢測到文字以後才能去識別文字。網絡
不嚴格的端到端是啥意思呢?post
下圖1-2所示爲傳統的文字識別,還得把每一個文字分割再去識別(這方面的東西不進行說明,很簡單的傳統方法)學習
而CRNN直接輸入上圖獲得結果。測試
CRNN網絡結構入下圖1-3所示:編碼
正常的圖像提取,提取到的特徵以序列方式輸出,這裏不懂的讀者能夠去看RNN訓練手寫數字識別.net
特徵輸入到BLSTM,輸出每一個序列表明的值(這個值是一個序列,表明可能出現的值),對輸出進行softmax操做,等於每一個可能出現值的機率。
至關於一個LOSS,一個計算機率到實際輸出的機率,具體後面章節介紹。
假設上圖2-1爲提取到的特徵(特徵是一塊一塊的,這確定不是特徵圖,爲了看着舒服)
圖像通過VGG的特徵提取以後就是普通的feature map,而後進行上述的劃分,造成特徵序列!
若是你的文字很斜或者是縱向的,那就得把特徵豎向劃分序列了!
基本原理不懂讀者能夠看看這個教程
懂了原理這部分仍是比較簡單的(理解簡單,實現太難了),筆者這裏只介紹幾個使用過程難理解的點
從上圖能夠獲得的是X1---X6,總共6個序列
從上圖3-2能夠看出,是由五層網絡構成
這裏引用知乎大神的一個圖,上圖中序列爲4,層數爲3層(固然不加輸入和輸出也能夠說是1層,這裏按正常CNN去說就是3層了)
從圖中能夠看出每一個序列包含一個CNN,圖中的隱藏層神經元數量爲24個,因爲RNN使用權值共享,那麼不一樣的神經元個數就爲6個。
以上圖知乎大神的圖爲例子,每一個輸入序列長度8
假設這個網絡是一個RNN識別手寫數字識別的圖,那麼圖像的寬爲4,高爲8
注意:輸入序列的數量和輸入序列的長度和神經元個數無關!!!這裏想象RNN便可理解
筆者只是推導了單向的LSTM網絡,而沒有推導BLSTM網絡。
其實不管RNN如何變種,像如今最好的GRU等,無非都是在單元(unite)裏面的trick而已。
具體公式推導,就是鏈式求導法則!建議先推RNN、而後LSTM、最後不用推導BLSTM都明白了
關於CTC的描述網上不少,也講解的比較清楚了,這裏主要是說一下我筆者看原理時候的幾個難點(弄了很久纔想明白)
這是鳶尾花分類網絡,其中輸入一張圖像,輸出是通過softmax的種類機率。
那麼這個網絡標籤是什麼???
標籤的製做都是須要通過Incode
(分類的種類通過數字化編碼),測試過程須要Encode
(把輸出的數字解碼成分類的種類)
這很簡單,讀者應該都理解,代碼爲了計算機能看懂,編碼就是神經網絡能看懂。
假設有26個英文字母要識別,那麼種類數=27(還有一個空白blank字符)
假設CNN輸出以50個序列爲基準(讀者這裏看不懂就去看RNN識別手寫數字識別),序列太大訓練不許,識別結果會漏字母。序列過小訓練不許,識別會多字母。
假設CTC是一個黑盒子,它能把輸出那麼多序列變化爲一個序列,這樣就能和CNN分類同樣計算Loss了。固然不會那麼簡單,CTC仍是比較複雜的,後面具體看這個黑盒子如何工做的。。。。
註釋:這裏筆者就不進行詳細的描述了,感受別人比我寫的更好:很是詳細的CTC力理論
在這一章,主要針對筆者遇到的重難點進行介紹:
原本還去看了馬爾科夫的先後向傳播的理論,沒怎麼看懂(數學基礎太差)
針對本文的CTC先後向傳播仍是比較簡單理解的
其實這裏能夠理解爲動態規劃的方式進行的,由於其使用遞歸的方式,以一個點爲中心,向前和向後進行遞推,以動態規劃的方式理解就很簡單了。。。。不懂的讀者能夠刷leetcode,作幾題就有感受了
最簡單的搜索追溯算法:
每一個都列舉最後計算,能夠看出來是指數級搜索,效率確定不行的
貪婪算法+動態規劃---CTC Prefix Search Decoding:
第一步是進行合併操做:
第二步輸出最大機率:
擴充CTC Prefix Search Decoding算法---CTC Beam Search Decoding
仔細看我上面的標題,CTC Prefix Search Decoding特地加了一個動態規劃,動態規劃是屬於最優解的算法。
由於CTC算法的前提是序列相互獨立,因此當前的序列最大,那麼總體的序列最大。
注意:得合併以後的序列最大,而不是單個序列的最大!!!,若是是單個序列最大,那這就是單獨的貪心算法了。
這都得從新看網絡了,網絡用到了BLSTM,序列這個東西已經使用過了,到達CTC已是使用序列以後的輸出了。
不得不佩服設計網絡的人RNN+CTC,語音是使用最先的。
其實回頭想一下,若是CTC是有序列的,那麼前向和後項機率根本不能使用馬爾科夫模型(前提相互獨立)了,也不能使用CTC Prefix Search Decoding,只能使用最簡單的追溯算法,那效率那麼低,怎麼普遍使用呢?