File size: 2,056 Bytes
88b0dcb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
""" 
@Date: 2021/08/02
@description:
The 2DIoU for calculating the visible and full boundaries, such as the MP3D dataset,
has the following data: {'train': 0.9775843958583535, 'test': 0.9828616219607289, 'val': 0.9883810438132491},
indicating that our best performance is limited to below 98.29% 2DIoU using our approach.
"""
import numpy as np
import matplotlib.pyplot as plt

from tqdm import tqdm
from evaluation.iou import calc_IoU_2D
from visualization.floorplan import draw_iou_floorplan
from utils.conversion import depth2xyz, uv2xyz


def eval_dataset_visible_IoU(dataset, show=False):
    bar = tqdm(dataset, total=len(dataset), ncols=100)
    iou2ds = []
    for data in bar:
        bar.set_description(f"Processing {data['id']}")
        corners = data['corners']
        corners = corners[corners[..., 0] + corners[..., 1] != 0]  # Take effective corners
        all_xz = uv2xyz(corners)[..., ::2]
        visible_xz = depth2xyz(data['depth'])[..., ::2]
        iou2d = calc_IoU_2D(all_xz, visible_xz)
        iou2ds.append(iou2d)
        if show:
            layout_floorplan = draw_iou_floorplan(all_xz, visible_xz, iou2d=iou2d)
            plt.imshow(layout_floorplan)
            plt.show()

    mean_iou2d = np.array(iou2ds).mean()
    return mean_iou2d


def execute_eval_dataset_visible_IoU(root_dir, dataset, modes=None):
    if modes is None:
        modes = ["train", "test", "valid"]

    iou2d_d = {}
    for mode in modes:
        print("mode: {}".format(mode))
        iou2d = eval_dataset_visible_IoU(dataset(root_dir, mode, patch_num=1024,
                                                 keys=['depth', 'visible_corners', 'corners', 'id']), show=False)
        iou2d_d[mode] = iou2d
    return iou2d_d


if __name__ == '__main__':
    from dataset.mp3d_dataset import MP3DDataset

    iou2d_d = execute_eval_dataset_visible_IoU(root_dir='../src/dataset/mp3d',
                                               dataset=MP3DDataset,
                                               modes=['train', 'test', 'val'])
    print(iou2d_d)