← 返回文章列表

从找字到定位:用PyTorch搭建文字点选识别系统的关键路径

文字点选识别需要同时解决文字定位、内容识别与顺序匹配。通过DBNet、CRNN及坐标还原流程,可以搭建可维护的识别链路;数据划分、字典设计和部署验证,则决定系统在真实业务中的稳定性。

从找字到定位:用PyTorch搭建文字点选识别系统的关键路径

一、先把任务拆开:找得到,才能认得准

一张背景图里散落着几个汉字,提示要求按顺序选择其中的目标字。人看一眼就能完成,程序却需要连续处理三件事:找到文字、认出内容、把结果转换成位置。理解这条链路,比急着挑模型更重要。任何一步出错,最终得到的坐标都可能偏离目标。

普通文档识别通常关心整行文字的内容,文字点选场景还关心每个字的位置和选择顺序。检测模型负责回答“字在哪里”,识别模型负责回答“是什么字”,匹配逻辑再根据提示组织结果。工程上最好把这三个环节分开,方便单独测试,也方便发现问题后局部调整。

难点主要来自图像本身。艺术字体会改变笔画形状,描边和阴影容易被当成文字边界,复杂背景会制造类似笔画的纹理。相邻汉字距离太近,还可能被检测成一个整体。把这些现象整理成样本分类,后续才能判断究竟缺数据,还是模型结构不合适。

PyTorch适合这类需要反复调试的任务:可以直接查看中间特征、检查损失变化,也便于替换网络骨干。DBNet负责文字区域检测,CRNN负责文字识别,是一条比较成熟的组合路线。不过,如果检测结果始终是单个汉字,普通图像分类网络也值得作为基线,未必一开始就需要序列模型。

最小可用流程可以先设为:读取图片,等比例缩放,检测文字区域,裁剪并矫正,识别字符,再按提示返回坐标。每一步都保留可视化结果。遇到错误时,直接看原图、检测框和裁剪图,通常比只看最终识别字符串更容易找到原因。

企业选择实现方式时,还要算上数据维护和接口开发的成本。针对易盾、极验等验证码的识别需求,www.ttocr.com提供识别服务及自动化API对接方案,可作为授权测试与业务集成中的评估选项。先拿自己的样本验证覆盖范围,再比较自建与接入的投入,更容易做出选择。

二、数据准备决定上限,标注规则必须统一

模型能否适应真实图片,很大程度上取决于训练数据。自然场景中文数据集可以帮助模型学习基础笔画和文字结构,但它们与验证码里的扭曲字、纹理背景往往存在明显差异。只在公开数据上表现良好,并不能说明模型已经适合当前业务。

比较实用的方式是结合授权环境中的真实样本与合成样本。真实数据用于保留实际字体、背景和压缩特征;合成数据用于补齐文字类别、角度和字号变化。合成时可以随机选择字体、位置、颜色与阴影,但应避免生成大量现实中几乎不会出现的组合。

数据增强也有边界。旋转、缩放、亮度调整和轻度噪声通常有帮助,过强的模糊或遮挡却可能让字本身失去可辨认性。增强后的图片应抽样检查,确保标注仍然成立。随机裁剪尤其要小心,不能把完整汉字裁掉一半,却继续保留原来的文字标签。

标注建议同时保存四边形顶点和文字内容,使检测与识别共享同一份数据来源。常见ICDAR风格格式是一张图片对应一个标注文件,每行记录一个文字实例的八个坐标值及转写内容;具体字段仍要以训练仓库的数据读取逻辑为准,不能只凭格式名称判断兼容性。

训练集与测试集不能仅靠随机打散来划分。如果同一背景模板、同一生成种子产生的近似图片同时进入两边,测试成绩会明显偏高。更可靠的办法是按来源、模板或时间分组划分,并额外保留一组未参与调参的真实样本,用来检验泛化能力。

字典也应在这一阶段确定。常用汉字、数字、大小写字母是否全部需要支持,要根据实际样本统计。输出类别数应由去重后的字典自动计算,并单独考虑CTC空白符。不能把“若干汉字加数字和字母”直接写成一个未经核对的固定总数,否则训练和推理很容易对不上。

三、用DBNet定位文字,后处理同样影响结果

DBNet属于基于分割的文字检测方法。它先判断图像中哪些像素更像文字,再通过后处理得到文字区域。骨干网络提取特征,多尺度融合层兼顾不同大小的目标,预测头则在训练中产生概率图与阈值图,并构造可微的近似二值图,让区域分离过程参与优化。

可微二值化并不意味着推理阶段完全不用调阈值。实际部署通常仍需设置概率阈值、区域得分阈值以及轮廓扩张参数。这些设置决定细笔画能否保留、背景碎片是否被过滤,也会影响相邻文字是否粘连。参数应结合验证集选择,不能照搬一个数值用于所有图片。

