MMF-M3AD

February 10, 2026 · View on GitHub

1. Licence

Copyright (c) 2025 Hanzhe Liang

All rights shall be reserved until the paper is accepted. This work has been submitted to Elsevier.

2. Quick Start

2.1 Requirements

conda create -n MMF-M3AD python=3.8
conda activate MMF-M3AD
pip install -r requirements.txt
pip install "git+https://github.com/erikwijmans/Pointnet2_PyTorch.git#egg=pointnet2_ops&subdirectory=pointnet2_ops_lib"
pip install --upgrade https://github.com/unlimblue/KNN_CUDA/releases/download/0.2/KNN_CUDA-0.2-py3-none-any.whl

2.2 Pre-trained Weights

Download Point-MAE pre-trained weights from here and place the modelnet_8k.pth file in the ./pretrain_ckp directory.

2.3 Real3D-AD

Download the dataset from here and unzip it.

Downsample the training set:

python downsample_pcd.py --radl3d_path <Path/to/your/Real3D-AD-PCD>

Set dataset.data_dir and net.data_dir in ./experiments/real3d/config.yaml to your Real3D-AD-PCD path.

Training/Evaluation:

cd ./experiments/real3d/
sh train_torch.sh 1 0 # or sh eval_torch.sh 1 0

2.4 Anomaly-ShapeNet

Download the dataset from here and organize as:

