CRNN——pytorch + wrap_ctc编译,实现pytorch版CRNN

简介

CTC可以生成一个损失函数,用于在序列数据上进行监督式学习不需要对齐输入数据及标签,经常连接在一个RNN网络的末端,训练端到端的语音或文本识别系统。CTC论文

本文主要是讲解用wrap_ctc来实现pytorch版本的CRNN环境配置过程,用其来进行OCR端到端文本识别。(注:wrap_ctc是百度开源的一个模块,需要自己编译使用。在pytorch 1.0中,自带了CTC loss,用pytorch 1.0的话可以不用编译这个wrap_ctc)

CTC网络的输入

CTC网络的输入是一个样本(图像)经过网络(一般是CNN+RNN)计算后生成的特征向量特征序列),这部分可参考CRNN论文

特征序列里各个向量是按序排布的,是从图像样本上从左到右的一个个小的区间映射过来的,可以设置区间的大小(宽度),宽度越小,获得的特征序列里的特征向量个数越多,极端情况下,可以设置区间宽度为1,这样就会生成width(图像宽度)个特征向量(作为后续RNN的输入)。

CNN产生的一系列(假设为width个)特征序列作为后续RNN(在CRNN中用的是Bi-LSTM)的输入,可以得到一个width维的概率矩阵,这个概率矩阵就可以作为CTC的输入,用来计算CTC loss

CTC网络的计算过程

CTC网络的计算是为了得到特征序列最可能对应的标签对象,对语音识别是一段话,对文本识别是一段文字。

  1. 计算特征序列里每个特征向量(共N个)分别对应的n个可能结果的概率。如果当前的特征向量的预测结果不在样本标签列表里,就置预测结果为blank空格或下划线。计算结果从一个N维的特征序列,得到一个N×n概率矩阵(就是上面所说的)。

  2. 计算上述预测的N×n的概率矩阵的所有可能结果的概率,中间涉及到去除重复字母和blank的操作。N个n维的特征向量(即N×n的概率矩阵)对应的所有可能的结果有 N n N^{n} Nn个,涉及到组合学,计算所有可能概率的成本会很高,但是CTC运用了动态规划(前后向算法,这部分推荐看一下HMM)以大幅降低计算的复杂性。

CTC网络的输出

对识别过程,取出最大概率对应的结果作为识别结果输出;
对训练过程,取最大概率对应的结果跟真实标签之间的差异(计算编辑距离等方法),作为训练Loss,反向传输给前端网络。

CTC计算过程示意图:

在这里插入图片描述

pytorch安装

默认你会了。。。

warp-CTC安装

首先我用的是环境是python 3.6,pytorch 1.0.1,起码这个版本是没有问题的。

参考crnn-train-pytorch,这个就是官方的教程,这部分github上的教程没有问题,如果出现错误,可以去Issues中看一下有没有相同错误,我当时安装的时候也是出现了错误,在issues里面找到了答案,出问题一定要去看一下。下面我贴几个我编译时出现问题,然后找到的答案,希望能帮到大家。

每个人遇到的问题可能不一样,上面仅供参考,相信出问题issues里面大概率会有解决办法的。
注:上面第三个链接是原版wrap_ctc里面的Issues,这里面也可能有解决问题的答案。

warp-CTC是百度开源的一个可以应用在CPU和GPU上高效并行的CTC代码库,对CTC算法进行了并行处理。

warp-CTC安装

git clone https://github.com/SeanNaren/warp-ctc.git
cd warp-ctc
mkdir build; cd build
cmake ..
make
cd ../pytorch_binding
python setup.py install

添加环境变量

vim ~/.bashrc
export WARP_CTC_PATH=/home/xxx/warp-ctc/build

验证pytorch中warp-CTC是否可用GPU例子:

cd /home/xxx/warp-ctc/pytorch_binding/tests
python test_gpu.py

若输出下列内容,则代表warp_ctc编译安装成功:
在这里插入图片描述
或:

import torch
from torch.autograd import Variable
from warpctc_pytorch import CTCLoss
ctc_loss = CTCLoss()
# expected shape of seqLength x batchSize x alphabet_size
probs = torch.FloatTensor([[[0.1, 0.6, 0.1, 0.1, 0.1], [0.1, 0.1, 0.6, 0.1, 0.1]]]).transpose(0, 1).contiguous()
labels = Variable(torch.IntTensor([1, 2]))
label_sizes = Variable(torch.IntTensor([2]))
probs_sizes = Variable(torch.IntTensor([2]))
probs = Variable(probs, requires_grad=True) # tells autograd to compute gradients for probs
cost = ctc_loss(probs, labels, probs_sizes, label_sizes)
cost.backward()
print('PyTorch bindings for Warp-ctc')

