CRNN
本專案是PaddlePaddle 2.0動態圖實作的CRNN文字識別模型,可支持長短不一的圖片輸入,CRNN是一種端到端的識別模式,不需要通過分割圖片即可完成圖片中全部的文字識別,CRNN的結構主要是CNN+RNN+CTC,它們分別的作用是,使用深度CNN,對輸入影像提取特征,得到特征圖,使用雙向RNN(BLSTM)對特征序列進行預測,對序列中的每個特征向量進行學習,并輸出預測標簽(真實值)分布,使用 CTC Loss,把從回圈層獲取的一系列標簽分布轉換成最終的標簽序列,

CRNN的結構如下,一張高為32的圖片,寬度隨意,一張圖片經過多層卷積之后,高度就變成了1,經過paddle.squeeze()就去掉了高度,也就說從輸入的圖片BCHW經過卷積之后就成了BCW,然后把特征順序從BCW改為WBC輸入到RNN中,經過兩次的RNN之后,模型的最終輸入為(W, B, Class_num),這恰好是CTCLoss函式的輸入,

使用環境:
- PaddlePaddle 2.0.1
- Python 3.7
原始碼地址:https://github.com/yeyupiaoling/PaddlePaddle-CRNN
在線運行一下:https://aistudio.baidu.com/aistudio/projectdetail/1751953
準備資料集
- 貼心的筆者準備了一個生成長度不一的驗證碼圖片作為資料集,該程式可以自動生成圖片以及資料串列和資料詞匯表,需要讀者修改自己字體檔案的路徑
font_path,網上下載一搜一大把,筆者用的是這個字體點擊下載 ,
python create_image.py
執行上面程式生成的圖片會放在dataset/images目錄下,生成的訓練資料串列和測驗資料串列分別放在dataset/train_list.txt和dataset/test_list.txt,最后還有個資料詞匯表dataset/vocabulary.txt,
資料串列的格式如下,左邊是圖片的路徑,右邊是文字標簽,
dataset/images/1617420021182_c1dw.jpg c1dw
dataset/images/1617420021204_uvht.jpg uvht
dataset/images/1617420021227_hb30.jpg hb30
dataset/images/1617420021266_4nkx.jpg 4nkx
dataset/images/1617420021296_80nv.jpg 80nv
以下是資料集詞匯表的格式,一行一個字符,第一行是空格,不代表任何字符,
f
s
2
7
3
n
d
w
訓練自定義資料,參考上面的格式即可,
訓練
不管你是自定義資料集還是使用上面生成的資料,只要檔案路徑正確,即可開始進行訓練,該訓練支持長度不一的圖片輸入,但是每一個batch的資料的資料長度還是要一樣的,這種情況下,筆者就用了collate_fn()函式,該函式可以把資料最長的找出來,然后把其他的資料補0,加到相同的長度,同時該函式還要輸出它其中每條資料標簽的實際長度,因為損失函式需要輸入標簽的實際長度,
python train.py
- 在訓練程序中,程式會使用VisualDL記錄訓練結果,可以通過以下的命令啟動VisualDL,
visualdl --logdir=log --host=0.0.0.0
- 然后再瀏覽器上訪問
http://localhost:8040可以查看結果顯示,如下,



預測
訓練結束之后,使用保存的模型進行預測,通過修改image_path指定需要預測的圖片路徑,解碼方法,筆者使用了一個最簡單的貪心策略,
python infer.py
輸出如下:
預測結果:2gmnt93e
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286887.html
標籤:AI
上一篇:SaaS為啥不能分銷
