训练后数据集后部署PaddleOCR转trt流程

训练后的模型部署,首先要进行训练

0.训练流程见文章

PaddleOCR字符识别,训练自己的数据集全流程(环境、标注、训练、推理)-CSDN博客文章浏览阅读1.6k次,点赞53次,收藏23次。PaddleOCR是基于百度飞桨框架的开源OCR工具,支持80多种语言,适用于复杂文本场景。本文介绍了PaddleOCR的环境配置、数据集制作和模型训练流程。首先通过conda创建虚拟环境并安装PaddlePaddle和PaddleOCR,然后使用PPOCRLabel工具标注数据集,划分训练集、验证集和测试集。接着下载预训练权重,分别训练文本检测和识别模型,最后评估模型性能并导出静态图模型。整个过程涵盖了从数据准备到模型部署的完整OCR开发流程,适用于票据识别、文档数字化等应用场景。 https://blog.csdn.net/wwwwww7733/article/details/150445308?spm=1001.2014.3001.5502

1.安装环境

这个环境要求太苛刻了,经常出现版本不兼容的情况,很烦

pip install paddle2onnx==0.9.7
pip install paddleocr==3.1.0

下载Paddleocr源码

cd /path/PaddleOCR

2.导出Paddle推理模型

python3 tools/export_model.py -c /home/boshi/AI_programming/PaddleOCR/output/rec_ppocr_v4/config.yml -o Global.pretrained_model=/home/boshi/AI_programming/PaddleOCR/output/rec_ppocr_v4/best_model/model.pdparams Global.save_inference_dir=/home/boshi/AI_programming/PaddleOCR/output/rec_ppocr_v4/best_model

参数解释:

-c 训练时配置文件路径

Global.pretrained_model=../best_model/model.pdparams  训练生成的pdparams模型路径

Global.save_inference_dir=../best_model  推理模型想要保存到的路径

3.Paddle推理模型转换ONNX模型

paddle2onnx --model_dir /home/boshi/AI_programming/PaddleOCR/output/rec_ppocr_v4/best_model --model_filename=inference.pdmodel --params_filename=inference.pdiparams --save_file=/home/boshi/AI_programming/PaddleOCR/output/rec_ppocr_v4/best_model/model.onnx --opset_version 16 --enable_onnx_checker True
--model_dir指向包含 Paddle 模型的文件夹路径,里面通常有 inference.pdmodel 和 inference.pdiparams
--model_filename指定模型结构文件的文件名,一般是 inference.pdmodel
--params_filename指定模型参数权重文件的文件名,一般是 inference.pdiparams
--save_file转换后导出的 ONNX 模型保存路径,如 /home/best_model/model.onnx
--opset_version指定 ONNX 的 opset 版本,常用 11 或 16,版本越高支持的算子越多
--enable_onnx_checker是否在导出后自动运行 ONNX 的合法性检查,True 表示启用,建议开启

4.ONNX使用onnx_optimizer.py转换为simply-onnx

import onnx
import onnxsim
import onnx.helper as helper

def rename_io_names(model_path, new_input_name, new_output_name):

    # 加载ONNX模型
    model = onnx.load(model_path)

    # 获取模型的输入和输出
    inputs = model.graph.input
    outputs = model.graph.output

    # 创建新的输入和输出Tensor, 保留原有属性
    new_input = helper.make_tensor_value_info(
        new_input_name,
        inputs[0].type.tensor_type.elem_type,
        [d.dim_param if d.dim_param else d.dim_value for d in inputs[0].type.tensor_type.shape.dim]
    )
    new_output = helper.make_tensor_value_info(
        new_output_name,
        outputs[0].type.tensor_type.elem_type,
        [d.dim_param if d.dim_param else d.dim_value for d in outputs[0].type.tensor_type.shape.dim]
    )

    # 替换图中的节点引用
    for node in model.graph.node:
        for index, inp in enumerate(node.input):
            if inp == inputs[0].name:
                node.input[index] = new_input_name
        for index, out in enumerate(node.output):
            if out == outputs[0].name:
                node.output[index] = new_output_name

    # 替换旧的输入输出名
    model.graph.input.remove(inputs[0])
    model.graph.output.remove(outputs[0])
    model.graph.input.insert(0, new_input)
    model.graph.output.insert(0, new_output)

    return model

if __name__ == "__main__":

    model_onnx = rename_io_names("/home/boshi/AI_programming/PaddleOCR/output/rec_ppocr_v4/best_model/model.onnx", "images", "output")
    model_onnx.ir_version = 9
    # 检查导入的onnx model
    onnx.checker.check_model(model_onnx)

    print(f"Simplifying with onnx-simplifier {onnxsim.__version__}...")
    model_onnx, check = onnxsim.simplify(model_onnx)
    assert check, "assert check failed"
    onnx.save(model_onnx, "/home/boshi/AI_programming/PaddleOCR/output/rec_ppocr_v4/best_model/tkx-ocr_sim.onnx")

        这段脚本把 PaddleOCR 导出的 ONNX 模型的输入、输出节点重命名为固定名字 images / output,并做简化,从而让后续 TensorRT、ONNXRuntime 等推理框架在不知道原模型细节的情况下也能直接加载运行

