AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


打造自己的RAG解析大模型:如何进行版面分析模型的训练?
发布日期:2024-11-26 07:03:50 浏览次数: 1549 来源:真聊技术



标注数据的核心目的在于为模型的训练或微调提供高质量的输入数据。今天我们将探讨如何利用自定义标注的训练数据进行模型微调。版面分析模型作为文档解析的基础,其精确度直接影响后续文档解析的整体质量。通过优化版面分析的精度,不仅可以提升文档结构化的效率,还能为下游任务如表格提取、文本分类等打下坚实基础,是构建高性能文档解析系统的重要一步。

版面分析介绍

版面分析指的是对图片形式的文档进行区域划分,定位其中的关键区域,如文字、标题、表格、图片等。版面分析算法基于PaddleDetection的轻量模型PP-PicoDet进行开发,包含英文、中文、表格版面分析3类模型。其中,英文模型支持Text、Title、Tale、Figure、List5类区域的检测,中文模型支持Text、Title、Figure、Figure caption、Table、Table caption、Header、Footer、Reference、Equation10类区域的检测,表格版面分析支持Table区域的检测

飞浆提供的中文版面分析模型是基于论文场景开发的,因此默认定义了10类检测区域。然而,这些分类并不是固定的。用户可以根据自己的业务需求,自由调整检测区域的类别数量及名称。

具体如何定义可以参考这篇文章:Labelme版面标注并顺利完成训练

版面分析模型训练详解

1、环境配置

1.1、运行硬件配置

  • Ubuntu 20.08
  • Memory: 256GB
  • CUDA Version:12.1
  • NVIDIA GeForce RTX 3090-24GB * 8

1.2、运行软件配置

  • Python: 3.11
  • Paddle版本:2.6.1,Docker安装
  • PaddleDetection版本:release/2.8

1.3、训练数据准备

百度建议,垂类模型的微调至少需要5000张版面训练集,这确实不是一个小数目,需要小伙伴干几天才能标注出这么多训练集,可这还不够,验证集要保证是训练集的10%,所以也需要500张。

在训练机器上,可以通过安装包含 Paddle 框架的 Docker 环境进行训练。为方便管理,训练数据集可以保存在宿主机上,并在创建 Docker 容器时通过挂载(mount)方式加载到容器内部。例如,可以创建一个中文数据集的专用目录 /paddle/publaynet

|-publaynet
   |- train.json #训练集标注文件
   |- train #训练集图片目录
       |- images
           |- train_1.jpg
           |- train_2.jpg
           | ...
   |- val.json #验证集标注文件
   |- val #验证集图片目录
       |- images
           |- val_1.jpg
           |- val_2.jpg
           | ...

标注文件内容与格式,参考这篇文章:Labelme版面标注并顺利完成训练

重要提示:在进行模型训练时,必须确保训练集和验证集使用同一款标注工具进行标注,以保证导出的标注文件格式中的 categories 字典在“数量”和“顺序”上完全一致。此外,标注文件中的 categories 定义必须与模型的 categories 类别字典的分类数量和顺序保持一致。如果这三者之间存在不匹配,可能会导致训练阶段出现错误或模型性能不佳。

1.4、软件安装

