【轉載】crnn的一些訓練技巧

建議看原文,

我是怕原文掛了,才做一個轉載備份一下。。。
博主總結得很好,就是博客園有時候真的搜不到啊

原文鏈接: Recurrent Neural Network[CTC]

ctc可以看作一種對字符識別過程中,一整句話的自動切分。
在這裏插入圖片描述
CTC是看似和HMM有些聯繫,然後也採用DP來進行求解,將CTC結構圖中<RNN輸出,CTC層>單獨拿出來,得到如下形式:
在這裏插入圖片描述
上圖如CTC結構圖, 最開始只能以(-)或者標籤序列中第一個字符開始,即這裏的t=1時,是{(-),(C)}; 在結尾也只能以()(-)或標籤序列中最後一個字符結束,即這裏的 t=Tt=T 時,是{()(T)}\{(-),(T)\}

所以,在所有的路徑中,只有開始和結束的點算是確定的。不過值得注意的是,這裏最開始和結束的空白符,分別是 t=1t=1 的最開始空白符和 t=Tt=T 的結束空白符

訓練的注意事項:

  1. 標點符號:在建立數據集的時候,需要將中文的如[,.’";:]等標點符號換成英文的,或者反過來,不要有兩份一樣的,因爲目前不論是attention_ocr還是ctc都算是象形文字,所以模型看到中文分號和英文分號,總覺得是同一個東西,所以會分錯
  2. 訓練集:在建立數據集的時候,因爲ctc_loss中有個sequence_length,所以,爲了增加數據分佈一致性和ctc的效率,最好先對圖片對應的文字進行長度排序,比如前面100個樣本的label都是小於5的字符串;後面100個都是小於10的字符串;後面100個都是小於15的字符串,等等。
  3. 在讀取數據的時候,同一個batch中因爲圖片大小需要相同,而如果是全卷積網絡,是可以讓不同batch之間獨立的。所以圖片的縮放可以按照batch之間各自決定。比如第一個batch讀取長度小於5的label和圖片,將其縮放到10032;第二個讀取長度小於10的label和圖片,將其縮放到20032;
  4. 訓練集雙尾問題:爲了數據的平衡性,需要將數據集中出現次數特別少的和出現次數特別多的label的樣本刪除,保證每個字符的頻率都適中;
  5. 字庫可以去搜狗輸入法 上下載,然後將scel轉換成txt,然後就能接着生成自己需要的了
    文字圖片生成:https://github.com/JarveeLee/SynthText_Chinese_version
'''在其中的colorize3_poisson.py中'''
l_out =  blit_images(l_normal.color,l_bg.color.copy())

'''等同於http://www.learnopencv.com/seamless-cloning-using-opencv-python-cpp/
    這裏實現的泊松圖像編輯中的混合模式,
    所以整個項目中的poisson_reconstruct.py腳本可以刪除'''
obj = l_normal.color
bgi = l_bg.color.copy()
mask = 255 * np.ones(obj.shape, obj.dtype)
width, height, channels = bgi.shape
center = (height//2, width//2)
mixed_clone = cv2.seamlessClone(obj, bgi, mask, center, cv2.MIXED_CLONE)
l_out = mixed_clone

使用自己合成數據的代碼遇到的問題:

1.想要往dest.h5裏面加數據,需要獲取深度和圖片的分塊信息:issue地址
可以使用 depth-from-single image ConvNets和一些流行的分割工具,例如gPb-UCM或者 “Holistic Edge Detection”.
深度和分割工具的使用和解釋,以及效果,我另開了一文:點擊這裏

2.用合成的圖片做ocr (其實已經有了chinese版本,倉庫地址:SynthText from Ankush
issue地址和解決方案

文字合成後屬性問題
文本角度文本角度得到更大的文字更長的字調整字符間距
對比度問題
文本顏色渲染渲染問題調整生成的文字的對比度文字與背景對比度
圖片分割問題
圖片分割替換ucm
depth2xyz的bug生成裁剪的單詞圖片pt和px的問題文字在放置的時候區域的選擇-lee平面上生成文字字符頻率的意義
取消坡度粘貼:隨機生成每個圖片的depth即可,然後將plane2xyz中z = np.ones_like(z)*-0.1,使得該函數失效,每一個點的z軸高度一致,然後刪除place_text中2個透視映射homography函數
整個圖片都作爲背景區域:將圖片的seg修改爲整個圖片大小,然後計算其中的像素點,格式如原來。然後將get_text_placement_mask中place_mask前面加一句ROW=W;COL=H,使得每次都選取整個圖片。

建議:

可以在batch獲取的時候,先統一高resize成32,然後取batch中最長的那個width爲準,其他不足的以雪花點不全(先生成一個imgW*32的雪花點矩陣,且imgW很長)。從而防止圖像失真。

猜測

上面的幾個鏈接中,是先訓練2個字的語料,然後逐漸上升到10個字的語料(雖然裏面也有人說直接訓練10個字的語料,這不是重點)。不過實際做inference的時候,該模型卻能對應15甚至20個字的圖片進行預測。所以個人猜測,是不是其實本身學習的也還是一種映射機制,即只是爲了讓整個模型能夠將某些圖像對應成某個字:
在這裏插入圖片描述
如上圖中幾個國字,因爲“象形”,所以其實是爲了學習不同背景,不同形狀下的對應關係,所以其實背景的複雜程度加上字體本身的變化,顏色等等,纔是數據集建立的關鍵,而lstm本身讀取語料的語義雖然有糾錯功能,不過卻並不是識別的本質。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章