代码地址如下:
http://www.demodashi.com/demo/13870.html

参考GitHub源码:https://github.com/YoungMiao/crnn

应demo大师文章要求,我再补充下,推荐下,这个平台挺好

1.环境搭建

1.1 基础环境

  • Ubuntu14.04 + CUDA
  • opencv2.4 + pytorch + lmdb +wrap_ctc

安装lmdb apt-get install lmdb

1.2 安装pytorch

pip,linux,cuda8.0,python2.7:pip install http://download.pytorch.org/whl/cu80/torch-0.1.12.post2-cp27-none-linux_x86_64.whl

参考:http://pytorch.org/

1.3 安装wrap_ctc

git clone https://github.com/baidu-research/warp-ctc.git`
cd warp-ctc
mkdir build; cd build
cmake ..
make

GPU版在环境变量中添加

export CUDA_HOME="/usr/local/cuda"

cd pytorch_binding
python setup.py install

参考:https://github.com/SeanNaren/warp-ctc/tree/pytorch_bindings/pytorch_binding

1.4 注意问题

  1. 缺少cffi库文件 使用pip install cffi安装
  2. 安装pytorch_binding前,确认设置CUDA_HOME,虽然编译安装不会报错,但是在调用gpu时,会出现wrap_ctc没有gpu属性的错误

2. crnn预测(以21类中英文为例)

模型地址:链接:https://eyun.baidu.com/s/3dEUJJg9 密码:vKeD

运行/contrib/crnn/demo.py

原始图片为:

识别结果为:

# 加载模型
model_path = './samples/netCRNN_9_112580.pth'
# 需识别的图片
img_path = './data/demo.png'
# 识别的类别
alphabet = 'ACIMRey万下依口哺摄次状璐癌草血运重'
# 设置模型参数 图片高度imgH=32, nc, 分类数目nclass=len(alphabet)+1 一个预留位, LSTM设置隐藏层数nh=128, 使用GPU个数ngpu=1
model = crnn.CRNN(32, 1, 22, 128, 1).cuda()

替换模型时,注意模型分类的类别数目

3、程序实现(crnn 训练(以21类中英文为例))

注意:--------------------------------------

请补充完整个实现过程,以下实现,没有说到具体的实现过程,应该把具体的代码说清楚,思路说清楚。数据怎样清洗的,怎样建模的等等

1. 数据预处理

运行/contrib/crnn/tool/tolmdb.py

# 生成的lmdb输出路径
outputPath = "./train_lmdb"
# 图片及对应的label
imgdata = open("./train.txt")

2. 训练模型

运行/contrib/crnn/crnn_main.py

python crnn_main.py [--param val]
--trainroot 训练集路径
--valroot 验证集路径
--workers CPU工作核数, default=2
--batchSize 设置batchSize大小, default=64
--imgH 图片高度, default=32
--nh LSTM隐藏层数, default=256
--niter 训练回合数, default=25
--lr 学习率, default=0.01
--beta1
--cuda 使用GPU, action='store_true'
--ngpu 使用GPU的个数, default=1
--crnn 选择预训练模型
--alphabet 设置分类
--Diters
--experiment 模型保存目录
--displayInterval 设置多少次迭代显示一次, default=500
--n_test_disp 每次验证显示的个数, default=10
--valInterval 设置多少次迭代验证一次, default=500
--saveInterval 设置多少次迭代保存一次模型, default=500
--adam 使用adma优化器, action='store_true'
--adadelta 使用adadelta优化器, action='store_true'
--keep_ratio 设置图片保持横纵比缩放, action='store_true'
--random_sample 是否使用随机采样器对数据集进行采样, action='store_true'

示例:python /contrib/crnn/crnn_main.py --tainroot [训练集路径] --valroot [验证集路径] --nh 128 --cuda --crnn [预训练模型路径]

修改/contrib/crnn/keys.pyalphabet = 'ACIMRey万下依口哺摄次状璐癌草血运重'增加或者减少类别

  1. 注意事项

训练和预测采用的类别数和LSTM隐藏层数需保持一致

4、项目结构

从上往下大概说明下

1.crnn.py是crnn网络结构模块

#双向的LSTM

class BidirectionalLSTM(nn.Module)

#CRNN网络

class CRNN(nn.Module)

crnn网络设计:

CRNN由CNN+BiLSTM+CTC构成:



