十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Kornia 修复 `bbox_to_mask3d` 整轴覆盖误判:从 union+all() 还原到直接交集计算

Kornia 修复 `bbox_to_mask3d` 整轴覆盖误判:从 union+all() 还原到直接交集计算 计算机视觉人工智能深度学习图像处理【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址https://gitcode.com/gh_mirrors/ko/kornia点击查看免费下载导读本文围绕 Kornia 变更记录 changelog.d/migration-074.fixed.md 展开讲解 3D 边界框转掩膜函数bbox_to_mask3d的一个经典布尔代数缺陷当包围盒在某个轴上覆盖或超出整个输出体素范围时旧实现会错误地填充整个 3D 体积。修复后该函数改为直接对三个轴向区间求交集与面向对象接口Boxes3D.to_mask行为完全一致。读完本文你将理解该缺陷的数学成因、修复前后的实现差异、对应的回归测试以及这一变更对既有代码的影响范围。bbox_to_mask3d是什么bbox_to_mask3d是 Kornia 几何模块提供的函数式 API位于 kornia/geometry/bbox.py作用是把一批 3D 边界框转换为二值掩膜被包围盒覆盖的体素为 1其余为 0。其核心约定见函数 docstring输入boxes形状为(B, 8, 3)每个框按顺时针顺序定义 8 个顶点前上左、前上右、前下右、前下左、后上左、后上右、后下右、后下左坐标按 x、y、z 排列size参数为(depth, height, width)三元组返回掩膜形状为(B, 1, depth, height, width)并保持输入 dtype这一点在 changelog.d/migration-008.fixed.md 中曾单独修复过无梯度路径不可微坐标经validate_bbox3d校验后从固定顶点位置读取边界用.long()向零截断并做**包含式inclusive**比较因此应传入vertices_plus导出格式的顶点。import torch import kornia boxes torch.tensor([[ [1., 1., 1.], [2., 1., 1.], [2., 2., 1.], [1., 2., 1.], [1., 1., 2.], [2., 1., 2.], [2., 2., 2.], [1., 2., 2.], ]]) # 1x8x3 mask kornia.geometry.bbox.bbox_to_mask3d(boxes, (4, 5, 5)) print(mask.shape) # torch.Size([1, 1, 4, 5, 5])缺陷成因union 与all()还原的致命假设修复前的实现采用两段式策略先并后还把三个轴向的广播 slab沿 z、y、x 三个轴各自的包含式区间掩膜用逻辑或|合并成并集三路归约还原再对该并集做三路all()归约试图从中恢复出三个区间的交集。这段逻辑在常规情况下可以工作三个 slab 的并集经过all()归约后只有三个方向同时为真的体素才保留等价于交集。但该还原方案建立在一个脆弱假设之上每个 slab 在自身轴上必须部分覆盖。一旦某个 slab 在其对应轴上覆盖了整个输出轴——例如盒子 x 方向从 0 覆盖到宽度边界、甚至因为裁剪或平移而越出体积——该 slab 在整条轴上全为真all-true。此时并集在该轴上也全为真all()归约便再也看不见另外两个 slab 的边界最终掩膜被错误地填满整个 3D 体积。用布尔代数可以更清晰地表达设三轴区间谓词为A(z)、B(y)、C(x)旧实现等价于all(A(z) | B(y) | C(x) over (z, y, x))当A(z)对某轴恒真时上式退化为恒真结果退化为全 1 体积而正确的交集应为A(z) B(y) C(x)只有当A、B、C都只覆盖自身轴的一部分时两个表达式才碰巧相等——这正是旧归约能碰巧恢复正确的条件。一旦任一方块覆盖整轴等式即被破坏。这一点在 kornia/geometry/bbox.py 的源码注释中有完整说明。修复方案直接以计算交集修复后的实现不再构造并集、也不再依赖归约还原而是直接对三个广播 slab 做逐元素与见 kornia/geometry/bbox.pym ( ((z[None, :] z_min[:, None]) (z[None, :] z_max[:, None]))[:, None, :, None, None] ((y[None, :] y_min[:, None]) (y[None, :] y_max[:, None]))[:, None, None, :, None] ((x[None, :] x_min[:, None]) (x[None, :] x_max[:, None]))[:, None, None, None, :] ) # Shape: (N, 1, D0, D1, D2) return m.to(boxes.dtype)其中z_min/z_max、y_min/y_max、x_min/x_max分别取自boxes[:, 0, 2] / boxes[:, 4, 2]、boxes[:, 1, 1] / boxes[:, 2, 1]、boxes[:, 0, 0] / boxes[:, 1, 0]对应 8 顶点约定中的前后、上下、左右边界坐标轴网格z / y / x用torch.arange在longdtype 下构建。新方案的关键优势在于每个广播 slab 本身已经在其所在轴上携带了完整边界信息逐元素的交集就是精确答案天然对整轴覆盖和越界悬垂overhang免疫——某个 slab 全真时另外两个 slab 的边界依然以的方式参与运算交集结果不受影响。这同时也省去了一次三路all()归约与中间并集张量的构造。与Boxes3D.to_mask的行为对齐本次修复的核心目标之一是让函数式bbox_to_mask3d与面向对象的Boxes3D.to_mask行为一致。Boxes3D.to_mask位于 kornia/geometry/boxes.py其约定为尺寸参数为(depth, height, width)返回形状为(N, depth, height, width)或(B, N, depth, height, width)保持框的 dtype内部将盒子导出为排他式exclusivexyzxyz边界夹取到体积范围后四舍五入为最近整数再按半开区间填充。需要注意两者在分数坐标下的边界处理仍存在已知差异Boxes3D.to_mask采用四舍五入而bbox_to_mask3d采用.long()向零截断该差异被记录在 issue #4015 中见 kornia/geometry/boxes.py 的 warning。本次修复只解决整轴覆盖/悬垂时填充整个体积的错误不涉及截断与舍入的语义分歧。回归测试四种场景锁定正确行为本次修复配套的回归测试位于 tests/geometry/test_bbox.py通过参数化覆盖了四种典型场景场景盒子范围xyzxyz_plus期望交集体素数full_width宽轴全覆盖[0.0, 1.0, 1.0, 4.0, 2.0, 2.0]20full_height高轴全覆盖[1.0, 0.0, 1.0, 2.0, 3.0, 2.0]16full_depth深轴全覆盖[1.0, 1.0, 0.0, 2.0, 2.0, 3.0]16overhang单轴越界悬垂[-1.0, 1.0, 1.0, 5.0, 2.0, 2.0]20以full_width为例盒子 x 从 0 到 4 覆盖了(4, 4, 5)体积的整个宽度轴y、z 只覆盖 1..2。正确的交集是2 × 2 × 5 20个体素。测试同时断言bbox_to_mask3d(boxes.data, (4, 4, 5)).sum()与boxes.to_mask(4, 4, 5).sum()相等直接验证了两条 API 路径的一致性另有独立测试tests/geometry/test_bbox.py将期望掩膜逐体素构造出来做assert_close精确比对。测试注释特别强调overhang场景是盒子经过裁剪或平移后的正常状态见 tests/geometry/test_bbox.py意味着该 bug 在实际的 3D 目标检测、体素级裁剪流水线中并非罕见边界而是常态输入。迁移影响内部盒子字节级不变修复对既有用户是向后兼容的位于体积内部、未触及任何整轴的普通盒子interior boxes新旧实现结果字节级一致byte-identical——这正是旧归约碰巧能正确恢复的情况只有覆盖或越出整轴的盒子行为发生变化从填满整个体积修正为三个轴向区间的交集输出形状、dtype 语义、无梯度特性均未改变。与之相关的 3D 边界框 API 变更链还包括rank-4 输入(B, N, 8, 3)现在会被bbox_to_mask3d以ShapeError拒绝需先展平为(B*N, 8, 3)见 changelog.d/migration-048.fixed.md。若你的代码依赖旧行为请检查是否存在整轴覆盖/悬垂的盒子并核对掩膜统计量如体素总和、占用率是否发生变化。小结bbox_to_mask3d的本次修复是一次典型的用正确代数替换脆弱还原的布尔运算改造从|all()的间接求交改为的直接求交消除了整轴覆盖时的全体积误填并让函数式与面向对象两套 API 在交集语义上达成一致。对于在裁剪、平移后仍要正确生成 3D 掩膜的场景这一修复让结果变得可预期、可验证。赞分享计算机视觉人工智能深度学习图像处理【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址https://gitcode.com/gh_mirrors/ko/kornia点击查看免费下载相关推荐Kornia bbox_to_mask3d 修复解析用直接求交替换并-恢复式体素掩码计算Kornia bbox_to_mask3d 修复解析用直接求交替换并 恢复式体素掩码计算 导读 本文围绕 Kornia 仓库 changelog 片段 mi计算机视觉深度学习人工智能图像处理Kornia PatchSequential 修复解析从“部分 patch”到“每个 patch 全覆盖”的行为变更与实践指南Kornia PatchSequential 修复解析从“部分 patch”到“每个 patch 全覆盖”的行为变更与实践指南 PatchSequential计算机视觉人工智能深度学习图像处理Kornia 3D 边界框 API 形状校验修复infer_bbox_shape3d 与 bbox_to_mask3d 拒绝 rank-4 输入Kornia 3D 边界框 API 形状校验修复 infer_bbox_shape3d 与 bbox_to_mask3d 拒绝 rank 4 输入 导读 本文计算机视觉深度学习人工智能图像处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表