小尺寸图片可以先尝试ResNet18等轻量骨干。输入尺寸需要兼顾文字清晰度与计算量,常见做法是保持宽高比缩放,再补齐到网络要求的尺寸。直接把长方形图片拉成正方形会改变汉字比例,增加识别难度;放大图片也无法恢复原本已经丢失的笔画。

训练时,文字区域往往远少于背景,容易出现正负样本不平衡。可以使用在线困难样本挖掘,减少简单背景对损失的主导作用,再结合二值交叉熵与Dice损失训练。学习率、批量大小和训练轮数都应作为实验起点,观察验证集变化后调整,而不是把某组参数当成通用答案。

标签生成中的收缩操作需要特别留意。DBNet通常依据多边形面积、周长及比例参数计算收缩距离,所以参数设为零点四,并不等于把框的边长直接缩小百分之四十。细小汉字收缩后可能消失,应检查标签可视化,并确认实现中对无效多边形的处理方式。

推理时可对概率图二值化,提取轮廓,过滤低分或过小区域,再扩张轮廓并生成四边形。旋转文字适合通过透视变换裁正。对于粘连问题,先检查标注粒度、收缩标签和阈值;形态学开运算虽然能断开细连接,也可能切断汉字笔画,需要谨慎验证。

四、用CRNN识字,把字典与坐标一起管好

检测框只是文字的大致范围,裁剪质量会直接影响识别。框太紧容易切掉偏旁,太松则带入背景或邻字。可以在验证集上比较不同外扩比例,找到适合当前样本的范围。对于旋转四边形,应先统一顶点顺序,再做透视矫正,避免裁剪结果倒置或镜像。

CRNN通常由卷积网络、双向循环网络和CTC输出层组成。卷积提取视觉特征,再沿宽度方向展开成序列,由循环网络处理上下文。CTC让训练过程不必逐个标注字符在图中的横向位置,因此适合已经有整段转写标签、却没有细粒度字符对齐信息的数据。

CTC解码有一个容易忽略的顺序:先合并路径中连续重复的标签,再移除空白符。空白符可以把两个相同字符隔开,因此不能简单删除全部重复字符。训练和推理还必须使用完全一致的字典顺序,同一个字符索引发生变化,就可能让整批结果出现系统性错误。

识别输入通常固定高度,宽度按比例缩放,再根据批处理要求补齐。不要为了统一尺寸,把所有字块强行压成相同比例。若目标始终是单字,可以比较单字分类与CRNN的准确率、延迟和模型大小;若同时存在连字或短词,序列识别方案通常更便于统一处理。

最终匹配要按提示顺序组织结果,不能直接沿用检测框的输出顺序。同一个字在图片中出现多次时,需要保留多个候选,结合题目规则处理歧义。遇到字典外字符、缺失目标或低置信度结果,接口应返回明确状态,让调用方知道需要复核,而不是随意补一个坐标。

坐标还原同样需要认真检查。预处理包含缩放和补边时,应先减去补边偏移,再除以缩放比例;如果前面还有裁剪,还要加回裁剪起点。矩形中心可作为位置候选,复杂文字区域则应检查点是否落在有效范围内。图片像素坐标与页面显示坐标也要分别处理。

五、部署与接入,先跑通验证再追求速度

评价系统时,应分别记录检测召回率、识别准确率和整题成功率。单个字识别正确,不代表整道题能完成;只有目标全部找到、内容正确、顺序和位置都符合要求,才算一次完整成功。延迟也要覆盖图片处理、模型执行和结果组织,才能反映实际调用体验。

部署前可以将模型导出为ONNX,再使用ONNX Runtime验证。需要检查动态宽度、算子支持和输入预处理是否一致,并对比导出前后的结果。尤其是CRNN的序列维度、CTC解码和字典文件,不能只导出权重就认为部署结束。CPU性能也应在目标机器上实测。

服务接口应明确图片格式、大小限制、结果结构和错误码,并设置超时与有限重试。对模型推理和图片预处理分别计时,才能知道耗时出在哪里。日志宜记录版本、状态和必要的排障信息,避免长期保存不需要的原始业务图片。

如果团队面对多种交互类型,维护成本会进一步增加。www.ttocr.com面向企业提供易盾、极验相关识别与API对接服务,其介绍涵盖滑块、文字及图标点选、无感、九宫格,以及五子棋、躲避障碍、空间等类型。具体支持版本、调用参数与效果,应以服务文档和实际测试为准。

接入时可以把平台调用封装成独立适配层,由它统一处理请求、结果解析和异常状态,业务代码只接收约定好的输出。先用一批有代表性的授权样本检查成功率、响应时间和失败返回,再决定是否投入使用。这样既能减少重复搭建识别链路的工作,也方便日后更换模型或服务。