人工智能深度学习计算机视觉NLP语音【免费下载链接】modelsOfficially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.项目地址https://gitcode.com/gh_mirrors/mo/models点击查看免费下载PaddleCV 是 PaddlePaddle 社区维护的一套计算机视觉推理框架当前仓库位于paddlecv/目录它以算子op为基本单元通过配置驱动的方式将预处理、模型推理、后处理、衔接与输出串接成一条可复用的推理流水线。本文以paddlecv/docs/how_to_add_new_op.md为主线完整讲解 PaddleCV 的算子分类、统一输入/输出数据格式以及如何新增模型推理算子、模型衔接算子、模型输出算子并配套单测。读完本文你将掌握 PaddleCV 的算子注册机制register、三类算子的继承体系与必须实现的方法签名并能照葫芦画瓢地扩展出自定义算子。1. 算子体系总览PaddleCV 的三类 opPaddleCV 的推理流水线由 op 串联而成按职责划分为三类对应paddlecv/ppcv/ops/下的三个子目录模型推理算子paddlecv/ppcv/ops/models/给定输入加载模型完成预处理、推理、后处理返回输出。例如图像分类 opClassificationOp。模型衔接算子paddlecv/ppcv/ops/connector/给定输入计算得到输出一般用于将一个模型的输出处理为另一个模型的输入例如目标检测/文本检测的抠图BboxCropOp、方向矫正模块之后的图像旋转ClsCorrectionOp、文本合成FragmentCompositionOp等。模型输出算子paddlecv/ppcv/ops/output/负责存储、可视化、输出模型的输出结果例如分类输出ClasOutput可将结果打印、存图、写 JSON 或直接返回。三类 op 都继承自统一的基类BaseOp定义于 paddlecv/ppcv/ops/base.py该基类规定了两个通用约定每个 op 通过配置文件中的Inputs字段声明其依赖的输入 keyBaseOp.__init__中通过self.input_keys model_cfg[Inputs]保存每个 op 通过类方法get_output_keys()声明输出的 key 列表输出 key 统一规范为op_name.key的形式例如ClassificationOp声明[class_ids, scores, label_names]实际输出 key 为cls.class_ids、cls.scores、cls.label_names见 ModelBaseOp.init中self.output_keys [self.name . key for key in keys]。此外BaseOp还提供了两个开箱即用的通用方法filter_input()按input_keys从上一 op 的输出 dict 中筛选本 op 需要的字段check_output()校验输出是否为Sequence且元素为dict并逐 key 比对输出键名是否与output_keys一致从框架层面保证算子间数据契约不被破坏。2. 单个 op 的统一输入/输出格式a list of dictPaddleCV 的输入为图像或者视频。无论哪类 op系统都会把数据整理为a list of dict的格式列表中的每个元素都是一个待推理的对象及其携带的中间结果。以图像分类为例其输入仅包含图像信息[ {image: img1}, {image: img2}, ]经过ClassificationOp推理后输出格式为[ {image: img1, class_ids: class_id1, scores: scores1, label_names: label_names1}, {image: img2, class_ids: class_id2, scores: scores2, label_names: label_names2}, ]对于模型衔接算子输入是前序模型输出 原始图像的组合。以BboxCropOp为例其输入为[ {image: img1, bbox: bboxes1}, {image: img2, bbox: bboxes2}, ]list of dict契约之所以关键是因为它同时服务于三类算子流水线中每个 op 都从上一个 op 输出的 dict 中按Inputs声明取数再把自己的结果以op_name.key的规范键名写回 dictModelBaseOp/ConnectorBaseOp中通过self.output_keys统一加self.name .前缀实现从而形成一条可组合、可复用的数据链。从源码看PaddleCV 在入口处就已经把输入包装成这种格式pipeline.py 的predict_images将每张图包装为{input.image: img, input.fn: path}的 dict 列表再交给Executor.run()视频场景则在 predict_video 中逐帧包装为{input.image: frame_rgb, input.fn: input}。因此自定义 op 时无需关心输入来源只需遵守 list-of-dict 契约。3. 新增模型推理算子Model Op模型推理算子整体继承自ModelBaseOppaddlecv/ppcv/ops/models/base.py示例可参考图像分类 opClassificationOppaddlecv/ppcv/ops/models/classification/inference.py。需要实现的内容如下继承与注册类必须继承自ModelBaseOp并使用register装饰器注册保证全局唯一重复注册会抛ValueError见 paddlecv/ppcv/core/workspace.py 的register实现。实现类方法方法输入输出说明__init__model_cfg、env_cfg无完成配置解析、predictor 构建、preprocessor/postprocessor 构建preprocess基于input_keys过滤后的模型输入模型预处理结果逐样本执行预处理算子链postprocess模型推理结果模型后处理结果逐样本执行后处理算子链__call__该 op 依赖的输入内容该 op 的处理结果组织解析输入 → 推理 → 合并结果全流程从 ModelBaseOp 的源码可以看清模型推理算子的公共骨架__init__中会通过get_model_path()解析param_path/model_path将model_cfg中的batch_size默认 1写入env_cfg支持delete_pass配置剔除推理图的某些 pass然后基于 Paddle Inference 构建PaddlePredictor最后读取模型的输入名input_names并以name.key形式生成output_keystype()返回MODEL标识算子类别preprocess/postprocess在基类中为raise NotImplementedError必须由子类实现。以ClassificationOp为例它的实现要点包括get_output_keys()返回[class_ids, scores, label_names]__init__中通过create_operators(model_cfg[PreProcess], mod)与create_operators(model_cfg[PostProcess], mod)把配置中的预处理/后处理算子列表实例化create_operators定义于 paddlecv/ppcv/ops/base.py支持以字符串或{OpName: params}形式声明算子infer()中按batch_size分批先逐样本preprocess后np.concatenate成 batch再调用self.predictor.run(inputs)推理最后postprocess__call__()中先按input_keys解析输入支持单样本或样本列表两种形态调用infer后按各样本的子长度把批量结果切分回list of dict返回paddlecv/ppcv/ops/models/classification/inference.py。配套的配置文件示例见 paddlecv/configs/single_op/PP-LCNet.ymlClassificationOp的完整配置结构为MODEL: - ClassificationOp: name: cls param_path: paddlecv://models/PPLCNet_x1_0_infer/inference.pdiparams model_path: paddlecv://models/PPLCNet_x1_0_infer/inference.pdmodel batch_size: 8 PreProcess: - ResizeImage: resize_short: 256 - CropImage: size: 224 - NormalizeImage: scale: 0.00392157 mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] order: channel_num: 3 - ToCHWImage: - ExpandDim: axis: 0 PostProcess: - Topk: topk: 5 class_id_map_file: paddlecv://dict/classification/imagenet1k_label_list.txt Inputs: - input.image配置要点说明param_path/model_pathPaddle Inference 的inference.pdiparams与inference.pdmodel支持paddlecv://协议自动下载仓库内模型batch_size推理批大小ModelBaseOp会将其写入env_cfg供推理循环使用PreProcess/PostProcess预处理/后处理算子链按声明顺序依次执行ClassificationOp的preprocess中outputs ops(outputs)逐个串联Inputs声明该 op 依赖的输入 key用于从上游输出 dict 中过滤数据。4. 新增模型衔接算子Connector Op模型衔接算子整体继承自ConnectorBaseOppaddlecv/ppcv/ops/connector/base.py示例可参考方向矫正 opClsCorrectionOppaddlecv/ppcv/ops/connector/op_connector.py。需要实现的内容如下继承与注册类必须继承自ConnectorBaseOp并使用register装饰器注册。实现类方法方法输入输出说明__init__model_cfg、env_cfg一般为 None无解析自身配置校验输入 key__call__该 op 依赖的输入内容该 op 的处理结果核心计算逻辑如旋转/抠图/拼接与模型推理算子不同衔接算子不加载模型、没有推理过程因此ConnectorBaseOp比ModelBaseOp更轻量它同样在__init__中生成name.key形式的output_keystype()返回CONNECTOR但不需要preprocess/postprocess抽象方法只需实现__call__。ClsCorrectionOp是很好的模板它演示了衔接算子中配置驱动 输入校验 纯计算的典型写法通过model_cfg[class_num]仅支持 2 或 4决定旋转映射表2 类时{1: ROTATE_180}4 类时{1: ROTATE_90_COUNTERCLOCKWISE, 2: ROTATE_180, 3: ROTATE_90_CLOCKWISE}通过model_cfg[threshold]控制置信度阈值只有prob threshold且类别命中映射表时才调用cv2.rotate旋转图像check_input_keys()校验Inputs必须恰好包含 3 个 keyimage、cls_id、probget_output_keys()返回[corr_image]__call__中逐条读取input_keys对应的字段兼容单样本 / 样本列表两种形态返回旋转后的图像列表。同一个文件中的BboxCropOppaddlecv/ppcv/ops/connector/op_connector.py则是检测框抠图的标准实现输入image与bboxN x 4x1,y1,x2,y2对每个框做image[ymin:ymax, xmin:xmax, :].copy()切片输出crop_image常被用于检测 → 识别如 OCR的级联场景。PolyCropOp进一步支持任意四边形N x 4 x 2 的角点通过透视变换cv2.getPerspectiveTransformcv2.warpPerspective矫正出规整的文本行图像。这些现成算子可作为自定义衔接算子的直接参照。5. 新增模型输出算子Output Op模型输出算子整体继承自OutputBaseOppaddlecv/ppcv/ops/output/base.py示例可参考分类输出 opClasOutputpaddlecv/ppcv/ops/output/classification.py。需要实现的内容如下继承与注册类必须继承自OutputBaseOp并使用register装饰器注册。实现类方法方法输入输出说明__init__model_cfg、env_cfg一般为 None无解析输出目录与保存选项__call__模型输出返回结果按需打印、存图、写 JSON 或返回结果从 OutputBaseOp 源码可见其通用行为type()返回OUTPUT__init__中从env_cfg读取并默认以下选项output_dir默认output输出目录不存在时自动创建save_img默认 False是否保存可视化图像save_res默认 False是否把结构化结果保存为 JSON 文件return_res默认 False是否将结果作为返回值回传print_res默认 False是否打印结果。ClasOutput.__call__完整演示了这些选项的组合用法paddlecv/ppcv/ops/output/classification.py逐条解包fn, image, class_ids, scores, label_names通过 logger 打印每条结果save_img时把 RGB 图像转回 BGR 并cv2.imwrite到output_dir文件名取原始文件名save_res时把结果列表json.dump为clas_output.jsonreturn_res时返回total_res列表否则返回 None。注意输出算子同样遵循list of dict契约——它读入的是上游 op 输出的 dict 列表。6. 新增单测验证 op 的正确性在新增 op 之后需要新增基于该 op 的单测可参考 paddlecv/tests/test_classification.py。该测试的核心逻辑是setUp中指定配置文件configs/unittest/test_classification.yml与输入图片demo/ILSVRC2012_val_00020010.jpeg通过ConfigParser解析出model_cfg与env_cfg用cv2.imread读图并转 RGB构造两组list of dict输入一组单张[img]、一组两张[img, img]用于覆盖单样本 / 样本列表两条路径从global_config即register的注册表见 paddlecv/ppcv/core/workspace.py按 op 名取出类传入model_cfg[op_name]与env_cfg实例化直接调用cls_op(inputs)断言能正常完成推理链。为新增 op 写单测时只需照此模式替换为自己的 op 名、配置文件与输入数据即可。测试使用的配置文件与单算子配置基本一致paddlecv/configs/unittest/test_classification.yml其中ENV段还包含了run_mode如paddle、device如GPU等运行环境选项MODEL段则与单算子配置共用同一套 op 结构便于测试与实跑保持行为一致。7. 从 op 到流水线注册、配置与执行链路自定义 op 写好之后是如何被 PaddleCV 组织成流水线的从源码可以梳理出如下链路注册register将 op 类写入global_config全局注册表paddlecv/ppcv/core/workspace.py重复注册同名类会报错create()按名字实例化 op。配置解析Pipeline.__init__通过ConfigParser解析 yaml得到model_cfgMODEL段op 列表与env_cfgENV段运行环境详见 paddlecv/ppcv/engine/pipeline.py。执行Executorpaddlecv/ppcv/core/framework.py按配置顺序实例化每个 op把上一 op 的输出 dict 列表作为下一 op 的输入逐个调用__call__实现预处理 → 推理 → 衔接 → 输出的链式推理。create_operatorspaddlecv/ppcv/ops/base.py支持两种声明写法仅写算子名如- ToCHWImage:参数为空 dict或写{OpName: params}的键值对形式配置结构不合法非 list、dict 长度不为 1时会直接断言报错。这些机制共同保证了新增一个 op本质上就是实现一个继承自对应基类的类 一个register装饰器 一段 yaml 配置之后即可被流水线无缝加载。8. 结语与扩展指引至此PaddleCV 新增算子的完整套路已经清晰先明确 op 的三类归属模型推理 / 模型衔接 / 模型输出继承对应的ModelBaseOp/ConnectorBaseOp/OutputBaseOp再用register注册保证全局唯一接着实现__init__与__call__模型推理算子还需实现preprocess/postprocess并遵守list of dict的输入输出契约与name.key的输出键规范最后参考test_classification.py补充单测。流水线、配置文件与注册表三者配合即可让新 op 立即参与多模型级联推理。更多细节可进一步阅读算子基类与工厂paddlecv/ppcv/ops/base.py、paddlecv/ppcv/ops/models/base.py、paddlecv/ppcv/ops/connector/base.py、paddlecv/ppcv/ops/output/base.py注册机制paddlecv/ppcv/core/workspace.py流水线执行paddlecv/ppcv/engine/pipeline.py、paddlecv/ppcv/core/framework.py配置示例paddlecv/configs/single_op/PP-LCNet.yml、paddlecv/configs/unittest/test_classification.yml测试示例paddlecv/tests/test_classification.py系统设计说明paddlecv/docs/system_design.md、paddlecv/docs/config_anno.md赞分享人工智能深度学习计算机视觉NLP语音【免费下载链接】modelsOfficially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.项目地址https://gitcode.com/gh_mirrors/mo/models点击查看免费下载相关推荐Data-Juicer 句子增强算子 sentence_augmentation_mapper 实战指南基于 Hugging Face 大模型的句子级数据增强Data Juicer 句子增强算子 sentence_augmentation_mapper 实战指南基于 Hugging Face 大模型的句子级数据增强人工智能大模型数据工程数据清洗数据增强数据质检N_m3u8DL-RE 完整命令教程一条命令下载 m3u8直播定时录制、批量脚本 4 个场景一次跑通N_m3u8DL RE 完整命令教程一条命令下载 m3u8直播定时录制、批量脚本 4 个场景一次跑通 播放器丢给你的只是一行 m3u8 或 MPD 地址你CLI音视频817 个安全技能 × 72 个 AI 风险子类别NIST AI RMF 合规映射怎么做817 个安全技能 × 72 个 AI 风险子类别NIST AI RMF 合规映射怎么做 审计要证据风险登记却无从下手——NIST AI RMF 的 72网络安全AI 技能/插件渗透测试红蓝对抗上一篇Intersection Observer API终极懒加载和无限滚动实现指南下一篇Go并发模式终极指南10种常见场景完整解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考