{"id":23776145,"url":"https://github.com/cea-list/tri3d","last_synced_at":"2026-02-27T12:07:01.579Z","repository":{"id":258541826,"uuid":"874115455","full_name":"CEA-LIST/tri3d","owner":"CEA-LIST","description":"A unified interface to various 3D driving datasets","archived":false,"fork":false,"pushed_at":"2025-11-18T14:33:40.000Z","size":21352,"stargazers_count":8,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-11-18T14:35:48.725Z","etag":null,"topics":["ai","autonomous-driving","data-science","datasets","geometry","kitti-dataset","machine-learning","nuscenes","waymo-open-dataset"],"latest_commit_sha":null,"homepage":"https://cea-list.github.io/tri3d/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CEA-LIST.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-10-17T09:26:00.000Z","updated_at":"2025-11-18T14:17:33.000Z","dependencies_parsed_at":"2025-02-27T11:35:33.993Z","dependency_job_id":"417fbe52-386d-4ff0-aea8-53495a7890cb","html_url":"https://github.com/CEA-LIST/tri3d","commit_stats":null,"previous_names":["cea-list/tri3d"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/CEA-LIST/tri3d","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CEA-LIST%2Ftri3d","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CEA-LIST%2Ftri3d/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CEA-LIST%2Ftri3d/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CEA-LIST%2Ftri3d/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CEA-LIST","download_url":"https://codeload.github.com/CEA-LIST/tri3d/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CEA-LIST%2Ftri3d/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29893785,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T09:48:51.284Z","status":"ssl_error","status_checked_at":"2026-02-27T09:48:43.992Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","autonomous-driving","data-science","datasets","geometry","kitti-dataset","machine-learning","nuscenes","waymo-open-dataset"],"created_at":"2025-01-01T07:13:07.835Z","updated_at":"2026-02-27T12:07:01.562Z","avatar_url":"https://github.com/CEA-LIST.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Introduction\n\n![Waymo sample](docs/source/waymo.jpg)\n\nTri3D provides a library to manipulate various 3D driving datasets under a unified API with common conventions.\n\nIt aims to address the following objectives:\n\n- Make datasets **interchangeable**.\n- Enforce **common coordinate and data format convention**.\n- Provide **fast non-sequential access to samples** at any given frame.\n- **Simplify geometric transformations** between sensors and timestamps.\n\nAs of now, Tri3D supports the following datasets:\n\n- [Argoverse 2](https://cea-list.github.io/tri3d/generated/tri3d.datasets.Argoverse2.html)\n- [NuScenes](https://cea-list.github.io/tri3d/generated/tri3d.datasets.NuScenes.html)\n- [ONCE Dataset](https://cea-list.github.io/tri3d/generated/tri3d.datasets.Once.html)\n- [Semantic KITTI](https://cea-list.github.io/tri3d/generated/tri3d.datasets.SemanticKITTI.html)\n- [Waymo open dataset](https://cea-list.github.io/tri3d/generated/tri3d.datasets.Waymo.html)\n- [Zenseact Open Dataset](https://cea-list.github.io/tri3d/generated/tri3d.datasets.ZODFrames.html)\n\nThe documentation is hosted at: https://cea-list.github.io/tri3d/\n\n## Conventions\n\nThe following conventions are adopted across all datasets :\n\n- An object **position** designates the center of its bounding box.\n- In the **local coordinate system of an object**, the x axis points\n  forward, y leftward, and z updward.\n- **Length, width and height** are the dimensions of the object along\n  x, y and z axes respectively.\n- In **camera sensor coordinates**, x points rightward, y points\n  downward, z point forward.\n- In **image coordinates**, x is the pixel column index starting from\n  the left, y is the pixel row index starting from the top, z is the\n  depth in meters along the optical axis.\n- In **lidar coordinates**, x points in the same direction as the ego\n  car, y points leftward, z points upward.\n\nThe differences with raw dataset conventions are documented in each\ndatasets class.\n\n![Coordinates convention](docs/source/coordinates.svg)\n\nTri3D accounts for timestamps, delays and the movement of the ego car\nwhich carries the sensors. For examples, if the boxes of a given dataset\nare annotated at the timestamps of the LiDAR, retrieving the boxes\nrelative to a camera sensor\n(ex: `boxes(seq=0, frame=5, sensor=\"cam\")`) will interpolate the box trajectories at the timestamp of\nframe 5 for the camera, and it will also return the object poses\nrelatively to the position of that camera at this timestamp.\n\n![Sensor timelines and track interpolation](docs/source/timelines.svg)\n\n## Dataset API\n\nAll datasets implement a common interface which provides access to data\nsamples such as:\n\n- Sensor frames.\n- Acquisition timestamps.\n- Sensor poses.\n- Camera images.\n- Lidar point clouds.\n- 3D box annotations.\n\nMoreover, a powerful `.alignment()` function can compute the geometric transformation between any pair of frame and sensors coordinates.\nThe [tutorial notebook](docs/source/example.ipynb) goes through most of these functions.\n\nTri3D datasets are somewhat low-level, ie. they do not enforce the\nnotion of sweep or keyframe where a sample of each sensor around a\ntimestamp is assembled in a tuple. Instead, datasets expose all\navailable samples of each sensor indexed by a per-sensor frame index.\nNotably, some sensors may work at a higher frequency and contain more\nsamples than others for a given recording.\n\nWhen available, keyframes and timestamps are exposed so that coherent\ntuples of samples can be rebuilt easily. Moreover, geometric\ntransformations and pose interpolation functions are provided to\nfacilitate the creation of new keyframes.\n\n## Geometric transformations\n\nTri3D provides a module which facilitates the creation and\nmanipulation of typical 3D geometric transformations: translation,\nrotation, affine, camera projections, pose interpolation.\n\nTransformations have a shared interface which supports:\n\n- **Batching**: list of transformations can be grouped together, and\n  broadcasting rules are supported.\n- **Application** to 3D points: applying the transformations to\n  points, again, boadcasting rules are implemented.\n- **Composition**: it is possible to chain transformation together.\n- **Inversion**: the inverse of a transformation is readily available.\n\n## Object and sensor poses\n\nIn Tri3D, the position and orientation of objects (or sensors) in a\ncoordinate system are stored as geometric transformation. For instance,\nthe pose of a camera in a lidar coordinate system is formulated as the\ncomposition of the camera rotation and translation relative to the\nlidar. Coincidently, this is also the geometric transformation which\ntakes points in the camera coordinate system and returns them in the\nlidar coordinate system.\n\nFor sensors, the sensor poses are accessible via the `.poses()` method.\nFor object annotations, it is provided by the `Box.transform` attribute.\n\nFor example, if we have the pose of a box in lidar coordinates and the\npose of the lidar in camera coordinates, then the position of a point 10\nmeters in front of that box is given by:\n\n```py\nseq = 0\nframe = 4\n\n# retrieve poses\nbox = dataset.boxes(seq, frame, coords=\"lidar\")[0]\nbox2lidar = box.transform\nlidar2cam = dataset.poses(seq, sensor=\"camera\", coords=\"lidar\")[frame]\n\n# compute the position of a point 10m in front of the box, in camera coordinates.\nxyz = (lidar2cam @ box2lidar).apply([10., 0, 0])\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcea-list%2Ftri3d","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcea-list%2Ftri3d","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcea-list%2Ftri3d/lists"}