ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

PaddleOCR PP-Structure 版面分析实战:基于 PP-PicoDet 的训练、FGD 蒸馏与部署推理全流程

PaddleOCR PP-Structure 版面分析实战:基于 PP-PicoDet 的训练、FGD 蒸馏与部署推理全流程 PaddleOCR PP-Structure 版面分析实战基于 PP-PicoDet 的训练、FGD 蒸馏与部署推理全流程【免费下载链接】PaddleOCR飞桨多语言OCR工具包实用超轻量OCR系统支持80种语言识别提供数据标注与合成工具支持服务器、移动端、嵌入式及IoT设备端的训练与部署 Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR版面分析Layout Analysis是对图片形式的文档进行区域划分与关键区域定位文字、标题、表格、图片等的技术是文档结构化解析、版面还原与信息抽取的前置环节。本文以 PaddleOCR 仓库中的 ppstructure/layout/README.md 为骨架系统讲解 PP-Structure 中基于 PaddleDetection 轻量检测模型 PP-PicoDet 开发的英文、中文、表格三类版面分析模型从环境安装、PubLayNet 等数据集准备到单卡/多卡训练与 FGD 蒸馏训练再到指标评估、模型导出与部署推理。读完本文你将掌握一套可直接复制运行的版面分析模型训练与部署方案并能结合仓库源码理解其预处理、后处理与推理实现。1. 版面分析是什么功能定位与模型家族版面分析指的是对图片形式的文档进行区域划分定位其中的关键区域如文字、标题、表格、图片等。PP-Structure 的版面分析算法基于 PaddleDetection 的轻量模型PP-PicoDet进行开发包含英文、中文、表格版面分析 3 类模型英文版面分析模型支持Text、Title、List、Table、Figure5 类区域的检测中文版面分析模型支持Text、Title、Figure、Figure caption、Table、Table caption、Header、Footer、Reference、Equation10 类区域的检测表格版面分析模型仅支持Table区域检测。上述类别定义与仓库中的类别字典文件一一对应可在 layout_publaynet_dict.txt5 类、layout_cdla_dict.txt10 类、layout_table_dict.txt1 类中直接查看。默认的 PubLayNet 字典路径在 ppstructure/utility.py 中通过--layout_dict_path参数给出推理时PicoDetPostProcess会读取该字典将类别 id 映射为区域名称。以英文文档为例版面分析的效果如下图所示输入图像2. 快速开始模型选择与 whl 包使用PP-Structure 目前提供了中文、英文、表格三类文档版面分析模型各模型的下载链接与精度说明见 版面分析模型列表。对于不想自行训练、希望直接体验预测流程的用户PP-Structure 也提供了 whl 包的形式方便快速使用整体使用说明见 PP-Structure 快速开始文档。在 PP-Structure 的预测入口predict_system.py中版面分析作为整个文档结构化流程的第一步参与工作。相关命令行开关定义在 ppstructure/utility.py--layout是否启用版面分析默认True--layout_model_dir指定版面分析模型目录--layout_dict_path类别字典路径默认指向layout_publaynet_dict.txt--layout_score_threshold类别置信度阈值默认0.5--layout_nms_thresholdNMS 阈值默认0.5。3. 环境安装3.1 安装 PaddlePaddlepython3 -m pip install --upgrade pip # GPU 安装 python3 -m pip install paddlepaddle-gpu2.3 -i https://mirror.baidu.com/pypi/simple # CPU 安装 python3 -m pip install paddlepaddle2.3 -i https://mirror.baidu.com/pypi/simple更多安装需求如特定 CUDA 版本请参照官方安装文档中的说明进行操作。3.2 安装 PaddleDetection训练、评估、预测脚本均来自 PaddleDetection 仓库需要单独获取其源码并安装依赖# 1下载 PaddleDetection 源码 git clone https://github.com/PaddlePaddle/PaddleDetection.git # 2安装第三方依赖 cd PaddleDetection python3 -m pip install -r requirements.txt需要说明的是本小节及后文第 5、6、7 节中的tools/train.py、tools/eval.py、tools/infer.py、tools/export_model.py均指在 PaddleDetection 源码目录下运行的脚本而仓库内本仓库自带的推理脚本为 ppstructure/layout/predict_layout.py可直接用于加载已导出的推理模型完成单张/多张图片的版面分析。4. 数据准备如果希望直接体验预测过程可以跳过数据准备下载官方提供的预训练模型见第 5 节。4.1 英文数据集 PubLayNet下载文档分析数据集 PubLayNet数据集约 96G包含 5 个类{0: Text, 1: Title, 2: List, 3: Table, 4: Figure}。# 下载数据 wget https://dax-cdn.cdn.appdomain.cloud/dax-publaynet/1.0.0/publaynet.tar.gz # 解压数据 tar -xvf publaynet.tar.gz解压之后的目录结构|-publaynet |- test |- PMC1277013_00004.jpg |- PMC1291385_00002.jpg | ... |- train.json |- train |- PMC1291385_00002.jpg |- PMC1277013_00004.jpg | ... |- val.json |- val |- PMC538274_00004.jpg |- PMC539300_00004.jpg | ...数据分布文件或文件夹说明数量train/训练集图片335,703val/验证集图片11,245test/测试集图片11,405train.json训练集标注文件-val.json验证集标注文件-标注格式JSON 文件包含所有图像的标注数据以字典嵌套的方式存放包含以下 keyinfo表示标注文件 infolicenses表示标注文件 licensesimages表示标注文件中图像信息列表每个元素是一张图像的信息。如下为其中一张图像的信息{ file_name: PMC4055390_00006.jpg, # file_name height: 601, # image height width: 792, # image width id: 341427 # image id }annotations表示标注文件中目标物体的标注信息列表每个元素是一个目标物体的标注信息。如下为其中一个目标物体的标注信息{ segmentation: # 物体的分割标注 area: 60518.099043117836, # 物体的区域面积 iscrowd: 0, # iscrowd image_id: 341427, # image id bbox: [50.58, 490.86, 240.15, 252.16], # bbox [x1,y1,w,h] category_id: 1, # category_id id: 3322348 # image id }注意bbox的格式为[x1, y1, w, h]左上角坐标 宽高这是训练配置文件TrainDataset.data_fields: [image, gt_bbox, gt_class, is_crowd]所依赖的标准 COCO 标注格式。4.2 更多数据集官方还提供了 CDLA中文版面分析、TableBank表格版面分析等数据集的下载链接将其处理为上述标注文件的 JSON 格式即可按相同方式进行训练。数据集简介cTDaR2019_cTDaR用于表格检测TRACKA和表格识别TRACKB。图片类型包含历史数据集以 cTDaR_t0 开头如 CTDAR_T00872.jpg和现代数据集以 cTDaR_t1 开头如 CTDAR_T10482.jpg。IIIT-AR-13K手动注释公开的年度报告中的图形或页面而构建的数据集包含 5 类table、figure、natural image、logo、signature。TableBank用于表格检测和识别的大型数据集包含 Word 和 LaTeX 两种文档格式。CDLA中文文档版面分析数据集面向中文文献类论文场景包含 10 类Text、Title、Figure、Figure caption、Table、Table caption、Header、Footer、Reference、Equation。DocBank使用弱监督方法构建的大规模数据集500K 文档页面用于文档布局分析包含 12 类Author、Caption、Date、Equation、Figure、Footer、List、Paragraph、Reference、Section、Table、Title。5. 开始训练官方提供了训练脚本、评估脚本和预测脚本本节以 PubLayNet 预训练模型为例进行讲解。如果不希望训练直接体验后面的模型评估、预测、动转静、推理流程可以下载提供的预训练模型PubLayNet 数据集并跳过 5.1 和 5.2 节mkdir pretrained_model cd pretrained_model # 下载 PubLayNet 预训练模型直接体验模型评估、预测、动转静 wget https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_fgd_layout.pdparams # 下载 PubLayNet 推理模型直接体验模型推理 wget https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_fgd_layout_infer.tar如果测试图片为中文可以下载中文 CDLA 数据集的预训练模型识别 10 类文档区域在 版面分析模型列表 中下载picodet_lcnet_x1_0_fgd_layout_cdla模型的训练模型和推理模型。如果只检测图片中的表格区域可以下载表格数据集的预训练模型在 版面分析模型列表 中下载picodet_lcnet_x1_0_fgd_layout_table模型的训练模型和推理模型。5.1 启动训练使用 PaddleDetection 的版面分析配置文件启动训练。如果你希望训练自己的数据集需要修改配置文件中的数据配置、类别数。以configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml为例修改的内容如下metric: COCO # 类别数 num_classes: 5 TrainDataset: !COCODataSet # 修改为你自己的训练数据目录 image_dir: train # 修改为你自己的训练数据标签文件 anno_path: train.json # 修改为你自己的训练数据根目录 dataset_dir: /root/publaynet/ data_fields: [image, gt_bbox, gt_class, is_crowd] EvalDataset: !COCODataSet # 修改为你自己的验证数据目录 image_dir: val # 修改为你自己的验证数据标签文件 anno_path: val.json # 修改为你自己的验证数据根目录 dataset_dir: /root/publaynet/ TestDataset: !ImageFolder # 修改为你自己的测试数据标签文件 anno_path: /root/publaynet/val.json开始训练。训练时 PaddleDetection 会默认下载 PP-PicoDet 预训练模型LCNet_x1_0无需预先手动下载。GPU 训练支持单卡与多卡# GPU 训练支持单卡、多卡训练训练日志会自动保存到 log 目录中 # 单卡训练 export CUDA_VISIBLE_DEVICES0 python3 tools/train.py \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ --eval # 多卡训练通过 --gpus 参数指定卡号 export CUDA_VISIBLE_DEVICES0,1,2,3 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 of memory请将TrainReader中batch_size调小同时将LearningRate中base_lr等比例减小。官方发布的 config 均由 8 卡训练得到如果 GPU 卡数改为 1那么base_lr需要减小 8 倍。正常启动训练后会看到以下 log 输出包含损失分量与吞吐量信息[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其中loss_vflVARIFOCAL Loss、loss_bbox、loss_dfl是 PicoDet 的三个损失分量ips表示每秒处理的图片数。--eval表示训练的同时进行评估评估过程中默认将最佳模型保存为output/picodet_lcnet_x1_0_layout/best_accuracy。注意预测/评估时的配置文件请务必与训练保持一致。5.2 FGD 蒸馏训练PaddleDetection 支持基于 FGDFocal and Global Knowledge Distillation for Detectors的目标检测模型蒸馏训练。FGD 蒸馏分为两个部分Focal 蒸馏分离图像的前景和背景让学生模型分别关注教师模型前景和背景部分特征的关键像素Global 蒸馏重建不同像素之间的关系并将其从教师模型转移到学生模型以补偿 Focal 蒸馏中丢失的全局信息。更换数据集修改配置中的数据配置、类别数参考 4.1 节后启动蒸馏训练# 单卡训练 export CUDA_VISIBLE_DEVICES0 python3 tools/train.py \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ --slim_config configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x2_5_layout.yml \ --eval-c指定模型配置文件学生模型--slim_config指定压缩策略配置文件含教师模型配置。仓库中官方发布的 PubLayNet 预训练模型即命名为picodet_lcnet_x1_0_fgd_layout.pdparams可推断其正是通过 FGD 蒸馏得到的轻量学生模型LCNet_x1_0教师模型为picodet_lcnet_x2_5_layout。6. 模型评估与预测6.1 指标评估训练中模型参数默认保存在output/picodet_lcnet_x1_0_layout目录下。在评估指标时需要设置weights指向保存的参数文件。评估数据集可以通过配置文件修改EvalDataset中的image_dir、anno_path和dataset_dir设置。# 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) [ IoU0.50:0.95 | area all | maxDets100 ] 0.935 Average Precision (AP) [ IoU0.50 | area all | maxDets100 ] 0.979 Average Precision (AP) [ IoU0.75 | area all | maxDets100 ] 0.956 Average Precision (AP) [ IoU0.50:0.95 | area small | maxDets100 ] 0.404 Average Precision (AP) [ IoU0.50:0.95 | areamedium | maxDets100 ] 0.782 Average Precision (AP) [ IoU0.50:0.95 | area large | maxDets100 ] 0.969 Average Recall (AR) [ IoU0.50:0.95 | area all | maxDets 1 ] 0.539 Average Recall (AR) [ IoU0.50:0.95 | area all | maxDets 10 ] 0.938 Average Recall (AR) [ IoU0.50:0.95 | area all | maxDets100 ] 0.949 Average Recall (AR) [ IoU0.50:0.95 | area small | maxDets100 ] 0.495 Average Recall (AR) [ IoU0.50:0.95 | areamedium | maxDets100 ] 0.818 Average Recall (AR) [ IoU0.50:0.95 | area large | maxDets100 ] 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.若使用官方提供的预训练模型进行评估或使用 FGD 蒸馏训练的模型更换weights模型路径执行如下命令进行评估python3 tools/eval.py \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ --slim_config configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x2_5_layout.yml \ -o weightsoutput/picodet_lcnet_x2_5_layout/best_model-c指定模型配置文件--slim_config指定蒸馏策略配置文件-o weights指定蒸馏算法训练好的模型路径。6.2 测试版面分析结果预测使用的配置文件必须与训练一致。使用 PaddleDetection 训练好的模型可以使用如下命令进行模型预测python3 tools/infer.py \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ -o weightsoutput/picodet_lcnet_x1_0_layout/best_model.pdparams \ --infer_imgdocs/images/layout.jpg \ --output_diroutput_dir/ \ --draw_threshold0.5--infer_img推理单张图片也可以通过--infer_dir推理目录中的所有图片--output_dir指定可视化结果保存路径--draw_threshold指定绘制结果框的 NMS 阈值。若使用官方提供的预训练模型进行预测或使用 FGD 蒸馏训练的模型更换weights模型路径执行如下命令进行预测python3 tools/infer.py \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ --slim_config configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x2_5_layout.yml \ -o weightsoutput/picodet_lcnet_x2_5_layout/best_model.pdparams \ --infer_imgdocs/images/layout.jpg \ --output_diroutput_dir/ \ --draw_threshold0.57. 模型导出与推理7.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 weightsoutput/picodet_lcnet_x1_0_layout/best_model \ --output_diroutput_inference/如无需导出后处理请指定-o export.benchmarkTrue如果-o已出现过此处删掉-o如无需导出 NMS请指定-o export.nmsFalse。转换成功后在目录下有三个文件output_inference/picodet_lcnet_x1_0_layout/ ├── model.pdiparams # inference 模型的参数文件 ├── model.pdiparams.info # inference 模型的参数信息可忽略 └── model.pdmodel # inference 模型的模型结构文件若使用官方提供的预训练模型转 inference 模型或使用 FGD 蒸馏训练的模型更换weights模型路径模型转 inference 模型步骤如下python3 tools/export_model.py \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ --slim_config configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x2_5_layout.yml \ -o weights./output/picodet_lcnet_x2_5_layout/best_model \ --output_diroutput_inference/7.2 模型推理若使用官方提供的推理模型推理或使用 FGD 蒸馏训练的模型更换model_dir推理模型路径执行如下命令进行推理python3 deploy/python/infer.py \ --model_diroutput_inference/picodet_lcnet_x1_0_layout/ \ --image_filedocs/images/layout.jpg \ --deviceCPU--device指定 GPU、CPU 设备。模型推理完成会看到以下 log 输出------------------------------------------ ----------- Model Configuration ----------- Model Arch: PicoDet Transform 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.jpg Test iter 0 ------------------ Inference Time Info ---------------------- total_time(ms): 2196.0, img_num: 1 average latency time(ms): 2196.00, QPS: 0.455373 preprocess_time(ms): 2172.50, inference_time(ms): 11.90, postprocess_time(ms): 11.60各字段含义Model模型结构PicoDetTransform Order预处理操作序列Resize → NormalizeImage → Permute → PadStrideclass_id、confidence、left_top、right_bottom分别表示类别 id、置信度、左上角坐标、右下角坐标save result to可视化版面分析结果保存路径默认保存到./output文件夹Inference Time Info推理时间其中preprocess_time表示预处理耗时inference_time表示模型预测耗时postprocess_time表示后处理耗时。可视化版面分析结果如下图所示输出结果图8. 源码导读LayoutPredictor 的完整推理链路除了在 PaddleDetection 中训练与导出外本仓库自带的 ppstructure/layout/predict_layout.py 实现了独立的版面分析推理器LayoutPredictor可直接加载推理模型完成预测其实现细节与第 7.2 节的推理日志一一对应。预处理阶段见 predict_layout.py与日志中的 Transform Order 一致Resize统一缩放至[800, 608]NormalizeImage使用 ImageNet 统计量mean[0.485, 0.456, 0.406]、std[0.229, 0.224, 0.225]scale1./255.通道顺序为hwcToCHWImage将 HWC 布局转换为 CHWKeepKeys仅保留image键供后续PicoDetPostProcess与可视化使用。后处理阶段见 predict_layout.py构造PicoDetPostProcess关键参数直接来自命令行layout_dict_path类别字典用于把class_id映射为区域名称score_threshold类别置信度阈值默认0.5nms_thresholdNMS 阈值默认0.5。推理时预测器将网络输出的 score 与 box 两组输出拼接为preds字典交给后处理算子过滤低置信度框并执行 NMS最终返回带类别与坐标的区域列表见 predict_layout.py。此外LayoutPredictor还支持--use_onnx开关通过 ONNX Runtime 执行推理便于在非 Paddle 环境或边缘设备上部署。若需将版面分析结果用于进一步的文档结构化OCR 识别、表格还原、公式识别等可参考 ppstructure/predict_system.py 的调用方式并通过 ppstructure/utility.py 中的draw_structure_result将版面区域与 OCR 结果叠加可视化。参考文献版面分析数据集与蒸馏算法分别引用以下论文inproceedings{zhong2019publaynet, title{PubLayNet: largest dataset ever for document layout analysis}, author{Zhong, Xu and Tang, Jianbin and Yepes, Antonio Jimeno}, booktitle{2019 International Conference on Document Analysis and Recognition (ICDAR)}, year{2019}, volume{}, number{}, pages{1015-1022}, doi{10.1109/ICDAR.2019.00166}, ISSN{1520-5363}, month{Sep.}, organization{IEEE} } inproceedings{yang2022focal, title{Focal and global knowledge distillation for detectors}, author{Yang, Zhendong and Li, Zhe and Jiang, Xiaohu and Gong, Yuan and Yuan, Zehuan and Zhao, Danpei and Yuan, Chun}, booktitle{Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, pages{4643--4652}, year{2022} }【免费下载链接】PaddleOCR飞桨多语言OCR工具包实用超轻量OCR系统支持80种语言识别提供数据标注与合成工具支持服务器、移动端、嵌入式及IoT设备端的训练与部署 Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表