实战8:基于tensorflowd搭建CRNN 卷积网络识别图片中的文字(完整代码+数据)

使用 tensorflow 构建神经网络,识别图片中的文字。

前言

基于图像的序列识别一直是计算机视觉中长期存在的研究课题。在本文中,我们研究了场景文本识别的问题,这是基于图像的序列识别中最重要和最具挑战性的任务之一。提出了一种将特征提取,序列建模和转录整合到统一框架中的新型神经网络架构。与以前的场景文本识别系统相比,所提出的架构具有四个不同的特性:

  • 与大多数现有的组件需要单独训练和协调的算法相比,它是端对端训练的。

  • 它自然地处理任意长度的序列,不涉及字符分割或水平尺度归一化。

  • 它不仅限于任何预定义的词汇,并且在无词典和基于词典的场景文本识别任务中都取得了显著的表现。

  • 它产生了一个有效而小得多的模型,这对于现实世界的应用场景更为实用。在包括 IIIT-5K,Street View Text 和 ICDAR 数据集在内的标准基准数据集上的实验证明了提出的算法比现有技术的更

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【资源说明】 课程设计基于python卷积循环神经网络(CRNN)的数字识别系统源码+模型+数据集+使用说明.zip 划分训练集与测试集 > 建议使用 ./tools 下 **split_train_and_test_dataset.py** 来执行划分操作 ## 3.修改配置文件 > 配置文件默认在 ./configs/global. yml ``` # 配置文件说明 Global: use_gpu: 是否使用gpu epoch_num: 训练总epoch数 save_model_dir: 模型保存文件夹,默认为./output save_epoch_step: 每几次epoch保存一次模型 learning_rate: 学习率,默认为0.001 character_dict_path: 字典,默认在./configs/dict.txt max_text_length: 最大文字长度 Train: data_dir: 训练集文件夹路径 label_file_dir: 训练集标注文件路径 shuffle: 是否打乱,默认为True batch_size: 训练批次大小 Test: data_dir: 测试集文件夹路径 label_file_dir: 测试集标注文件路径 shuffle: 是否打乱,False batch_size: 测试批次大小 ``` ## 4.启动训练 > 运行项目内 train.py ## 5.进行推理 > 运行项目内 infer.py ```python # 选择训练好的模型路径 model_path = './output/best.pth' # 选择要推理的图片路径 image_path = './example.png' ``` 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
以下是一个利用CRNN搭建文字识别模型的案例代码说明注释: ```python # 导入必要的库 import os import cv2 import numpy as np from keras.models import Sequential from keras.layers.convolutional import Conv2D, MaxPooling2D from keras.layers.recurrent import GRU from keras.layers.core import Dense, Activation, Reshape from keras.optimizers import Adam from keras.callbacks import EarlyStopping from keras.backend import ctc_batch_cost, ctc_decode # 设置参数 img_h = 32 # 图像高度 img_w = 280 # 图像宽度 batch_size = 64 # 批次大小 max_text_len = 20 # 最大文本长度 epochs = 50 # 训练迭代次数 num_classes = 37 # 类别数,包括26个英文字母、10个数字和1个空格 # 定义CRNN模型 def crnn(): # 定义序列模型 model = Sequential() # 添加卷积层 model.add(Conv2D(64, (3, 3), padding='same', input_shape=(img_h, img_w, 1), activation='relu')) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(128, (3, 3), padding='same', activation='relu')) model.add(Conv2D(128, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(256, (3, 3), padding='same', activation='relu')) model.add(Conv2D(256, (3, 3), activation='relu')) model.add(Conv2D(256, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(1, 2))) model.add(Conv2D(512, (3, 3), padding='same', activation='relu')) model.add(Conv2D(512, (3, 3), activation='relu')) model.add(Conv2D(512, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(1, 2))) model.add(Conv2D(512, (2, 2), padding='same', activation='relu')) model.add(Conv2D(512, (2, 2), activation='relu')) # 将输出变成序列形式 model.add(Reshape(target_shape=((img_w // 32), -1))) # 添加循环层 model.add(GRU(256, return_sequences=True)) model.add(GRU(256, return_sequences=True)) # 添加全连接层 model.add(Dense(num_classes)) # 添加激活函数 model.add(Activation('softmax')) # 返回模型 return model # 定义CTC损失函数 def ctc_loss(y_true, y_pred): return ctc_batch_cost(y_true, y_pred, np.ones(batch_size)*int(img_w/32), np.ones(batch_size)*max_text_len) # 定义CTC解码函数 def ctc_decode_func(y_pred): return ctc_decode(y_pred, np.ones(batch_size)*int(img_w/32), greedy=True, beam_width=100, top_paths=1)[0][0] # 加载数据集 def load_data(): # 加载图像和标签 img_files = os.listdir('data/img') X = [] y = [] for img_file in img_files: img = cv2.imread('data/img/'+img_file, 0) img = cv2.resize(img, (img_w, img_h)) X.append(img) with open('data/label/'+img_file.split('.')[0]+'.txt', 'r', encoding='utf8') as f: label = f.read().strip() y.append(label) # 将图像和标签转换为数组形式 X = np.array(X).reshape(-1, img_h, img_w, 1) y = np.array(y) # 将标签转换为one-hot编码形式 y = [np.array([char_to_idx[c] for c in text]) for text in y] y = np.array(y) y = np.zeros((y.shape[0], max_text_len, num_classes)) for i, t in enumerate(y_train): for j, char_idx in enumerate(t): y[i, j, char_idx] = 1 # 返回数据集 return X, y # 训练模型 def train(): # 加载数据集 X_train, y_train = load_data() # 定义模型 model = crnn() # 编译模型 model.compile(loss=ctc_loss, optimizer=Adam()) # 设置EarlyStopping early_stopping = EarlyStopping(monitor='val_loss', patience=5) # 训练模型 model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.2, callbacks=[early_stopping]) # 保存模型 model.save('model.h5') # 测试模型 def test(): # 加载测试集 X_test, y_test = load_data() # 加载模型 model = crnn() model.load_weights('model.h5') # 对测试集进行预测 y_pred = model.predict(X_test) # 对预测结果进行解码 decoded = ctc_decode_func(y_pred) # 计算准确率、召回率和F1值等指标 num_correct = 0 num_total = len(y_test) for i in range(num_total): if y_test[i] == decoded[i]: num_correct += 1 accuracy = num_correct / num_total print('准确率:', accuracy) # 字符集 charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ ' # 字符到索引的映射表 char_to_idx = {char: idx for idx, char in enumerate(charset)} # 索引到字符的映射表 idx_to_char = {idx: char for idx, char in enumerate(charset)} ``` 这个案例包括以下步骤: 1. 定义CRNN模型,包括卷积神经网络(CNN)、循环神经网络RNN)和全连接层。 2. 定义CTC损失函数和CTC解码函数。 3. 加载数据集,并将图像和标签转换为数组形式。 4. 训练模型,并在训练过程使用EarlyStopping防止过拟合。 5. 测试模型,并计算准确率、召回率和F1值等指标。 在这个案例,我们使用了Synthetic Chinese String Dataset数据集,它包括汉字、数字和英文字母的文本图像。在训练过程,我们使用了CTC损失函数对序列输出进行训练,并使用Adam优化器进行模型优化。在测试过程,我们使用CTC解码函数对预测结果进行解码,并计算准确率、召回率和F1值等指标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜辣uu

谢谢关注再接再厉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值