基於深度學習(端到端)的OCR文字識別
一、環境搭建
開發環境: Anaconda | python3.6 + tensorflow/keras/pytorch
該模型使用了 OpenCV 模組。
依賴包版本需求:你可以使用 pip install 包名/ conda install 包名 安裝依賴
easydict==1.7
tensorflow_gpu==1.3.0
scipy==0.18.1
numpy==1.11.1
opencv_python==3.4.0.12
Cython==0.27.3
Pillow==5.0.0
PyYAML==3.12
如果您沒有gpu裝置,演示步驟如下:
(1)將檔案./ctpn/text.yml中的“USE_GPU_NMS”設定為“False” (2)在檔案中設定“__C.USE_GPU_NMS” ./lib/fast_rcnn/config.py為“False”;
(3)在檔案./lib/fast_rcnn/nms_wrapper.py中註釋掉“from lib.utils.gpu_nms import gpu_nms”;
(4)重建
from Cython.Build import cythonize
import numpy as np
from distutils.core import setup
try:
numpy_include = np.get_include()
except AttributeError:
numpy_include = np.get_numpy_include()
setup(ext_modules=cythonize(["bbox.pyx","cython_nms.pyx"],
include_dirs= [numpy_include]),)
(a)執行匯出CFLAGS = -I/home/zhao181/ProGram1/anaconda2/lib/python2.7/site-packages/numpy/core/include
你應該使用自己的numpy路徑。
(b)cd xxx/text-detection-ctpn-master/lib/utils
和execute:python setup.py build
(c)將.so檔案從“build”目錄複製到xxx/text-detection-ctpn-master/lib/utils。
(5)cd xxx/text-detection-ctpn-master並執行:python . /ctpn/demo.py
順便說一下,我使用
Anaconda2-4.2.0-Linux-x86_64.sh和tensorflow-1.3.0-cp27-cp27mu-manylinux1_x86_64.whl(cpu)在ubuntu 16.04下執行。
如果您有一個gpu裝置,請按以下方式構建庫
cd lib / utils
chmod + x make.sh
./make.sh
Github地址:https://github.com/eragonruan/text-detection-ctpn
我們使用 Classify(vgg16) 來檢測文字方向,使用CTPN(CNN+RNN) 來檢測文字區域,使用 CRNN(CNN+GRU/LSTM+CTC) 來進行 EndToEnd的文字識別。
- 文字方向檢測網路-Classify(vgg16)
- 文字區域檢測網路-CTPN(CNN+RNN)
- EndToEnd文字識別網路-CRNN(CNN+GRU/LSTM+CTC)
基於影象分類,在VGG16模型的基礎上,訓練0、90、180、270度檢測的分類模型(考慮到文字在紙張上出現的情況)。程式碼參考angle/predict.py檔案,訓練圖片8000張,準確率88.23%
關於 OCR 端到端識別:CRNN網路請檢視 https://blog.csdn.net/wsp_1138886114/article/details/82555728
你可以執行demo.py 寫入測試圖片的路徑來測試識別效果,
如果想要顯示ctpn的結果,修改檔案./ctpn/ctpn/other.py 的draw_boxes函式的最後部分,cv2.inwrite(‘dest_path’,img),如此,可以得到ctpn檢測的文字區域框以及影象的ocr識別結果
訓練網路
工程專案目錄
"""
root
.
├── ctpn
| ├── __init__.py
| ├── demo.py
| ├── demo_pb.py
| ├── generate_pb.py
| ├── text.yml
| └── train_net.py
├── data
| ├── demo
| ├── oriented_results
| ├── results
| ├── ctpn.pb
| └── results
└── lib
├── __pycache__
├── datasets
├── fast_rcnn
├── networks
├── prepare_training_data
├── roi_data_layer
├── rpn_msr
├── text_connector
├── utils
└── __init__.py
"""
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=模型訓練的權重儲存位置,這個自己指定)
對於純文字的識別結果還行,感覺可以在crnn網路在加以改進,現在的crnn中的cnn有點淺,並且rnn層為單層雙向+attention,目前正在針對這個地方進行改動,使用遷移學習,以restnet為特徵提取層,使用多層雙向動態rnn+attention+ctc的機制,將模型加深。
關於訓練需求準備
準備資料
- 首先,下載預先訓練的VGG網路模型並將其放入data / pretrain / VGG_imagenet.npy中。
- 其次,準備紙上提到的培訓資料,或者您可以下載我從谷歌驅動器或百度雲準備的資料。或者您可以按照以下步驟準備自己的資料。
- 根據您的資料集修改prepare_training_data / split_label.py中的路徑和gt_path。並執行:
cd lib/prepare_training_data
python split_label.py
資料集準備好後:
python ToVoc.py
將準備好的訓練資料轉換為voc格式。它將生成一個名為TEXTVOC的資料夾。將此資料夾移動到資料/然後執行:
cd ../../data
ln -s TEXTVOC VOCdevkit2007
訓練
python ./ctpn/train_net.py
- 你可以在ctpn / text.yml中修改一些超級引數,或者只使用我設定的引數。
- 我在檢查站提供的模型在GTX1070上訓練了50k iters。
- 如果你正在使用cuda nms,它每次約需0.2秒。因此完成50k迭代需要大約2.5小時。
特別鳴謝
http://www.sohu.com/a/256995954_787107
https://github.com/eragonruan/text-detection-ctpn