chinese-ocr自然場景下不定長文字識别(ctpn + densenet)
注:本文中多處使用各位前輩的經驗,項目代碼不友善提供,可參考:
https://github.com/YCG09/chinese_ocr
實作功能
文字方向檢測 0、90、180、270度檢測
文字檢測 後期将切換到keras版本文本檢測 實作keras端到端的文本檢測及識别
不定長OCR識别
環境部署
GPU環境
sh setup.sh
CPU環境
sh setup-cpu.sh
CPU python3環境
sh setup-python3.sh
cd ./ctpn/lib/utils
./make-for-cpu.sh
運作demo
将測試圖檔放入test_images目錄,檢測結果會儲存到test_result中
Python3 demo.py
模型訓練
一共分為3個網絡
- 文本方向檢測網絡-Classify(vgg16)
- 文本區域檢測網絡-CTPN(CNN+RNN)
- DenseNet + CTC
文字方向檢測-vgg分類
基于圖像分類,在VGG16模型的基礎上,訓練0、90、180、270度檢測的分類模型.
詳細代碼參考angle/predict.py檔案,訓練圖檔8000張,準确率88.23%
模型位址:https://pan.baidu.com/s/1zquQNdO0MUsLMsuwxbgPYg
##文字區域檢測CTPN
關于ctpn網絡,網上有很多對其進行介紹講解的,算法是2016年提出的,在印書體識别用的很多,這裡有前輩一篇相應的博文http://xiaofengshi.com/2019/01/23/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0-TextDetection/,在文章中結合本repo的代碼對ctpn的原理進行了詳細的講解。
CTPN訓練
1. 準備資料
首先,下載下傳預先訓練的VGG網絡模型并将其放在data/pretrain/VGG_imagenet.npy.
其次,準備論文提到的訓練資料。或者我們可以放置自己的資料
根據我們的資料集修改prepare_training_data/split_label.py中的path和gt_path路徑。并執行下面操作。
cd lib/prepare_training_data
python3 split_label.py
它将在目前檔案夾中生成準備好的資料,然後運作下面代碼:
Python3 ToVoc.py
将準備好的訓練資料轉換為voc格式。它将生成一個名為TEXTVOC的檔案夾。将此檔案夾移動到資料/然後運作
cd …/…/data
ln -s TEXTVOC VOCdevkit2007
2.資料集下載下傳
作者給的資料是預處理過的資料,
我們下載下傳了資料,VOCdevkit2007 隻有1.06G,但是此資料可以訓練自己的模式,要是想訓練自己的資料,那麼需要自己标注資料,找自己的資料。
作者使用的icdar17的multi lingual scene text dataset, 沒有用voc,隻是用了他的資料格式,下面給出的資料是作者實作的源資料位址。
gt_path的資料位址:http://rrc.cvc.uab.es/?com=contestant
進入2017MLT 檢視如下:
然後我們可以發送郵件,注冊使用者,并激活,進入下載下傳頁面:
3. 存放資料
作者訓練使用的是7200張圖檔。使用train或者trainval是一樣的,因為用的都是這7200張圖檔。可以檢查一下VOCdevkit2007/VOC2007/ImageSets/Main下面的train.txt和trainval.txt是否正确,是否是7200張圖檔。你在用自己資料訓練的時候也要特别注意一點,資料的标注格式是不是和mlt這個資料集一緻,因為split_label這個函數是針對mlt的标注格式來寫的,是以如果你原始資料标注格式如果和它不同,轉換之後可能會是錯的,那麼得到的用來訓練的資料集可能也不對。
對原始gt檔案進一步處理的分析(也就是對txt标注資料進行進一步處理),生成對應的xml檔案部分内容截圖如下:
4.資料集标注
在标注資料的時候采用的是順時針方向,一次是左上角坐标點,右上角坐标點,右下角坐标點,左下角坐标點(即x1,y1,x2,y2,x3,y3,x4,y4),,這裡的标注方式與通用目标檢測的目标檢測方式一樣,這裡我标注的資料是生成到txt中,具體格式如下:
x1,y1,x2,y2,x3,y3,x4,y4 分别是一個框的四個角點的x,y坐标。這是因為作者用的mlt訓練的,他的資料就是這麼标注的,如果你要用一些水準文本的資料集,标注是x,y,w,h的,也是可以的,修改一下split_label的代碼,或者寫個小腳本把x,y,w,h轉換成x1,y1,x2,y2,x3,y3,x4,y4就行。
圖檔标注方法
如果想訓練自己的資料集,那麼我們可以自己去标注圖檔。本文将推薦一個十分好用的資料标注工具LabelImg。
這款工具是全圖形界面,用Python和Qt寫的,最牛的是其标注資訊可以直接轉化成為XML檔案,與PASCAL VOC以及ImageNet用的XML是一樣的。(具體如何使用,直接參考下面GitHub或者網上百度即可)
它來自下面的項目:https://github.com/tzutalin/labelImg
其中标簽存儲功能和“Next Image”、“Prev Image”的設計使用起來比較友善。
該軟體最後儲存的xml檔案格式和ImageNet資料集是一樣的。
• Labelme 适用于圖像分割任務的資料集制作
• labellmg适用于圖像檢測任務的資料集制作
• yolo_mark适用于圖像檢測任務的資料集制作
• Vatic适用于圖像檢測任務的資料集制作
注(标注工具生成的的是xml檔案,可直接生成資料集無需執行python3 split_label.py,另外labelimg工具産生的是左上和右下坐标并非四點坐标,有能解決此問題的分享給我,謝謝)
5.訓練
簡單的運作
你可以在ctpn/text.yml中修改一些參數,或者隻使用作者設定的參數
作者提供的模型在GTX1070上訓練了50K iters
如果我們正在使用cuda nms ,它每次約需要0.2秒,是以完成50k疊代需要大約2.5小時
當然,我們可以指定在那塊顯示卡上運作,比如我這裡指定選擇第一塊顯示卡上訓練,訓練的指令如下:
CUDA_VISIBLE_DEVICES=“0” python ./ctpn/train_net.py
訓練完成後 cd 項目/ctpn/ctpn/text.yml 修改模型加載路徑
densenet訓練
1. 資料準備
資料集:https://pan.baidu.com/s/1QkI7kjah8SPHwOQ40rS1Pw (密碼:lu7m)
共約364萬張圖檔,按照99:1劃分成訓練集和驗證集
資料利用中文語料庫(新聞 + 文言文),通過字型、大小、灰階、模糊、透視、拉伸等變化随機生成
包含漢字、英文字母、數字和标點共5990個字元
每個樣本固定10個字元,字元随機截取自語料庫中的句子
圖檔分辨率統一為280x32
圖檔解壓後放置到train/images目錄下,描述檔案放到train目錄下
2. 訓練
cd train
python3 train.py
3.資料集制作
1.工具生成資料集
可參考SynthText_Chinese_version,TextRecognitionDataGenerator和text_renderer
2.個人制作資料集
圖檔可使用opencv處理
标注文本:手工标注文字
标注檔案格式轉換:百度網盤
連結:https://pan.baidu.com/s/13ja-547KlebHrROZmwLBWQ
提取碼:tkq8