1. 程式人生 > >基於深度學習(端到端)的OCR文字識別

基於深度學習(端到端)的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)重建

setup.py

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的文字識別。

  1. 文字方向檢測網路-Classify(vgg16)
  2. 文字區域檢測網路-CTPN(CNN+RNN)
  3. 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