This repository was archived by the owner on Feb 26, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathevaluate_IR_FMR.py
63 lines (49 loc) · 2.33 KB
/
evaluate_IR_FMR.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import os
os.environ['CUDA_DEVICE_ORDER']='PCI_BUS_ID'
os.environ['CUDA_VISIBLE_DEVICES']='0'
import json
import torch
import argparse
from munch import munchify
from torch.utils.data import DataLoader
from data.indoor_data import IndoorTestDataset
from engine.trainer import EpochBasedTrainer
from models.models.cast import CAST
from engine.evaluator import Evaluator
parser = argparse.ArgumentParser()
parser.add_argument("--benchmark", default='3DMatch', choices=['3DMatch', '3DLoMatch'])
parser.add_argument("--config", default='./config/3dmatch.json', type=str)
parser.add_argument("--load_pretrained", default='cast-epoch-05', type=str)
parser.add_argument("--ransac", default=False, action="store_true")
_args = parser.parse_args()
class Tester(EpochBasedTrainer):
def __init__(self, cfg):
super().__init__(cfg)
val_dataset = IndoorTestDataset(cfg.data.root, _args.benchmark, cfg.data.npoints, cfg.data.voxel_size, cfg.data_list)
self.val_loader = DataLoader(val_dataset, 1, num_workers=cfg.data.num_workers, shuffle=False, pin_memory=True)
self.model = CAST(cfg.model).cuda()
self.evaluator = Evaluator(cfg.eval).cuda()
def step(self, data_dict):
output_dict = self.model(*data_dict[:3])
trans = output_dict['gt_transform']
PIR = self.evaluator.evaluate_coarse_inlier_ratio(output_dict)
results = {'PIR': PIR, 'PMR': PIR.gt(0.2).float()}
indices = torch.argsort(output_dict['corr_confidence'], descending=True)
corr_confidence = output_dict['corr_confidence'][indices]
corres = output_dict['corres'][indices]
indices = indices[corr_confidence.gt(0.1 * corr_confidence[0])]
corres_ = output_dict['corres'][indices]
for num in [250, 500, 1000, 2500, 5000]:
results['IR@%d'%num] = self.evaluator.evaluate_inlier_ratio(corres_[:num], trans)
results['FMR@%d'%num] = self.evaluator.evaluate_inlier_ratio(corres[:num], trans).gt(0.05).float()
return results
if __name__ == "__main__":
with open(_args.config, 'r') as cfg:
args = json.load(cfg)
args = munchify(args)
args.model.ransac = False
tester = Tester(args)
tester.set_eval_mode()
tester.load_snapshot(_args.load_pretrained)
# e.g. tester.load_snapshot("cast-epoch-05")
tester.validate_epoch()