跳转到主要内容

3D几何轻松实现。

项目描述

visu3d - 3D几何轻松实现

Unittests PyPI version Documentation Status

visu3d是Torch/TF/Jax/Numpy与你的程序之间的抽象层。它提供

  • 标准3D几何原语(RayCameraTransform,...)。你可以将那些标准原语与你的自定义原语结合起来。
  • 所有内容都可以轻松可视,无需任何样板代码。检查并调试相机姿态、轨迹...
  • 所有原语都是dataclass_array,可重新排列、切片...,就像它们是NumPy数组一样。
  • 所有内容都是可扩展的,你可以逐步选择所需的功能,并用你的自定义原语替换任何标准原语。

核心功能

所有内容都是v3d.DataclassArraydataclass表现得像np.array(具有索引、切片、形状操作、向量化...)。

# Single ray
ray = v3d.Ray(pos=[0, 0, 0], dir=[1, 1, 1])
assert rays.shape == ()

# Multiple rays batched together
rays = v3d.Ray(pos=np.zeros((B, H, W, 3)), dir=np.ones((B, H, W, 3)))
assert rays.shape == (B, H, W)

rays = rays.reshape('b h w -> b (h w)')  #  Native `einops` support

top_left_ray = rays[..., 0, 0]  #  (b, h, w) -> (b,)

rays = rays.flatten()
rays = rays[rays.norm() > 0]  # Filter invalid rays

所有内容都可以交互式可视化

每个对象都有一个.fig属性用于交互式可视化

rays.fig  # Plot the rays

同时显示多个对象

v3d.make_fig([cam, rays, point_cloud])

使用Colab魔法自动绘图

v3d.auto_plot_figs()  # Once at the start of the Colab

cam, rays, point_cloud  # Tuple auto-displayed without `v3d.make_fig` call

相同的代码在Torch、Jax、TensorFlow、Numpy上无缝工作。

rays = rays.as_jax()  # .as_tf(), as_np(), .as_jax()
assert isinstance(rays.pos, jnp.ndarray)
assert rays.xnp is jnp

rays = rays.as_torch()
assert isinstance(rays.pos, torch.Tensor)
assert rays.xnp is torch

具有对自动微分、jax.vmapjax.tree_utils...的原生支持。

原语

常用原语(RayCameraTransform等),用户可以用它们来表达意图,而不是数学表达式。

H, W = (256, 1024)
cam_spec = v3d.PinholeCamera.from_focal(
    resolution=(H, W),
    focal_in_px=35.,
)
cam = v3d.Camera.from_look_at(
    spec=cam_spec,
    pos=[5, 5, 5],
    target=[0, 0, 0],  # Camera looks at the scene center
)

rays = cam.rays()  # Rays in world coordinates

# Project `(*shape, 3)` world coordinates into `(*shape, 2)` pixel coordinates.
px_coords = cam.px_from_world @ point_cloud

查看API获取原语的全列表。

创建自己的原语非常简单。

将任何数据类转换为数据类数组非常简单

  • 继承自v3d.DataclassArray
  • 使用etils.array_types来注解数组字段(或显式使用my_field: Any = dca.field(shape=, dtype=)而不是dataclasses.field
from etils.array_types import FloatArray


class MyRay(v3d.DataclassArray):
  pos: FloatArray[..., 3]
  dir: FloatArray[..., 3]


rays = MyRay(pos=jnp.zeros((H, W, 3)), dir=jnp.ones((H, W, 3)))
assert rays.shape == (H, W)

v3d通过实现相应的协议,使您能够轻松选择所需的特性。

文档

开始使用Colab教程(在文档中)是最佳方式。

安装

pip install visu3d

用法

import visu3d as v3d

安装

pip install visu3d

这不是一个官方的Google产品。

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面