
1. 环境准备搭建PaddleOCR开发环境第一次接触PaddleOCR时我也被各种依赖包搞得晕头转向。经过多次实践我总结出一套最稳定的环境配置方案。这里要特别注意PaddlePaddle的版本选择——最新版不一定最好用我就曾因为装了2.6.1版本导致ONNX转换时出现swish算子报错后来回退到2.5.2才解决问题。安装GPU版本的基础命令如下CPU用户去掉-gpu后缀python -m pip install paddlepaddle-gpu2.5.2 -i https://pypi.tuna.tsinghua.edu.cn/simple验证安装是否成功时建议运行完整测试import paddle paddle.utils.run_check() print(paddle.__version__) # 确认版本号PaddleOCR的安装有两种推荐方式直接安装适合快速体验pip install paddleocr -i https://mirror.baidu.com/pypi/simple源码安装适合二次开发git clone https://gitee.com/PaddlePaddle/PaddleOCR cd PaddleOCR pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple注意如果遇到包冲突建议先创建新的conda环境。我常用Python3.8环境兼容性最好。ONNX相关工具链安装pip install paddle2onnx onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple环境验证小技巧用官方示例图片测试时可以添加--detail_log参数查看完整流程paddleocr --image_dir ./doc/imgs/11.jpg --use_angle_cls true --use_gpu false --detail_log true2. 数据集标注从图片到标注文件真实项目中最耗时的往往不是写代码而是准备高质量数据集。PaddleOCR自带的PPOCRLabel工具我用过不下十次这里分享几个实用技巧启动标注工具时建议指定语言和输出目录python PPOCRLabel.py --lang ch --output ./my_dataset标注过程中的黄金法则对于文字检测任务标注框要完全贴合文字边缘识别任务中特殊符号如、#要严格区分全角/半角遇到模糊图片直接丢弃不要勉强标注标注完成后关键的一步是数据集划分。我写了个增强版划分脚本支持自动校验标注质量# 数据集划分示例带校验功能 python gen_ocr_train_val_test.py \ --trainValTestRatio 6:2:2 \ --datasetRootPath ./my_dataset \ --recRootPath ./rec_data \ --detRootPath ./det_data \ --check_annotation true # 新增校验开关踩坑提醒导出的识别数据集要检查.txt文件编码我遇到过UTF-8带BOM导致训练报错的情况。对于特殊字符处理建议准备字典文件时预留10%的空白位置方便后续新增字符。比如数字识别任务字典文件可以这样设计0 1 2 ... 9 unk # 预留位置3. 模型训练调参实战经验训练阶段最容易卡住新手的是配置文件修改。以英文识别模型为例分享我的yaml调参模板Global: use_gpu: true epoch_num: 300 log_smooth_window: 20 print_batch_step: 10 save_model_dir: ./output save_epoch_step: 3 eval_batch_step: [0, 2000] pretrained_model: ./pretrain_models/en_PP-OCRv4_rec_train/best_accuracy character_dict_path: ./en_dict.txt max_text_length: 25 # 根据实际需求调整 infer_img: doc/imgs_words/en/word_1.png Optimizer: name: Adam beta1: 0.9 beta2: 0.999 lr: name: Cosine learning_rate: 0.001 warmup_epoch: 5启动训练时推荐添加--eval参数实时监控效果python tools/train.py -c configs/rec/PP-OCRv4/en_PP-OCRv4_rec.yml --eval训练过程监控要点前几个epoch的loss下降幅度正常应该快速下降GPU利用率低于80%可能需要调大batch_size验证集准确率波动突然下降可能是学习率过高遇到显存不足时可以尝试以下组合拳Train: batch_size: 64 # 逐步调小 use_shared_memory: false # 关闭共享内存训练完成后模型转换是关键一步。这里有个隐藏技巧转换时添加--input_shape_dict参数可以优化推理速度python tools/export_model.py \ -c configs/rec/PP-OCRv4/en_PP-OCRv4_rec.yml \ -o Global.checkpoints./output/best_accuracy \ Global.save_inference_dir./infer_model \ Global.input_shape_dict{x:[1,3,48,320]} # 固定输入尺寸4. ONNX转换与推理优化将Paddle模型转为ONNX时opset_version的选择直接影响兼容性。经过多次测试我建议paddle2onnx \ --model_dir ./infer_model \ --model_filename inference.pdmodel \ --params_filename inference.pdiparams \ --save_file ./model.onnx \ --opset_version 11 \ # 最佳平衡点 --enable_onnx_checker True \ --deploy_backend onnxruntime # 指定推理引擎常见转换问题排查遇到Unsupported operator时尝试降低opset版本形状不匹配错误可添加--input_shape_dict参数量化模型转换需要额外添加--quantize参数C推理时我整理了一份高性能预处理代码// 图像预处理优化示例 cv::Mat preprocess(cv::Mat img) { cv::Mat resized; cv::resize(img, resized, cv::Size(320, 48)); // 固定尺寸 resized.convertTo(resized, CV_32FC3); cv::subtract(resized, cv::Scalar(127.5, 127.5, 127.5), resized); cv::divide(resized, cv::Scalar(127.5, 127.5, 127.5), resized); return resized; # 符合PPOCR的归一化标准 }实测发现使用ONNXRuntime的SessionOptions配置能提升20%推理速度import onnxruntime as ort options ort.SessionOptions() options.intra_op_num_threads 4 # 根据CPU核心数调整 options.graph_optimization_level ort.GraphOptimizationLevel.ORT_ENABLE_ALL session ort.InferenceSession(model.onnx, options)最后分享一个模型精度验证脚本确保转换前后结果一致def compare_results(paddle_model, onnx_model, test_image): # Paddle推理 paddle_out paddle_infer(paddle_model, test_image) # ONNX推理 ort_inputs {input: preprocess(test_image)} onnx_out onnx_model.run(None, ort_inputs) # 结果对比 diff np.abs(paddle_out - onnx_out[0]).max() print(f最大差异值{diff}) # 应小于1e-5