字符识别引擎Calamari总结

论文:Calamari - A High-Performance Tensorflow-based Deep Learning Package for Optical Character Recognition 

Github:https://github.com/Calamari-OCR/calamari

依赖:

Python3

Tensorflow1.8

图片预处理:

  1. 灰度图片
  2. 高度48pix
  3. 基于OCRopy 对训练图片的每一行进行退缩操作
  4. 由于LSTM的瞬态效应,每一行的左右各补16个白色的像素

 

网络结构:

cnn=40:3x3,pool=2x2,cnn=60:3x3,pool=2x2,lstm=200,dropout=0.5

CODEC: ['', ' ', "'", '(', ')', ',', '-', '.', '0', '1', '2', '4', '7', '9', ':', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'V', 'W', 'Y', 'Z', '[', ']', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

需要注意的是在tensorflow中blank是最后一个label,而在这里的CODEC里面,blank是第一个label。

layers {
  filters: 40
  kernel_size {
    x: 3
    y: 3
  }
  stride {
    x: 1
    y: 1
  }
}
layers {
  type: MAX_POOLING
  kernel_size {
    x: 2
    y: 2
  }
  stride {
    x: 2
    y: 2
  }
}
layers {
  filters: 60
  kernel_size {
    x: 3
    y: 3
  }
  stride {
    x: 1
    y: 1
  }
}
layers {
  type: MAX_POOLING
  kernel_size {
    x: 2
    y: 2
  }
  stride {
    x: 2
    y: 2
  }
}
layers {
  type: LSTM
  hidden_nodes: 200
}
solver: ADAM_SOLVER
dropout: 0.5
features: 48
classes: 66
backend {
  cudnn: true
}
ctc_merge_repeated: true
learning_rate: 0.0010000000474974513

评价标准:

字符错误率CER(Character Error Rate),编辑ed(edit distance )。

整体公式表达了编辑距离和pred和groundtruth中较大值的比值。

CER=0表示所有字符匹配正确,CER=1表示没有字符匹配正确

 

多模型融合:

论文中作者使用了5折交叉训练,可以分别训练5个模型。然后进行模型融合,基于confidence_voter_default_ctc (default), confidence_voter_fuzzy_ctc, sequence_voter这3种投票方法,输出最终识别结果。

 

总结:

  1. CRNN的思路,由于这里的模型只有2个卷积层,比CRNN的网络要小很多,所以使用了模型融合的思想。
  2. 纯python制作,支持自己训练和测试
  3. 目前只有识别模块,没有检测模块

猜你喜欢

转载自blog.csdn.net/qq_14845119/article/details/81103207