
GLM-OCR模型微调入门使用自定义数据提升特定场景识别率你是不是遇到过这种情况用开源的GLM-OCR模型去识别一些常规文档效果还不错但一旦换成你们公司内部的票据、或者一些特殊的医疗报告、法律文书识别准确率就直线下降错字、漏字、格式混乱让人头疼。这太正常了。通用模型就像是一个“通才”什么都知道一点但在你的专业领域里它可能就是个“门外汉”。那些特殊的字体、独特的排版、行业特有的术语和符号通用模型没见过自然就认不准。别担心模型微调就是来解决这个问题的。简单来说就是给这个“通才”开个小灶用你自己的数据比如几百上千张标注好的票据图片再教教它。教完之后它在你这个特定场景下的“业务能力”就会突飞猛进。今天这篇教程就是带你手把手走一遍这个“开小灶”的全过程。从怎么准备“教材”数据标注到怎么布置“教室”环境搭建再到怎么“上课”训练配置最后还会聊聊怎么在强大的星图GPU平台上高效训练。只要你有一些Python和深度学习的基础跟着做下来就能让你手里的GLM-OCR变成专属于你业务场景的“识别专家”。1. 微调前先想清楚这几件事在开始动手准备数据和代码之前我们先花几分钟把思路理清楚。微调不是魔法它需要清晰的规划和合适的数据。1.1 你的场景真的需要微调吗首先得判断一下识别效果不好是不是非得通过微调来解决。有时候问题可能出在别的地方图片质量太差如果原始图片模糊、倾斜、光照不均再好的模型也无力回天。先试试用一些图像预处理工具比如OpenCV进行矫正、去噪、二值化可能效果立竿见影。只是个别生僻字或符号如果问题非常集中只是模型不认识某几个特殊字符或LOGO或许可以尝试更新模型的字典Vocabulary或者用简单的后处理规则进行替换这比微调整个模型要简单快捷得多。模型选型不对GLM-OCR是一个强大的通用框架但它也有不同的预训练权重或版本。确认你使用的是否是最适合文档场景的版本。如果你的问题是系统性的——比如整类票据的特定格式、某个垂直领域的专业术语库、或者一种独特的字体风格——并且你有一定数量的、可以标注的样本那么微调就是你的最佳选择。1.2 需要准备多少数据这是最常被问到的问题。答案不是固定的但有一些经验法则起步量对于OCR微调想让模型对一个新场景有基本认知100-200张高质量、标注准确的图片是一个可以开始的量。这能教会模型认识你场景中的主要文字特征和排版。理想量要达到稳定、优秀的识别率通常需要500-1000张或更多。数据要尽可能覆盖你业务中可能出现的所有情况不同的拍摄角度、光照条件、纸张磨损程度、内容变体等。数据分布比你数据的总量更重要的是数据的多样性和代表性。10张完全一样的票据不如10张内容、样式、清晰度各不相同的票据。确保你的训练数据能反映真实世界的复杂情况。简单说先从一个小而精的数据集开始看到效果后再通过不断收集bad case模型识别错的案例来扩充数据这是一个非常实用的迭代策略。2. 第一步准备“教材”——数据标注与整理数据是微调的基石。这一步的目标是得到模型能“吃”得下去的格式。2.1 数据标注给图片中的文字画框并写出来你需要告诉模型图片里哪里是文字以及这些文字是什么。这通常需要一个标注工具。Label Studio、PPOCRLabel等都是不错的选择。这里以流程为例收集图片把你需要识别的医疗报告、法律文书、票据等图片集中到一个文件夹里。格式最好是JPG、PNG等常见格式。使用标注工具导入图片。用四边形框四边形框通常比旋转矩形框更常用且易于标注框出每一个文本区域可以是一个词、一行字或一个段落。在对应的输入框里准确输入框内的文字内容。标注关键点文本区域bbox即四边形的四个顶点坐标(x1, y1), (x2, y2), (x3, y3), (x4, y4)。文本内容text对应的字符串。难度可选可以标记一些模糊、遮挡的文本为“难”在训练时区别对待。2.2 格式转换整理成模型需要的样式标注工具导出的结果可能是JSON、XML等需要转换成GLM-OCR训练指定的格式。常见的是一种简单的文本文件格式每张图片对应一个.txt标注文件或者一个总的标注列表文件。例如一种常见的格式是 每行代表一个文本区域包含图片路径, 文本区域的坐标信息, 文本内容。 坐标信息可能是x1,y1,x2,y2,x3,y3,x4,y4或者x1,y1,x2,y2左上、右下等具体需要看GLM-OCR代码仓库的要求。你需要写一个小脚本将标注工具的导出文件解析并转换成这种格式。同时记得将数据集随机拆分为训练集如80%、验证集如10%和测试集如10%。验证集用于在训练过程中监控模型表现测试集用于最终评估。# 示例一个简单的格式转换脚本思路 (伪代码) import json import os import random # 假设从Label Studio导出的JSON文件 def convert_labelstudio_to_ocr_format(labelstudio_json_path, image_dir, output_label_file): with open(labelstudio_json_path, r, encodingutf-8) as f: data json.load(f) all_samples [] for item in data: image_filename item[data][image].split(/)[-1] # 获取图片文件名 image_path os.path.join(image_dir, image_filename) annotations item[annotations][0][result] ocr_info [] for ann in annotations: if ann[type] textarea: # 提取四边形顶点坐标 (假设是相对坐标需转换) points ann[value][points] # 转换为绝对坐标或模型需要的格式... coordinates convert_points(points, item[data][width], item[data][height]) text ann[value][text][0] ocr_info.append(f{coordinates},{text}) # 将一张图的所有标注合并为一行写入总文件或生成单独的txt line f{image_path}\t{ .join(ocr_info)} all_samples.append(line) # 随机打乱并划分数据集 random.shuffle(all_samples) split_idx int(len(all_samples) * 0.8) train_samples all_samples[:split_idx] val_samples all_samples[split_idx:] # 写入文件 with open(train_list.txt, w, encodingutf-8) as f: f.write(\n.join(train_samples)) with open(val_list.txt, w, encodingutf-8) as f: f.write(\n.join(val_samples)) print(f转换完成训练集{len(train_samples)}条验证集{len(val_samples)}条。) # 注意以上为思路示例具体转换逻辑需严格参照GLM-OCR官方数据格式说明。3. 第二步搭建“教室”——环境与代码准备环境配置是保证后续流程顺利的基础。强烈建议在带有NVIDIA GPU的机器或云服务器上进行。3.1 基础环境配置首先确保你的机器有合适的驱动和CUDA版本。然后我们创建一个干净的Python虚拟环境并安装核心依赖。# 1. 创建并激活虚拟环境 (推荐使用conda或venv) conda create -n glm-ocr-finetune python3.8 -y conda activate glm-ocr-finetune # 2. 安装PyTorch (请根据你的CUDA版本去PyTorch官网选择对应命令) # 例如对于CUDA 11.8 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 3. 克隆GLM-OCR的官方代码仓库 (假设仓库地址请以实际为准) git clone https://github.com/THUDM/GLM-OCR.git cd GLM-OCR # 4. 安装项目依赖 pip install -r requirements.txt # 可能还需要安装一些其他包如 opencv-python, Pillow, scikit-learn, tensorboard 等 pip install opencv-python Pillow scikit-learn tensorboard3.2 准备配置文件模型微调的行为主要由配置文件通常是.yaml或.json文件控制。你需要找到GLM-OCR提供的预训练模型配置文件并复制一份进行修改。# 进入配置文件目录 cd configs # 复制一个与你的任务最接近的配置文件例如基于det_db和rec_crnn的配置 cp ocr_system.yaml ocr_system_finetune.yaml接下来用文本编辑器打开ocr_system_finetune.yaml关键修改以下几处# 1. 修改数据路径 Train: dataset: name: YourDatasetName data_dir: /path/to/your/images # 图片所在根目录 label_file_list: [/path/to/your/train_list.txt] # 训练标注文件路径 # 可能还有其他数据增强、采样器等参数 Eval: dataset: name: YourEvalDatasetName data_dir: /path/to/your/images label_file_list: [/path/to/your/val_list.txt] # 验证标注文件路径 # 2. 修改预训练权重路径 (指向你下载的GLM-OCR预训练模型) Global: pretrained_model: /path/to/pretrained/glm-ocr-model.pdparams # 假设是PaddlePaddle格式实际根据框架调整 # 3. 调整训练超参数 (根据你的数据量调整) Optimizer: lr: name: Cosine learning_rate: 0.001 # 微调时学习率通常设置得比从头训练小例如1e-3到1e-4 warmup_epoch: 2 # 学习率预热轮数 epochs: 100 # 总训练轮数根据数据量调整小数据可适当增加 save_epoch_step: 10 # 每多少轮保存一次模型 # 4. 修改模型输出类别数 (如果需要例如识别字符集变了) # 这通常涉及识别(Recognition)部分的配置如果字符集和预训练模型一致则无需修改。 Architecture: Recognition: Head: out_channels: 6625 # 字符表大小如果你的字符集不同需要修改此处注意以上配置项名称和结构是示意性的你必须以GLM-OCR官方代码仓库提供的实际配置文件为准仔细阅读其注释和说明。4. 第三步开始“上课”——启动训练与监控环境数据都准备好了现在可以开始训练了。4.1 单卡训练如果你的数据量不大或者只是想快速验证流程单GPU训练是最简单的起步方式。# 假设训练脚本是 train.py 配置文件是我们修改过的 python tools/train.py -c configs/ocr_system_finetune.yaml训练开始后终端会打印日志包括当前epoch、迭代次数、损失(loss)、准确率(accuracy)等。重点关注验证集上的指标变化它是衡量模型泛化能力的关键。4.2 使用星图GPU平台进行分布式训练加速关键当你的数据集很大或者模型很复杂时单卡训练会非常耗时。利用星图这样的云平台进行多GPU分布式训练可以大幅缩短实验周期。星图平台通常提供了预置的深度学习环境并简化了分布式训练的启动流程。其核心优势在于免环境配置无需自己安装CUDA、驱动、深度学习框架直接使用预置的、经过优化的镜像。一键多卡通过简单的配置或命令行参数就能轻松启动多GPU训练任务。资源弹性可以根据任务需要灵活选择不同型号和数量的GPU。在星图平台上启动分布式训练流程可能与本地类似但具体命令和配置方式需遵循平台规范。通常你需要准备代码和数据将你的GLM-OCR代码、修改后的配置文件以及数据集上传到平台提供的存储空间中。选择镜像选择一个包含PyTorch/PaddlePaddle等深度学习框架和GLM-OCR所需依赖的预置镜像。配置任务在任务创建页面指定启动命令、数据挂载路径、GPU数量等。启动命令示例概念性# 假设平台使用 torch.distributed.launch 或 accelerate 等工具 python -m torch.distributed.launch --nproc_per_node4 --master_port29500 \ tools/train.py -c configs/ocr_system_finetune.yaml \ --distributed True--nproc_per_node4表示使用4张GPU。4.3 训练过程监控训练过程中不要只是放着不管。要学会观察损失曲线训练损失应稳步下降验证损失在下降后趋于平稳或缓慢上升可能过拟合。可以使用TensorBoard等工具可视化。验证集指标如识别准确率、编辑距离等。这是判断模型好坏的核心。当验证指标连续多个epoch不再提升时可以考虑停止训练早停。学习率如果使用了学习率调度器观察其变化是否符合预期。GPU利用率在星图平台的控制台可以查看GPU的使用情况确保资源没有被浪费。5. 第四步验收“成果”——模型评估与使用训练完成后我们得到了新的模型权重文件.pth或.pdparams接下来就是检验它学得怎么样。5.1 模型评估使用预留的测试集注意不是验证集对最终模型进行客观评估。运行评估脚本python tools/eval.py -c configs/ocr_system_finetune.yaml \ -o Global.pretrained_model./output/your_best_model.pdparams查看评估报告关注在你自己业务数据上的指标比如字符准确率、单词准确率、整句准确率等。对比微调前的模型应该有显著提升。5.2 模型推理现在你可以用微调好的模型来识别你的专属文档了。GLM-OCR通常会提供一个推理脚本或API。# 示例使用微调后的模型进行单张图片推理 (伪代码) from glm_ocr_system import TextSystem # 假设的导入请以实际代码为准 # 初始化系统加载微调后的配置和权重 config_path configs/ocr_system_finetune.yaml model_path ./output/your_best_model.pdparams ocr_system TextSystem(config_path, model_path) # 读取图片 image_path your_test_ticket.jpg img cv2.imread(image_path) # 进行OCR识别 dt_boxes, rec_res ocr_system(img) # dt_boxes是检测框rec_res是识别结果 # 打印结果 for box, text in zip(dt_boxes, rec_res): print(f位置: {box}, 识别文字: {text[0]}, 置信度: {text[1]})5.3 迭代优化第一次微调很少能达到完美。分析测试集上识别错误的案例bad cases是某些特定字体没认出来—— 补充更多包含该字体的数据。是背景复杂干扰大—— 增加数据增强或调整模型相关参数。是某个专业术语总错—— 检查标注是否正确或考虑扩充字典。收集这些bad cases补充到训练集中重新进行微调。这个过程迭代2-3次模型的性能通常会越来越好。整个流程走下来你会发现微调并没有想象中那么神秘和困难。它更像是一个系统的“教与学”工程你准备好高质量的习题数据配置好学习计划参数在一个好的环境GPU平台里让模型反复练习。最终它就能在你关心的任务上考出高分。刚开始的时候建议用一个小的子数据集快速跑通整个流程从数据准备到训练出第一个模型建立信心。然后再逐步扩大数据规模调整参数追求更好的效果。在星图这类云平台上做分布式训练能让你在数据变大时也不至于等待太久。希望这篇教程能帮你打开GLM-OCR定制化的大门。动手试试吧把你那个“不太灵”的通用模型变成业务场景中得心应手的专属工具。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。