ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Kornia 针孔相机形状校验修复解析:PinholeCamera、PinholeCamerasList 与 pixel2cam / cam2pixel 的 ValueError 契约

Kornia 针孔相机形状校验修复解析:PinholeCamera、PinholeCamerasList 与 pixel2cam / cam2pixel 的 ValueError 契约 计算机视觉人工智能深度学习图像处理【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址https://gitcode.com/gh_mirrors/ko/kornia点击查看免费下载本指南聚焦 Kornia 中针孔相机Pinhole Camera核心模块的一次输入校验修复issue #4387PinholeCamera与PinholeCamerasList共享的矩阵形状检查、pixel2cam的坐标形状检查以及cam2pixel的坐标/投影矩阵检查被修正无效输入现在会在入口处抛出预期的ValueError而不是被静默接受或在后续张量运算中才暴露问题。读完本文你将掌握 Kornia 针孔相机各 API 的精确输入形状约定、形状校验的源码实现与测试验证方式并理解PinholeCamerasList的四维rank-4矩阵为何保持兼容。修复背景形状校验为什么重要Kornia 的针孔相机模块位于 kornia/geometry/camera/pinhole.py它同时提供面向对象 APIPinholeCamera类和函数式 APIpixel2cam、cam2pixel、project_points等。这类 API 的输入是带批次的张量形状约定高度结构化内参intrinsics为(B, 4, 4)标定矩阵左上 3×3 块为[[fx, 0, cx], [0, fy, cy], [0, 0, 1]]外参extrinsics为(B, 4, 4)的世界到相机变换[R | t]height/width为(B,)的一维张量网格类输入pixel_coords/cam_coords_src为(B, H, W, 3)。在修复之前部分非法形状例如非方阵、错误秩、多通道 depth会被默认接受直到矩阵乘法或逐元素除法等深层张量操作才以难以理解的错误失败。本次修复changelog.d/migration-026.fixed.md把检查前移到 API 入口统一以带具体形状信息的ValueError拒绝无效输入。共享矩阵形状检查_check_valid_paramsPinholeCamera构造函数在存储参数之前会调用一组校验方法。其中核心的矩阵形状检查是_check_valid_paramspinhole.py 第 102-108 行staticmethod def _check_valid_params(data: torch.Tensor, data_name: str) - bool: if len(data.shape) not in (3, 4) or data.shape[-2:] ! (4, 4): raise ValueError( fArgument {data_name} shape must be in the following shape Bx4x4 or BxNx4x4. Got {data.shape} ) return True这段代码是本次修复的核心证据它定义了精确的形状契约张量秩len(data.shape)必须是 3 或 4——即Bx4x4或BxNx4x4最后两维必须恰好是(4, 4)任何非方阵如(1, 3, 4)、(1, 5, 4)都会被拒绝错误信息会携带参数名data_name与实际形状data.shape方便调用者定位问题。PinholeCamera.__init__依次对intrinsics和extrinsics调用该方法并对height/width调用_check_valid_shape要求一维(B,)再通过_check_valid保证四个参数的 batch size 一致不匹配时抛出ValueError: Arguments shapes must match。此外_check_consistent_device通过KORNIA_CHECK_SAME_DEVICE保证所有张量在同一设备上。pixel2cam像素坐标系到相机坐标系函数pixel2campinhole.py 第 815-845 行将像素坐标网格反投影到相机坐标系输入约定为参数要求形状失败时抛出的错误depthBx1xHxWValueError: Input depth has to be in the shape of Bx1xHxW. Got ...intrinsics_invBx4x4ValueError: Input intrinsics_inv has to be in the shape of Bx4x4. Got ...pixel_coordsBxHxWx3ValueError: Input pixel_coords has to be in the shape of BxHxWx3. Got ...注意intrinsics_inv的检查条件是len(intrinsics_inv.shape) 3 and intrinsics_inv.shape[-2:] (4, 4)——它要求的是PinholeCamera布局的(B, 4, 4)逆标定矩阵而非函数式 API 常用的(*, 3, 3)的K。这一点在修复中特别关键一个仅检查秩的宽松守卫会让非方阵通过并返回错误数量的坐标分量而本次修复改为同时校验后两维是否为(4, 4)。depth必须为单通道多通道 depth 会被拒绝避免每个坐标分量被不同通道深度缩放的静默错误。通过校验后函数以transform_points(intrinsics_inv[:, None], pixel_coords)施加逆内参再乘上深度得到BxHxWx3的相机坐标。cam2pixel相机坐标系到像素坐标系函数cam2pixelpinhole.py 第 852-895 行执行正向投影同样在入口处完成两项检查参数要求形状失败时抛出的错误cam_coords_srcBxHxWx3ValueError: Input cam_coords_src has to be in the shape of BxHxWx3. Got ...dst_proj_srcBx4x4ValueError: Input dst_proj_src has to be in the shape of Bx4x4. Got ...dst_proj_src是(B, 4, 4)的投影矩阵PinholeCamera布局而非(*, 3, 3)的K。投影过程为先用transform_points施加投影矩阵得到(x, y, z)再做透视除法u x / (z eps)、v y / (z eps)默认eps1e-12最终返回BxHxWx2的像素坐标。从源码结构看该除法不做除零保护z 0时会在float32/float64/bfloat16下得到约1e14量级的有限值、在float16下得到inf这一行为在测试中被标记为已知缺陷kornia#4267并单独固定。PinholeCamerasList的四维矩阵兼容PinholeCamerasListpinhole.py 第 522-576 行继承自PinholeCamera表示一组相机。其_initialize_parameters将每台相机的参数沿新维度堆叠给定 N 台PinholeCameraintrinsics/extrinsics的形状为(B, N, 4, 4)。因此共享的_check_valid_params必须同时接受秩 3Bx4x4与秩 4BxNx4x4——这正是本次修复中len(data.shape) not in (3, 4)与data.shape[-2:] ! (4, 4)两个条件的设计动机收紧到精确的4x4后两维的同时保留对 rank-4 列表布局的兼容。测试 tests/geometry/camera/test_pinhole.py 第 866-875 行 的test_camera_list_preserves_rank_four_parameters验证了这一点构造两台相机组成的PinholeCamerasList后cameras.intrinsics.shape (1, 2, 4, 4)、cameras.extrinsics.shape (1, 2, 4, 4)且get_pinhole(1).project(...)与单台相机的投影结果一致。num_cameras属性通过intrinsics.shape[1]返回相机数量。测试验证无效形状一律ValueError本次修复由参数化测试完整覆盖tests/geometry/camera/test_pinhole.pytest_invalid_parameter_shape_4266第 852-864 行对intrinsics/extrinsics遍历(4, 4)、(1, 3, 3)、(1, 3, 4)、(1, 5, 5)、(1, 2, 3, 3)、(1, 1, 1, 4, 4)等形状断言抛出ValueError且消息匹配Argument {parameter} shape must be ...test_invalid_projection_shape_4266第 186-191 行cam2pixel的投影矩阵遍历()、(4, 4)、(3, 3)、(1, 3, 3)、(1, 3, 4)、(1, 5, 4)、(1, 1, 4, 4)等非法形状test_invalid_coordinate_shape_4266第 193-207 行cam2pixel与pixel2cam的坐标张量遍历()、(3,)、(1, 3)、(1, 2, 3, 2)、(1, 2, 3, 4)、(1, 2, 3, 1, 3)等形状并断言错误信息中包含调用者传入的实际形状test_invalid_depth_shape第 209-216 行与test_invalid_intrinsics_shape_4266第 325-338 行覆盖pixel2cam的多通道 depth 与非4x4逆内参。这些测试同时验证了错误消息的自解释性例如pytest.raises(ValueError, matchInput dst_proj_src has to be in the shape of Bx4x4)与assert str(pixel_coords.shape) in str(exc_info.value)确保用户从异常文本即可得知期望形状与实际形状。此外test_convention_pixel2cam_rejects_multi_channel_depth_4266第 356-388 行专门固定了单通道 depth 缩放整条射线、多通道 depth 被拒绝的语义。在修复序列中的位置本次修复并非孤立事件而是 Kornia 针孔相机输入契约收紧系列的一部分同目录的变更记录可互为参照changelog.d/migration-022.fixed.mdPinholeCamera.project对秩 1 输入抛出与点转换 API 一致的显式ValueErrorchangelog.d/migration-014.fixed.mdunproject_meshgrid要求(B, 3, 3)内参并拒绝额外相机轴#4383changelog.d/migration-032.fixed.mdPinholeCamera、StereoCamera、warp_frame_depth支持空批次#4386。可以推断这一系列修复的目标是让整个kornia.geometry.camera子模块在输入形状合法性上遵循统一契约非法输入在入口即抛ValueError合法但受限的输入如 rank-4 列表布局、空批次保持显式支持。对使用pixel2cam/cam2pixel做深度图重投影、光流采样或双目几何计算的开发者而言这意味着可以在更早的调用点捕获形状错误而无需在深层张量运算的晦涩报错中排查。小结PinholeCamera/PinholeCamerasList共享的_check_valid_params现在精确校验Bx4x4或BxNx4x4非法矩阵形状立即抛ValueErrorkornia/geometry/camera/pinhole.pypixel2cam校验depthBx1xHxW、intrinsics_invBx4x4、pixel_coordsBxHxWx3三者的形状cam2pixel校验cam_coords_srcBxHxWx3与dst_proj_srcBx4x4rank-4 的(B, N, 4, 4)布局仍受支持保证PinholeCamerasList的多相机场景不受影响全部行为由参数化测试固定错误消息携带参数名与真实形状便于快速定位。若你正在迁移依赖旧版宽松行为的代码只需对照上文的形状表检查调用处的张量布局——凡是矩阵不是4x4、坐标网格不是...x3、深度不是Bx1xHxW的输入都应在进入pixel2cam/cam2pixel或构造PinholeCamera之前显式 reshape 或修复。赞分享计算机视觉人工智能深度学习图像处理【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址https://gitcode.com/gh_mirrors/ko/kornia点击查看免费下载相关推荐Kornia 针孔相机输入形状校验修复解析PinholeCamera 与 pixel2cam/cam2pixel 的 ValueError 语义Kornia 针孔相机输入形状校验修复解析PinholeCamera 与 pixel2cam/cam2pixel 的 ValueError 语义 导读 本篇文计算机视觉深度学习人工智能图像处理Kornia 几何相机 API 加固pixel2cam 对 intrinsics_inv 完整 Bx4x4 形状校验解析Kornia 几何相机 API 加固pixel2cam 对 intrinsics_inv 完整 Bx4x4 形状校验解析 导读 本文围绕 Kornia 发布变计算机视觉深度学习人工智能图像处理Warp 中 wp.utils.array_inner() 形状校验修复以 ValueError 确立数组规约 API 的输入契约Warp 中 wp.utils.array_inner 形状校验修复以 ValueError 确立数组规约 API 的输入契约 本篇围绕 NVIDIA War高性能计算物理引擎图形学机器人创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表