Skip to content

Changelog¶

All notable changes to this project are documented in this file. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

0.0.18 (2026-10-20)¶

  • Fixed randlanet.{semantickitti,semantic3d,parislille3d}.open3d to use the activation and input transforms their weights were trained with.
  • Added the deprecated_model decorator, stacked above register_model, which keeps a renamed model reachable under its former name with a FutureWarning naming the release that drops it; it replaces register_model(deprecated_names=...), and model_info lists the former names under deprecated_names.
  • The former name point-transformer.s3dis-area5 loads again, with a FutureWarning.
  • Fixed the intermittent IndexError in construct_neigh_by_parent when DataLoader workers collate ocnn octrees: the batch octree no longer shares ocnn's lookup-table cache.

0.0.17 (2026-10-18)¶

  • Added the Point Transformer V3 DALES checkpoint ptv3.dales.jayakumar-pujar (MIT) and its benchmark on the DALES test tiles.
  • Added the DALES dataset, read with the optional laspy package, and the return_number and number_of_returns data keys.
  • Added the MaxAbsScale transform.
  • create_model(pretrained=True) downloads with the Hugging Face token of the environment (utils.hub.load_hub_token), so weights hosted in a gated repository load; read_state_dict unwraps a model_state_dict key.
  • download_url takes request headers, not forwarded on redirects, and removes its partial file when the download fails.
  • PointTransformerV3DecoderBlock(cpe_from_skip=) picks what the block xCPE convolves after upsampling; PointTransformerV3Decoder(pooling="grid") uses the summed features, as the reference grid unpooling does.
  • PointTransformerV3Classification.forward and PointTransformerV3Segmentation.forward take pos as their fourth argument, like the encoder, and condition by keyword only.
  • Fixed the stem and pooling BatchNorm eps of the Point Transformer V3 segmentation checkpoints (1e-3).
  • Added the Open3D-ML model zoo (MIT): randlanet.{semantickitti,s3dis-area3,toronto3d,semantic3d,parislille3d}.open3d, kpfcnn.{s3dis-area3,semantickitti,toronto3d}.open3d, kpfcnn-deform.parislille3d.open3d, point-transformer.s3dis-area5.open3d and spformer-unet.scannet20.open3d, with their inference transforms and the benchmark scripts of their validation protocols under examples/randlanet, examples/kpconv, examples/point_transformer and examples/spformer_unet.
  • Renamed point-transformer.s3dis-area5 to point-transformer.s3dis-area5.open3d, which now ships pretrained weights.
  • Semantic3D(download=True, accept_terms=True) fetches the requested scenes and their labels from the benchmark's ETH mirror (7z archives, read with the optional py7zr package).
  • Added datasets.semantickitti.SEMANTIC_KITTI_LEARNING_MAP, the official 19-class learning map of the single-scan benchmark.
  • Fixed PointTransformerSegmentation to match the reference network: the attention MLP of PointTransformerBlock starts with normalization and activation, the query / key / value projections carry a bias (PointTransformerConv(bias=True)), the decoder opens with a PointTransformerGlobalTransition that mixes a global mean feature into the coarsest stage followed by one transformer block, and the head is Linear -> norm -> act -> Linear (architecture snapshots regenerated).
  • Added the sonata-small, utonia-small, utonia-tiny, concerto-base-origin, concerto-large-origin and concerto-base-siglip pretrained encoders.
  • Renamed utonia.pretrain.pointcept, utonia-lp.scannet20.pointcept and sonata-lp.scannet20.fair to utonia-base.pretrain.pointcept, utonia-base-lp.scannet20.pointcept and sonata-base-lp.scannet20.fair; the former names still load, with a FutureWarning.
  • Added register_model(deprecated_names=...), which keeps renamed models reachable under their former names.
  • Added WeightsDict(pretrained_filter_fn=...), which maps a checkpoint onto the model keys at load, and WeightsDict(url=...) accepts several files, warning when a later file overrides keys.
  • The Sonata, Concerto and Utonia weights download from the authors' Hugging Face repositories.
  • Added the pvcnn-c0p25, pvcnn-c0p125, pvcnn2 and pvcnn2-c0p5 S3DIS Area 5 pretrained weights.
  • Renamed pvcnn2.s3dis-area5 to pvcnn2.s3dis-area5.mit-han-lab; the former name still loads, with a FutureWarning.
  • Fixed PVCNN2Segmentation to match PVCNN++: set abstraction groups unscaled relative positions before the features, the decoder skips take each set-abstraction output before its point-voxel convs, and the decoder takes at most one block per set-abstraction level.
  • Added --num-points to the PVCNN S3DIS benchmark.