Anomaly-ShapeNet
├── ashtray0
│   ├── train/*.pcd
│   ├── test/*.pcd
│   └── GT/*.txt
├── bag0
...

Set dataset paths in ./experiments/Anomaly-ShapeNet/config.yaml.

Training/Evaluation:

cd ./experiments/Anomaly-ShapeNet/
sh train_torch.sh 1 0 # or sh eval_torch.sh 1 0

Update: We shared our checkpoints and visualization.

If you use this checkpoints, you will get following results:

clsnameobj-AUROCpixel-AUROC
ashtray00.9952380.897062
ashtray0|bulge10.889446
ashtray0|concavity0.9904760.937943
bag00.90.866893
bag0|bulge0.8952380.856569
bag0|concavity0.9047620.906479
bottle00.9428570.936578
bottle0|bulge0.9142860.933266
bottle0|concavity0.9714290.953431
bottle10.8421050.908467
bottle1|broken0.7666670.305473
bottle1|bulge0.8190480.905599
bottle1|concavity0.9333330.948842
bottle1|crak0.7333330.206387
bottle1|hole0.7333330.495934
bottle30.9365080.932748
bottle3|bulge0.923810.959732
bottle3|concavity0.9619050.964948
bottle3|crak10.838852
bottle3|hole10.9109
bottle3|scratch0.8222220.692359
bowl010.903884
bowl0|bulge10.916167
bowl0|concavity10.928045
bowl0|scratch10.834646
bowl10.9074070.648632
bowl1|bulge0.876190.685258
bowl1|concavity0.8952380.702776
bowl1|scratch0.9833330.508401
bowl20.9074070.75407
bowl2|bulge0.8666670.826114
bowl2|concavity0.923810.827766
bowl2|scratch0.950.530516
bowl30.9555560.855255
bowl3|bulge10.955086
bowl3|concavity0.9428570.832484
bowl3|scratch0.90.639366
bowl410.734168
bowl4|bulge10.805815
bowl4|concavity10.812012
bowl4|scratch10.422547
bowl50.8842110.645095
bowl5|broken0.8666670.566797
bowl5|bulge0.9142860.665874
bowl5|concavity0.8952380.660983
bowl5|hole0.8333330.592889
bowl5|scratch0.7333330.245375
bucket00.9492060.759023
bucket0|broken10.827687
bucket0|bulge10.836904
bucket0|concavity0.8476190.80944
bucket0|crak10.360253
bucket0|hole10.795544
bucket0|scratch10.620731
bucket10.8730160.87787
bucket1|broken0.6666670.777851
bucket1|bulge0.876190.854464
bucket1|concavity0.9523810.938854
bucket1|crak10.425497
bucket1|hole0.8333330.714966
bucket1|scratch0.5333330.644734
cap00.9259260.90987
cap0|broken0.8666670.850834
cap0|bulge0.876190.890177
cap0|concavity10.95993
cap0|hole0.90.915897
cap30.971930.965336
cap3|bending10.99497
cap3|broken0.9333330.922619
cap3|bulge0.9428570.961105
cap3|concavity10.971099
cap3|hole10.98001
cap40.9684210.93938
cap4|bending10.990492
cap4|broken10.966726
cap4|bulge0.9619050.916807
cap4|concavity0.9619050.952002
cap4|hole0.9666670.967294
cap50.9543860.933446
cap5|bending10.967775
cap5|broken0.80.848967
cap5|bulge0.9809520.938863
cap5|concavity0.9904760.941298
cap5|hole0.8666670.723962
cup00.9857140.861293
cup0|bulge0.9809520.838595
cup0|concavity0.9904760.914248
cup110.735271
cup1|bulge10.71608
cup1|concavity10.758117
eraser00.8809520.87012
eraser0|bulge0.7714290.847092
eraser0|concavity0.9904760.891903
headset00.8044440.731442
headset0|bending0.9333330.909638
headset0|bulge0.80.640014
headset0|concavity0.7904760.83813
headset10.9571430.731932
headset1|bulge0.9904760.737233
headset1|concavity0.923810.753173
helmet00.9130430.79685
helmet0|bending10.720229
helmet0|broken10.679532
helmet0|bulge0.9428570.897179
helmet0|concavity0.8285710.8183
helmet0|crak0.8666670.105913
helmet0|hole0.9333330.329984
helmet0|scratch10.657819
helmet110.615464
helmet1|bulge10.621174
helmet1|concavity10.608757
helmet20.7478260.878402
helmet2|bending0.8666670.941038
helmet2|broken0.7333330.993004
helmet2|bulge0.7333330.947578
helmet2|concavity0.8571430.93423
helmet2|crak0.7666670.682557
helmet2|hole0.5666670.580093
helmet2|scratch0.5333330.651519
helmet310.667767
helmet3|broken10.0643443
helmet3|bulge10.621837
helmet3|concavity10.750445
helmet3|crak10.0914993
helmet3|hole10.256677
helmet3|scratch10.818785
jar00.976190.909678
jar0|bulge0.9523810.886122
jar0|concavity10.947556
microphone00.9857140.898087
microphone0|bulge10.912981
microphone0|concavity0.9714290.881227
shelf00.7826090.712568
shelf0|bending0.80.663835
shelf0|broken0.8333330.390459
shelf0|bulge0.8285710.814257
shelf0|concavity0.7904760.658587
shelf0|crak0.90.25119
shelf0|hole0.5666670.225338
shelf0|scratch0.6333330.550755
tap00.9575760.622709
tap0|broken10.523318
tap0|bulge0.9428570.53855
tap0|concavity0.9619050.750784
tap0|crak10.183025
tap0|hole0.9333330.189428
tap0|scratch0.9333330.565097
tap10.8592590.611318
tap1|broken0.8666670.570039
tap1|bulge0.8380950.559186
tap1|concavity0.8666670.687257
tap1|hole0.90.509744
vase00.9291670.91241
vase0|bulge0.8380950.885184
vase0|concavity10.982515
vase0|scratch10.930962
vase10.90.732615
vase1|bulge0.923810.730049
vase1|concavity0.876190.733679
vase20.8666670.849978
vase2|bulge0.8952380.858266
vase2|concavity0.8380950.852019
vase30.7575760.862079
vase3|broken0.60.836963
vase3|bulge0.723810.871578
vase3|concavity0.7809520.891512
vase3|crak0.8666670.779981
vase3|hole10.793726
vase3|scratch0.60.772522
vase40.8757580.883506
vase4|broken0.90.967484
vase4|bulge0.923810.926809
vase4|concavity0.7809520.866639
vase4|crak10.75813
vase4|hole0.7666670.392309
vase4|scratch10.890568
vase510.695899
vase5|bulge10.711384
vase5|concavity10.685223
vase710.745133
vase7|bulge10.736848
vase7|concavity10.756386
vase80.8484850.90603
vase8|broken0.60.979162
vase8|bulge0.8857140.909134
vase8|concavity0.9904760.958211
vase8|crak0.8333330.759614
vase8|hole0.7666670.559733
vase8|scratch0.5666670.69685
vase90.8787880.821715
vase9|broken0.8666670.986422
vase9|bulge0.8666670.825208
vase9|concavity0.8952380.840287
vase9|crak0.9333330.338621
vase9|hole0.90.646975
vase9|scratch0.80.877198
mean|bending0.9428570.883997
mean|broken0.850.725427
mean|bulge0.9171430.82074
mean|concavity0.9326190.845188
mean|crak0.9153850.444732
mean|hole0.8666670.609548
mean|scratch0.841520.660566
mean0.9205270.813001

2.5 MulSen-AD

Download the dataset from here and process following this guide.

Set dataset paths in ./experiments/MulSen-AD/config.yaml.

Training/Evaluation:

cd ./experiments/MulSen-AD/
sh train.sh 1 O # or sh eval.sh 1 0

Note: Multi-GPU training is not supported for evaluation, set saver.load_path in config.yaml.