Bug解决

到此整个CRNN的运行环境基本已经配置完毕(还需要安装一个lmdb,pip install lmdb即可),在编译wrap_ctc的时候可能会出一些莫名奇妙的Bug,这部分还是推荐先去Issues里面找答案。像这么成熟的模块,Issues里面基本已经包含所有常见错误了,其他有问题欢迎大家多交流,共同进步~

References

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: CRNN(卷积循环神经网络)是一种深度学习模型,通常用于文本序列、音频信号和图像识别等任务。crnn.pytorch是CRNN模型在Python PyTorch中的实现,提供了端到端的训练和测试功能。 在使用crnn.pytorch训练时,需要准备数据集并进行预处理。通常的处理包括将图片转换成灰度图像、进行归一化处理、对字符进行标签化等。可以使用文本编辑器进行预处理的代码实现。此外,要确保数据集的标注和图片的匹配性。 接下来,需要实例化CRNN模型并设置超参数。超参数包括训练批次大小、学习率、权重衰减等。CRNN模型可以通过PyTorch模型Zoo来初始化,也可以根据需要定制自己的网络结构。 在训练过程中,使用反向传播算法来调整模型参数,优化训练损失(loss)并提高模型精度。还要设置训练过程中的评估指标以监控模型的表现。 最后,保存训练好的模型以便进行预测,或者使用已经保存的模型进行微调或继续训练。 总之,crnn.pytorch的训练过程需要准备数据,实例化模型,设置超参数,训练并对结果进行评估,最后保存训练好的模型。需要注意的是,合理的超参数选择和数据预处理对训练结果至关重要。 ### 回答2: CRNN是一种将卷积神经网络(CNN)和循环神经网络(RNN)结合起来进行序列识别的模型。CRNN对于语音和文本的识别比较有效,所以在OCR、语音识别等领域都有广泛应用。 在PyTorch实现的CRNN训练流程如下: 1.准备数据集:CRNN需要大量的训练数据,可以使用captcha、MNIST、SVHN等公共数据集,也可以自己生成数据集。首先将图片转换为灰度图并缩放到指定大小,然后将标签转换为序列化的列表形式。 2.定义模型:将CNN和RNN结合起来,构建CRNN模型。模型包括卷积层、池化层、循环层、全连接层和softmax层,可以通过继承nn.Module并重写forward函数实现。 3.定义损失函数和优化器:交叉熵损失函数常用于序列识别任务,可以通过torch.nn.CrossEntropyLoss实现,优化器推荐使用Adam。 4.训练模型:将数据集划分为训练集和测试集,定义好epoch数量、batch size等参数,然后通过for循环迭代训练集进行训练,在每个epoch结束时在测试集上进行验证。将训练好的模型参数保存下来。 5.模型测试:将训练好的模型加载进来,对输入的图片进行预测,将预测结果转换成字符串并输出。 以上是CRNN模型的训练流程,值得注意的是,在训练中需要注意输入数据格式的一致性,同时还需要进行数据增强以提高模型的鲁棒性和泛化能力。 ### 回答3: CRNN(卷积循环神经网络)是一种将卷积神经网络和循环神经网络结合起来的强大模型,广泛应用于语音识别和文本识别等任务中。CRNN.pytorch是一个基于PyTorch框架实现的CRNN模型,可以用于训练和测试OCR(光学字符识别)和语音识别等任务。 要训练CRNN.pytorch,需要以下步骤: 1. 准备数据集:数据集包括输入(图片或语音)和标签(对应的字符或文字)两部分。可以使用已有的数据集,也可以自行制作。 2. 配置训练参数:配置训练所需的参数,比如超参数(学习率、batch size等)和模型参数(卷积核大小、循环神经网络层数等)。这些参数的选择需要根据数据集和任务来进行调整。 3. 定义模型:定义CRNN的模型结构,包括卷积神经网络、循环神经网络和全连接层,并根据任务来选择对应的损失函数。 4. 数据预处理:将数据集的输入部分进行预处理,比如将图片转化为灰度图像并调整大小,或将语音进行分段并转化为Mel频率谱图。 5. 训练模型:通过迭代优化模型参数,使得模型对于输入的图片或语音能够输出对应的字符或文字。同时可以使用验证集监控模型的训练效果,防止过拟合。 6. 测试模型:使用测试集测试模型的准确率和召回率等指标,以此评估模型的性能。 总结来说,CRNN.pytorch的训练过程需要仔细调整训练参数、选择合适的损失函数、进行数据预处理、迭代训练模型,并最终使用测试集进行测试。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值