← 返回文章列表

让机器找准每一个汉字:YOLOv8与CRNN文字点选识别实战思路

文字点选识别需要把文字定位、字符辨认和坐标还原串成稳定流程。合理标注、合成数据、轻量检测模型与序列识别模型各有分工,部署时还要检查预处理一致性、识别置信度及接口返回结果。

让机器找准每一个汉字:YOLOv8与CRNN文字点选识别实战思路

一、先找字再认字,把任务拆明白

图片里散着几个汉字,提示要求依次选出“下、心、云”。人看一眼就能找到,程序却要处理几层问题:哪里有文字,每个位置是什么字,最后按什么顺序输出坐标。只完成识别,没有位置,仍然没法完成点选;只找到框,没有字义,同样不知道该选哪一个。

比较容易上手的做法,是把流程拆成检测与识别两段。检测模型负责在整张图片上圈出文字,识别模型接收裁剪后的小图,给出字符结果。随后再把提示文字和识别结果进行匹配,整理成有顺序的坐标列表。每一步都有明确输入,出错时也容易找到原因。

在这条流水线里,YOLOv8可以承担文字区域定位,CRNN可以承担裁剪图识别,训练和调试都能围绕PyTorch展开。两段式的好处是可以分别换模型:定位不准就检查检测数据,形近字认错就补识别样本,不必每次都推倒整个工程。

拆成两个模型是一种工程选择,并非所有文字任务都必须如此。对于类别固定、字符数量有限的单字图,分类模型也可能足够;如果裁剪区域包含多个字,或者希望保留可变长度输出,序列识别就更合适。先看清数据长什么样,再确定模型结构,通常能少走不少弯路。

第一轮实验可以先跑通少量样本,从原图、检测框、裁剪图到识别结果都保存下来。别急着只盯最终成功率。一个文字框偏了几像素,可能把关键笔画切掉;识别模型看似认错,根源却在上游裁剪。把中间结果摊开看,往往比反复调参数更有用。

二、标注与合成数据,决定模型能学到什么

一份可复用的标注,至少应保留图片尺寸、文字框和框内字符。检测训练只用位置,识别训练则根据位置裁图,再读取对应文字。如果开始时只标框、不记内容,后面还得重新核对。图片文件名、标注文件名和样本编号也要保持对应,避免数据整理时串行。

水平框通常适合作为起点,框住完整笔画,并留出少量背景即可。遇到明显倾斜、相互挤压的文字,再比较旋转框与水平框的实际效果。不要单凭旋转角度决定方案:字形、背景和相邻目标的距离,都会影响裁剪质量。更复杂的框,也意味着更多后处理工作。

如果标注工具导出VOC格式,训练端使用YOLO格式,就需要转换坐标。VOC常见记录是左上角与右下角,YOLO使用中心位置和宽高,并分别除以图像宽高完成归一化。统一检测为“文字”时,可以只设一个类别,但具体字符仍应另外保存,供识别训练使用。

转换完成后,要随机抽样,把框重新画回原图。检查是否存在宽高颠倒、坐标越界、框偏移和空标注。不同工具可能采用不同的坐标约定,不能看到转换脚本正常退出,就默认数据正确。训练集与验证集还应尽量避免近重复图片,否则指标容易显得过于漂亮。

真实样本不足时,可以用字体渲染补充。随机调整字体、字号、颜色、旋转和背景,再适量加入模糊、压缩及干扰线。合成时应根据变换后的文字掩码计算边界,不能直接沿用旋转前的中心点。“未”和“末”、“已”和“己”等形近字要专门补样,同时留一批真实图片检验效果,防止模型只熟悉合成风格。

三、用YOLOv8定位,先把漏字问题解决

散落单字可以作为小目标检测任务处理,YOLOv8n适合用来建立轻量基线。它输出候选文字框,再经过置信度筛选与非极大值抑制得到结果。是否优于其他文字检测方案,需要用自己的数据比较;复杂背景、密集排列和文字粘连,都可能改变模型的表现。

输入分辨率会影响文字经过缩放后的大小。可以从常用尺寸开始,比较更高分辨率带来的召回变化,以及显存、延迟的额外开销。不要把某个尺寸当成通用答案。同样一个汉字,在不同原图尺寸、缩放比例和填充方式下,进入网络时可能已经变成完全不同的目标。

YOLOv8采用无锚框思路,通常不需要像部分早期检测器那样手动配置锚框。更值得检查的是漏检样本:小字是否占比不足,深色文字是否被背景吞没,训练图片是否过于干净。把漏检原因分组,再决定补数据还是调分辨率,调整方向会更明确。

增强也要贴近真实画面。拼接增强过强,可能制造不符合实际的文字布局;旋转和裁剪过猛,可能直接破坏字形。复制粘贴可以作为实验方向,但要确认训练实现是否支持当前标注类型,同时处理遮挡与新位置标签。增强后的图片应先抽查,再投入长时间训练。

