
PaddleOCR 文本檢測模型訓練、評估與推理全流程實戰以 icdar2015 為例【免費下載鏈接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.項目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR本文以 PaddleOCR 倉庫中的 檢測模型訓練文檔 為核心骨架結合 tools/train.py、tools/eval.py、tools/export_model.py 等源碼與 det_mv3_db.yml 配置逐項對照驗證系統講解從數據準備、權重下載、訓練啟動單卡/多卡/多機/混合精度、評估指標、單圖/批量測試到推理模型導出的完整鏈路。1. 數據與預訓練權重準備1.1 數據準備PaddleOCR 的檢測模型訓練以icdar2015數據集作為官方示例。數據集的下載、標注格式與目錄組織方式請參考 OCR 數據集文檔。訓練集與驗證集的標注文件分別對應配置文件中的Train.dataset.label_file_list與Eval.dataset.label_file_list例如Train: dataset: name: SimpleDataSet data_dir: ./train_data/icdar2015/text_localization/ label_file_list: - ./train_data/icdar2015/text_localization/train_icdar2015_label.txt Eval: dataset: name: SimpleDataSet data_dir: ./train_data/icdar2015/text_localization/ label_file_list: - ./train_data/icdar2015/text_localization/test_icdar2015_label.txt在 det_mv3_db.yml 中可以看到Train.dataset使用SimpleDataSet通過data_dir label_file_list定位圖片與標簽Eval.dataset則指向test_icdar2015_label.txt且Eval.loader.batch_size_per_card必須為1評估過程逐圖進行。1.2 下載預訓練骨干權重PaddleOCR 的檢測模型目前支持 3 種骨干網絡MobileNetV3、ResNet18_vd、ResNet50_vd。預訓練權重統一放到./pretrain_models/目錄下cd PaddleOCR/ # 下載 MobileNetV3 預訓練模型 wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/pretrained/MobileNetV3_large_x0_5_pretrained.pdparams # 或下載 ResNet18_vd 預訓練模型 wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/pretrained/ResNet18_vd_pretrained.pdparams # 或下載 ResNet50_vd 預訓練模型 wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/pretrained/ResNet50_vd_ssld_pretrained.pdparams說明預訓練權重下載后訓練時通過Global.pretrained_model指定路徑不帶.pdparams后綴如./pretrain_models/MobileNetV3_large_x0_5_pretrained。這些骨干權重來自 PaddleClas 的分類預訓練模型僅用于初始化特征提取層。2. 訓練2.1 啟動訓練使用tools/train.py啟動訓練-c指定配置文件-o用于覆蓋配置項python3 tools/train.py -c configs/det/det_mv3_db.yml \ -o Global.pretrained_model./pretrain_models/MobileNetV3_large_x0_5_pretrained若安裝的是 CPU 版本 PaddlePaddle請將配置中的use_gpu設為false。-o支持任意層級的鍵值覆蓋無需修改 yml 文件。例如將學習率調整為 0.0001# 單 GPU 訓練 python3 tools/train.py -c configs/det/det_mv3_db.yml -o \ Global.pretrained_model./pretrain_models/MobileNetV3_large_x0_5_pretrained \ Optimizer.base_lr0.0001 # 多 GPU 訓練通過 --gpus 指定使用的 GPU ID python3 -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/det/det_mv3_db.yml \ -o Global.pretrained_model./pretrain_models/MobileNetV3_large_x0_5_pretrained # 多機多卡訓練通過 --ips 指定節點 IP--gpus 指定 GPU ID python3 -m paddle.distributed.launch --ipsxx.xx.xx.xx,xx.xx.xx.xx --gpus 0,1,2,3 \ tools/train.py -c configs/det/det_mv3_db.yml \ -o Global.pretrained_model./pretrain_models/MobileNetV3_large_x0_5_pretrained多機訓練注意事項--ips必須替換為各機器的實際地址且機器之間需能互相 ping 通需要在多臺機器上分別啟動訓練命令查看本機 IP 可用ifconfig。想要進一步加速訓練可開啟自動混合精度訓練。單卡訓練命令如下python3 tools/train.py -c configs/det/det_mv3_db.yml \ -o Global.pretrained_model./pretrain_models/MobileNetV3_large_x0_5_pretrained \ Global.use_ampTrue Global.scale_loss1024.0 Global.use_dynamic_loss_scalingTrue從源碼看訓練主流程在 tools/train.py 中main()依次完成分布式環境初始化dist.init_parallel_env、構建訓練/驗證 DataLoaderbuild_dataloader、構建后處理build_post_process、構建模型build_model、構建損失build_loss、構建優化器build_optimizer與評估指標build_metric最后調用program.train()進入訓練循環。use_amp開啟時會在 tools/train.py 中構造paddle.amp.GradScaler并按amp_level默認O2對模型與優化器進行paddle.amp.decorate封裝同時設置master_weightTrue保證主權重精度。2.2 加載已訓練模型繼續訓練若希望加載訓練中間產物checkpoints斷點續訓指定Global.checkpoints即可python3 tools/train.py -c configs/det/det_mv3_db.yml -o Global.checkpoints./your/trained/model注意Global.checkpoints的優先級高于Global.pretrained_model當兩者同時指定時優先加載Global.checkpoints指向的模型若該路徑錯誤則回退加載Global.pretrained_model指向的模型。這一加載邏輯由 ppocr/utils/save_load.py 中的load_model實現。2.3 使用新骨干網絡訓練PaddleOCR 將檢測網絡劃分為四個串聯模塊數據依次經過transforms - backbones - necks - heads相關代碼位于 ppocr/modeling 目錄├── architectures # 網絡構建代碼 ├── transforms # 圖像變換模塊 ├── backbones # 特征提取模塊 ├── necks # 特征增強模塊 └── heads # 輸出模塊如果目標骨干在 PaddleOCR 中已有實現直接修改配置文件Backbone部分即可若需引入全新的 Backbone步驟如下在 ppocr/modeling/backbones 目錄下新建文件例如my_backbone.py在其中編寫繼承paddle.nn.Layer的網絡類import paddle import paddle.nn as nn import paddle.nn.functional as F class MyBackbone(nn.Layer): def __init__(self, *args, **kwargs): super(MyBackbone, self).__init__() # 你的初始化代碼 self.conv nn.xxxx def forward(self, inputs): # 你的網絡前向邏輯 y self.conv(inputs) return y在 ppocr/modeling/backbones/init.py 中導入新模塊。四個模塊添加完成后只需在配置文件中聲明即可使用Backbone: name: MyBackbone args1: args1說明替換 Backbone 及其他模塊的完整規范見 新增算法文檔。從配置看Architecture采用模塊化注冊機制如DBFPNNeck、DBHeadHead、DBLossLoss、DBPostProcess后處理各模塊通過name字段在對應目錄的__init__.py中完成注冊與實例化。2.4 混合精度訓練希望進一步加速訓練時可使用自動混合精度訓練。以單機單卡為例python3 tools/train.py -c configs/det/det_mv3_db.yml \ -o Global.pretrained_model./pretrain_models/MobileNetV3_large_x0_5_pretrained \ Global.use_ampTrue Global.scale_loss1024.0 Global.use_dynamic_loss_scalingTrue其中Global.scale_loss為梯度縮放初始值init_loss_scalingGlobal.use_dynamic_loss_scaling決定是否啟用動態損失縮放二者直接傳入paddle.amp.GradScaler見 tools/train.py。2.5 分布式訓練多機多卡訓練時--ips指定機器 IP--gpus指定 GPU IDpython3 -m paddle.distributed.launch --ipsxx.xx.xx.xx,xx.xx.xx.xx --gpus 0,1,2,3 \ tools/train.py -c configs/det/det_mv3_db.yml \ -o Global.pretrained_model./pretrain_models/MobileNetV3_large_x0_5_pretrained注意事項--ips需替換為各機器實際地址且機器之間可互相 ping 通需在多個機器上分別啟動訓練查看本機 IP 使用ifconfig更多分布式訓練加速比細節見 分布式訓練教程。從源碼結構可以推斷配置文件中Global.distributed為真時訓練代碼會先執行dist.init_parallel_env()并將模型包裝為paddle.DataParallel見 tools/train.py 與 tools/train.py。2.6 知識蒸餾訓練PaddleOCR 的文本檢測訓練支持知識蒸餾Knowledge Distillation通常用于訓練輕量級學生模型細節參考 知識蒸餾文檔。蒸餾配置在Architecture中聲明多個子模型teacher/student后處理則使用DistillationDBPostProcess見 ppocr/postprocess/db_postprocess.py其內部為每個子模型默認model_name[student]分別執行 DB 后處理。2.7 其他平臺訓練Windows / macOS / Linux DCUWindows GPU/CPUWindows 平臺僅支持單 GPU 訓練與推理用set CUDA_VISIBLE_DEVICES0指定 GPUDataLoader 僅支持單進程模式需將num_workers設為 0。macOS不支持 GPU 模式需在配置文件中將use_gpu設為False其余訓練/評估/預測命令與 Linux GPU 完全一致。Linux DCU在 DCU 設備上運行需設置環境變量export HIP_VISIBLE_DEVICES0,1,2,3其余命令與 Linux GPU 一致。2.8 微調實際業務中推薦加載官方預訓練模型并在自有數據集上微調。檢測模型的微調方法詳見 模型微調教程。微調核心要點數據集至少準備500 張檢測標注圖標注框需與語義內容一致例如火車票場景中姓名雖相距較遠但語義同一字段應標注為一個檢測框推薦使用 PP-OCRv3 檢測模型作為預訓練權重配置文件 PP-OCRv3_mobile_det.yml權重包解壓后使用其中的student.pdparams即僅使用學生模型微調時最重要的三個超參數是pretrained_model、learning_rate與batch_size。PaddleOCR 官方配置面向 8 卡訓練總 batch size 8×864你的場景需按總 batch size 線性縮放學習率單卡 batch_size8 時建議學習率約1e-4單卡受顯存限制 batch_size4 時建議約5e-5推理階段可調整預測圖像尺度與 DB 后處理參數來提升小文本檢測效果常用推理超參數如下表超參數類型默認值含義det_db_threshfloat0.3DB 輸出的概率圖中得分大于該閾值的像素被視為文本像素det_db_box_threshfloat0.6檢測結果框內所有像素平均得分大于該閾值時才判定為文本區域det_db_unclip_ratiofloat1.5Vatti clipping 擴張系數用于擴張文本區域max_batch_sizeint10batch 大小use_dilationboolFalse是否對分割結果做膨脹以得到更優檢測結果det_db_score_modestrfastDB 檢測結果的得分計算方式支持fast按多邊形外接矩形內所有像素計算平均分與slow按原始多邊形內所有像素計算平均分速度較慢但更準確3. 評估PaddleOCR 使用Precision精確率、Recall召回率、HmeanF1 分數三項指標評估文本檢測性能。在 ppocr/metrics/det_metric.py 中DetMetric通過DetectionIoUEvaluator逐圖比對預測多邊形與 GT 多邊形最終由get_metric()匯總輸出precision、recall、hmean三項指標配置項Metric.main_indicator: hmean表明以 Hmean 作為早停/模型篩選的主指標。運行以下命令計算評估指標結果保存在配置文件中Global.save_res_path指定的文件里python3 tools/eval.py -c configs/det/det_mv3_db.yml \ -o Global.checkpoints{path/to/weights}/best_accuracy \ PostProcess.box_thresh0.6 PostProcess.unclip_ratio1.5評估要點評估時建議設置后處理參數box_thresh0.6、unclip_ratio1.5若使用不同數據集/模型訓練這兩個參數需要相應調整以獲得更優結果訓練過程中保存的模型參數默認存放在Global.save_model_dir目錄評估時需將Global.checkpoints指向保存的參數文件如best_accuracy注意box_thresh與unclip_ratio是 DB 后處理所需參數評估 EAST、SAST 模型時無需設置。從源碼看評估流程tools/eval.py 構建 Eval DataLoader 與模型后通過load_model加載Global.checkpoints指定的權重再調用program.eval()完成推理與指標計算program.eval()內部使用build_post_process得到的DBPostProcess對網絡輸出的概率圖做二值化與多邊形提取見 ppocr/postprocess/db_postprocess.py并將box_thresh、unclip_ratio等參數直接用于框篩選與擴張。4. 測試對單張圖片測試檢測結果python3 tools/infer_det.py -c configs/det/det_mv3_db.yml \ -o Global.infer_img./doc/imgs_en/img_10.jpg \ Global.pretrained_model./output/det_db/best_accuracy測試 DB 模型時可調整后處理閾值python3 tools/infer_det.py -c configs/det/det_mv3_db.yml \ -o Global.infer_img./doc/imgs_en/img_10.jpg \ Global.pretrained_model./output/det_db/best_accuracy \ PostProcess.box_thresh0.6 PostProcess.unclip_ratio2.0對文件夾內所有圖片測試python3 tools/infer_det.py -c configs/det/det_mv3_db.yml \ -o Global.infer_img./doc/imgs_en/ \ Global.pretrained_model./output/det_db/best_accuracy配置文件中Global.infer_img的默認值為doc/imgs_en/img_10.jpg見 det_mv3_db.ymlinfer_det.py同時支持傳入單圖路徑與目錄路徑。5. 推理5.1 訓練模型與推理模型的區別推理模型由paddle.jit.save保存的固化模型模型結構與參數已全部固化為文件便于部署與實際系統集成checkpoints 模型訓練過程中保存的參數快照主要用于斷點續訓。與 checkpoints 相比推理模型額外保存了模型結構信息因此部署更簡單。5.2 導出推理模型將 DB 訓練模型轉換為推理模型python3 tools/export_model.py -c configs/det/det_mv3_db.yml \ -o Global.pretrained_model./output/det_db/best_accuracy \ Global.save_inference_dir./output/det_db_inference/從源碼看tools/export_model.py 通過ArgsParser解析參數、load_config加載配置、merge_config合并-o覆蓋項最終調用ppocr.utils.export_model.export(config)完成模型固化。5.3 推理模型預測python3 tools/infer/predict_det.py --det_algorithmDB \ --det_model_dir./output/det_db_inference/ \ --image_dir./doc/imgs/ --use_gpuTrue若使用其他檢測算法如 EAST修改det_algorithm參數即可默認為 DBpython3 tools/infer/predict_det.py --det_algorithmEAST \ --det_model_dir./output/det_db_inference/ \ --image_dir./doc/imgs/ --use_gpuTrue6. FAQQ1訓練模型與推理模型的預測結果不一致A絕大多數情況是由訓練模型預測時的預處理/后處理參數與推理模型預測時的參數不一致導致。以det_mv3_db.yml訓練出的模型為例排查思路如下檢查預處理是否一致對比 訓練模型預處理配置Eval.dataset.transforms中的DetResizeForTest其image_shape: [736, 1280]與推理模型的預測預處理函數。評估時輸入圖像尺寸會影響精度——為與論文一致icdar15 訓練配置將圖像 resize 到[736, 1280]而推理模型預測時只有一套默認參數出于速度考慮默認將圖像最長邊限制為 960 進行 resize。兩者的預處理函數均位于 ppocr/data/imaug/operators.pyDetResizeForTest等算子。檢查后處理是否一致對比 訓練模型后處理配置PostProcess中的thresh、box_thresh、unclip_ratio等與推理的后處理參數是否一致。附檢測配置深度解讀det_mv3_db.yml原文檔對應的示例配置 configs/det/det_mv3_db.yml 是理解整個訓練流程的關鍵各模塊與源碼的對應關系如下配置模塊關鍵參數對應源碼/說明Globaluse_gpu、epoch_num: 1200、save_model_dir、eval_batch_step: [0, 2000]、pretrained_model、checkpoints、use_amp訓練全局控制eval_batch_step表示每 2000 個 iteration 評估一次tools/train.py 中由program.train執行Architecturemodel_type: det、algorithm: DBBackbone: MobileNetV3(scale0.5, large)Neck: DBFPN(out_channels256)Head: DBHead(k50)四段式網絡組裝transforms→backbones→necks→headsLossDBLossalpha: 5、beta: 10、ohem_ratio: 3、main_loss_type: DiceLossppocr/losses/det_db_loss.py總損失 alpha×shrink_map損失 beta×threshold_map損失 binary_map的Dice損失其中ohem_ratio控制負樣本采樣比例negative_ratioOptimizerAdam(beta10.9, beta20.999)、lr.learning_rate: 0.001、L2 regularizer(factor0)-o Optimizer.base_lr0.0001可在線調整學習率PostProcessDBPostProcessthresh: 0.3、box_thresh: 0.6、max_candidates: 1000、unclip_ratio: 1.5ppocr/postprocess/db_postprocess.pythresh為概率圖二值化閾值box_thresh為框內平均分閾值unclip_ratio為 Vatti 擴張系數MetricDetMetric、main_indicator: hmeanppocr/metrics/det_metric.pyTrain/Eval.datasetSimpleDataSetIaaAugment、EastRandomCropData、MakeBorderMap(shrink_ratio0.4)、MakeShrinkMap等變換訓練側生成 shrink_map/threshold_map 監督信號評估側使用DetResizeForTest(image_shape[736, 1280])整體流程可以概括為數據加載與增強含邊界/收縮圖生成→ 四段式網絡前向DB 輸出 probability map、threshold map、binary map 三通道→ DBLoss 計算二值化可微化訓練→ 反向傳播優化 → DBPostProcess 后處理提取文本框 → DetMetric 計算 Precision/Recall/Hmean → 周期性評估與模型保存 → export_model 固化推理模型 → predict_det 部署推理。【免費下載鏈接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.項目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考