网络结构:

  • input: 输入文字块,归一化到32*w 即height缩放到32,宽度按高度的比率缩放,也可以缩放到自己想要的宽度,训练时为批次训练,缩放到[32,Wmax]),示例为(32,128)

  • 经过两个conv层和两个poling层,conv3层时数据大小为256*8*32,两个pooling层步长为2

  • pooling2层步长为(2,1),(个人看法:作者使用的英文训练,英文字符的特征是高大于宽的特征,倘若使用中文训练,建议使用(2,2),我的代码中默认为(2,2),示例以(2,1)为例,所以此时输出为256*4*33

  • bn层不改变输出的大小(就是做个归一化,加速训练收敛),p3层时,w+1,所以pooling3层时,输出为512*2*34

  • conv7层时,kernel 为22,stride(1,1) padding(0,0)

    Wnew = (2 + 2 * padW - kernel ) / strideW + 1 = 1

    Hnew = 33

    所以conv7层输出为512
    1*33

  • 后面跟两个双向Lstm,隐藏节点都是256

    Blstm1输出33*1256

    Blstm2输出 33
    *1*5530 5530 = 字符个数 + 非字符 = 5529 + 1

    最终的输出结果直观上可以想象成将128分为33份,每一份对应5530个类别的概率

2.tolmdb.py生成训练lmdb数据模块

  • 输入图片list的文档,大概格式如下

3.crnn_main.py主程序模块

  • 增加了对类别增删的增量训练,line104~line117

    4.dataset.py数据加载模块
  • class alignCollate:按照比例缩放w
  • class randomSequentialSampler:随机采样batch

    5.utils.py编解码模块

5、数据部分

数据获取方法有两种:

  1. 生成自然场景文本

    GitHub:https://github.com/ankush-me/SynthText
  2. 生成常规文本:

    GitHub:https://github.com/YoungMiao/synthdata-zh

    有时间在记录两种方法

CRNN中英文字符识别

代码地址如下:
http://www.demodashi.com/demo/13870.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

CRNN中英文字符识别的更多相关文章

  1. gameUnity 网络游戏框架

    常常在想,有没有好的方式,让开发变得简单,让团队合作更加容易. 于是,某一天 动手写一个 架构, 目前版本 暂定 0.1 版本.(unity5.0.0f4 版本以上) 我打算 开源出来 0.1有什么功 ...

  2. 【OCR技术系列之七】端到端不定长文字识别CRNN算法详解

    在以前的OCR任务中,识别过程分为两步:单字切割和分类任务.我们一般都会讲一连串文字的文本文件先利用投影法切割出单个字体,在送入CNN里进行文字分类.但是此法已经有点过时了,现在更流行的是基于深度学习 ...

  3. 使用Python基于VGG/CTPN/CRNN的自然场景文字方向检测/区域检测/不定长OCR识别

    GitHub:https://github.com/pengcao/chinese_ocr https://github.com/xiaofengShi/CHINESE-OCR |-angle 基于V ...

  4. 字符识别OCR原理及应用实现

    字符识别OCR原理及应用实现 文本是人类最重要的信息来源之一,自然场景中充满了形形色色的文字符号.光学字符识别(OCR)相信大家都不陌生,就是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过 ...

  5. Tesseract-OCR字符识别简介

    OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程.Tesseract:开源的OCR识别引擎,初期Tesseract引擎 ...

  6. ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

  7. [修正] Firemonkey 中英文混排折行问题(移动平台)

    问题:FMX 在移动平台的文字显示并非由该平台的原生 API 来显示,而是由 FMX.TextLayout.GPU 来处理,也许是官方没留意到中文字符的问题,造成在中英文混排折行时,有些问题. 适用: ...

  8. [连载]《C#通讯(串口和网络)框架的设计与实现》- 13.中英文版本切换设计

    目       录 第十三章     中英文版本切换设计... 2 13.1        不用自带的资源文件的理由... 2 13.2        配置文件... 2 13.3        语言 ...

  9. Excel—分离中英文字符

    1.如下图: 2.提取中文字符为: 3.提取应为字符为: 4.说明: 该方法的原理利用了LENB和LEN计算方法的不同,LEN计算字符数,中英文都算作一个字符:LENB计算字节数,中文算两个字节,英文 ...

随机推荐

  1. [转]android中OnTouch和OnClick、 imagebutton的src和background有什么区别

    1.OnTouch和OnClick有何区别?   专业回答 1.onClick就传入一个View对象,而 onTouch要传入一个View 对象和 MotionEvent的对象2.onTouch对控件 ...

  2. JLInk 各种版本图片收集

    所有图片来自网络, 版权归原始所有者拥有. JLink V5 JLink V6 JLink V7 JLink V8 JLink V9 JLink Ultra JLink Pro

  3. ARM 调用约定 calling convention

    int bar( int a, int b, int c, int d, int e, int f, int g ) { ]; array2[ ] = a + b; array2[ ] = b + c ...

  4. SQL Server 2000 ——DBCC命令

    http://blog.163.com/ruifeng_00/blog/static/6904584200971291923462/   一.定义 微软当初从SYBASE将DBCC是作为数据库一致性检 ...

  5. VS2010下面Empty Project使用

    VS2010下面Empty Project使用:1,添加代码HelloApp #include <afxwin.h> class CHelloApp:public CWinApp{publ ...

  6. Linux 系统 /proc/[pid]/stat 文件解释

    转载:http://www.net527.cn/a/caozuoxitong/Linux/2012/0823/24385.html [root@localhost ~]# cat /proc/6873 ...

  7. UML建模工具Visio 、Rational Rose、PowerDesign的比较

    UML建模工具Visio .Rational Rose.PowerDesign的比较   ROSE是直接从UML发展而诞生的设计工具,它的出现就是为了对UML建模的支持,ROSE一开始没有对数据库端建 ...

  8. EF 不允许启动新事务,因为有其他线程正在该会话中运行。

    引起原因:在查询中提交了更改.如在遍历的时候,调用了savechanges(): 解决:把savechange()提到循环外.             IOrderedQueryable<TOH ...

  9. django 实现上传文件功能

    需求:自己写一个文件上传功能 代码: urls.py from django.conf.urls import url from django.contrib import admin from ap ...

  10. 文本相似性计算总结(余弦定理,simhash)及代码

    最近在工作中要处理好多文本文档,要求找出和每个文档的相识的文档.通过查找资料总结如下几个计算方法: 1.余弦相似性 我举一个例子来说明,什么是"余弦相似性". 为了简单起见,我们先 ...