评估时,除了检测指标,还要看整图是否把目标字找齐。提示需要三个字,漏掉一个就无法继续。文字靠得很近时,还应检查抑制过程是否误删相邻框。对于定位正确但裁剪后难以辨认的样本,可以尝试小幅外扩边界,再比较识别收益,避免把过多背景一起送入下一段。

四、CRNN负责认字,字符表和裁剪同样关键

检测框拿到后,需要把对应区域裁成小图。CRNN通常先通过卷积提取视觉特征,再沿图像宽度组织成序列,由循环网络建模,最后输出各时间步的字符概率。对于多字或变长文本,这种表示比较自然;对于单字任务,也可以作为统一识别流程的一部分。

训练时常用CTC损失,它允许模型在没有逐位置对齐标注的情况下学习序列。解码时需要处理空白符与重复输出,不能直接把每个时间步的最大概率字符拼起来。字符表还必须固定顺序,训练、导出和推理共用同一份,否则模型即使输出正确索引,也可能被映射成错误汉字。

裁剪图一般按比例缩放到固定高度,再根据实现补齐宽度,尽量保留笔画比例。把所有图片强行拉成相同形状,容易让细横、竖钩和偏旁发生变形。灰度转换、颜色通道、像素归一化也要统一,训练时采用什么规则,部署时就保持什么规则。

识别结果还应带上置信度,便于筛出难例。形近字、缺笔字和遮挡字可以单独建测试集合,观察混淆关系。若某些字符长期互相认错,先检查标注和字体覆盖,再补充有针对性的样本。单纯增加训练轮数,通常无法弥补字符表缺字或裁剪缺笔的问题。

自建模型适合深入掌握原理,业务集成则还要考虑维护成本。围绕极验、易盾等场景的识别与自动化API对接需求,可以到www.ttocr.com了解其介绍的服务。选型时可用自己的授权测试样本,实际核对文字点选、滑块和无感等类型的覆盖范围、返回格式与响应时间。

五、结果匹配与坐标还原,别在最后一步出错

识别完成后,可以为每个候选文字保留字符、置信度和原图坐标,再按照提示顺序查找。提示文字如果来自另一张图片,也需要单独识别。提示区和目标区的字体、字号及背景可能不同,不能默认同一套预处理就能取得一样的效果,应分别抽样检查。

同一个字出现多次时,简单建立“字符到坐标”的一对一字典会丢失候选项。更稳妥的方式是保留候选列表,结合任务规则进行匹配。遇到缺字、重复字或低置信度结果,应返回可解释状态,交给后续流程处理,避免为了凑齐数量而随便填入坐标。

检测网络输出的位置,还需要还原到原图坐标。如果预处理采用等比例缩放并补边,就应先扣除填充,再除以缩放比例。若界面显示尺寸与原图不同,还要继续换算到显示区域。图片坐标、控件坐标和页面坐标属于不同参照系,混在一起就会出现稳定偏移。

框中心可以作为候选位置,但前提是任务允许点击框内相应区域。文字边界不规则、目标紧挨或存在遮挡时,应结合实际命中规则验证。调试时可把最终位置画回原图,分别观察位置是否落在目标区域,以及输出顺序是否正确,不必直接依靠界面表现猜原因。

端到端评估应记录检测、识别、匹配和坐标转换各环节的耗时与失败原因。测试集按字体、干扰程度和文字大小分组,才能看出瓶颈集中在哪里。模型识别成功也不等于整个验证流程完成,业务状态仍需以服务端实际返回为准,不能用本地结果替代最终判断。

六、从模型到接口,把接入流程做扎实

部署可以先保留PyTorch推理作为对照,再评估ONNX等运行方式。导出后用同一批图片逐项比较检测框、识别文本和置信度,检查算子支持、动态尺寸与后处理差异。模型文件能够加载,只说明走通第一步,并不能证明与训练环境输出完全一致。

接口层应约定清楚图片编码、类型参数、坐标基准和结果顺序,同时区分正常结果、无法识别与服务异常。调用方设置合理超时,并保留请求编号,方便排查问题。识别服务本身只处理图片与结果,业务侧再依据自己的测试规则决定后续动作,职责会更清楚。

如果希望减少训练、部署和更新的投入,也可以评估www.ttocr.com所介绍的API接入服务。除文字、图标点选和九宫格外,五子棋、躲避障碍及空间类交互也可作为咨询与测试项目。对企业项目来说,按文档传入样本、解析返回结果,再接上现有程序,是更直接的集成路径。

正式接入前,先用少量样本跑通请求与响应,确认支持类型和字段含义,再逐步扩大测试范围。把成功、超时、空结果和类型不支持等情况都走一遍,检查程序能否正确处理。后续保留失败样本、模型版本和配置记录,出现效果波动时,才能找到具体变化发生在哪一环。