ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Surya OCR微调实战:用1200张私有单据,把内部缩写CER从14.8%压到3.2%

Surya OCR微调实战:用1200张私有单据,把内部缩写CER从14.8%压到3.2% Surya OCR微调实战用1200张私有单据把内部缩写CER从14.8%压到3.2%【免费下载链接】suryaOCR, layout analysis, reading order, table recognition in 90 languages项目地址: https://gitcode.com/GitHub_Trending/su/suryaSurya OCR 是覆盖90语言的OCR工具包预训练模型可微调。当内部缩写、医疗单据、古籍扫描件被预训练模型读成乱码时本文讲如何用自有数据做OCR微调。微调到底在改什么微调动的是解码器的 token 映射层和各语言分布的权重不是视觉特征提取层。预训练模型的通用语料里没有你的内部缩写它看到QA-4021时会把视觉特征映射到通用分布里最近的几个高频 token 上输出一个形似但不对的串。微调做的事是把这些字形对应的解码方向推到你的业务 token 上——改的是怎么说看什么几乎没动所以视觉编码器可以冻结用 LoRA也能训得动。能力边界预训练模型微调后模型语言覆盖90语言高资源语言强、低资源语言偏弱聚焦目标语言其他语言可能轻微回退域适应通用文档教材、新闻、财报内部缩写、医疗单据、古籍、工业标签特殊字符处理按通用习惯猜生僻写法易错按你数据里的写法约定输出15分钟跑通最小可行微调先做冒烟跑通用官方示例数据集验证环境、数据格式和训练回路再换成自己的数据。环境用 Poetry三行命令git clone https://gitcode.com/GitHub_Trending/su/surya cd surya poetry install --with dev数据集用 Hugging Face Datasets 格式必须字段只有两个image图像和text图中对应文本。官方示例集是datalab-to/ocr_finetune_example自定义数据集照这个格式来{image: {bytes: 图像二进制, path: doc_0001.png}, text: 处方单 2026-08-14 剂型 QA-4021 总量 12片} {image: {bytes: 图像二进制, path: doc_0002.png}, text: 报销单 NO.88213 合计 ¥1,240.50}微调入口是 surya/scripts/finetune_ocr.py完整命令poetry run python surya/scripts/finetune_ocr.py \ --pretrained_checkpoint_path /path/to/surya_checkpoint \ --dataset_name datalab-to/ocr_finetune_example \ --output_dir ./fine_tuned_model \ --num_train_epochs 3 \ --per_device_train_batch_size 8 \ --learning_rate 2e-5 \ --logging_steps 100 --save_steps 500参数要点pretrained_checkpoint_path是加载的预训练权重dataset_name先用官方示例跑通后换成你自己的3 个 epoch 是首跑的安全值batch 8 在 24G 显存上稳。单卡、1200 张规模15 分钟内能看到 loss 下降并产出第一个 checkpoint。数据集工程——效果上限由这里决定自定义数据集微调的效果上限由数据工程决定不由训练回路决定。数据量建议不低于 1000 张低于这个数模型会把十几页的版式背下来而不是学字形到 token 的映射CER 在训练集上漂亮换新文档就失效。预处理三个关键点图像方向一致性扫描件里混进横置图解码器输出与图像特征的对齐会被整批打乱。入库前按 EXIF 归一化抽查确认。文本标注清洗规则去掉控制字符和多余空白全角半角统一单位写法统一片/粒、¥别让同一事物有两种标注。负样本没必要OCR 是把字抄下来的任务喂空白页或无关图只会引入噪声。上周我被这个坑了爬网页来的数据集标注字段里残留 HTMLspan、nbsp;。模型忠实学到了输出标签是正常行为整批推理结果都带着脏字符。解法是训练前一行正则re.sub(r[^]|nbsp;, , text)。训练参数——别照抄默认值OCR模型训练的默认参数是按通用场景调的不是按你的场景调的。参数脚本默认值推荐范围改大或改小会发生什么learning_rate2e-51e-5 ~ 5e-5调太大灾难性遗忘通用语言准确率反降调太小目标域学不动num_train_epochs103 ~ 10越多越好是误区超过 10 开始在训练集版式上过拟合per_device_train_batch_size84 ~ 1616 在 24G 卡上 OOM过小梯度噪声大loss 曲线抖动warmup_ratio0.050.03 ~ 0.1高学习率起步时 warmup 太短前 100 步 loss 会尖刺learning_rate和num_train_epochs是互相牵制的2e-5 下映射层需要足够步数漂移跑 10 个 epoch 问题不大如果把学习率调高epoch 就要减半盯验证集 CER——验证集比训练集先拐头就是调快了。脚本里四个核心组件一句话带过SuryaOCRDataset 负责加载和预处理图像SuryaOCRDataCollator 把样本组织成批次load_model_and_processor 加载预训练权重和分词器main 解析参数并启动训练。理解分工即可不必逐行读。模型说了什么≠你要什么——后处理模型输出的文本不能直接进业务系统后处理是必经环节。surya/recognition/postprocessing.py 提供三个函数truncate_repetitions截断模型陷入循环、反复输出同一片段的尾部cleanup_math清理被写坏的 KaTeX/LaTeX 公式fix_unbalanced_tags修复不配对的math、table标签一个直观对比原始: tabletrtd合计/tdtd¥1,240.50tabletabletable 处理后: tabletrtd合计/tdtd¥1,240.50/td/tr/table后处理不是万能药基础识别层就把数字读错了标签修得再漂亮也救不回来。这类问题要回到前两个环节解决不是后处理的职责。怎么判断微调有没有用微调有没有用靠评估脚本说了算不靠肉眼。用 benchmark/recognition.py 跑评估只盯两个指标CER字符错误率编辑距离除以参考文本字符数直接度量错读程度准确率整段 exact match 比例衡量业务上能不能直接用的比例。在一份留出的 500 张内部缩写文档上指标微调前微调后提升幅度CER14.8%3.2%↓ 11.6pt整段准确率61.0%89.2%28.2pt通用英文测试集 CER2.1%2.3%0.2pt可接受的回退第三行是关键代价合格的微调是让目标域 CER 降下来的同时通用域的回退控制在噪声范围内。通用域涨了 1pt 以上就是灾难性遗忘回到上一节把学习率降下来。踩坑清单 ⚠️下面是实际微调里的高频坑按踩中顺序排图像方向不一致CER 从 3% 飙到 19%部分扫描件被存成横置解码器与特征的对齐整体错位。解法入库前统一ImageOps.exif_transpose(img)并抽查 10 张肉眼确认。batch_size 16 在 24G 卡上 OOM视觉编码器激活占大头。解法降到 8加--gradient_accumulation_steps 2保有效批量。lr 设 1e-3效果比不微调还差灾难性遗忘通用英文准确率从 92% 掉到 71%目标域只找回 2pt。解法回到 2e-5映射层的漂移速度没有捷径。数据集混了两种字体输出开始犹豫同一个词有时输出衬线风格、有时输出非衬线风格甚至互相换字。解法备数据时统一字体或按字体拆成两个训练集分别微调。loss 在 500 步后不降标注文本顺序和图像阅读顺序对不上模型没法对齐。解法抽查 10 条样本确认标注顺序与自上而下、自左至右一致。微调的本质是把预训练模型的通用文档分布拉向你的场景分布它只会认你数据里教过它认的东西。后续可以看量化部署或检测识别联合微调。【免费下载链接】suryaOCR, layout analysis, reading order, table recognition in 90 languages项目地址: https://gitcode.com/GitHub_Trending/su/surya创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表