Occlusion-Based NLOS Model
Standalone PyTorch implementation and checkpoint for binary classification of
32 Γ 32 Γ 64 histograms. This package includes the complete inference architecture,
weights, and saved preprocessing statistics. It does not require the original
lidarx repository and is not a Transformers AutoModel package.
Model
- Architecture:
HistCoarseMultiScaleMLP; 549,641 parameters. - Multiscale coarse histogram projections (32Γ8Γ8, 16Γ8Γ8, 32Γ4Γ4), global statistics, temporal statistics, and spatial projections.
- Batch normalization, a 128-dimensional projection, gated residual layers, and a 128β64β1 classification head; SiLU activation and dropout 0.2.
- Output: one logit; sigmoid produces the positive-class score.
- Threshold: 0.5. Class 0 is negative; class 1 is positive.
best.ptcontains the original state dictionary, training configuration, preprocessing statistics, selected epoch, and validation loss.
The precise physical definition of positive/negative and histogram timing/range units require author documentation. This package preserves the original labels.
Files
| File | Purpose |
|---|---|
best.pt |
Original checkpoint, unchanged |
model.py |
Architecture and feature extraction |
inference.py |
Input validation, preprocessing, model loading, and prediction CLI |
config.json |
Inference configuration and class labels |
preprocess_stats.json |
Saved normalization statistics |
requirements.txt |
Runtime dependencies |
verification.json |
Original-versus-standalone parity results and tested versions |
SHA256SUMS |
Integrity hashes for package files |
Local inference
Use Python 3.10 or newer. Install a PyTorch build suitable for your hardware if needed, then install the remaining requirements:
python -m pip install -r requirements.txt
python inference.py /path/to/sample.h5
# Optional CUDA inference:
python inference.py /path/to/sample.h5 --device cuda
The HDF5 key must be stamped_histogram, with raw shape (32, 32, 64) in
(height, width, time_bin) order. Values must be finite, nonnegative counts.
Do not pass already normalized data. No test-time augmentation is applied.
The output JSON contains the logit, positive probability, numeric label, and label name.
From Python, with this folder on the Python import path:
import h5py
from inference import load_model, predict
model, config, stats = load_model()
with h5py.File("sample.h5", "r") as f:
result = predict(f["stamped_histogram"][()], model, config, stats)
print(result)
Downloading from Hugging Face
Download this model package from
PeizhaoEdinburgh/Occlusion_Based_NLOS_model.
from huggingface_hub import snapshot_download
folder = snapshot_download(
repo_id="PeizhaoEdinburgh/Occlusion_Based_NLOS_model",
repo_type="model",
# revision="COMMIT_HASH", # Pin a published commit for reproducibility.
)
print(folder)
Run python /downloaded/folder/inference.py /path/to/sample.h5. The downloaded
Python files execute locally, so review the source before running them.
Exact preprocessing
- Cast raw counts to NumPy float32.
- Compute the total using float64 accumulation. For a positive total, multiply
all bins by
10000 / total; an all-zero histogram remains zero at this step. - Apply
log1p. - Subtract
0.10141183639534776and divide by0.22149132767394814. - Transpose to
(64, 32, 32)and add batch/channel axes:(B, 1, 64, 32, 32).
The original checkpoint also records pixel_photon_count and count_power;
those settings are inactive for this preprocessing mode.
Training and recorded evaluation
Source run:
20260726_212202_tmf8829_36noise_seed_lhs_plus30_36_global_log_count_coarse_multiscale_h128_d4_aug_standard_hist_coarse_multiscale_mlp.
Training used the synthetic dataset with 26,600 training, 5,700 validation, and 5,700 test samples, seed 42, batch size 64, learning rate 0.001, weight decay 0.0001, and D4 spatial augmentation. The selected checkpoint is from epoch 50, with the lowest run validation loss, 0.3138319095. No real experimental samples were used for training according to the run artifacts.
| Evaluation | Recorded result |
|---|---|
| Synthetic test accuracy | 0.8626316 |
| Synthetic test precision | 0.8627589 |
| Synthetic test recall | 0.8624561 |
| Synthetic test F1 | 0.8626075 |
| Synthetic test ROC-AUC | 0.9465309 |
| Experimental groups 1β5 | 88/100 correct |
| Additional left/right/long/short groups | 68/80 correct |
| Combined experimental accuracy | 156/180 = 86.67% |
Metrics above are historical artifacts, not newly recomputed benchmark scores. βBestβ means lowest validation loss within this run, not best across all models. Experimental data use during model selection has not been audited. The synthetic split does not establish independence between related clean/noisy scenes.
Verification
verification.json records exact CPU agreement with the original implementation
for preprocessing and logits on all 180 experimental samples and six synthetic
samples spanning both labels and clean/noise_1/noise_36 conditions. Boundary
checks cover zero counts, constant counts, wrong shape, negative counts, and NaNs.
sha256sum --check SHA256SUMS
Intended use and limitations
Research on NLOS histogram classification. Generalization to different sensors, scene geometry, or timing calibration is not established. Probability outputs have not been shown to be calibrated. The original checkpoint contains provenance paths that are not used by the standalone loader.
License and attribution
A license for these model weights and source code has not been selected. The associated dataset's MIT metadata does not automatically license this model. Author attribution and a paper citation have not been supplied.
The card follows the Hugging Face model card format.
- Downloads last month
- 3