Paddle安装
进入/paddle/publaynet目录并安装Docker
    # 进入数据目录cd /paddle/publaynet# 创建版面分析模型Paddle训练环境docker run -d --gpus all --name layout_train -v $(pwd):/paddle/publaynet --network=host registry.baidubce.com/paddlepaddle/paddle:2.6.1-gpu-cuda12.0-cudnn8.9-trt8.6 tail -f /dev/null
    PaddleDetection安装
    在进入 “layout_train” 环境后,您需要在 /home 目录下执行相关命令来下载 PaddleDetection 的源码,并完成后续操作。确保您已正确配置了环境依赖,并仔细检查执行的命令,以避免因环境问题或路径设置错误导致失败。
    源码下载
      # 克隆PaddleDetection项目代码git clone https://github.com/PaddlePaddle/PaddleDetection.git# 切换到release/2.8分支cd PaddleDetectiongit checkout -b release/2.8 origin/release/2.8

      • 创建训练集软链接至训练集目录
        # 创建训练集软链接至数据集目录ln -sf /paddle/publaynet /home/PaddleDetection/dataset

        • 安装其他依赖
          # 更新pippython3.10 -m pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/# 安装依赖pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/# 编译安装PaddleDetectionpython setup.py install# 测试paddledet安装是否成功python ppdet/modeling/tests/test_architectures.py
          2、开始训练
          在版面训练中,采用了飞桨最新的 PP-StructureV2 智能文档分析系统模型。相比之前的版本,从算法改进的角度来看,该模型在 8 个关键方面实现了优化。这些改进显著提升了文档版面分析的准确性和效率,为智能文档处理提供了更优质的解决方案,是目前文档解析任务中的领先选择。
          2.1、修改配置文件

          如果你希望训练自己标注的数据集,需要修改配置文件中的数据配置、类别数。以picodet_lcnet_x1_0_layout.yml为例,修改的内容如下所示。

            metric: COCO# 类别数num_classes: 11TrainDataset:!COCODataSet# 修改为你自己的训练数据目录image_dir: train# 修改为你自己的训练数据标签文件anno_path: train.json# 修改为你自己的训练数据根目录dataset_dir: /publaynet/data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']EvalDataset:!COCODataSet# 修改为你自己的验证数据目录image_dir: val# 修改为你自己的验证数据标签文件anno_path: val.json# 修改为你自己的验证数据根目录dataset_dir: /publaynet/TestDataset:!ImageFolder# 修改为你自己的测试数据标签文件anno_path: /publaynet/val.json
            2.2、启动训练

            • 公共参数

            -c指定模型配置文件
            --eval表示训练的同时进行评估。


            • 单机单卡训练
              export CUDA_VISIBLE_DEVICES=0python3 tools/train.py \-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \--eval

              • 单机多卡训练
                # 多卡训练,通过--gpus参数指定卡号python3 -m paddle.distributed.launch --gpus '0,1,2,3'tools/train.py \-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \--eval
                注意:如果训练时显存out memory,将TrainReader中batch_size调小,同时LearningRate中base_lr等比例减小。发布的config均由8卡训练得到,如果改变GPU卡数为1,那么base_lr需要减小8倍。
                2.3、训练日志
                训练日志:PaddleDetection/log目录下workerlog.0文件。
                  [08/15 04:02:30] ppdet.utils.checkpoint INFO: Finish loading model weights: /root/.cache/paddle/weights/LCNet_x1_0_pretrained.pdparams[08/15 04:02:46] ppdet.engine INFO: Epoch: [0] [ 0/1929] learning_rate: 0.040000 loss_vfl: 1.216707 loss_bbox: 1.142163 loss_dfl: 0.544196 loss: 2.903065 eta: 17 days, 13:50:26 batch_cost: 15.7452 data_cost: 2.9112 ips: 1.5243 images/s[08/15 04:03:19] ppdet.engine INFO: Epoch: [0] [20/1929] learning_rate: 0.064000 loss_vfl: 1.180627 loss_bbox: 0.939552 loss_dfl: 0.442436 loss: 2.628206 eta: 2 days, 12:18:53 batch_cost: 1.5770 data_cost: 0.0008 ips: 15.2184 images/s[08/15 04:03:47] ppdet.engine INFO: Epoch: [0] [40/1929] learning_rate: 0.088000 loss_vfl: 0.543321 loss_bbox: 1.071401 loss_dfl: 0.457817 loss: 2.057003 eta: 2 days, 0:07:03 batch_cost: 1.3190 data_cost: 0.0007 ips: 18.1954 images/s[08/15 04:04:12] ppdet.engine INFO: Epoch: [0] [60/1929] learning_rate: 0.112000 loss_vfl: 0.630989 loss_bbox: 0.859183 loss_dfl: 0.384702 loss: 1.883143 eta: 1 day, 19:01:29 batch_cost: 1.2177 data_cost: 0.0006 ips: 19.7087 images/s
                  log中自动打印如下信息:
                  Epoch[0]:表示当前是第 0个训练周期。
                  迭代步数[0/1929]:表示当前是第 0步,总共需要 1929步。
                  learning_rate:当前批次数据载入的学习率。
                  ips:每秒处理图片的数量
                  eta:当前batch后剩余时间
                  batch_cost:训练一个batch的耗时,单位为秒。
                  data_cost:载入一个batch数据到GPU的耗时,单位为秒。
                  loss_vfl:指的是 Variational Loss(变焦损失值)
                  loss_bbox:边界框回归的损失值
                  loss_dfl:分布焦点损失值。
                  loss:总损失值
                  3、模型的评估与预测
                  版面分析模型训练采用边训练边验证,在验证过程中,模型会自动保存在save_dir参数配置的目录下,该模型为验证集上效果最好的模型。
                  3.1、模型的评估

                  参数说明:
                  --c指定配置文件,该配置文件必须和训练时使用的配置文件一致。
                  --o指定要检测的模型参数,配置为训练时保存的最优模型参数的地址,“best_model”为该文件的名称。

                    cd /home/PaddleDetection# GPU 评估, weights 为待测权重python3 tools/eval.py \-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \-o weights=./output/picodet_lcnet_x1_0_layout/best_model
                    会输出以下信息,打印出mAP、AP0.5等信息。
                      Average Precision(AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.935Average Precision(AP) @[ IoU=0.50| area= all | maxDets=100 ] = 0.979Average Precision(AP) @[ IoU=0.75| area= all | maxDets=100 ] = 0.956Average Precision(AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.404Average Precision(AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.782Average Precision(AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.969Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1 ] = 0.539Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.938Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.949Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.495Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.818Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.978[08/15 07:07:09] ppdet.engine INFO: Total sample number: 11245, averge FPS: 24.405059207157436[08/15 07:07:09] ppdet.engine INFO: Best test bbox ap is 0.935.
                      AP:平均精度的度量,用于评估模型在不同阈值下的准确性
                      IoU:用来判断预测框与真实框重叠程度的指标。
                      area= all:表示计算所有面积范围的 AP,包括小、中、大三种。
                      maxDets=100:指每张图片最多考虑 100个检测结果。
                      3.2、模型的预测
                      预测使用的配置文件必须与训练一致。
                      参数说明:
                      -c:指定配置文件。
                      -o:指定要检测的模型参数,为训练时保存的最优模型参数的地址。
                      --infer_img:推理单张图片,也可以通过--infer_dir推理所有图片。
                      --output_dir:指定可视化结果保存路径。
                      --draw_threshold:指定绘制结果框的NMS阈值。
                        python3 tools/infer.py \-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \-o weights='output/picodet_lcnet_x1_0_layout/best_model.pdparams' \--infer_img='docs/images/layout.jpg' \--output_dir=output_dir/ \--draw_threshold=0.5
                        执行命令后可以看到如下信息
                          W1024 01:29:03.965935 178585 gpu_resources.cc:119] Please NOTE: device: 0, GPU Compute Capability: 8.6, Driver API Version: 12.1, Runtime API Version: 12.0W1024 01:29:03.970413 178585 gpu_resources.cc:149] device: 0, cuDNN Version: 8.9.[10/24 01:29:04] ppdet.utils.checkpoint INFO: Finish loading model weights: output/picodet_lcnet_x1_0_layout/best_model.pdparamsloading annotations into memory...Done (t=0.07s)creating index...index created!100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:04<00:00,4.01s/it][10/24 01:29:08] ppdet.utils.download INFO: Downloading simfang.ttf from https://paddledet.bj.bcebos.com/simfang.ttf100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10329/10329 [00:10<00:00, 965.67KB/s][10/24 01:29:19] ppdet.engine INFO: Detection bbox results save in output_dir/layout.jpg

                          4. 模型导出与预测

                          4.1 模型导出

                          inference 模型(paddle.jit.save保存的模型) 一般是模型训练,把模型结构和模型参数保存在文件中的固化模型,多用于预测部署场景。 训练过程中保存的模型是checkpoints模型,保存的只有模型的参数,多用于恢复训练等。 与checkpoints模型相比,inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成。

                          版面分析模型转inference模型步骤如下:

                            python3 tools/export_model.py \-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \-o weights=output/picodet_lcnet_x1_0_layout/best_model \--output_dir=output_inference/
                            4.2 模型推理

                            提供的推理训练模型推理
                              # --device:GPU、CPUpython3 deploy/python/infer.py \--model_dir=output_inference/picodet_lcnet_x1_0_layout/ \--image_file=docs/images/layout.jpg \--device=GPU

                              模型推理完成,会看到以下log输出

                                -----------------------------------------------------Model Configuration -----------Model Arch: PicoDetTransform Order:--transform op: Resize--transform op: NormalizeImage--transform op: Permute--transform op: PadStride--------------------------------------------class_id:0, confidence:0.9921, left_top:[20.18,35.66],right_bottom:[341.58,600.99]class_id:0, confidence:0.9914, left_top:[19.77,611.42],right_bottom:[341.48,901.82]class_id:0, confidence:0.9904, left_top:[369.36,375.10],right_bottom:[691.29,600.59]class_id:0, confidence:0.9835, left_top:[369.60,608.60],right_bottom:[691.38,736.72]class_id:0, confidence:0.9830, left_top:[369.58,805.38],right_bottom:[690.97,901.80]class_id:0, confidence:0.9716, left_top:[383.68,271.44],right_bottom:[688.93,335.39]class_id:0, confidence:0.9452, left_top:[370.82,34.48],right_bottom:[688.10,63.54]class_id:1, confidence:0.8712, left_top:[370.84,771.03],right_bottom:[519.30,789.13]class_id:3, confidence:0.9856, left_top:[371.28,67.85],right_bottom:[685.73,267.72]save result to: output/layout.jpgTest iter 0------------------ Inference Time Info ----------------------total_time(ms): 2196.0, img_num: 1average latency time(ms): 2196.00, QPS: 0.455373preprocess_time(ms): 2172.50, inference_time(ms): 11.90, postprocess_time(ms): 11.60
                                Model:模型结构
                                • Transform Order:预处理操作
                                • class_id、confidence、left_top、right_bottom:分别表示类别id、置信度、左上角坐标、右下角坐标
                                • save result to:可视化版面分析结果保存路径,默认保存到./output文件夹
                                • Inference Time Info:推理时间,其中preprocess_time表示预处理耗时,inference_time表示模型预测耗时,postprocess_time表示后处理耗时



                                53AI,企业落地应用大模型首选服务商

                                产品:大模型应用平台+智能体定制开发+落地咨询服务

                                承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

                                联系我们

                                售前咨询
                                186 6662 7370
                                预约演示
                                185 8882 0121

                                微信扫码

                                与创始人交个朋友

                                回到顶部

                                 
                                扫码咨询