4.1ONNX推理指令

 python3 tools/infer/predict_rec.py --use_gpu=False --use_onnx=True --rec_model_dir=/home/boshi/AI_programming/PaddleOCR/output/p5/tkx-ocr_sim.onnx --image_dir=/home/boshi/AI_programming/PaddleOCR/train_data/rec/test/

5.ONNX转换为trt

trtexec --onnx=tkx-ocr_sim.onnx --minShapes=images:1x3x48x640 --optShapes=images:1x3x48x640 --maxShapes=images:8x3x48x640 --memPoolSize=workspace:2048 --saveEngine=tkx-ocr_sim.trt --fp16
参数说明
--onnx=tkx-ocr_sim.onnx指定输入的 ONNX 模型文件路径。
--minShapes=images:1x3x48x640动态 shape 输入设置最小允许尺寸;这里规定 images 张量的最小形状是 NCHW = 1×3×48×640。
--optShapes=images:1x3x48x640设置优化目标形状,TensorRT 会在这个尺寸上做最多的 kernel 搜索与调优;通常选你实际推理时最常见的 batch/size。
--maxShapes=images:8x3x48x640设置最大允许尺寸,运行时不允许超过该形状;构建引擎时也会为这一上限预留资源。
--memPoolSize=workspace:2048新版 TensorRT 用来替代已废弃的 --workspace;指定构建引擎时可用的临时显存(workspace)上限为 2048 MB。
--saveEngine=tkx-ocr_sim.trt把构建好的 TensorRT 引擎序列化并保存到指定文件,方便后续 C++/Python 推理直接加载。
--fp16启用 FP16 精度模式;如果 GPU 支持 Tensor Core,可显著减少显存占用并提升速度,精度一般可接受。

6.最终所有的文件列表

