TensorRT cropAndResizePlugin 深度解析面向 Faster R-CNN 的 TensorFlow 风格 ROIPooling 自定义插件【免费下载链接】TensorRTNVIDIA® TensorRT™ is an SDK for high-performance deep learning inference on NVIDIA GPUs. This repository contains the open source components of TensorRT.项目地址: https://gitcode.com/GitHub_Trending/tens/TensorRTcropAndResizePlugin 是 NVIDIA TensorRT 官方开源插件库中用于目标检测Faster R-CNN的核心组件它以 TensorFlowcrop_and_resize的语义实现了裁剪多个 ROI 双线性缩放的 ROIPooling 流程。本文以仓库内 plugin/cropAndResizePlugin/README.md 为骨架结合 cropAndResizePlugin.cpp、cropAndResizeKernel.cu 等源码实现完整讲解其输入输出约定、参数配置、插件版本演进IPluginV3 迁移与底层 CUDA 双线性插值原理读者读完后可直接在 TensorRT 中注册并使用该插件完成 Faster R-CNN 推理。插件定位在 TensorRT 中实现 Faster R-CNN 的 ROIPoolingcropAndResizePlugin是随 TensorRT 一起发布的官方插件Plugin 名称CropAndResizeDynamic版本 2其核心职责是为Faster R-CNN模型执行目标检测推理中的关键一步——Region of InterestROI池化。具体而言它实现了TensorFlow 风格的 ROIPooling即 CropAndResize根据给定的 ROI 坐标从输入 feature map 上裁剪出多个感兴趣区域再将每个裁剪出来的 patch双线性插值缩放到统一的目标空间尺寸crop_height × crop_width从而让不同大小、不同形状的 ROI 都能产出形状一致的 pooled 特征供后续分类与边框回归分支使用。该实现与原始 Caffe 版 ROIPooling 有两处显著差异README 中明确给出插值方式不同Caffe 风格 ROIPooling 通常采用最大池化或均匀网格采样而本插件采用 TensorFlowcrop_and_resize的双线性插值语义不做层融合本插件没有将 ROIPooling 层与 Proposal 层融合进单个层这一点与仓库中的nvFasterRCNN插件RPROI_TRT已标记 DEPRECATED不同。如果读者需要将 Proposal 生成与 ROI 池化合并为单层的极端融合方案可参考 nvFasterRCNN但该方案已废弃本插件是推荐路径。从源码结构看整个插件目录非常精简plugin/cropAndResizePlugin/CMakeLists.txt 仅注册了两个源文件plugin/cropAndResizePlugin/ ├── CMakeLists.txt # add_plugin_source 注册编译单元 ├── CropAndResizeDynamic_PluginConfig.yaml # 插件元数据/测试配置 ├── README.md # 官方说明文档 ├── cropAndResizePlugin.cpp # IPluginV3 插件与 Creator 实现 └── cropAndResizePlugin.h # 插件类声明输入与输出数据结构与形状约定cropAndResizePlugin接收两个输入生成一个输出完整约定如下。输入一feature_maps待裁剪的输入特征图形状为[N, C, H, W]维度含义Nbatch size批大小Cchannel number通道数Hheight特征图高度Wwidth特征图宽度该特征图承载着后续分类所需的语义特征插件从其中裁剪 patch分类分支据此判断每个 patch潜在目标的类别同时回归分支输出该目标的边框偏移bounding box deltas。输入二roisROI 边框坐标归一化到 (0, 1) 区间形状为[N, B, 4, 1]维度含义Nbatch size批大小B每张特征图每张图像上 ROI 边框的最大数量4边框坐标[y1, x1, y2, x2](x1, y1)为左上角、(x2, y2)为右下角1固定维形状约束要求rois_3 1注意坐标顺序是y在前、x在后与常见[x1, y1, x2, y2]约定不同接入时务必核对避免出现裁剪区域错位。输出pfmapROI 池化后的特征图形状为[N, B, C, crop_height, crop_width]维度含义Nbatch sizeBROI 最大数量C输入特征图通道数crop_height/crop_width池化输出 patch 的高度 / 宽度即插件参数ROI 池化步骤利用推理出的 ROI 边框信息在特征图上提取对应区域将形状各异的 ROI 统一池化为形状一致的特征。需要注意的是源码中输出被构造为5 维张量(N, R, C, H, W)——见 cropAndResizePlugin.cpp 中getOutputShapes的实现outputs[0].d[0] inputs[0].d[0]batch、outputs[0].d[1] inputs[1].d[1]MaxBoxNum、outputs[0].d[2] inputs[0].d[1]通道后两维由exprBuilder.constant(mCropHeight)/mCropWidth固定。维度约束来自插件配置文件plugin/cropAndResizePlugin/CropAndResizeDynamic_PluginConfig.yaml 对输入输出维度给出了可校验的硬性约束input_dims: input1: 4 # feature_maps 为 4 维 input2: 4 # rois 为 4 维 input_dim_constraints: - feature_maps_0 rois_0 # batch 维度必须一致 - rois_2 4 # 坐标维固定为 4 - rois_3 1 # 最后一维固定为 1 output_dims: pfmap: feature_maps_0, rois_1, feature_maps_1, crop_width_0, crop_height_0插件参数只有两个 int 属性cropAndResizePlugin的参数极简仅有 2 个int型属性定义于插件 Creator 类cropAndResizeDynamicPluginCreator对应插件类CropAndResizeDynamicPluginTypeParameterDescriptionintcrop_widthROI 池化后输出 patch 的宽度像素intcrop_heightROI 池化后输出 patch 的高度像素从源码可进一步确认参数的行为细节字段类型Creator 构造函数中注册了两个PluginField类型均为kINT32cropAndResizePlugin.cpp 中CropAndResizeDynamicPluginCreator::CropAndResizeDynamicPluginCreator()必填校验createPlugin首先调用validateRequiredAttributesExist({crop_width, crop_height}, fc)校验两个属性齐全随后逐字段解析并要求cropWidth 0、cropHeight 0否则返回nullptr创建失败序列化getFieldsToSerialize将crop_width、crop_height序列化进 engine保证反序列化时参数一致取值范围配置文件给出crop_height/crop_width的合法区间为min: 0、max: pinf即大于 0 的正整数实际创建时还要求严格大于 0。典型取值参考配置文件中的两组测试用例config_base使用 7×7config_larger使用 14×14——这也与 Faster R-CNN 中常见的 7×7 或 14×14 池化输出尺寸一致configs: config_base: attribute_options: crop_height: { value: 7 } crop_width: { value: 7 } config_larger: attribute_options: crop_height: { value: 14 } crop_width: { value: 14 }插件版本演进为什么推荐 IPluginV3 版Version 2README 顶部明确提示基于IPluginV2Ext和IPluginV2DynamicExt的旧版本插件已分别在 TensorRT 9.0 与 10.11 起被弃用推荐使用基于IPluginV3的CropAndResizeDynamic版本 2。三个版本共享相同的输入输出与属性差异仅在于接口体系与动态形状支持Plugin NameVersionParent Interface ClassDeprecatedSupports Dynamic ShapesCropAndResize1IPluginV2ExtYesTensorRT 9.0 起NoCropAndResizeDynamic1IPluginV2DynamicExtYesTensorRT 10.11 起YesCropAndResizeDynamic2IPluginV3NoRecommendedYes仓库源码印证了这一演进当前cropAndResizePlugin.cpp中的插件类继承自IPluginV3、IPluginV3OneCore、IPluginV3OneBuild、IPluginV3OneRuntime四重接口见 cropAndResizePlugin.h并通过getCapabilityInterface按kBUILD/kRUNTIME/kCORE三种PluginCapabilityType分发能力接口Creator 则继承IPluginCreatorV3One。插件常量也定义了新版本号char const* const kCROP_AND_RESIZE_DYNAMIC_PLUGIN_VERSION{2}; char const* const kCROP_AND_RESIZE_DYNAMIC_PLUGIN_NAME{CropAndResizeDynamic};IPluginV3 版本的核心行为源码级从 cropAndResizePlugin.cpp 可以观察到 v2 实现的完整行为链输出形状推导build 期getOutputShapes基于两个输入表达式推导出 5 维输出(N, R, C, crop_height, crop_width)其中 batch 继承自feature_maps、ROI 数量继承自rois、通道继承自feature_maps格式支持supportsFormatCombination要求全部输入输出均为DataType::kFLOATPluginFormat::kLINEAR且前后精度一致consistentFloatPrecision输出数据类型getOutputDataTypes固定输出DataType::kFLOAT零工作空间getWorkspaceSize返回 0插件无需额外 workspace动态形状适配configurePlugin与onShapeChange会在 build 期与运行期形状变化时更新内部成员mDepth、mInputHeight、mInputWidth、mNumBoxes使插件天然支持动态 batch、动态输入尺寸与动态 ROI 数量上下文附加attachToContext直接返回clone()——注释表明简单克隆即可因为该插件不需要任何上下文资源。底层原理CUDA Kernel 中的双线性插值enqueue最终调用cropAndResizeInference声明见 plugin/common/kernels/kernel.h实现在 plugin/common/kernels/cropAndResizeKernel.cu。该 Kernel 是整个插件的算法核心值得深入理解。线程映射Kernel 以每个线程计算一个输出元素的方式组织const int output_volume batch_size * num_boxes * crop_height * crop_width * depth; int block_size 1024; int grid_size (output_volume block_size - 1) / block_size; cropAndResizeKernelfloatgrid_size, block_size, 0, stream(...);线程内部通过取模/除法把一维索引拆解为(x, y, d, b)四维坐标x idx % crop_width、y idx % crop_height、d idx % depth、b idx / depth。坐标映射与双线性插值对每个输出位置Kernel 先从boxes_ptr读取归一化坐标[y1, x1, y2, x2]再映射回特征图像素坐标const float height_scale (crop_height 1) ? (y2 - y1) * (image_height - 1) / (crop_height - 1) : 0; const float in_y (crop_height 1) ? y1 * (image_height - 1) y * height_scale : 0.5 * (y1 y2) * (image_height - 1);这里与 TensorFlowcrop_and_resize的语义一致归一化坐标以image_height - 1而非image_height为缩放基准当crop_height 1时退化为取 ROI 中心点。in_x同理。随后进行标准的双线性插值——取floorf/ceilf得到上下左右四个相邻像素按x_lerp、y_lerp两次线性混合const float top top_left (top_right - top_left) * x_lerp; const float bottom bottom_left (bottom_right - bottom_left) * x_lerp; crops_ptr[out_idx] top (bottom - top) * y_lerp;越界处理与 TensorFlow 默认行为一致若采样点in_y或in_x超出[0, image_height - 1]/[0, image_width - 1]范围输出写extrapolation_value。本插件调用时传入0.0f即越界位置填 0。批内图像索引通过b / num_boxes计算并做了b_in越界保护continue跳过非法线程。如何在 TensorRT 中集成使用插件注册与加载该插件随 TensorRT 官方插件库一起编译并注册。在 plugin/api/inferPlugin.cpp 中CropAndResizeDynamicPluginCreator被显式注册进插件注册表initializePluginnvinfer1::plugin::CropAndResizeDynamicPluginCreator(logger, libNamespace);因此在使用时只需确保加载了包含本插件的nvinfer_plugin库即可通过插件注册表按名称CropAndResizeDynamic版本2查找 Creator随后填充PluginFieldCollectioncrop_width、crop_height两个kINT32字段创建插件实例。插件总览表plugin/README.md中也将其列为当前推荐使用的活跃插件| cropAndResizePlugin | CropAndResizeDynamic | 2 |未标注 DEPRECATED。插件元数据与测试配置plugin/cropAndResizePlugin/CropAndResizeDynamic_PluginConfig.yaml 同时承载了插件元数据与数值精度测试配置它逐版本1Legacy、2新版本声明了接口类型、输入输出名、维度约束、属性定义与容差2: # New Ver 2 (using IPluginV3 interface) interface: IPluginV3 inputs: [feature_maps, rois] outputs: [pfmap] attributes: [crop_height, crop_width] attribute_types: crop_height: int32 crop_width: int32 attributes_required: [crop_height, crop_width] golden_io_path: plugin/CropAndResizeDynamic_PluginGoldenIO.json abs_tol: 1e-6 rel_tol: 1e-6 fp16_atol: 1e-3 fp16_rtol: 1e-3该文件同时提示插件的金标准输入输出golden_io_path指向plugin/CropAndResizeDynamic_PluginGoldenIO.json被用于精度回归验证float32 下绝对/相对误差容忍度为1e-6fp16 下为1e-3。接入自定义模型前可借助该配置验证插件行为是否符合预期。集成步骤速览加载插件库TensorRT 官方插件库含本插件源码目录 plugin/cropAndResizePlugin通过getPluginRegistry()按名称CropAndResizeDynamic 版本2获取CropAndResizeDynamicPluginCreator构造PluginField数组crop_width、crop_heightkINT32类型并调用createPlugin将插件作为网络层加入引擎feature_maps[N, C, H, W]与rois[N, B, 4, 1]归一化到 (0,1)两个输入输出pfmap[N, B, C, crop_height, crop_width]按需配置动态形状动态 batch、动态输入尺寸、动态 ROI 数量均受支持。Changelog 与已知问题版本历史April 2025将CropAndResizeDynamic插件迁移到IPluginV3接口版本 2。旧版实现版本 1被弃用仅为向后兼容而保留。June 2023为IPluginV2Ext版本插件添加弃用说明。May 2019本 README 文件首次发布。已知问题README 明确声明该插件目前没有已知问题There are no known issues in this plugin。参考资料与延伸阅读围绕该插件可进一步理解其设计来源的公开资料此处仅给出文献名便于检索网络Faster R-CNN《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》算法背景Fast R-CNN 中的原始 ROI Pooling 定义《Fast R-CNN》语义对标TensorFlow 的crop_and_resize算子tf.image.crop_and_resizeAPI——本插件即其 TensorRT 实现小结cropAndResizePlugin是一个接口简洁两个int参数、语义明确TensorFlow 风格 CropAndResize且已完整迁移到IPluginV3体系的官方插件覆盖了 Faster R-CNN 推理链路中裁剪 双线性缩放这一关键算子。理解它的输入输出约定、归一化坐标语义与 CUDA 插值实现不仅可以直接在 TensorRT 中正确接入该插件也为自定义类似 ROI 池化算子提供了可靠的参考范本。【免费下载链接】TensorRTNVIDIA® TensorRT™ is an SDK for high-performance deep learning inference on NVIDIA GPUs. This repository contains the open source components of TensorRT.项目地址: https://gitcode.com/GitHub_Trending/tens/TensorRT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考