字符识别(CRNN,Opencv,Pytorch)

本文介绍了使用CRNN进行字符识别的实践过程,包括数据集的创建,网络构建,数据读取和模型训练。通过随机选择4到9个字符生成训练和验证图像,实现了95%以上的识别准确率。
摘要由CSDN通过智能技术生成

0. 前言

至于CRNN网络的细节这里就不再多言了,网上有很多关于crnn的介绍,这里直接讲一下代码的实现流程

1. 数据集准备

CRNN是识别文本的网络,所以我们首先需要构建数据集,使用26个小写字母以及0到9十个数字,一共有36个字符,从这36个字符中随机选择4到9个字符(这里要说明一下,网上很多关于crnn的训练集中每张图片中的字符个数是一样的,这就具有很大的局限性。所以本文使用4到9随机选择字符个数构建图片。)

生成数据集代码如下:

import cv2
import numpy as np
import random
import imgaug.augmenters as iaa

def get_img():
    zfu=['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',
         '0','1','2','3','4','5','6','7','8','9']
    # zfu=[str(i) for i in range(10)]


    # zfu=[str(i) for i in range(10)]
    k=random.randint(4,9)
    select=random.choices(zfu,k=k)
    lab=[zfu.index(i) for i in select]

    select="".join(select)
    font=cv2.FONT_HERSHEY_COMPLEX
    src=np.ones(shape=(50,250,3)).astype('uint8')*255
    src=cv2.putText(src,select,(20,27),font,1,(0,0,0),2)
    seq = iaa.Sequential([
        # iaa.Flipud(0.5),  # flip up and down (vertical)
        # iaa.Fliplr(0.5),  # flip left and right (horizontal)
        iaa.Multiply((0.5, 1.5)),  # change brightness, doesn't affect BBs(bounding boxes)
        iaa.GaussianBlur(sigma=(0, 1.0)),  # 标准差为0到3之间的值

        iaa.Crop(percent=(0, 0.06)),
        iaa.Grayscale(alpha=(0, 1)),
        iaa.Affine(
            #translate_px={"x": (0, 15), "y": (0, 15)},  # 平移
            scale=(0.95, 1.05),  # 尺度变换
            mode=iaa.ia.ALL,
            cval=(100, 255)
        ),
        iaa.Resize({
   "height": 32, "width": 200})
    ])
    # img是numpy格式,无归一化
    src=np.expand_dims(src,axis=0)
    src = seq(images=src)[0]
    # cv2.imshow('a21',src)
    # cv2.waitKey(0)
    return src,lab

f_train=open('train.txt','w')
f_val=open('val.txt','w')

for i in range(10000):
    img,lab=get_img()
    lab=[str(i) for i in lab]
    lab=" ".join(lab)
    path='train_data/'+str(i)+'.jpg'
    cv2.imwrite(path,img)
    f_train.write(path+' '+lab+'\n')
    print(i)
for i in range(1000):
    img,lab=get_img()
    lab=[str(i) for i in lab]
    lab=" ".join(lab)
    path='val_data/'+str(i)+'.jpg'
    cv2.imwrite(path,img)
    f_val.write(path+' '+lab+'\n')
    print(i)



运行上述代码之前首先需要手动新建两个空文件夹用于存放训练图像和验证图像,文件夹名字分别是:train_data和val_data。运行完上述代码以后会在train_data文件夹中保存10000张训练图像,在val_data文件夹中保存1000张验证图像。此外还会生成两个txt文件,分别为train.txt和val.txt。
txt文本中存放的是图片的路径及包含字符的类别,如下所示:

在这里插入图片描述
部分训练图像如下所示:

在这里插入图片描述

2.构建网络

构建crnn网络的代码如下所示:

# crnn.py
import argparse, os
import torch
import torch.nn as nn


class BidirectionalLSTM(nn.Module):

    def __init__(self, nInput_size, nHidden, nOut):
        super(BidirectionalLSTM, self).__init__()

        self.lstm = nn.LSTM(nInput_size, nHidden, bidirectional=True)
        self.linear = nn.Linear(nHidden * 2, nOut)

    def forward(self, input):
        recurrent, (hidden, cell) = self.lstm(input)
        T, b, h = recurrent.size()
        t_rec = recurrent.view(T * b, h)

        output = self.linear(t_rec)  # [T * b, nOut]
        output = output.view(T, b, -1)  # 输出变换为[seq,batch,类别总数]

        return output


class CNN(nn.Module):

    def __init__(self, imageHeight, nChannel):
        super(CNN, self).__init__()
        assert imageHeight % 
### 回答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的训练过程需要仔细调整训练参数、选择合适的损失函数、进行数据预处理、迭代训练模型,并最终使用测试集进行测试。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值