Skip to content

feat: YoloObbPostprocess plugin (GPU rotated NMS via ProbIoU) - #322

Open
triple-mu wants to merge 5 commits into
mainfrom
feat/obb-plugin
Open

feat: YoloObbPostprocess plugin (GPU rotated NMS via ProbIoU)#322
triple-mu wants to merge 5 commits into
mainfrom
feat/obb-plugin

Conversation

@triple-mu

@triple-mu triple-mu commented Jun 10, 2026

Copy link
Copy Markdown
Owner

YoloObbPostprocess 插件(GPU 旋转 NMS via ProbIoU,自包含)

后处理插件家族最后一个。obb 经 export-obb.py(onnx_graphsurgeon)插桩:转置后的 raw [1,A,C](C=4+nc+1:xc,yc,w,h | scores | angle)喂给 YoloObbPostprocess,在引擎内做并行旋转 NMS + top-k,输出中心框 + 角度。obb.cpp 按 binding 名自动识别并重建 cv::RotatedRect

旋转重叠用 ProbIoU(协方差高斯闭式)—— ultralytics OBB 本身用的度量,比多边形相交更省、更贴近其语义。与 ultralytics.utils.metrics.batch_probiou 逐例 5 位小数吻合(独立 CUDA 自测验证)。NMS 同样是 EfficientNMS 式并行(每候选一线程 + 单线程 compact)。

验证:bus.jpg 上插件与 raw(cv 旋转 NMS)路径在分离目标一致;build.py 阈值覆盖生效;TRT 8.6/10.16/11.0 编译。完成 det/seg/pose/obb 四类 GPU 后处理插件 + GPU 前处理 kernel。

栈在 #321 之上(栈尾)。

🤖 Generated with Claude Code

triple-mu and others added 5 commits June 10, 2026 17:09
Raw uint8 image -> NCHW float input via a CUDA kernel (letterbox + RGB + /255),
staged through a pinned host buffer for a fast async H2D. Opt-in, default-off;
the CPU path is unchanged. CMake enables CUDA only when nvcc is found.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Opt-in custom plugin (libyolov8_plugins.so, BUILD_PLUGINS=ON) fusing YOLOv8
detection decode + NMS + top-k as an alternative to EfficientNMS_TRT; consumes
the decoded boxes+scores and emits num_dets/bboxes/scores/labels. Plugin .so
loaded via --plugin-lib / $YOLOV8_PLUGIN_LIB (Python ctypes + C++ dlopen);
detect.cpp auto-detects raw vs End2End/plugin engines. export-det.py --plugin.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds the seg plugin (decode+NMS, gathers 32 mask coeffs; proto matmul stays on
host) and extracts shared helpers into nms_common.cuh. NMS is parallel
(EfficientNMS-style: one thread per candidate marks suppression vs higher-scoring
overlaps; single-thread compaction gathers top-k) — det refactored onto the shared
parallel suppression too. PostSeg.plugin + export-seg.py --plugin; engine.py finds
the NMS node by attribute name anywhere in the graph; segment.cpp auto-detects.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pose plugin attached to the raw ultralytics export via onnx_graphsurgeon
(export-pose.py): the transposed head [1,A,C] is fed to YoloPosePostprocess,
which does parallel NMS + top-k and gathers 17 keypoints in-engine. pose.cpp
auto-detects plugin outputs by binding name.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
OBB plugin attached via onnx_graphsurgeon (export-obb.py); parallel NMS + top-k
in-engine using ProbIoU (the closed-form Gaussian overlap ultralytics uses for
OBB), emitting center boxes + angles. obb.cpp auto-detects plugin outputs.
Completes the det/seg/pose/obb GPU postprocess plugin family.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@triple-mu triple-mu changed the title feat: YoloObbPostprocess plugin (GPU rotated NMS) feat: YoloObbPostprocess plugin (GPU rotated NMS via ProbIoU) Jun 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant