深度學習:識別圖片中的電話號碼(2)

背景介紹見:深度學習:識別圖片中的電話號碼(1)html

識別電話號碼最終採用的是:循環卷積網絡。先看下網絡的結構,有幾處比較trick的地方,後面會講到。git

lrcn_ctc_net

注意的地方

1. 上圖中的網絡是訓練網絡的結構,訓練的輸入有三個:image圖片;seq是時序的標識,若是時序長度爲5則爲[0,1,1,1,1],0表示序列的開始,1表示序列繼續(當前時刻有信號輸入),上一時刻的細胞狀態會傳遞給當前時刻。label表示序列的真實結果,如「123」應該表示爲[1,2,3,-1,-1],長度和seq一致。github

在batchsize中,多個樣本的seq大小若是不一樣,短序列的seq=[0,1,1,…1,0,0..0],表示短序列提早結束了。固然電話識別中,把圖片特徵按列等分了n份,你們的序列長度是一致的。網絡

2. 序列的分割學習

輸入image的大小是:batch_size*3*h*wspa

輸入seq的大小是:batch_size*n ,n表示序列的長度=圖片特徵要切割的份數code

輸入label的大小是:batch_size*nhtm

通過ZF特徵提取網絡,relu5的輸出爲:batch_size*num_output*height*width,num_output表示featureMap的數據,width/height特徵層的寬高。blog

trans1轉置層,參數爲:圖片

transpose_param {
    dim: 0 
    dim: 3
    dim: 2 
    dim: 1
}

輸出的維度爲:batch_size*width*num_output*height。trick的作法是:n的大小能夠設置爲width,即把特徵層的每一列做爲一個時刻的輸入。

conv5_trans爲全鏈接層,固然它的全鏈接只針對某一列在num_output個featureMap上的節點進行,參數爲:

inner_product_param {
    num_output: 4096
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
    axis: 2
  }

輸出爲:batch_size*width(n)*4096。

3. 構建序列,主要是構建LSTM的輸入格式,注意LSTM的輸入是:T*batch_size*C,T就是時序長度n,C是特徵的維度即4096。

4. LSTM的輸出爲:T*batch_size*lstm_c,lstm_c表示LSTM中特徵維度的大小,這裏取256。

通過fc-final,全鏈接爲字符的種類數目+1(背景)。好比數字,輸出爲T*batch_size*11。

5. 最終輸入CTC網絡,CTC網絡會對T時刻的數據作後處理計算與真實label的差別,返回loss。正如上節說的,T的大小應該大於label的長度,由於CTC的後處理會把結果中的空格(背景)和連續相同字符去除(重複識別)去除,若是T<len(label),後處理後獲得的字符必定和label不一樣了,這樣就沒意義了。

好比T=20,序列爲:「1_88_8_1_1_66_10_16_8」,處理後獲得「18811610168」。

檢測網絡

檢測網絡和訓練相似,只是CTCLoss層替換爲CTCDecoder便可。

因爲新加了一些層的依賴,基於的caffe爲:https://github.com/houkai/caffe

相關文章
相關標籤/搜索