标注数据的核心目的在于为模型的训练或微调提供高质量的输入数据。今天我们将探讨如何利用自定义标注的训练数据进行模型微调。版面分析模型作为文档解析的基础,其精确度直接影响后续文档解析的整体质量。通过优化版面分析的精度,不仅可以提升文档结构化的效率,还能为下游任务如表格提取、文本分类等打下坚实基础,是构建高性能文档解析系统的重要一步。
版面分析介绍
版面分析指的是对图片形式的文档进行区域划分,定位其中的关键区域,如文字、标题、表格、图片等。版面分析算法基于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.08Memory: 256GBCUDA Version:12.1NVIDIA GeForce RTX 3090-24GB * 81.2、运行软件配置
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训练环境dockerrun-d--gpusall--namelayout_train-v$(pwd):/paddle/publaynet--network=hostregistry.baidubce.com/paddlepaddle/paddle:2.6.1-gpu-cuda12.0-cudnn8.9-trt8.6tail-f/dev/null
PaddleDetection安装
在进入“layout_train”环境后,您需要在/home目录下执行相关命令来下载PaddleDetection的源码,并完成后续操作。确保您已正确配置了环境依赖,并仔细检查执行的命令,以避免因环境问题或路径设置错误导致失败。
源码下载
#克隆PaddleDetection项目代码gitclonehttps://github.com/PaddlePaddle/PaddleDetection.git#切换到release/2.8分支cdPaddleDetectiongitcheckout-brelease/2.8origin/release/2.8
#创建训练集软链接至数据集目录ln-sf/paddle/publaynet/home/PaddleDetection/dataset
#更新pippython3.10-mpipinstall--upgradepip-ihttps://mirrors.aliyun.com/pypi/simple/#安装依赖pip3install-rrequirements.txt-ihttps://mirrors.aliyun.com/pypi/simple/#编译安装PaddleDetectionpythonsetup.pyinstall#测试paddledet安装是否成功pythonppdet/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表示训练的同时进行评估。
exportCUDA_VISIBLE_DEVICES=0python3tools/train.py\-cconfigs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml\--eval
#多卡训练,通过--gpus参数指定卡号python3-mpaddle.distributed.launch--gpus'0,1,2,3'tools/train.py\-cconfigs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml\--eval
注意:如果训练时显存outmemory,将TrainReader中batch_size调小,同时LearningRate中base_lr等比例减小。发布的config均由8卡训练得到,如果改变GPU卡数为1,那么base_lr需要减小8倍。
训练日志:PaddleDetection/log目录下workerlog.0文件。
[08/1504:02:30]ppdet.utils.checkpointINFO:Finishloadingmodelweights:/root/.cache/paddle/weights/LCNet_x1_0_pretrained.pdparams[08/1504:02:46]ppdet.engineINFO:Epoch:[0][0/1929]learning_rate:0.040000loss_vfl:1.216707loss_bbox:1.142163loss_dfl:0.544196loss:2.903065eta:17days,13:50:26batch_cost:15.7452data_cost:2.9112ips:1.5243images/s[08/1504:03:19]ppdet.engineINFO:Epoch:[0][20/1929]learning_rate:0.064000loss_vfl:1.180627loss_bbox:0.939552loss_dfl:0.442436loss:2.628206eta:2days,12:18:53batch_cost:1.5770data_cost:0.0008ips:15.2184images/s[08/1504:03:47]ppdet.engineINFO:Epoch:[0][40/1929]learning_rate:0.088000loss_vfl:0.543321loss_bbox:1.071401loss_dfl:0.457817loss:2.057003eta:2days,0:07:03batch_cost:1.3190data_cost:0.0007ips:18.1954images/s[08/1504:04:12]ppdet.engineINFO:Epoch:[0][60/1929]learning_rate:0.112000loss_vfl:0.630989loss_bbox:0.859183loss_dfl:0.384702loss:1.883143eta:1day,19:01:29batch_cost:1.2177data_cost:0.0006ips:19.7087images/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:总损失值
版面分析模型训练采用边训练边验证,在验证过程中,模型会自动保存在save_dir参数配置的目录下,该模型为验证集上效果最好的模型。
3.1、模型的评估
参数说明:
--c指定配置文件,该配置文件必须和训练时使用的配置文件一致。
--o指定要检测的模型参数,配置为训练时保存的最优模型参数的地址,“best_model”为该文件的名称。
cd/home/PaddleDetection#GPU评估,weights为待测权重python3tools/eval.py\-cconfigs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml\-oweights=./output/picodet_lcnet_x1_0_layout/best_model
AveragePrecision(AP)@[IoU=0.50:0.95|area=all|maxDets=100]=0.935AveragePrecision(AP)@[IoU=0.50|area=all|maxDets=100]=0.979AveragePrecision(AP)@[IoU=0.75|area=all|maxDets=100]=0.956AveragePrecision(AP)@[IoU=0.50:0.95|area=small|maxDets=100]=0.404AveragePrecision(AP)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.782AveragePrecision(AP)@[IoU=0.50:0.95|area=large|maxDets=100]=0.969AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=1]=0.539AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=10]=0.938AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=100]=0.949AverageRecall(AR)@[IoU=0.50:0.95|area=small|maxDets=100]=0.495AverageRecall(AR)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.818AverageRecall(AR)@[IoU=0.50:0.95|area=large|maxDets=100]=0.978[08/1507:07:09]ppdet.engineINFO:Totalsamplenumber:11245,avergeFPS:24.405059207157436[08/1507:07:09]ppdet.engineINFO:Besttestbboxapis0.935.
AP:平均精度的度量,用于评估模型在不同阈值下的准确性
IoU:用来判断预测框与真实框重叠程度的指标。
area= all:表示计算所有面积范围的 AP,包括小、中、大三种。
maxDets=100:指每张图片最多考虑 100个检测结果。
3.2、模型的预测
预测使用的配置文件必须与训练一致。
参数说明:
-c:指定配置文件。
-o:指定要检测的模型参数,为训练时保存的最优模型参数的地址。
--infer_img:推理单张图片,也可以通过--infer_dir推理所有图片。
--output_dir:指定可视化结果保存路径。
--draw_threshold:指定绘制结果框的NMS阈值。
python3tools/infer.py\-cconfigs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml\-oweights='output/picodet_lcnet_x1_0_layout/best_model.pdparams'\--infer_img='docs/images/layout.jpg'\--output_dir=output_dir/\--draw_threshold=0.5
W102401:29:03.965935178585gpu_resources.cc:119]PleaseNOTE:device:0,GPUComputeCapability:8.6,DriverAPIVersion:12.1,RuntimeAPIVersion:12.0W102401:29:03.970413178585gpu_resources.cc:149]device:0,cuDNNVersion:8.9.[10/2401:29:04]ppdet.utils.checkpointINFO:Finishloadingmodelweightsutput/picodet_lcnet_x1_0_layout/best_model.pdparamsloadingannotationsintomemory...Done(t=0.07s)creatingindex...indexcreated!100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|1/1[00:04<00:00,4.01s/it][10/2401:29:08]ppdet.utils.downloadINFO
ownloadingsimfang.ttffromhttps://paddledet.bj.bcebos.com/simfang.ttf100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████|10329/10329[00:10<00:00,965.67KB/s][10/2401:29:19]ppdet.engineINFO
etectionbboxresultssaveinoutput_dir/layout.jpg
paddle.jit.save保存的模型) 一般是模型训练,把模型结构和模型参数保存在文件中的固化模型,多用于预测部署场景。 训练过程中保存的模型是checkpoints模型,保存的只有模型的参数,多用于恢复训练等。 与checkpoints模型相比,inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成。版面分析模型转inference模型步骤如下:
python3tools/export_model.py\-cconfigs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml\-oweights=output/picodet_lcnet_x1_0_layout/best_model\--output_dir=output_inference/
4.2模型推理
提供的推理训练模型推理:
#--device:GPU、CPUpython3deploy/python/infer.py\--model_dir=output_inference/picodet_lcnet_x1_0_layout/\--image_file=docs/images/layout.jpg\--device=GPU
模型推理完成,会看到以下log输出
-----------------------------------------------------ModelConfiguration-----------ModelArchicoDetTransformOrder:--transformop:Resize--transformop:NormalizeImage--transformop
ermute--transformop
adStride--------------------------------------------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]saveresultto
utput/layout.jpgTestiter0------------------InferenceTimeInfo----------------------total_time(ms):2196.0,img_num:1averagelatencytime(ms):2196.00,QPS:0.455373preprocess_time(ms):2172.50,inference_time(ms):11.90,postprocess_time(ms):11.60
Model:模型结构
./output文件夹| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |