首页/新闻资讯/正文详情

Kornia Boxes.merge 轴语义修复详解:vertex 轴与 box 轴的取舍及列表填充处理

发布时间:2026/9/23 17:22:08 来源:云帆数科 栏目:资讯中心
Kornia Boxes.merge 轴语义修复详解:vertex 轴与 box 轴的取舍及列表填充处理
计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载导读本文围绕 Kornia 仓库中的迁移记录 changelog.d/migration-093.fixed.md对应 GitHub 议题 #4168、#4175深入剖析Boxes.merge在拼接检测框时的一个关键缺陷及其修复方案旧的dim1拼接轴在非批量(N, 4, 2)输入下会错误地沿“顶点轴”而非“框轴”进行拼接导致合并结果形状损坏修复改为dim-3后批量与非批量两条路径均正确且批量路径保持字节级一致。读完本文你将理解 KorniaBoxes的数据排布约定、merge的底层实现与测试验证以及列表list-backed输入下填充padding元数据_N的正确处理方式。背景Boxes 的两种张量排布与轴语义Kornia 的Boxes类位于 kornia/geometry/boxes.py用浮点四边形的四个顶点(x, y)表示一个 2D 框内部数据有两种排布参见 kornia/geometry/boxes.py 的 Convention 说明非批量unbatched形状(N, 4, 2)其中N是框的数量4是四个角顶点2是(x, y)坐标批量batched形状(B, N, 4, 2)B为 batch 维度。由此带来一个极易混淆的轴语义问题输入形状dim0dim1dim2dim3(N, 4, 2)非批量框轴N顶点轴4坐标轴2—(B, N, 4, 2)批量batch 轴B框轴N顶点轴4坐标轴2可以看到dim1 在批量数据里是“框轴”但在非批量数据里却是“顶点轴”。这正是本次 bug 的根源——对同一个维度索引的语义在不同排布下发生了漂移。缺陷剖析旧dim1为什么在非批量输入下出错根据 changelog.d/migration-093.fixed.md 的描述修复前的merge使用dim1作为拼接轴对于批量(B, N, 4, 2)数据dim1 恰好是框轴因此拼接行为正确但对于三维张量(N, 4, 2)dim1 是顶点维度。沿顶点轴做torch.cat会把每个框的顶点数从 4 变成 8得到(1, 8, 2)之类的错误形状而不是期望的(NM, 4, 2)。测试 tests/geometry/test_boxes.py 的注释精确还原了这个故障现场On base (dim1) this produced shape (1, 8, 2) andto_tensor(xyxy)returned the single union row[[1, 2, 9, 8]]instead of two rows.也就是说两个框合并后不仅形状错误后续to_tensor(xyxy)用amin/amax归约见 kornia/geometry/boxes.py时还会把被错误拼接到同一个框里的 8 个顶点坍缩成一个“大框”的包围盒两个框的信息被静默吞并——这正是迁移记录中“dropping merged boxes”丢弃合并后的框所指的破坏性后果。修复方案统一使用dim-3两条路径都正确修复的核心改动是把拼接轴从绝对的dim1改为相对末端的dim-3对批量(B, N, 4, 2)dim-3仍解析为框轴N行为与旧代码字节级一致byte-identical对非批量(N, 4, 2)dim-3同样解析为框轴N从而得到正确的(NM, 4, 2)。从当前源码 kornia/geometry/boxes.py 可以看到无填充路径的最终实现data torch.cat([self._data, boxes.data], dim-3)dim-3从张量末端倒数第三个维度取值与数据最前面是否多了一个 batch 轴无关因此对两种排布天然统一。这是“从形状语义出发选择轴、而不是从绝对位置出发”的典型修正。merge的完整签名与语义如下kornia/geometry/boxes.pydef merge(self, boxes: Boxes, inplace: bool False) - Boxes:非批量(N, 4, 2)与(M, 4, 2)合并结果为(NM, 4, 2)批量(B, N, 4, 2)与(B, M, 4, 2)合并结果为(B, NM, 4, 2)inplaceTrue时直接改写自身并返回self否则返回克隆副本两个操作数的 batch 维度必须一致否则抛出ValueError: Batch size mismatch。列表输入的正确填充处理真实框在前、填充在后Boxes支持从长度不一的(N_i, 4, 2)张量列表构造对象此时会通过_merge_box_listkornia/geometry/boxes.py用pad_sequence补齐到统一长度并把每张图像的填充数量记录在私有属性_N中def _merge_box_list(boxes, methodpad): ... max_N max(box.shape[0] for box in boxes) stats [max_N - box.shape[0] for box in boxes] output torch.nn.utils.rnn.pad_sequence(boxes, batch_firstTrue) return output, stats本次修复之前合并列表输入时存在两类隐患填充被当作真实框暴露合并后每行的填充区可能与真实框混杂to_tensor只能按“尾部填充”的假设裁剪导致旧填充暴露为真实框真实框被丢弃若合并逻辑只裁剪尾部而真实框并未被重新排到前面合并得到的框会被误删。修复后的行为见 kornia/geometry/boxes.py 与 changelog.d/migration-093.fixed.md逐行重排repack只要self._N或boxes._N任一非空就对每个 batch 行执行真实框(self) 真实框(boxes) 填充(self) 填充(boxes)的拼接确保每个框的真实顶点都排在该行所有尾部填充之前合并填充计数新的_N为两者逐行之和padding [self_pad boxes_pad for ...]从而to_tensor能精确知道每行应裁剪多少个填充条目。data torch.stack( [ torch.cat( [ self._data[i, : self._data.shape[-3] - self_pad], boxes.data[i, : boxes.data.shape[-3] - boxes_pad], self._data[i, self._data.shape[-3] - self_pad :], boxes.data[i, boxes.data.shape[-3] - boxes_pad :], ] ) for i, (self_pad, boxes_pad) in enumerate(zip(self_padding, boxes_padding)) ] ) padding [self_pad boxes_pad for self_pad, boxes_pad in zip(self_padding, boxes_padding)]其中当某一侧没有列表元数据时其填充计为[0] * B因此“稠密张量 列表对象”的混合输入也能正确合并。to_tensor 的配合只裁剪填充、不丢真实框修复的关键配套在于to_tensor对_N的使用kornia/geometry/boxes.pyif self._N is not None and not as_padded_sequence: boxes [torch.nn.functional.pad(o, (len(o.shape) - 1) * [0, 0] [0, -n]) for o, n in zip(boxes, self._N)] else: boxes boxes if self._is_batched else boxes.squeeze(0)当_N存在且未要求as_padded_sequenceTrue时to_tensor返回一个按原长度裁剪过的张量列表每行末尾去掉n个填充项由于merge已保证真实框全部位于填充之前这里的“只裁剪尾部填充”逻辑就能精确生效既不会误删真实合并框也不会把旧填充当作真实框返回。测试验证四类场景全覆盖修复行为在 tests/geometry/test_boxes.py 的test_merge中得到了系统验证非批量拼接(1, 4, 2)(1, 4, 2)→ 断言m.data.shape (2, 4, 2)且to_tensor(xyxy)返回两行独立框[[1,2,5,4],[6,3,9,8]]直接回归验证了旧dim1下“单行大框”的 bug 已被修复批量拼接(B, N, 4, 2)(B, M, 4, 2)→(2, 2, 4, 2)并断言逐行内容正确确认dim-3不破坏批量路径inplace 路径merge(b2, inplaceTrue)返回self且数据与内容同步更新列表填充场景列表对象与稠密张量合并后_N [1, 0]to_tensor返回列表每行内容等于torch.cat([src_i, extra_i])两个列表对象合并后_N [1, 1]两侧填充计数求和稠密对象在左、列表对象在右时_N [0, 1]列表对象上的 inplace 合并同样正确维护_N。实操示例import torch from kornia.geometry.boxes import Boxes # 非批量 (N, 4, 2)修复前会得到 (1, 8, 2) 的错误形状 a Boxes.from_tensor(torch.tensor([[1.0, 2.0, 5.0, 4.0]]), modexyxy) b Boxes.from_tensor(torch.tensor([[6.0, 3.0, 9.0, 8.0]]), modexyxy) m a.merge(b) assert m.data.shape (2, 4, 2) # 修复后框轴拼接 assert torch.equal(m.to_tensor(xyxy), torch.tensor([[1.0, 2.0, 5.0, 4.0], [6.0, 3.0, 9.0, 8.0]])) # 列表输入真实框在前、填充在后_N 记录逐行填充数 src1 torch.tensor([[1.0, 2.0, 5.0, 4.0]]) # 1 个框 src2 torch.tensor([[1.0, 2.0, 5.0, 4.0], [6.0, 3.0, 9.0, 8.0]]) # 2 个框 list_boxes Boxes.from_tensor([src1, src2], modexyxy) assert list_boxes._N [1, 0] # 第 0 行补了 1 个填充框 extra Boxes.from_tensor( torch.tensor([[[6.0, 3.0, 9.0, 8.0]], [[0.0, 0.0, 3.0, 3.0]]]), modexyxy ) merged list_boxes.merge(extra) assert merged._N [1, 0] # 填充计数被保留并合并 tensors merged.to_tensor(xyxy) # 返回裁剪后的列表 assert isinstance(tensors, list)升级注意事项对于批量输入的用户本次修复是行为透明的官方明确保证批量路径“字节级一致”无需调整调用代码对于非批量输入的用户merge的结果形状由错误的(1, 8, 2)变为正确的(NM, 4, 2)此前依赖错误形状的下游代码需要同步修正若你构建的是列表list-backedBoxes合并后_N会被正确合并to_tensor默认返回裁剪后的张量列表需要原始带填充张量时请显式传入as_padded_sequenceTrue该修复同时覆盖了VideoBoxes的合并路径tests/geometry/test_boxes.py 验证了视频框合并后时间维度不变。延伸阅读修复记录原文changelog.d/migration-093.fixed.md核心实现kornia/geometry/boxes.pyBoxes.merge位于 L348-L405to_tensor位于 L738-L817_merge_box_list位于 L36-L48回归测试tests/geometry/test_boxes.pytest_merge位于 L555-L650changelog 机制说明changelog.d/README.mdmigration-*为一次性遗留保留条目fixed类型表示对既有行为的缺陷修正赞分享计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载相关推荐Kornia RandomMosaic 轴约定修复详解非方形输入的 (H, W) 保持与 start_ratio_range 宽高缩放语义Kornia RandomMosaic 轴约定修复详解非方形输入的 H, W 保持与 start_ratio_range 宽高缩放语义 导读 RandomMo计算机视觉人工智能深度学习图像处理Kornia RandomMosaic 修复深度解析非方形输入下的 (H, W) 保序与 start_ratio_range 轴语义修正Kornia RandomMosaic 修复深度解析非方形输入下的 H, W 保序与 start_ratio_range 轴语义修正 本篇技术指南以 Korn计算机视觉深度学习人工智能图像处理Warp 数组归约中的负轴Negative Axis一致性修复array_sum 与 array_inner 的轴语义深入解析Warp 数组归约中的负轴Negative Axis一致性修复array_sum 与 array_inner 的轴语义深入解析 导读 Warp wp 高性能计算物理引擎图形学机器人创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

3种草地贴图方案对比:告别API报错的最佳实践
3种草地贴图方案对比:告别API报错的最佳实践

3种草地贴图方案对比:告别API报错的最佳实践 刚升级完引擎,发现草地渲染的API全变了?别慌,这坑我踩了三年。很多老项目还在用旧版接口,新文档一看,参数名全改,回调函数也变了,代码直接崩。今天不聊虚的,直接上 最佳实践… · 2026/9/23 17:22:08

SAS硬盘与SATA硬盘区别详解:接口、指令集与选型指南
SAS硬盘与SATA硬盘区别详解:接口、指令集与选型指南

作为一个常年跟服务器、存储打交道的人,我太清楚“SAS硬盘和SATA硬盘到底啥区别”这个问题被问过多少回了。尤其是刚接触服务器的朋友,看着盘位里长得几乎一模一样的硬盘,再看看采购单上SAS和SATA的价格差,心里肯定犯嘀咕——都是… · 2026/9/23 17:22:08

智慧校园建设避坑:3个SQL优化让查询快10倍的保姆级教程
智慧校园建设避坑:3个SQL优化让查询快10倍的保姆级教程

智慧校园建设避坑:3个SQL优化让查询快10倍的保姆级教程 刚接了个智慧校园系统的重构项目,打开旧代码一看,我血压直接上来了。 很多刚入行的朋友,包括我当年,都踩过这个坑:看了一堆教程还是不会写项目。教程里全是“Hello… · 2026/9/23 17:22:08

5个html5网页模板性能优化坑,别再被报错吓哭
5个html5网页模板性能优化坑,别再被报错吓哭

5个html5网页模板性能优化坑,别再被报错吓哭 刚打开html5网页模板项目,控制台直接飘红一片?那串天书一样的StackTrace让你头皮发麻,明明代码看着没毛病,页面却卡得像PPT。别慌,这种 报错一堆看不懂 StackTrace… · 2026/9/23 17:55:10

注册水利工程师避坑指南:老扒证书变更注销全流程
注册水利工程师避坑指南:老扒证书变更注销全流程

注册水利工程师避坑指南:老扒证书变更注销全流程 复制来的代码跑不通,或者照着网帖搞了半天证书变更,结果提交材料被退回,这种绝望感谁懂?很多人以为注册水利工程师的证书变更、注销和补办只是走个过场,点个鼠标就行。其实不然,这里的坑多到能让你怀疑… · 2026/9/23 17:54:57

EEG尖峰自动检测算法:MATLAB动态阈值与形态门控实现
EEG尖峰自动检测算法:MATLAB动态阈值与形态门控实现

简介:本资源是一套面向神经科学与生物信号处理初学者的MATLAB尖峰自动检测算法实现,聚焦EEG脑电图中棘波与海尖峰的识别任务,解决噪声背景下微弱瞬态事件精准提取的典型难题。压缩包仅含1个核心MATLAB脚本(.m文件)&… · 2026/9/23 17:54:57

