Downloads · 30 days
0
kartikbathla/ptv3-dental-landmark-detector
ptv3-dental-landmark-detector is a keypoint detection model from kartikbathla. Use it for the keypoint detection task on the model card, and read the license before you ship it in a product. It is set up for pytorch. The card lists the license as cc-by-nc-4.0.
Automatic detection of anatomical landmarks on 3D intraoral scans, developed during a research internship at the National Dental Centre of Singapore (NDCS) and evaluated under the official 3DTeethLand — MICCAI 2024 ch…
Downloads · 30 days
0
Access
Public
Updated Aug 22, 2026
Repo size
51.7 MB
Likes
0
Public
Click a slice to open those files.
.pth51.7 MB · 100%
From the Hugging Face model README
Automatic detection of anatomical landmarks on 3D intraoral scans, developed during a research internship at the National Dental Centre of Singapore (NDCS) and evaluated under the official 3DTeethLand — MICCAI 2024 challenge protocol.
The model takes a raw dental scan mesh (upper or lower jaw) and predicts six classes of clinically relevant landmarks — Mesial, Distal, Cusp, InnerPoint, OuterPoint, FacialPoint — directly from the point cloud, with no tooth segmentation stage.
Landmark detection is formulated as dense per-point distance regression:
[N, 6] features (x, y, z, nx, ny, nz).d = sqrt(min(d, 15) / 15), so 0 = at a
landmark. Dense distance supervision gives every point a training signal —
this proved far more trainable than the sparse Gaussian heatmaps used in
early experiments.(threshold, eps, min_samples) were tuned per arch and ship in config/.Two models are provided, one per dental arch (weights/lower,
weights/upper). Each has 6.45 M parameters (~26 MB). Training used
MSE loss with gradient clipping, LR warmup → plateau → cosine decay
(AdamW, peak 2e-4), and rigid-transform augmentation (rotation ±0.5 rad,
translation ±5 mm, scale 0.8–1.2) on an NVIDIA A100.
Scored with the challenge's official evaluation code on the 50-scan test split (per-arch):
| Arch | mAP | mAR |
|---|---|---|
| lower | 0.536 | 0.412 |
| upper | 0.553 | 0.438 |
Lower-arch mean AP/AR at selected matching thresholds:
| Threshold | 0.5 mm | 1.0 mm | 1.5 mm | 2.0 mm | 2.5 mm |
|---|---|---|---|---|---|
| mean AP | 0.091 | 0.473 | 0.701 | 0.790 | 0.823 |
| mean AR | 0.263 | 0.635 | 0.787 | 0.843 | 0.862 |
Inference takes ~0.9 s per scan on an Apple M3 Pro (CPU/MPS).
pip install -r requirements.txt
python inference.py --mesh your_scan.obj --arch lower --out landmarks.json
Or from Python:
from ptv3_dental import load_model, load_dbscan_params, detect, landmarks_to_json
model = load_model("weights/lower/best_model.pth")
params = load_dbscan_params("config/dbscan_params_lower.json")
landmarks, _, _ = detect("your_scan.obj", model, params) # {class: [k,3] coords}
Input: OBJ/STL/PLY mesh of a single arch, in millimeters, in the native intraoral-scanner coordinate frame (as in Teeth3DS). Output: landmark coordinates per class, in the 3DTeethLand annotation JSON format.
Trained on the 3DTeethLand'24 landmark annotations over Teeth3DS (3DTeethSeg'22) meshes — 120 training / 50 test scans per arch. The datasets are released for non-commercial research and are not redistributed here; obtain them from the challenge organizers. Weights are released under CC BY-NC 4.0 accordingly.
@misc{bathla2025ptv3dental,
author = {Bathla, Kartik},
title = {PTv3 Dental Landmark Detector: Direct Point-Cloud Landmark
Detection on 3D Intraoral Scans},
year = {2025},
note = {Research internship, National Dental Centre of Singapore},
url = {https://huggingface.co/kartikbathla/ptv3-dental-landmark-detector}
}