1. 程式人生 > >自然場景文字檢測CTPN原理詳解

自然場景文字檢測CTPN原理詳解

自然場景文字檢測CTPN流程詳解

標籤: 文字檢測 CTPN tensorflow
說明: 借鑑了網上很多資源,如有侵權,請聯絡本人刪除!

摘要

對於自然場景中的文字檢測,難點是:字型多變、遮擋、不規則變化等,其實對於實際的應用場景,針對自己的需求可以採用通用的目標檢測框架(faster Rcnn,SSD,Yolo,Retina)等網路,或許也能滿足專案的需求。
而CTPN等用於文字檢測的方法,對自然場景的文字檢測具有更強的魯棒性,就是針對文字檢測較SSD,Yolo等可能具有更高的精度;其次文字檢測中涉及到旋轉和仿射變化等,此時,通用的目標檢測框檢就不合適。
在這裡插入圖片描述

CTPN優點

  • 採用固定寬度的anchor,只做一個h迴歸
  • 特徵提取的過程中採用VGG作為base net 再加上一個conv3×3_512,再以W方向為序列(sequence),512為特徵數(input feature),經過雙向LSTM。主要目的,提高特徵之間的練習
  • 這裡有一個疑問,既然在W方向送入LSTM,進行了特徵增強,那是否可以在H方向增強特徵的聯絡。

網路模型與前向傳播過程

在這裡插入圖片描述
模型結構如上圖所示

整個模型的前向傳播過程如下(以1張圖片為例):

  1. 採用VGG16作為base net進行特徵提取。假設經過VGG之後的feature map為:W×H×C。
  2. 增加一個conv3×3_512的卷積層,(這一步網上好多說是用3×3的視窗做滑窗,我看tensorflow的原始碼,就是做了一個卷積,具體可查原論文和official code)。這一步的輸出還是為:feature map:W×H×C=512。
  3. 將上一步的feature map reshape為LSTM的輸入格式,LSTM採用128個隱藏節點的雙向Bilstm,輸出之後再接256×512的線性層,線性層輸出之後再reshape為1×W×H×C,即和輸入尺寸一樣;在tensorflow中上一步的feature map reshape為:[1 × H, W, C=512],應該是(batch, steps, inputs)的格式,因為是增強特徵在W方向的聯絡,於是應該以W為steps。這一步的輸出為:feature map:1×W×H×C=512。
  4. 線性迴歸層512×(10×4)做anchor的座標預測,512:每個點的特徵數,10:每個點有10個不同高度的anchors,4:一個anchor有4個座標點(xmin,xmax,ymin,ymax);線性迴歸層512×(10×2)做類別預測,2:兩個類別,是文字,不是文字。這一步的輸出為:box_coordinate_pred:1×W×H×(104),box_label_pred:1×W×H×(102),
  5. 共生成W×H×10個anchors,採用和faster rcnn類似的策略對每個anchor,指定target_box和target_label
  6. 計算交叉熵和座標點的L1smooth loss。tensorflow原始碼中還回歸輸出了inside_weights和outside_weights,兩個都為:1×W×H×(10*4),這個不知道怎麼用的。

訓練

對於每一張訓練圖片,總共抽取128個樣本,64正64負,如果正樣本不夠就用負樣本補齊。這個和faster rcnn的做法是一樣的。

測試 TODO

  • TO DO …

Tricks

  • 採用densenet,resnet等最新的base net,這裡安利一下pytorch,tensorflow的模型建模和除錯確實沒有pytorch方便
  • 對H方向也採用一定策略(LSTM或其他方法)進行特徵增強

reference

  1. CTPN/CRNN的OCR自然場景文字識別理解(一)
  2. https://github.com/eragonruan/text-detection-ctpn