• CRNN中英文字符识别


    代码地址如下:
    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大师代发,拒绝转载,转载需要作者授权

  • 相关阅读:
    soapUI学习笔记--用例字段参数化
    python 写数据到txt 文件
    Python生成8位随机字符串的一些方法
    python datetime获取几分钟、小时、天之前的时间
    MQTT 测试工具介绍
    运用MQTT-JMeter插件测试MQTT服务器性能
    mqtt-jmeter
    ActiveMQ测试工具
    MQTT压力测试工具之JMeter插件教程
    volatile非原子性的示例
  • 原文地址:https://www.cnblogs.com/demodashi/p/9582520.html
Copyright © 2020-2023  润新知