實現功能
- 文字方向檢測 0、90、180、270度檢測
- 文字檢測 後期將切換到keras版本文本檢測 實現keras端到端的文本檢測及識別
- 不定長OCR識別
環境部署
Bash
##GPU環境
sh setup.sh
## CPU環境
sh setup-cpu.sh
##CPU python3環境
sh setup-python3.sh
使用環境:python3.6+tensorflow1.7+cpu/gpu
模型訓練
一共分爲3個網絡 1. 文本方向檢測網絡-Classify(vgg16)
2. 文本區域檢測網絡-CTPN(CNN+RNN)
3. EndToEnd文本識別網絡-CRNN(CNN+GRU/LSTM+CTC)
文字方向檢測-vgg分類
基于圖像分類,在VGG16模型的基礎上,訓練0、90、180、270度檢測的分類模型.
詳細代碼參考angle/predict.py文件,訓練圖片8000張,准確率88.23%
文字區域檢測CTPN
關于ctpn網絡,網上有很多對其進行介紹講解的,算法是2016年提出的,在印書體識別用的很多,CTPN網路結構如下:
ctpn是一種基于目標檢測方法的文本檢測模型,在本repo的ctpn中anchor的設置爲固定寬度,高度不同,相關代碼如下:
def generate_anchors(base_size=16, ratios=[0.5, 1, 2],
scales=2 ** np.arange(3, 6)):
heights = [11, 16, 23, 33, 48, 68, 97, 139, 198, 283]
widths = [16]
sizes = []
for h in heights:
for w in widths:
sizes.append((h, w))
return generate_basic_anchors(sizes)
基于這種設置,ctpn只能檢測水平方向的文本,如果想要ctpn可以支持垂直文本檢測,可以在anchor生成函數上進行修改。
OCR 端到端識別:CRNN
ocr識別采用GRU+CTC端到到識別技術,實現不分隔識別不定長文字
提供keras 與pytorch版本的訓練代碼,在理解keras的基礎上,可以切換到pytorch版本,此版本更穩定
此外參考了了tensorflow版本的資源倉庫:https://github.com/xiaofengShi/CTC_TF
爲什麽使用ctc
ctc是一種解碼機制,在使用ctpn提取到待檢測文本行之後,我們要識別提取到的區域內的文本內容,目前廣泛存在兩種解碼機制。
一種是seq2seq機制,輸入的是圖像,經過卷積編碼之後再使用RNN解碼,爲了提高識別的准確率,一般會加入attention機制。
另一種就是ctc解碼機制,但是對于ctc解碼要滿足一個前提,那就是輸入序列的長度不小于輸出序列的長度。ctc主要用于序列解碼,我們不需要對序列中的每個元素進行標記,只需要知道輸入序列對應的整個label是什麽即可,針對ocr項目,也就是輸入一張圖像上面寫著“歡迎來到中國”這幾個字,我們只需要是這幾個字,而沒必要知道這幾個字在輸入圖像中所在的具體位置,實際上如果知道每個字所在的位置,就是單字符識別了,的確會降低任務的複雜多,但是現實中我們沒有這麽多標記號位置的數據,這個時候CTC就顯得很重要了。
使用CNN+RNN+CTC的機制,實際上可以使用CNN+CTC的機制,CNN推薦選擇densenet或者resnet。
使用預訓練測試
運行demo.py 寫入測試圖片的路徑即可,如果想要顯示ctpn的結果,修改文件./ctpn/ctpn/other.py 的draw_boxes函數的最後部分,cv2.inwrite('dest_path',img),如此,可以得到ctpn檢測的文字區域框以及圖像的ocr識別結果
使用數據訓練
1 對ctpn進行訓練
定位到路徑–./ctpn/ctpn/train_net.py
預訓練的vgg網絡路徑VGG_imagenet.npy 將預訓練權重下載下來,pretrained_model指向該路徑即可, 此外整個模型的預訓練權重checkpoint
ctpn數據集還是百度雲 數據集下載完成並解壓後,將.ctpn/lib/datasets/pascal_voc.py 文件中的pascal_voc 類中的參數self.devkit_path指向數據集的路徑即可
2 對crnn進行訓練
keras版本 ./train/keras_train/train_batch.py model_path–指向預訓練權重位置 MODEL_PATH—指向模型訓練保存的位置 keras模型預訓練權重
pythorch版本./train/pytorch-train/crnn_main.py
parser.add_argument(
'--crnn',
help="path to crnn (to continue training)",
default=預訓練權重的路徑,看你下載的預訓練權重在哪啦)
parser.add_argument(
'--experiment',
help='Where to store samples and models',
default=模型訓練的權重保存位置,這個自己指定)
文字檢測及OCR識別結果
主要是因爲訓練的時候,只包含中文和英文字母,因此很多公式結構是識別不出來的
文獻鏈接:https://arxiv.org/pdf/1803.00085.pdf
數據集下載地址:https://ctwdataset.github.io/