在六七月份參加了一個比賽,做的項目是提取圖片中的文字信息,首先是接觸了一些文本檢測算法(如CTPN,East),后研究了文本識別算法(我認為較好的是CRNN)。代碼實現是參考算法提出者的pytorch,python3版本的crnn實現。因為python版本的迭代,導致代碼重使用比較難,其中涉及到ctc,python編碼,中文數據集,如何將模型finetune到自己的應用場景上種種問題。實現的深度學習框架是pytorch,雖然TensorFlow也可以,但是比較多坑。其實是什么框架實現的都沒關系,現在語法都是比較簡單,看懂不難!
因為自己已經踩了很多坑,也填好了這些坑,就將自己填好的項目貢獻給大家!
https://github.com/Sierkinhane/crnn_chinese_characters_rec 代碼地址
這次分享的是文本識別算法CRNN,具體的內容我就不涉及了,這篇文章主要是做算法代碼的實現(參考原作者),建議大家研讀算法一定要看作者發的Paper! CRNN論文地址:http://arxiv.org/abs/1507.05717(作者是華中科技大學的老師)
先放一些效果圖,利用360萬的中文數據訓練集,最后可以finetune到97.7%的驗證准確率,訓練好的模型在train_models文件夾
第一、二張圖片是最近修改的一個demo,第三、四張圖是CTPN算法和CRNN的結合,可以將圖片上的任何文字信息提取。因為CTPN要求的環境比較復雜,所以這次只放出CRNN的代碼,因為CRNN實現環境比較簡單。
現在開始介紹代碼:
代碼的實現必須是Linux環境(因為涉及到warp-ctc的安裝,最好是Ubuntu16.04,能跳的坑我基本都填了)
1. Warp-ctc安裝
首先得安裝warp-ctc https://github.com/SeanNaren/Warp-ctc,這是pytorch版本的ctc實現(計算序列loss,具體看論文),安裝方法按照作者的步驟即可,如果遇到問題可以私聊我。我是在Ubuntu16.04安裝的,並沒有太大問題,但是在17.04就遇到很多問題,所以最好用Ubuntu16.04作為代碼實現環境。
2. 測試
安裝好ctc后,直接運行終端輸入 python3 test.py 試下效果,測試圖片在test_images文件夾下。
3. 訓練
正確的訓練效果如圖。
訓練之前首先制作數據集,因為360萬的中文數據集制作成lmdb格式的數據有十幾G,就沒直接放到Github中。
先下載360萬中文數據集:https://pan.baidu.com/s/1ufYbnZAZ1q0AlK7yZ08cvQ
對於數據集我想說明一下,在文字識別領域有比較多的識別場景,例如場景文本識別,比較正規的圖片信息識別,這些不同的應用場景需要對應不同的數據集訓練,這次我自己應用到的場景比較正規的字體識別,所以這個訓練集不一定能夠用到所有場景,但也確實提供了一個不錯數據集資源!還有就是訓練集最好是具有語義信息,如果只是將文字隨機的組合生成圖片作為訓練集,模型收斂會更慢並且准確率受限!
下圖是部分訓練集
(這個數據是在Github中找到的,暫時沒找到他的地址,很感謝作者的奉獻!)
數據集是隨機選取定長的字數,經過模糊、傾斜、顏色變化等操作之后生成的,比較具有一般性,能很好地提升模型的Robust。
下載好數據集之后如果解壓出錯,不完整,可以用好壓進行修復。
接下來是制作lmdb格式的數據。
圖片與之對應的標簽我鏈接:https://pan.baidu.com/s/1jfAKQVjD-SMJSffOwGhh8A 密碼:u7bo,只需要將下載好的數據集放到lmdb文件中,根據情況修改to_lmdb.py中的文件名 運行該py程序就可以制作lmdb格式的數據!
制作好數據集之后將它放到lmdb_dataset文件夾中調出終端:
python3 crnn_main.py --train_root 訓練數據集路徑 --val_root 驗證集路徑 --cuda (如果有cuda加速可選)
大概流程就是這樣了,最主要的還是自己看待自己琢磨!
(不定長識別是將訓練集圖片的放縮feed到神經網絡中的尺寸應用到測試中,test.py已經標注!)
(如果有幫助到你,可以在Github給我個star!)
--------------------- 本文來自 Sierkinhane 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/Sierkinhane/article/details/82857572?utm_source=copy