<think>好的,我现在需要回答用户的问题:“训练完开源数据集后,可以直接用图片检测效果吗”。首先,我要理解用户的问题核心。用户可能是在使用开源数据集完成模型训练后,想直接用一些图片来测试模型的效果,但不确定是否可行或需要注意什么。 首先,我需要明确几个关键点。用户是否指的是使用与训练集相同分布的图片,还是任意图片?是否已经进行了适当的预处理?模型的泛化能力如何?是否存在领域差异(domain gap)?这些都会影响检测效果。 接下来,我应该考虑直接使用图片检测可能遇到的问题。例如,开源数据集通常有特定的数据格式和标注方式,而用户自己的图片可能在这些方面有所不同。此外,数据分布的差异可能导致模型性能下降,比如光照、角度、背景等变化。 然后,我需要思考解决方案或建议。比如,数据预处理的重要性,如何调整输入图片的尺寸、颜色空间等以匹配训练数据。另外,可能需要数据增强或领域适应技术来提升模型的泛化能力。此外,评估指标的选择也很重要,不能仅凭肉眼观察结果,而应使用定量指标。 还需要考虑实际应用中的步骤,例如如何加载模型、预处理输入数据、运行推理以及后处理结果。同时,可能涉及到的工具或库,如OpenCV、PyTorch或TensorFlow的相关函数。 另外,用户可能没有明确提到的潜在问题,比如过拟合。如果模型在训练集上表现很好,但在新图片上效果差,可能是过拟合导致的。这时需要建议用户进行交叉验证或使用测试集进行评估。 还有,用户可能想了解如何可视化检测结果,比如绘制边界框、分割掩码等,这需要相应的代码示例或工具推荐。 最后,总结关键点,强调验证的必要性和具体步骤,确保用户理解虽然可以直接使用图片检测,但需注意数据一致性和评估方法。</think>以下是针对“训练完开源数据集后,是否可以直接用图片检测效果”的技术解析及实践指南: --- ### 一、直接检测的条件与风险 1. **可行性条件** - **数据同分布**:测试图片与训练数据在以下维度需一致: $$ p_{test}(x) \approx p_{train}(x) $$ ```python # 检查维度匹配示例 assert test_image.shape == (cfg.INPUT.HEIGHT, cfg.INPUT.WIDTH, 3) ``` - **标注格式兼容**:检测任务需匹配标注类型(如COCO格式的bbox/YOLO格式的txt) 2. **典型风险** | 风险类型 | 表现示例 | 解决方案 | |---------|---------|---------| | 领域偏移 | 训练数据为白昼图片,测试数据含夜间场景 | 使用[CLAHE](https://docs.opencv.org/4.x/d5/daf/tutorial_py_histogram_equalization.html)增强对比度 | | 分辨率失配 | 训练尺寸512x512,测试输入4K图像 | 动态缩放策略:`cv2.resize(img, (512,512), interpolation=cv2.INTER_AREA)` | | 通道差异 | 训练用RGB,测试收到BGR格式 | 通道换:`cv2.cvtColor(img, cv2.COLOR_BGR2RGB)` | --- ### 二、标准化检测流程 #### 1. 数据预处理管道 ```mermaid graph TD A[原始图像] --> B[色彩空间换] B --> C[尺寸归一化] C --> D[数值标准化] D --> E[批处理打包] ``` 具体实现: ```python def preprocess(image): # 颜色校正 image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 保持长宽比的缩放 h, w = image.shape[:2] scale = min(cfg.INPUT.SIZE[0]/h, cfg.INPUT.SIZE[1]/w) new_h, new_w = int(h*scale), int(w*scale) resized = cv2.resize(image, (new_w, new_h), interpolation=cv2.INTER_LINEAR) # 标准化 normalized = (resized.astype(np.float32) - cfg.INPUT.MEAN) / cfg.INPUT.STD return normalized ``` #### 2. 领域适配增强 ```python class DomainAdapter: def __call__(self, img): # 光照一致性调整 img = self._match_histogram(img, reference_img) # 传感器噪声注入 if np.random.rand() < 0.5: img = self._add_gaussian_noise(img, mean=0, var=0.01) return img def _match_histogram(self, src, ref): # 使用直方图匹配对齐颜色分布 matched = exposure.match_histograms(src, ref, multichannel=True) return matched ``` --- ### 三、效果验证方法论 1. **定性分析** ```python def visualize_detections(image, boxes, scores, classes): plt.figure(figsize=(12,8)) plt.imshow(image) ax = plt.gca() for box, score, cls in zip(boxes, scores, classes): xmin, ymin, xmax, ymax = box ax.add_patch(plt.Rectangle( (xmin, ymin), xmax-xmin, ymax-ymin, fill=False, color='red', linewidth=2 )) text = f"{CLASS_NAMES[cls]}: {score:.2f}" ax.text(xmin, ymin-2, text, fontsize=12, bbox=dict(facecolor='yellow', alpha=0.5)) plt.axis('off') plt.show() ``` 2. **定量评估** ```python from sklearn.metrics import average_precision_score def evaluate_model(dataloader, model): all_preds = [] all_targets = [] with torch.no_grad(): for images, targets in dataloader: outputs = model(images) all_preds.extend(outputs['scores'].cpu().numpy()) all_targets.extend(targets['labels'].cpu().numpy()) ap = average_precision_score(all_targets, all_preds) print(f"[email protected]: {ap:.4f}") ``` --- ### 四、常见问题解决方案 #### 1. 漏检问题调优 ```python # 调整检测阈值 new_detections = [] for detection in raw_detections: if detection['score'] > 0.3: # 原阈值0.5 new_detections.append(detection) # 非极大值抑制优化 keep_indices = nms( boxes=detections[:, :4], scores=detections[:, 4], iou_threshold=0.4 # 原值0.5 ) ``` #### 2. 跨域性能提升 ```python # 使用领域自适应层 class DomainAdaptModule(nn.Module): def __init__(self, in_features): super().__init__() self.grl = GradientReversalLayer() self.domain_classifier = nn.Sequential( nn.Linear(in_features, 512), nn.ReLU(), nn.Linear(512, 2) ) def forward(self, x): reversed_x = self.grl(x) domain_logits = self.domain_classifier(reversed_x) return domain_logits ``` --- ### 五、工业级部署建议 1. **推理加速** ```python # TensorRT优化示例 trt_model = torch2trt( model, [dummy_input], fp16_mode=True, max_workspace_size=1 << 25 ) torch.save(trt_model.state_dict(), 'model_trt.pth') ``` 2. **内存优化** ```python # 使用半精度推理 with torch.cuda.amp.autocast(): outputs = model(images.half()) # 显存回收 torch.cuda.empty_cache() ``` --- ### 六、典型错误排查表 | 错误现象 | 可能原因 | 诊断方法 | |---------|---------|---------| | 检测框偏移 | 预处理缩放策略错误 | 可视化预处理各阶段结果 | | 类别混淆 | 标签编码不匹配 | 检查`CLASS_NAMES`与模型输出索引对应关系 | | 推理速度慢 | 未启用CUDA加速 | 验证`torch.cuda.is_available()`返回值 | | 内存溢出 | 批处理尺寸过大 | 使用`nvidia-smi`监控显存占用 | --- **结论**:直接使用图片检测可行,但必须保证: 1. 数据预处理流程训练时严格一致 2. 完成领域适配验证(推荐使用t-SNE可视化特征分布) 3. 采用渐进式验证策略(从单张测试到批量评估) 建议优先在验证集(validation set)上完成性能基准测试,再扩展到自定义图片集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值