Mellanox PRM 第4卷实战:从mlxlink诊断到寄存器级调试
Mellanox PRM 第4卷实战:从mlxlink诊断到寄存器级调试

简介:Mellanox Adapters Programmers Reference Manual(PRM)第4部分,面向从事RDMA网卡驱动开发、固件调试与底层协议实现的工程师,以及需要深入理解Mellanox HCA硬件行为的研究人员。内容聚焦扩展原子操作、WQE格式与R… · 2026/9/23 17:54:50

PythonDOA资源包实战:深度学习窄带信号DOA估计全流程解析
PythonDOA资源包实战:深度学习窄带信号DOA估计全流程解析

简介:面向信号处理与深度学习入门者的Python DOA估计示例包,聚焦利用神经网络对窄带信号进行波达方向估计。资源将深度学习框架与阵列信号处理结合,涵盖数据构造、模型定义、训练与可视化等环节,适合希望把CNN/RNN等模型用于方向估… · 2026/9/23 17:54:44

Acronis True Image 2019 异机还原实战:UEFI+GPT 环境下驱动注入与蓝屏修复
Acronis True Image 2019 异机还原实战:UEFI+GPT 环境下驱动注入与蓝屏修复

简介:本资源是一份面向Windows系统管理员与个人用户的Acronis True Image 2019异机还原实战指南,专为解决老旧电脑系统(如Win7)迁移到新硬件平台时因驱动不兼容导致蓝屏、无法启动等核心痛点而设计。教程覆盖从老机备份、可启动媒… · 2026/9/23 17:54:44

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码