
简介光学字符识别OCR是计算机视觉领域的关键技术旨在让计算机自动识别图像中的文字信息。其核心原理通常分为文本检测与文本识别两个阶段检测模块定位图像中的文字区域识别模块则解读区域内的字符内容。在技术演进中以全卷积网络进行密集预测的EAST模型和结合卷积循环网络与CTC损失的CRNN模型构成了经典的OCR解决方案具有结构清晰、易于理解和教学性强的特点。这类方案在轻量级部署、算法教学和定制化开发场景中仍有重要价值。本文将以一个基于Keras和TensorFlow 1.x的完整项目为例详细解析如何搭建兼容环境、理解模型架构、准备训练数据并串联检测与识别模块实现端到端OCR流程为深入掌握现代OCR技术奠定坚实基础。1. 项目背景与核心价值为什么现在还需要关注EAST和CRNN最近在整理一个老项目翻出来一个名为“基于Keras_TensorFlow的最新图像文字检测模型(EAST_AdvancedEAST)及文字识别模型(CRNNCTC).zip”的压缩包。看到这个标题估计很多朋友第一反应是这都什么年代了EAST和CRNN不是早就被各种Transformer、YOLO、DBNet、PP-OCR之类的模型“拍在沙滩上”了吗确实从纯技术演进的角度看这个组合算不上“最新”。但恰恰是这种“不新”让它具备了独特的价值——一个极其清晰、完整、可复现的端到端OCR入门与教学范本。这个项目打包了从文字检测到文字识别的完整流程基于Keras和TensorFlow实现。对于刚接触计算机视觉特别是光学字符识别领域的新手来说直接上手最新的、动辄几十个G的预训练大模型很容易陷入“环境都配不好代码跑不起来原理更是一头雾水”的困境。而这个项目就像一份结构清晰的“老地图”虽然标注的不是最前沿的高速公路但它能带你走通从数据准备、模型构建、训练到推理的每一条小路让你真正理解OCR系统是如何“看”和“读”的。它的核心价值在于“可教学性”和“可掌控性”。EAST模型结构相对简洁其核心的“全卷积网络多尺度特征融合几何参数预测”思想是理解现代密集文本检测器如DBNet的绝佳前置知识。而CRNN卷积循环神经网络结合CTC连接时序分类的架构更是序列识别领域的经典范式理解了它再看基于Attention的识别模型会轻松很多。这个项目用Keras这种高层API实现代码可读性高剥离了复杂的工程封装让你能直接看到模型每一层的输入输出亲手调整每一个超参数。对于想夯实基础、理解原理或者需要一个轻量级、可定制OCR方案进行二次开发的开发者来说这个“老项目”的价值可能远超一个直接调用的黑盒API。2. 环境搭建实战避开TensorFlow 2.x的版本“雷区”拿到这个项目第一步就是搭建运行环境。这是劝退很多人的第一道坎尤其是涉及到TensorFlow和Keras的版本兼容性问题。根据项目标题和相关的网络热词如“tensorflow 2.18 安装”、“keras安装教程”、“虚拟环境安装tensorflow”我们可以推断这个项目很可能是在TensorFlow 1.x和Keras 2.x的时代创建的。直接在当前主流的TensorFlow 2.18环境下运行大概率会报各种导入错误、API不兼容的问题。我的建议是不要试图在最新环境下“硬刚”。最稳妥、最高效的方式是使用虚拟环境复现一个接近项目原始开发时期的环境。经过测试以下环境组合是稳定可用的核心环境配置Python: 3.6 或 3.7不推荐3.8及以上某些依赖包可能不兼容TensorFlow: 1.15.0Keras: 2.3.1注意在TF 1.15中应使用import tensorflow.keras而非独立的Keras包CUDA/cuDNN: 如果使用GPU需匹配TF 1.15的版本如CUDA 10.0, cuDNN 7.6。使用CPU版本则可跳过。逐步搭建指南2.1 创建并激活虚拟环境使用conda或venv创建独立的Python环境这是保证环境纯净的关键。# 使用conda推荐 conda create -n ocr_old_env python3.6 conda activate ocr_old_env # 或使用venv python3.6 -m venv ocr_old_env source ocr_old_env/bin/activate # Linux/Mac ocr_old_env\Scripts\activate # Windows2.2 安装TensorFlow 1.15与Keras在激活的虚拟环境中使用pip指定版本安装。# 安装TensorFlow 1.15.0 CPU版本 pip install tensorflow1.15.0 # 安装GPU版本需已配置CUDA环境 # pip install tensorflow-gpu1.15.0 # TensorFlow 1.15已内置Keras但为确保版本一致可固定安装 pip install keras2.3.1安装后在Python中验证import tensorflow as tf print(tf.__version__) # 应输出 1.15.0 import keras print(keras.__version__) # 应输出 2.3.1 # 注意后续代码中应使用 from tensorflow import keras 或 import tensorflow.keras2.3 安装其他项目依赖解压项目zip包通常里面会有一个requirements.txt文件或通过代码导入能看出需要的库。常见依赖包括pip install opencv-python # 用于图像处理 pip install numpy pip install scipy pip install Pillow # 图像处理 pip install matplotlib # 可视化 pip install h5py # 用于模型保存与加载 pip install editdistance # 可能用于评估指标计算如果项目中没有明确的依赖文件你可以先尝试运行主脚本根据报错信息逐个安装缺失的包。避坑提示1Protobuf版本冲突在安装较旧的TensorFlow时可能会遇到TypeError: Descriptors cannot not be created directly.的错误。这是因为新版本的protobuf包4.x与TF 1.x不兼容。解决方法是指定安装低版本的protobufpip install protobuf3.20.*避坑提示2Keras导入路径在TF 1.15中官方推荐使用tensorflow.keras作为Keras的实现。因此在项目代码中你需要将所有import keras或from keras import ...的语句修改为from tensorflow import keras或from tensorflow.keras import ...。这是让旧项目在新相对环境下跑起来最关键的一步。3. EAST与AdvancedEAST文本检测模型深度解析环境配好我们终于可以深入模型内部了。这个项目包含了EAST及其改进版AdvancedEAST。我们首先拆解最核心的EAST模型。3.1 EAST模型的核心思想从“框”到“几何图”传统的文本检测方法如CTPN通常先生成大量的文本提议框再进行复杂的后处理来合并和筛选。EASTEfficient and Accurate Scene Text detector在2017年提出了一种颠覆性的思路将文本检测视为一个像素级的密集预测任务。它不再预测“框”而是为每一个可能是文本的像素点预测两样东西得分Score一个0到1的值表示该像素属于文本区域的置信度。几何形状Geometry描述该像素所在的文本行。EAST论文中提出了两种几何表示旋转框RBOX和四边形QUAD。项目里通常实现的是更常用的RBOX即预测一个5维向量(dx1, dy1, dx2, dy2, θ)分别表示该像素点到文本行上下左右四条边的距离以及文本行的旋转角度。网络结构拆解EAST的主干网络Backbone通常采用PVANet或轻量化的VGG16用于提取多层级的图像特征。其核心创新在于特征融合模块Feature Merging Branch和输出层Output Layer。特征提取阶段输入图像经过主干网络得到四个不同尺度的特征图例如大小为原图的1/32, 1/16, 1/8, 1/4。特征融合阶段这是一个自底向上的过程。将最深层的特征图感受野大语义信息强逐步与较浅层的特征图分辨率高细节信息丰富进行合并。合并操作通常是对深层特征进行上采样反卷积或双线性插值使其与浅层特征尺寸一致然后在通道维度上进行拼接Concatenate。这个过程让模型同时“看到”大局和细节对于检测不同尺度的文本至关重要。输出阶段融合后的最终特征图被送入两个并行的卷积层一个1x1卷积输出1个通道经过Sigmoid激活得到得分图Score Map。另一个1x1卷积输出5个通道对应RBOX的5个参数得到几何图Geometry Map。推理流程输入图像通过网络得到得分图和几何图。使用一个阈值如0.8对得分图进行二值化得到文本区域掩码。对每个得分高于阈值的像素点根据其对应的几何参数可以还原出一个以该像素为中心的旋转矩形框。由于每个像素都产生一个框会存在大量重叠。EAST使用Locality-Aware NMS局部感知非极大值抑制进行后处理。与标准NMS只比较IoU不同LANMS会考虑框的局部性将同一文本行内距离近、高度相似的框先进行加权合并再进行抑制能更好地保留长文本行。3.2 AdvancedEAST的改进点解决长文本与边缘问题原始的EAST在处理长文本如横幅、车牌和图像边缘的文本时效果会下降。AdvancedEAST主要做了两点关键改进VGG16主干网络的修改移除了原始VGG16最后的两个全连接层和最后一个池化层使网络结构完全卷积化可以接受任意尺寸的输入并输出更高分辨率的特征图有利于边缘文本的定位。损失函数的优化得分图损失除了使用交叉熵AdvancedEAST引入了Dice系数损失。Dice系数衡量的是预测区域和真实区域的重叠度对于处理正负样本极不均衡文本像素远少于背景像素的场景特别有效能促使模型更关注文本区域本身。几何损失对于RBOX的损失计算AdvancedEAST对距离参数(d1, d2, d3, d4)使用了IoU损失的近似——即最小化预测框与真实框的负对数IoU。这比EAST原始使用的平滑L1损失更直接地与评估指标IoU挂钩。对于角度θ则使用余弦相似度损失。代码层面的关键细节在项目的模型定义文件如model.py或east_model.py中你可以找到类似下面的结构from tensorflow.keras.layers import Input, Conv2D, Concatenate, UpSampling2D from tensorflow.keras.models import Model def east_model(input_size): inputs Input(shape(input_size, input_size, 3)) # 特征提取主干 (例如修改后的VGG16) f backbone(inputs) # 假设backbone函数返回多个特征层 [f1, f2, f3, f4] # 特征融合 h f[3] # 最深层的特征 for i in range(2, -1, -1): # 自底向上融合 h Conv2D(128, (1,1), paddingsame)(h) h UpSampling2D(size(2,2))(h) # 上采样 h Concatenate(axis-1)([h, f[i]]) # 与浅层特征拼接 # 输出层 score_map Conv2D(1, (1,1), activationsigmoid, namescore_map)(h) geo_map Conv2D(5, (1,1), activationlinear, namegeo_map)(h) # RBOX: 4个距离1个角度 return Model(inputsinputs, outputs[score_map, geo_map])而AdvancedEAST的损失函数部分会更为复杂包含了Dice Loss和IoU Loss的计算。3.3 数据准备与标注格式训练EAST模型需要特定的标注数据。常见的公开数据集如ICDAR2015、ICDAR2017 MLT都提供了文本行的四边形坐标标注。对于EASTRBOX模式需要将这些四边形标注转换为模型需要的格式。标注文件格式示例通常是一个与图片同名的文本文件如img_1.txt每行代表一个文本实例。x1,y1,x2,y2,x3,y3,x4,y4,text其中(x1,y1), ..., (x4,y4)是四边形四个顶点的坐标按顺时针或逆时针顺序排列。text是标注内容对于检测任务可以忽略或设为占位符。训练标签生成步骤在label.py或data_generator.py中读取图像和其标注文件。对于图像中的每个文本四边形计算其最小外接旋转矩形RBOX得到中心点、宽、高和旋转角度。生成两个真值图Ground Truth Map尺寸为原图的1/4与模型输出一致得分图Score Map在RBOX缩小一定比例如0.3倍后的“收缩框”内的像素其得分设为1框外像素为0。这种收缩是为了在文本行之间创造间隔避免粘连。几何图Geometry Map在得分图为1的像素位置填充该像素点到RBOX四条边的距离归一化到0-1和旋转角度弧度制。实操心得数据增强是关键文本检测模型对数据增强非常敏感。除了常规的随机旋转、缩放、裁剪颜色抖动亮度、对比度、饱和度和随机模糊对提升模型鲁棒性尤其有效。因为自然场景中的文本其颜色、光照和清晰度变化极大。在项目的训练脚本中务必检查数据增强流水线是否完备。4. CRNNCTC文字识别模型原理与实现检测模型把文字区域“框”出来了接下来就需要识别模型“读”出里面的内容。CRNNConvolutional Recurrent Neural Network结合CTCConnectionist Temporal Classification是序列识别领域的经典架构完美解决了不定长文本的识别问题。4.1 CRNN的三段式架构卷积、循环、转录CRNN的流程可以概括为卷积网络提取特征 - 循环网络学习序列上下文 - CTC解码得到最终文本。卷积层CNN输入是经过检测模型裁剪并校正后的文本行图像通常高度归一化为32像素宽度不定。使用一个轻量的CNN如VGG的变体来提取图像的视觉特征。这个CNN的作用不是分类而是将图像转换为一个特征序列。关键理解假设输入图像尺寸为(32, W, 3)。经过一系列卷积和池化后特别注意池化层只在高度方向进行最终将高度降为1我们得到一个形状为(1, W, C)的特征张量。我们可以将其重新解释为一个长度为W的序列序列的每一步都是一个C维的特征向量。W通常小于原图宽度W这是因为池化操作在宽度方向也进行了下采样步长为2的卷积或池化。每一个特征向量都对应原图像水平方向上一个“感受野”区域的视觉信息摘要。循环层RNN将上一步得到的特征序列(W, C)输入到双向循环神经网络如LSTM或GRU中。RNN的作用是学习序列中每个位置即每个特征向量的上下文依赖关系。例如在识别单词时前面的字母会影响后面字母出现的概率。双向RNN能同时利用过去和未来的上下文信息提升识别准确率。RNN输出另一个序列长度仍为W但每个时间步的输出维度变为分类类别数通常是字符集大小1个空白符。转录层CTC这是CRNN最精妙的部分用于解决“序列对齐”问题。RNN输出了W个时间步的类别分布但W与真实文本的长度并不相等且我们不知道哪个时间步对应哪个字符。CTC引入了一个特殊的blank空白标签。它允许模型在输出序列中插入空白并且可以合并重复的字符除非中间有空白。CTC解码给定RNN输出的序列概率CTC通过动态规划算法如Beam Search找到概率最高的字符序列并自动处理重复字符和空白符最终得到规整的文本。例如RNN可能输出“--hh-e-l-lll-oo--”其中-代表blankCTC解码后会得到“hello”。4.2 项目中的CRNN实现细节在项目的识别模型部分如crnn_model.py你会看到类似的结构from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Reshape, Bidirectional, LSTM, Dense, Lambda from tensorflow.keras.models import Model import tensorflow as tf def crnn_model(input_shape, num_classes): # 输入高度固定为32宽度可变通道为1灰度图或3 inputs Input(shapeinput_shape) # (32, None, 1) # CNN部分 x Conv2D(64, (3,3), activationrelu, paddingsame)(inputs) x MaxPooling2D(pool_size(2,2), strides(2,2))(x) # (16, W/2, 64) x Conv2D(128, (3,3), activationrelu, paddingsame)(x) x MaxPooling2D(pool_size(2,2), strides(2,2))(x) # (8, W/4, 128) # ... 更多卷积和池化层最终将高度降为1 x Conv2D(512, (2,2), activationrelu, paddingvalid)(x) # 高度从2降为1 # 此时 x 形状为 (1, W, 512) # 将高度维度压平准备送入RNN: (1, W, 512) - (W, 512) x Reshape((-1, 512))(x) # RNN部分 x Bidirectional(LSTM(256, return_sequencesTrue))(x) x Bidirectional(LSTM(256, return_sequencesTrue))(x) # 输出层每个时间步预测一个字符类别 outputs Dense(num_classes, activationsoftmax)(x) model Model(inputsinputs, outputsoutputs) return model而CTC损失函数需要单独定义因为它不是简单的分类损失。在Keras中需要自定义一个损失层def ctc_lambda_func(args): y_pred, labels, input_length, label_length args # y_pred: RNN输出 (batch_size, time_steps, num_classes) # labels: 真实标签 (batch_size, max_label_length) # input_length: 每个样本的序列长度W (batch_size, 1) # label_length: 每个样本的真实标签长度 (batch_size, 1) return tf.keras.backend.ctc_batch_cost(labels, y_pred, input_length, label_length) # 在构建模型时需要额外的输入来传递 input_length 和 label_length训练时需要提供这四项数据推理时则使用CTC解码算法如keras.backend.ctc_decode或外部库如ctcdecode从y_pred中获取最终文本。4.3 识别模型的数据与训练技巧数据准备图像预处理文本行图像需统一高度如32像素宽度按比例缩放。转换为灰度图或保持RGB并做归一化。标签处理需要构建一个字符到索引的映射字典。所有标签文本需转换为索引序列。例如字典{‘0’:0, ‘1’:1, ..., ‘A’:10, ‘B’:11, ..., ‘-’:N}空白符-通常作为最后一个类别。标签“AB12”转换为[10, 11, 0, 1]。序列长度需要计算CNN部分输出的特征序列长度input_length这取决于网络结构。对于一个输入宽度为W的图像经过若干步长为2的池化/卷积后输出长度W大约为W / 2^n。这个值需要在数据生成时精确计算用于CTC损失。训练技巧使用预训练权重CNN部分如VGG可以使用在ImageNet上预训练的权重进行初始化这能加速收敛并提升性能。学习率策略使用学习率衰减如ReduceLROnPlateau当验证集指标停滞时降低学习率。数据增强对文本行图像进行轻微的弹性形变、透视变换、添加椒盐噪声或高斯模糊可以极大地提升模型对扭曲、模糊文本的识别能力。字典设计根据你的应用场景构建合适的字符集。如果只识别数字和英文字典可以很小~36个字符。如果需要识别中文则需要一个较大的汉字字典常用汉字约3000-5000个。字典越大模型越难训练所需数据也越多。常见问题识别结果重复或丢字这通常是CTC解码或训练不充分导致的。首先检查训练时CTC损失是否在稳步下降。其次可以尝试调整Beam Search的宽度beam width更大的宽度能搜索更多可能路径但速度更慢。另外确保你的标签中没有包含空白符-作为真实字符。5. 从训练到部署端到端流程与踩坑记录有了检测和识别模型下一步就是将它们串联起来构建一个完整的OCR流水线并处理从训练到推理过程中的各种实际问题。5.1 训练流程编排一个完整的训练流程通常包含以下几个步骤项目里可能会有对应的脚本数据准备与预处理(preprocess.py)将原始数据集如图片和标注文件转换为模型需要的格式。对于EAST生成得分图和几何图的真值文件如.npy或.tfrecord格式。对于CRNN生成图片路径、标签序列、图片实际高度/宽度、特征序列长度input_length、标签长度label_length的列表或索引文件。模型训练(train_east.py,train_crnn.py)EAST训练损失函数是得分损失分类和几何损失回归的加权和。需要仔细调整两个损失的权重平衡如1:1或1:5。使用Adam优化器初始学习率可以设为1e-3或1e-4。由于生成真值图比较耗时通常使用数据生成器Generator在训练时实时生成批次数据。CRNN训练使用CTC损失。一个关键细节是需要向损失函数传递input_length和label_length参数。优化器同样常用Adam。CRNN对批量大小Batch Size比较敏感由于序列长度不一需要将同一批次的样本填充到相同的宽度并记录原始宽度用于计算input_length。模型评估与验证(eval.py)EAST评估使用IoU交并比和 Precision/Recall/F1-score 指标。在验证集上运行检测将预测框与真实框进行匹配计算。CRNN评估使用词错误率Word Error Rate, WER或字符错误率Character Error Rate, CER。CER (替换数删除数插入数) / 真实标签总字符数。更实用的评估是直接在验证集图片上运行端到端识别统计完全正确的图片比例。模型导出(export_model.py)训练完成后将模型保存为可部署的格式。对于TensorFlow 1.x常用model.save()保存为H5文件或使用tf.saved_model.simple_save保存为SavedModel格式便于后续用TensorFlow Serving部署。5.2 端到端推理流程推理脚本 (inference.py或predict.py) 的逻辑是核心文本检测加载EAST模型。输入图像可能需要进行缩放如将长边缩放到1024短边等比例缩放并填充为32的倍数因为网络有5次步长为2的下采样2^532。前向传播得到得分图和几何图。应用阈值如0.8和LANMS后处理得到一系列旋转矩形框RBOX。将这些旋转矩形框从网络输出尺度映射回原图尺度。文本区域校正对于每个检测到的旋转框使用仿射变换将倾斜的文本区域“拉直”裁剪出水平的文本行图像。这是提升识别准确率的关键一步因为CRNN默认输入是水平文本。文本识别加载CRNN模型。将上一步裁剪出的每个文本行图像高度缩放到32宽度按比例缩放并转换为模型需要的输入格式归一化调整通道。送入CRNN模型得到每个时间步的字符概率分布。使用CTC贪婪解码Greedy Decode或集束搜索Beam Search将概率序列转换为最终的文本字符串。可选结合一个语言模型如n-gram或神经网络LM进行后处理纠正明显的拼写错误尤其在识别英文单词时效果显著。5.3 实战踩坑与优化经验坑1EAST检测框不准确或漏检可能原因1训练数据标注质量。检查标注的四边形是否紧密贴合文本边缘。过于宽松或紧张的框都会影响模型学习几何参数。特别是对于弯曲文本用四边形标注本身就有信息损失。可能原因2NMS阈值设置不当。LANMS中的得分阈值和NMS阈值需要根据你的场景调整。阈值太高会导致漏检太低则会产生大量重复框。可以尝试在验证集上绘制Precision-Recall曲线来寻找最佳阈值。可能原因3输入图像尺寸。EAST对输入尺寸敏感。如果测试图片与训练图片尺寸差异过大效果会变差。建议在推理时采用多尺度测试如将图像缩放到多个尺寸分别检测再合并结果或使用模型训练时相近的尺寸。坑2CRNN识别结果乱码或空白可能原因1CTC的blank标签问题。确保你的字符字典中blank标签的索引是正确的并且在CTC解码时被正确处理。在贪婪解码中通常需要合并重复字符并移除blank。可能原因2序列长度不对。确保在推理时传递给模型或解码器的input_length参数计算正确。这个长度是经过CNN下采样后的特征序列长度必须与模型实际输出的时间步数一致。一个常见的错误是忘记考虑CNN中paddingvalid的层对尺寸的影响。可能原因3图像预处理不一致。训练和推理时图像的高度必须严格保持一致如32。归一化的方式如除以255.0或减均值除标准差也必须完全相同。性能优化建议模型轻量化如果部署在资源受限的设备上可以考虑将EAST的主干网络从VGG16替换为MobileNetV2或ShuffleNet。减少CRNN中LSTM的隐藏单元数或层数。使用TensorFlow Lite进行模型量化Post-training quantization可以显著减小模型体积并提升推理速度精度损失通常很小。流水线并行在端到端推理时检测和识别可以并行。即当检测模型在处理第N张图片时识别模型可以同时处理第N-1张图片中已检测出的文本区域。这需要一定的多线程/异步编程技巧。缓存机制如果应用场景是处理视频流或连续相似的图片可以缓存前一帧的检测结果在当前帧通过光流或特征匹配进行跟踪避免每一帧都运行完整的检测网络能极大提升实时性。6. 项目扩展与现代OCR技术栈对比虽然这个基于EAST和CRNN的项目是一个优秀的起点但了解它在当前技术图谱中的位置能帮助你更好地决定是深入优化它还是转向更新的方案。与现代检测器的对比DBNetDifferentiable Binarization2019年提出现在是工业界主流。它最大的创新是提出了“可微分二值化”将二值化这一后处理步骤融入到网络中一起训练让模型能自适应地学习每个像素点的二值化阈值对模糊、光照不均的文本检测效果极佳。其速度和精度通常都优于EAST。PANetPixel Aggregation Network同样注重轻量化和实时性通过低维度的特征金字塔和特征融合模块在保持精度的同时大幅提升速度。基于Transformer的检测器如DETR及其变种将检测视为集合预测问题无需NMS后处理。但在文本检测领域其优势尚不明显且计算开销较大。与现代识别器的对比基于Attention的识别器如ASTER、SAR。它们用Attention机制替代了CTC直接建模字符与图像区域之间的对齐关系。对于形状复杂、字体多变的文本有时效果更好但训练更复杂且对长序列支持不如CTC稳定。Transformer如ViTSTR将图像切块送入Transformer进行序列建模完全摒弃了CNN和RNN。在数据充足的情况下能达到SOTA但模型更大需要更多数据。半监督/自监督学习利用大量无标注数据预训练视觉骨干网络如BEiT、MAE再在下游OCR任务上进行微调这是当前提升小数据场景性能的主流方向。这个项目的现实意义与扩展方向对于学习和研究这个项目依然是金矿。你可以基于它做很多有意义的尝试替换骨干网络尝试将EAST的VGG主干换成MobileNetV3观察速度与精度的变化。改进损失函数在CRNN中尝试Focal Loss来解决字符类别不平衡问题。集成语言模型在CTC解码后接入一个简单的统计语言模型KenLM或一个小型神经网络LM观察对识别准确率的提升。尝试端到端训练虽然这个项目是检测、识别分开训练但你可以设计一个可微分的RoI Rotate操作将检测框的仿射变换融入到计算图中尝试进行端到端的联合训练难度较大但很有挑战性。部署实战将这个Keras/TF1.x的模型通过ONNX转换为其他框架如PyTorch的模型或者使用TensorRT、OpenVINO等工具进行加速部署到边缘设备上。回过头看这个“老项目”就像一本经典的教科书。它可能没有涵盖最新的公式但它把最基础、最核心的原理讲得透彻明白。在AI技术快速迭代的今天花时间吃透这样一个经典的实现建立起扎实的直觉和理解远比盲目追逐最新论文标题来得更有价值。当你真正弄懂了EAST为何要预测几何图CTC如何解决序列对齐问题之后再去学习DBNet、Attention OCR这些新方法你会发现自己是在已有的知识地图上添加新的地标而不是在一片迷雾中摸索。这大概就是这个项目在2024年带给我们的最大礼物。本文还有配套的精品资源点击获取