0.0.16 (2026-10-14)¶

  • Added scores charts and tables to the documentation for better comparison of the models.

0.0.15 (2026-10-13)¶

  • Fixed the module paths in THIRD_PARTY_NOTICES.md, the FAQ entry on num_classes= overrides, the tutorials index, and the model zoo notebooks that did not run top to bottom.
  • Removed the plyfile dependency (GPL-3.0): utils.io.load_ply and save_ply read and write PLY files with NumPy, and the ScanNet, Paris-Lille-3D and Toronto-3D loaders use them.
  • Fixed the SyntaxWarning that a docstring of ops.box3d raised on first import under Python 3.12+.

0.0.14 (2026-10-12)¶

  • Added the Data Format, FAQ and About pages to the documentation.
  • Every package __init__ defines __all__, transforms imports its classes explicitly and implicit_reexport is off, so the documented names type-check under mypy --strict.
  • torch_pointcloud.ops imports its modules: tp.ops.box3d, tp.ops.cluster, tp.ops.voxelization, ... are reachable after import torch_pointcloud.
  • Removed the TORCH_POINTCLOUD_MODELS_DIR variable: the pretrained weights always live under <cache>/models, and TORCH_POINTCLOUD_CACHE_DIR moves the cache.
  • create_model raises an ImportError naming the model and the installation page when an optional dependency is missing; optional_import tells a package that is not installed from one that does not meet its version requirement, and the flash attention errors point at use_flash_attn=False.
  • DynamicMeanVFE.forward takes (x, pos, batch) like every other packed layer; swap the first two arguments of existing vfe(pos, x, batch) calls.
  • create_pool(None), create_adaptive_pool(None) and create_dropout(None) return None like create_norm / create_act instead of raising (overloaded, so a non-None argument still types as nn.Module). create_act("swish") resolves to nn.SiLU instead of PyG's swish function.
  • AnchorHeadLoss accepts 9-column boxes and ignores their velocity columns; no call changes.
  • TransFusionHeadLoss supervises the velocity codes from 9-column boxes once code_weights enables them; its docstring no longer states that the velocity targets are always zero.
  • Renamed optim.param_groups to generate_param_groups and removed the MONAI-signature function of that name (its overlapping groups are rejected by torch.optim): generate_param_groups(model, overrides=[dict(keyword=..., lr=...)]), and the same kwargs as LitModel(param_groups=...).
  • Fixed the DGCNN segmentation lines of examples/benchmark.sh, which passed --dataset and --area to scripts that take --model; a test now checks every line of the file against the argparse interface of the script it calls.
  • create_model(..., pretrained=True) no longer warns about overrides: num_classes=K loads the registered checkpoint and then rebuilds the head for K classes (0 drops it), and the keys whose shape changed under another override (e.g. the stem after in_channels=) keep their initialization.
  • create_model(..., pretrained=True) warns when the registered weights are released under a non-commercial license.
  • Added tests/test_docs_examples.py, which runs every ``python fence of the docstrings and the docs pages as pasted with--run-docs(make doctest-docs); a block that cannot run is tagged. Fixed the examples that did not run (missing imports, placeholder names, stale calls, the argument order of theSlidingWindowInfererpredictor) and removed thepytest-markdown-docs` dependency.

0.0.13 (2026-10-11)¶

  • Updated some model references in docstrings to include full paper titles.
  • Added the detection training scripts of SECOND, PointPillars, PointRCNN, VoxelNeXt, LION, VoteNet and 3DETR.
  • Added the finetuning scripts of Point-MAE, Point-BERT, Point-M2AE, PointMamba and PointGPT.
  • Added the semantic segmentation training scripts of DGCNN, KP-FCNN, OctFormer, Point Transformer V3, PointNet++, PointNeXt, PVCNN, RandLA-Net, SphereFormer, SpUNet and SPVCNN, and the linear probing of Sonata, Concerto and Utonia.
  • Added the classification and part segmentation training scripts of DGCNN, OctFormer, PointConv, PointMLP, PointNet++ and PointNeXt.
  • Moved the example scripts to one directory per model, named <task>_<dataset>_<kind>.py, and removed the generic classification and segmentation scripts.
  • Added transforms.functional.cut_boxes and transforms.PasteBoxes, the copy-paste augmentation of box-annotated scenes.
  • Added RandomScale(axes=...) and per-channel Clamp bounds.
  • The box augmentations carry the velocity columns of 9-column boxes.
  • AnchorHead, AnchorGroupHead, PointRCNNRefinementHead, VoxelNeXtSeparateHead and TransFusionHead initialize their heads as the reference detectors do.
  • assign_anchor_targets and MultiGroupAnchorHeadLoss carry the velocity columns of 9-column boxes.
  • Renamed layers.separate_branch to prediction_branch.
  • Added models.model_info, the registry entry of a model without building it.
  • Added torch_pointcloud.optim: generate_param_groups (moved from utils.optim), CosineWarmupLR, PolyLR, bn_momentum, set_bn_momentum and BNMomentumScheduler.
  • Added RandomRotate(center=..., vector_keys=...), RandomColorAutoContrast(blend=None), multi-pass RandomElasticDistortion, SphereCrop(max_ratio=..., dst_center_key=...) and RandomSample(allow_fewer=True).
  • Added transforms.RandomApply, RandomBlockCrop and Translate, S3DIS(num_nodes=None), PointCloudDataLoader(mix=..., mix_prob=...) and datasets.RepeatSampler.
  • The masked point modeling pretraining models return (pred, target, pred_batch, target_batch), packed for chamfer_distance.

0.0.12 (2026-10-07)¶

  • Reorganized losses into tiers: each tensor function sits next to its module and is re-exported by losses.functional; added the module forms SigmoidFocalLoss, GaussianFocalLoss, ChamferDistance and CornerLoss; the private copies inside the detection losses are gone.
  • Renamed the detection losses after their head (AnchorHeadLoss, MultiGroupAnchorHeadLoss, CenterHeadLoss, VoxelNeXtHeadLoss, TransFusionHeadLoss) and their reported terms to <term>_loss.
  • VoteNetLoss assigns its targets from the packed ground truth; the GenerateVoteLabels and EncodeVoteNetTargets transforms are removed.
  • Added tnet_orthogonality_regularizer / TNetOrthogonalityRegularizer, PointNet's feature-transform regularization; TNet and DynamicTNet keep their last transform in running_transform.
  • Moved generate_anchors, assign_anchor_targets and AnchorTargets to ops.anchors; added ops.box3d.points_in_boxes and boxes_iou_nearest_bev.
  • Added poly1_focal_loss / Poly1FocalLoss.
  • Sped up the detection and segmentation losses 2x to 15x with identical values: vectorized heatmap and anchor targets, batched Hungarian matching, class-batched Lovász sort, an axis-aligned prefilter of the rotated IoU, and chamfer_distance on the nearest-neighbor kernels of kaolin (optional) or torch_geometric so whole clouds fit.
  • The detection losses take the collated dict as data: forward(output, data).
  • Removed the scalar loss_weight of the single-term loss modules; SumLoss takes weights instead.
  • Fixed TransFusionHeadLoss backpropagating through its IoU-rescore target.
  • Fixed assign_anchor_targets matching by the rotated BEV IoU; the anchor recipes match by the nearest-axis-aligned one (boxes_iou_nearest_bev) unless match_height is set.
  • Removed ML monitoring dependencies (mlflow, tensorboard, aim) from the dev dependencies.

0.0.11 (2026-10-06)¶

  • Removed FPS_RANDOM_START (TORCH_POINTCLOUD_FPS_RANDOM_START), which is no longer needed as all models turn this off at eval time directly.
  • Removed ops.cluster.decimate (no longer used) and decimate_indices: RandLA-Net decimates with torch_geometric's decimation_indices, drawn in eval from a random state forked and seeded by the input size, so a forward stays reproducible without a dedicated generator (value snapshot regenerated).
  • Added losses.kpconv_deform_regularizer and its module form KPConvDeformRegularizer, the fitting and repulsive regularizer of deformable KPConv layers, computed from the statistics they keep (running_min_d2 is now the closest input point per kernel point, \((N, K)\), and the deformed kernel is stored per point); examples/kpconv_segmentation.py trains with it and the KPConv-PyTorch recipe (SGD 0.98, offsets at a tenth of the learning rate, per-epoch decay, clipped gradients, --deformable).

0.0.10 (2026-09-27)¶

  • Moved each family's convolution and blocks from models to layers (kpconv_blocks, randlanet_blocks, point_transformer_conv, grouped_vector_attention, torchsparse_blocks, voxel_grid_pool), and merged pointconv and pointconv_sa into pointconv_blocks. DilatedResidualBlock is RandLANetResidualBlock, KPFCNNGridPool is VoxelGridPool.
  • Rebuilt KPConv, GroupedVectorAttention and AttentivePooling on MessagePassing, taking (x, pos, edge_index) with edge_index as [source, target]; KPConv pools the neighbors per kernel point before the matrix products (up to 2x faster, 8x less memory).
  • Fixed KPConv(bias=True), which registered a bias without adding it to the output.
  • Consolidated the duplicated blocks into layers: PillarFeatureLayer, VoxelGridPool, SparseBasicBlock, TransformerEncoderLayer and TransformerDecoderLayer.
  • Updated XConv to take edge_index as [source, target], and DGCNN to build its feature graph with knn_graph(loop=True).
  • Renamed state-dict keys of second-multihead.nuscenes.openpcdet, voxelnext.nuscenes.openpcdet and lion-mamba.nuscenes.zhe-liu (bn -> norm, LION decoder under layer).
  • Fixed the PointNeXt classifiers' global set abstraction: a shared MLP over cat([pos, x]) as in the reference, instead of a whole-cloud radius search with zeroed coordinates (global_sa.* keys; ModelNet40 93.80 -> 93.96 OA).
  • Updated farthest_point_sample and FarthestPointSample to leave a cloud untouched when it has at most num_samples points (or ratio >= 1) instead of reordering it by farthest-point rank; 27 value snapshots regenerated.
  • Added ops.cluster.dense_neighbors and gather_neighbors, padding a [source, target] edge list into a (N_t, k) neighbor table over the packed batch; KPConv pools on that table with one bmm when the neighborhoods fill at least dense_fill_threshold of it (KP-FCNN inference 231 -> 141 ms, training step 905 -> 443 ms).
  • Fixed radius(..., sort=True) materializing the full distance matrix on CUDA, where the kernel already returns the smallest source indices (3DETR inference 244 -> 46 ms, 5.3 -> 0.6 GB).
  • Removed KNN_DENSE_BUDGET and the dense cdist path of knn / knn_graph, which wrap the torch_geometric kernel; group orders every neighborhood closest first (six pretraining value snapshots regenerated: one patch had two near-equidistant neighbors in the other order).
  • Removed KPConv.dense_fill_threshold: the padded neighbor table is the only aggregation path.
  • Added PatchLayout / patch_layout: the PTv3 encoder and decoder build the padding and patch offsets once per stage and pass them to the serialized-attention blocks, which also accept them through patch_layout=; divisible_pad and split_batch are vectorized. PTv3 inference 95.7 -> 83.6 ms, training step 390 -> 374 ms, identical outputs.
  • Fixed farthest_point_sample / FarthestPointSample returning fewer than num_samples rows for a smaller cloud: it now keeps the cloud in place and completes it by cycling through its points, as fps repeats indices, so the sample size stays fixed (a 1-point object no longer breaks group-based tokenizers). 27 value snapshots of 1024-point fixtures regenerated; ShapeNetPart mIoU unchanged (86.90 / 84.51 for pointnext-sm).

0.0.9 (2026-09-26)¶

  • Moved the tensor operations of torch_pointcloud.utils (box3d, cluster, density, geometry, heatmap, hilbert, octree, serialization, voxelization) to a new torch_pointcloud.ops package, and dissolved utils.ops: safe_divide is in ops.math, decimate and decimate_indices in ops.cluster, first_permutation in ops.voxelization and offset_index in utils.data; softmax is replaced by torch_geometric.utils.softmax, and pad_tail is removed.
  • Fixed docstrings typos, and added notice about AI tool usage in CONTRIBUTING.
  • Updated docs, typos and social card on URL redirects.

0.0.8 (2026-09-25)¶

  • Added a checkpoint table to every model page of the docs, generated from the registry, and a comparison with the research codebases to the README.
  • Removed SoftmaxPool and LogSoftmaxPool, and the "softmax" / "log_softmax" names of create_pool: both always raised.
  • Keyed the weights cache by the pinned revision (<checkpoint>/<revision>/<file>), so a checkpoint pinned to new weights downloads them instead of loading the stale file. Weights cached by 0.0.7 and earlier download once more.
  • Replaced the torch-cluster, torch-scatter and torch-sparse imports with their torch_geometric equivalents, and required torch-geometric>=2.8, so pyg-lib is the only PyG kernel package to install.

0.0.7 (2026-09-24)¶

  • Renamed CenterLoss and SparseCenterLoss to CenterPointLoss and SparseCenterPointLoss, in losses.centerpoint.
  • Renamed the loss weights to <term>_weight (the 3DETR loss_*_weight, TransFusion hm_weight / bbox_weight to heatmap_weight / loc_weight, VoteNet loss_scale to loss_weight) and the TransFusion hungarian_*_cost to matcher_*_cost, and made every loss argument after num_classes keyword-only.
  • Renamed average_precision3d to box_average_precision, and the Lightning metrics AveragePrecision3D, MeanAveragePrecision3D and InstancePartMeanIoU to BoxAveragePrecision, BoxMeanAveragePrecision and InstancePartMeanIntersectionOverUnion.
  • Updated nuscenes_detection_metrics to take (preds, target) like box_matches, and confusion_matrix(ignore_index) to accept several indices.
  • Added kitti_average_precision, the KITTI 3D detection protocol used by the PointPillars and SECOND benchmarks.
  • Renamed the 3detr_* and ptv3_* examples after their model modules (threedetr_*, point_transformer_v3_*).
  • Added the class names to the OctFormer and PTv3 ScanNet checkpoints, and SCANNET200_CLASSES.
  • Made the dataset arguments after root keyword-only everywhere (ModelNet, ScanNet, ScanObjectNN and NuScenes(split) were positional).
  • Updated ParisLille3D, Toronto3D and ShapeNetPart to default to the train split like the other datasets, and typed every split as a Literal.
  • Renamed RepeatDataset(loop) to k.
  • Updated SlidingWindowInferer(softmax) to default to False like the other inferers.
  • Renamed VoxelPartitionInferer(sub_batch_size) to sw_batch_size, and added progress to VoxelPartitionInferer and TTAInferer.
  • Made import torch_pointcloud lazy: subpackages load on first access, so importing transforms or datasets no longer loads the models and spconv.
  • Renamed BaseBEVBackbone, BaseBEVResBackbone, BasicBlock2d, AnchorHeadSingle, AnchorHeadMulti, MultiGroupSingleHead, PFNLayer and RPE to BEVBackbone, BEVResidualBackbone, ResidualBlock2d, AnchorHead, MultiGroupAnchorHead, AnchorGroupHead, PillarFeatureLayer and OctreeRelativePositionEncoding.
  • Moved utils.ops.voxel_grid_fnv to utils.voxelization, utils.ops.knn_interpolate to utils.cluster, and layers.ensure_msg_list / ensure_msg_list_size to utils.conversion, and renamed utils.neighbors to utils.density.
  • Added input_keys to the registry, the batch keys each model's forward takes, read by LitModel by default, and utils.data.select_inputs.
  • Made task optional in create_model when the name is registered under a single task.
  • Added ModelInfoDict, the type of create_model(..., return_info=True) info, with the resolved task and input_keys, and typed the registered transform as a Transform.
  • Moved the return_intermediates argument of PointTransformerV3Encoder.forward after pos and condition.
  • Replaced RandomDropout(p_drop) with drop_ratio_range, the range the dropped fraction is drawn from on each call, and renamed functional.random_dropout_mask(p_drop) to drop_ratio.
  • Renamed Voxelize(method="pyg") to method="grid" and Voxelize(random_sample) to random_first.
  • Moved EncodeVoteNetTargets and GenerateVoteLabels to torch_pointcloud.models.votenet, and angle_to_class, class_to_angle and class_to_size to torch_pointcloud.utils.box3d.
  • Moved functional.split_batch to torch_pointcloud.layers.serialized_attention, and renamed functional.random_color_drop to color_drop.
  • Removed Abs(inplace), since transforms never mutate their input.
  • Removed the type aliases (ReduceOp, RescaleMethod, ShiftMethod, VoxelMethod, VoxelReduce, VoxelPosReduce) from the torch_pointcloud.transforms exports.
  • Renamed SubtractKey and DivideKey to SubtractItems and DivideItems, and RandomShift to RandomTranslate (shift_range to translation_range, functional.shift_boxes to translate_boxes).
  • Removed AlignAxis, the same as Shift(method="min", axes=[k]).
  • Renamed the output-key arguments to dst_*: names of CopyItems / RenameItems and normal_key of EstimateNormals to dst_keys, and the output keys of RandomSampleFaceVertices, BuildOctree, HardVoxelize, GenerateVoteLabels, EncodeVoteNetTargets and RelabelBoxes.
  • Renamed HardVoxelize(feat_key) to feature_key, like BuildOctree.
  • Moved every function of torch_pointcloud.transforms.functional next to its transform in the themed modules; functional imports them all.
  • Renamed functional.abs to absolute.
  • Split torch_pointcloud.transforms.transforms into base, sampling, masking, geometry, scaling, utils, voxelization, octree, augmentation, box and mixing; torch_pointcloud.transforms exports the same names.
  • Removed DataKeys.SEMANTIC, REFLECTANCE and ROOM_MAX: ParisLille3D emits intensity and the S3DIS blocks scene_max, like the other datasets.
  • Renamed DataKeys.POINTS to OCTREE_POINTS.
  • Renamed num_group, num_heading_bin (and num_angle_bin), num_size_cluster and num_proposal to their plurals in the models, losses, box transforms and utils.cluster.group.
  • Renamed sa_npoints, roi_sa_npoints and preenc_npoints to sa_num_points, roi_sa_num_points and preencoder_num_points.
  • Renamed the PointNet mlp1_dims / mlp2_dims to mlp1_channels / mlp2_channels, and the Point Transformer encoder_num_groups / decoder_num_groups to encoder_attention_groups / decoder_attention_groups.
  • Renamed the Voxel Mamba d_model to embed_dim, the OctFormer num_blocks to encoder_depths (and segmentation channels to encoder_channels), and the SPFormer U-Net layers to depths.
  • Renamed the SphereFormer base_channels, layers and block_reps to stem_channels, channels and depth.
  • Split the SparseUNet channels and layers into encoder_channels, decoder_channels, encoder_depths and decoder_depths, and renamed base_channels to stem_channels.
  • Split the segmentation task into semantic-segmentation and part-segmentation, and renamed the base task to pretraining.
  • Renamed SegmentationModel to SemanticSegmentationModel and BaseModel to PretrainingModel, and added PartSegmentationModel.
  • Renamed the 3DETR classes from DETR3D* to ThreeDETR*, in the threedetr modules.
  • Renamed the pretraining models to <Arch>Pretraining, and the Point-MAE and Point-M2AE part segmentation models to *PartSegmentation.
  • Replaced LitSegmentationModel with LitSemanticSegmentationModel and LitPartSegmentationModel.
  • Replaced the generator argument of the random transforms and MixDataset with seed, and added set_random_state.
  • Fixed seeded random transforms repeating the same draws in every DataLoader worker (seed_worker).
  • Updated PointNet++, VoteNet, PointRCNN, 3DETR, PVCNN++, Point-MAE and Point-M2AE to use the PointNet2* layers.
  • Removed SAModule, GlobalSAModule and FPModule, replaced by PointNet2SetAbstraction, PointNet2GlobalSetAbstraction and PointNet2FeaturePropagation.
  • Renamed the pool argument of PointNet2Encoder to aggr and of the PointNet++ models to sa_aggr.
  • Updated the 17 checkpoints built on set abstraction to the new parameter names.
  • Removed utils.diffusion and utils.ensemble, which nothing used.
  • Removed config.RANDOM_SEED, which nothing read.

0.0.6 (2026-09-23)¶

  • Renamed the ScanObjectNN checkpoints to name their split (-hardest, -objbg, -objonly) and the KPConv checkpoints to s3dis-area5.
  • Pinned every registered weight URL to its Hub commit.
  • Fixed the point-mamba-base.scanobjectnn-objonly.dingkang-liang weights (block norms taken from the unused norm_ffn layer): OA 83.30 to 92.60.
  • Added accept_terms to S3DIS, S3DISHdf5, ScanNet and ScanObjectNN; download asks for it on the terminal otherwise.
  • Updated create_model(pretrained=True) to raise when the model registers no weights.
  • Added torch_pointcloud.metrics to the package namespace.
  • Added the upstream copyright notices to THIRD_PARTY_NOTICES.md.
  • Updated the documentation: install order, canonical latest links, social card, model overview scores.

0.0.5 (2026-09-21)¶

  • Added performances of object detection models on nuScenes.
  • Updated the minimum torch version to 2.8.
  • Updated the CI to test on torch 2.8 and to run on pull requests.
  • Added torch 2.8 to the install selector.
  • Updated DGCNN, T-Net, PointNeXt and Point Transformer to use the library's knn, knn_graph and radius.
  • Added CONTRIBUTING.md and issue templates.
  • Added the dependencies and their licenses to THIRD_PARTY_NOTICES.md.
  • Updated the README with a warning on the required PyG kernels.
  • Added social cards to the documentation.
  • Added examples/benchmark.sh to run every benchmark.
  • Removed the pointnext-xl.s3dis-area6.openpoints registration (no weights).
  • Removed the out-of-memory skip of the PTv3 benchmark.
  • Updated the benchmark results after the inferers seed fix.
  • Added the secondary metrics (mAcc, OA, per-class AP) to the registry.

0.0.4 (2026-09-20)¶

  • Added versioning of the documentation with mike.
  • Moved the metrics from torch_pointcloud.utils.metrics to the torch_pointcloud.metrics sub-package.
  • Added intersection_over_union and accuracy of a confusion_matrix, with average, ignore_index, class_names.
  • Removed compute_iou, compute_mean_iou, overall_accuracy and per_class_accuracy, superseded by the above.
  • Renamed part_iou to part_intersection_over_union; part_mean_intersection_over_union scores it with average.
  • Added box_matches; average_precision3d now scores its records, with average and class_names.
  • Removed mean_average_precision3d, superseded by average_precision3d.
  • Updated instance_average_precision to take iou_threshold, average and class_names, like the other metrics.
  • Updated box AP and count_points_in_boxes for faster detection benchmarks.
  • Added inverse_key to VoxelPartitionInferer, KNNWindowInferer and PotentialSphereInferer, so a transform that changes the number of points (pad, voxelize) works in every inferer, as it did in SlidingWindowInferer.
  • Renamed VoxelPartitionInferer(reduce=...) to aggregate, and the "weighted_mean" mode of KNNWindowInferer to "mean", so every inferer names its aggregation the same way.
  • Renamed TTAInferer(ema_softmax=...) to softmax, now False by default and applied in both aggregation modes.
  • Added TTAInferer(transforms=None, num_passes=...) to repeat the base inferer without augmentation.
  • Added DataKeys.BLOCK_BBOX, the key SlidingWindowInferer writes the block bounds under.
  • Fixed seeded inferers drawing the same fragments on every call, which made the votes of a TTAInferer identical: an int seed now advances on each call, and seed=None follows the global generator like the transforms.
  • Updated the pointnet2.s3dis-area5.xu-yan benchmark to 54.83 mIoU (from 54.28), now that its three votes differ.
  • Updated the inferers overview in the docs.
  • Renamed serialize_coords to serialize_pos and RelativePositionalEncoding.coords_boundary to pos_boundary.

0.0.3 (2026-09-19)¶

  • Fixed SPUNet and PTv3 color normalizations to reproduce the same processing as original.
  • Updated all tests datasets to use random data instead of subsampled versions of original ones (for testing).
  • Added sw_batch_size parameter for SlidingWindowInferer for faster inference.
  • Updated benchmark scripts to use batch_size > 1 for faster benchmarking.
  • Updated the SerializedRPE attention module operation to use less memory.
  • Added FeaturesDict so that return_intermediates=True returns the same list for every model: the encoder stages from fine to coarse, each with x, batch and pos or pos_grid.
  • Renamed the intermediates keys features to x and inverse to pooling_inverse.
  • Updated SpUNet, SPFormer-UNet and SPVCNN forward_features to return the skips only with return_intermediates=True.
  • Fixed octformer-lg stem channels, the model could not run a forward pass.
  • Fixed reset_classifier ignoring global_pool for PVCNN and PVCNN2.
  • Fixed Point-MAE and Point-M2AE segmentation forward_head returning dense logits but packed pre_logits features.
  • Added source links to classes and functions in the docs.

0.0.2 (2026-09-16)¶

  • Pinned torch version to 2.10 in the CI to match local development.
  • Updated pypi package URLs metadata, README documentation with better CI badges.
  • Removed unlinked tutorials from the docs for future releases.
  • Fixed decimate_indices such that when a generator is provided, it is reseeded for each sample.
  • Updated tutorials docs summaries to better highlight the cards.
  • Updated examples scripts to auto adjust number of classes based on specified dataset.
  • Added tests in CI for all Python versions supported by the project (3.10-3.13).

0.0.1 (2026-08-29)¶

Initial release: a timm-style create_model factory and pretrained-weight registry covering classification, segmentation, detection, self-supervised, and generative point cloud models, built on packed PyG-style batches. Ships datasets with disk caching, MONAI-style dict transforms, tiling and sliding-window inferers, optional PyTorch Lightning modules, and one training and one benchmark script per model under examples/.