這次到CRNN部分了,CRNN網絡很簡單,就是CNN+RNN,因為RNN适用于時間序列類型的資料,車牌呢,其實也是有規律的,比如第一位是漢字,後面是字母+漢字;
前一部分通過MTCNN将車牌區域已經定位了,那這部分就需要拿CRNN來對其進行訓練,使其能作為一個pipeline處理MTCNN輸出的車牌圖像;
首先是CNN+RNN的網絡,這裡使用的網絡比較簡單,CNN部分使用了淺層網絡和BN層,最終輸出sequence_length*512維的輸出;輸出正好可以輸入後續的RNN網絡,其中RNN網絡的序列長度是可變的,根據輸入特征的長度而定;
RNN的網絡結構中,深度為2層,序列長度根據輸入待定,隐層單元數是256,車牌的類别數量是69,是以可以認為是每個時間點的輸出為一個69維的向量,對向量做softmax,獲得預測的結果;當然,此時預測的結果還是不準确的,也就是CTC中B變換之前的一個序列預測,若要得到最終預測,還需要進行B變換;
序列長度的值和輸入圖像的寬度是有關聯的,是以在使用時候,将MTCNN輸入圖像的寬度除以4,得到了序列的長度,當然,這個序列長度要考慮B變換前的預測長度,不能太短,太短的話,在進行CTC計算的時候,可能得到的結果還不夠車牌号的規定位數。
在訓練中,很簡單,使用自帶函數tf.nn.ctc_loss即可,使用ctcc損失函數進行計算;
通過這樣的訓練,我們就可以使用模型預測了;
最後,MTCNN+CRNN僅僅是一次小的嘗試,目前的結果由于樣本的關系,還沒做大量的訓練,也沒做優化,流程整個跑通;後面有時間的話,可以按這個方案,用更多資料訓練一下,另外,各個環節再優化一下。