Skip to content

Commit a572fa1

Browse files
committed
Load cognata validation set from csv file
-includes script to generate data splits
1 parent 908a2a1 commit a572fa1

File tree

12 files changed

+148
-52
lines changed

12 files changed

+148
-52
lines changed

automotive/2d-object-detection/accuracy_cognata.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99
import pprint
1010
import numpy as np
1111
from cognata import collate_fn, Cognata, prepare_cognata, train_val_split
12+
import cognata_labels
1213
from transform import SSDTransformer
1314
import importlib
1415
import torch
15-
from utils import generate_dboxes, Encoder
16+
from utils import generate_dboxes, read_dataset_csv
1617
from torchmetrics.detection.mean_ap import MeanAveragePrecision
1718
# pylint: disable=missing-docstring
1819

@@ -25,7 +26,7 @@ def get_args():
2526
required=True,
2627
help="path to mlperf_log_accuracy.json")
2728
parser.add_argument(
28-
"--cognata-dir",
29+
"--dataset-path",
2930
required=True,
3031
help="cognata dataset directory")
3132
parser.add_argument(
@@ -51,25 +52,26 @@ def main():
5152
with open(args.mlperf_accuracy_file, "r") as f:
5253
results = json.load(f)
5354

54-
detections = {}
55-
image_ids = set()
5655
seen = set()
57-
no_results = 0
5856
config = importlib.import_module('config.' + args.config)
5957
folders = config.dataset['folders']
6058
cameras = config.dataset['cameras']
6159
ignore_classes = [2, 25, 31]
6260
if 'ignore_classes' in config.dataset:
6361
ignore_classes = config.dataset['ignore_classes']
64-
files, label_map, label_info = prepare_cognata(
65-
args.cognata_dir, folders, cameras, ignore_classes)
66-
files = train_val_split(files)
62+
if config.dataset['use_label_file']:
63+
label_map = cognata_labels.label_map
64+
label_info = cognata_labels.label_info
65+
else:
66+
_, label_map, label_info = prepare_cognata(args.dataset_path, folders, cameras)
67+
files = read_dataset_csv("val_set.csv")
68+
files = [{'img': os.path.join(args.dataset_path, f['img']), 'ann': os.path.join(args.dataset_path, f['ann'])} for f in files]
6769
dboxes = generate_dboxes(config.model, model="ssd")
6870
image_size = config.model['image_size']
6971
val_set = Cognata(
7072
label_map,
7173
label_info,
72-
files['val'],
74+
files,
7375
ignore_classes,
7476
SSDTransformer(
7577
dboxes,

automotive/2d-object-detection/cognata.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,11 @@ def prepare_cognata(root, folders, cameras, ignore_classes=[2, 25, 31]):
181181
return files, label_map, label_info
182182

183183

184-
def train_val_split(files):
184+
def train_val_split(files, calibration_length=200):
185185
random.Random(5).shuffle(files)
186186
val_index = round(len(files) * 0.8)
187-
return {'train': files[:val_index], 'val': files[val_index:]}
187+
calibration_index = len(files) - calibration_length
188+
return {'train': files[:val_index], 'val': files[val_index:calibration_index], 'calibration': files[calibration_index:]}
188189

189190

190191
class PostProcessCognata:
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import argparse
2+
import importlib
3+
from cognata import Cognata, prepare_cognata, train_val_split
4+
import csv
5+
6+
def get_args():
7+
parser = argparse.ArgumentParser()
8+
parser.add_argument("--config", help="config file")
9+
parser.add_argument(
10+
"--dataset-path",
11+
required=True,
12+
help="path to the dataset")
13+
parser.add_argument(
14+
"--calibration-size",
15+
default=200,
16+
type=int,
17+
help="number of items in calibration dataset",
18+
)
19+
args = parser.parse_args()
20+
return args
21+
22+
def write_data_to_csv(file_path, files):
23+
with open(file_path, mode='w', newline='') as csv_file:
24+
writer = csv.writer(csv_file)
25+
writer.writerow(['img', 'ann'])
26+
for file in files:
27+
writer.writerow([file['img'], file['ann']])
28+
29+
def main():
30+
args = get_args()
31+
config = importlib.import_module('config.' + args.config)
32+
folders = config.dataset['folders']
33+
cameras = config.dataset['cameras']
34+
files, label_map, label_info = prepare_cognata(
35+
args.dataset_path, folders, cameras)
36+
files = train_val_split(files, args.calibration_size)
37+
for file_set in files.values():
38+
for file in file_set:
39+
file['img'] = file['img'].replace(args.dataset_path, '')
40+
file['ann'] = file['ann'].replace(args.dataset_path, '')
41+
write_data_to_csv('val_set.csv', files['val'])
42+
write_data_to_csv('calibration_set.csv', files['calibration'])
43+
44+
main()

automotive/2d-object-detection/config/baseline_8MP_ss_scales_fm1_5x5_all.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,13 @@
4141
)
4242

4343
dataset = dict(
44-
folders=['10001_Urban_Clear_Noon'],
45-
cameras=[
46-
'Cognata_Camera_01_8M',
47-
'Cognata_Camera_02_8M',
48-
'Cognata_Camera_03_8M'],
49-
use_label_file=True
50-
)
51-
52-
'''folders = ['10001_Urban_Clear_Noon', '10002_Urban_Clear_Morning', '10003_Urban_Clear_Noon', '10004_Urban_Clear_Noon', '10005_Urban_Clear_Noon',
44+
folders = ['10001_Urban_Clear_Noon', '10002_Urban_Clear_Morning', '10003_Urban_Clear_Noon', '10004_Urban_Clear_Noon', '10005_Urban_Clear_Noon',
5345
'10006_Urban_Clear_Noon', '10007_Highway_Clear_Morning', '10008_Highway_Clear_Noon', '10009_Urban_Rain_Morning', '10010_Urban_Rain_Morning', '10011_Urban_Rain_Evening',
5446
'10012_Urban_Rain_Evening', '10013_Highway_Rain_Morning', '10014_Highway_Rain_Noon', '10015_Highway_Clear_Evening', '10016_Highway_Clear_Evening',
5547
'10017_Urban_Rain_Evening', '10018_Urban_Rain_Evening', '10019_Urban_HeavyRain_Noon', '10020_Urban_HeavyRain_Afternoon', '10021_Urban_Clear_Morning', '10022_Urban_Clear_Morning',
5648
'10023_Urban_Rain_Morning', '10024_Urban_Rain_Evening', '10025_Urban_HeavyRain_Evening', '10026_Urban_HeavyRain_Afternoon'],
57-
cameras = ['Cognata_Camera_01_8M', 'Cognata_Camera_02_8M', 'Cognata_Camera_03_8M']'''
49+
cameras = ['Cognata_Camera_01_8M', 'Cognata_Camera_02_8M', 'Cognata_Camera_03_8M'],
50+
use_label_file=True
51+
)
52+
53+

automotive/2d-object-detection/main.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@
2020
import mlperf_loadgen as lg
2121
import numpy as np
2222
import torch
23-
23+
import csv
2424
import dataset
2525
import cognata
2626
from transform import SSDTransformer
2727
import importlib
28-
from utils import generate_dboxes, Encoder
28+
from utils import generate_dboxes, Encoder, read_dataset_csv
2929
from cognata import Cognata, prepare_cognata, train_val_split
3030
import cognata_labels
3131

@@ -300,7 +300,6 @@ def finish(self):
300300
for worker in self.workers:
301301
worker.join()
302302

303-
304303
def main():
305304
args = get_args()
306305

@@ -311,12 +310,15 @@ def main():
311310
transformer = SSDTransformer(dboxes, image_size, val=True)
312311
folders = config.dataset['folders']
313312
cameras = config.dataset['cameras']
314-
files, label_map, label_info = prepare_cognata(
315-
args.dataset_path, folders, cameras)
316-
files = train_val_split(files)
313+
317314
if config.dataset['use_label_file']:
318315
label_map = cognata_labels.label_map
319316
label_info = cognata_labels.label_info
317+
else:
318+
_, label_map, label_info = prepare_cognata(args.dataset_path, folders, cameras)
319+
320+
files = read_dataset_csv("val_set.csv")
321+
files = [{'img': os.path.join(args.dataset_path, f['img']), 'ann': os.path.join(args.dataset_path, f['ann'])} for f in files]
320322
# find backend
321323
backend = get_backend(
322324
# TODO: pass model, inference and backend arguments
@@ -349,7 +351,7 @@ def main():
349351
ds = dataset_class(
350352
label_map=label_map,
351353
label_info=label_info,
352-
files=files['val'],
354+
files=files,
353355
ignore_classes=[2, 25, 31],
354356
transform=transformer)
355357

automotive/2d-object-detection/utils.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import numpy as np
2828
import itertools
2929
from math import sqrt
30-
30+
import csv
3131
import torch
3232
import torch.nn.functional as F
3333
from torchvision.ops.boxes import box_iou, box_convert
@@ -218,3 +218,11 @@ def generate_dboxes(config, model="ssd"):
218218
aspect_ratios = [[2,3], [2, 3], [2, 3], [2, 3], [2,3], [2,3]]
219219
dboxes = DefaultBoxes(figsize, feat_size, steps, scales, aspect_ratios)
220220
return dboxes
221+
222+
def read_dataset_csv(file_path):
223+
files = []
224+
with open(file_path, mode='r') as csv_file:
225+
csv_reader = csv.DictReader(csv_file)
226+
for row in csv_reader:
227+
files.append(row)
228+
return files

automotive/semantic-segmentation/accuracy_cognata.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
"""
66
import argparse
77
import json
8+
import os
89
import numpy as np
910
from cognata import Cognata, prepare_cognata, train_val_split
1011
import torch
1112
import cognata_scenarios
12-
from utils import StreamSegMetrics
13+
from utils import StreamSegMetrics, read_dataset_csv
1314
from utils import ext_transforms as et
1415
# pylint: disable=missing-docstring
1516

@@ -22,7 +23,7 @@ def get_args():
2223
required=True,
2324
help="path to mlperf_log_accuracy.json")
2425
parser.add_argument(
25-
"--cognata-dir",
26+
"--dataset-path",
2627
required=True,
2728
help="cognata dataset directory")
2829
parser.add_argument(
@@ -55,25 +56,20 @@ def main():
5556
with open(args.mlperf_accuracy_file, "r") as f:
5657
results = json.load(f)
5758

58-
detections = {}
59-
image_ids = set()
6059
seen = set()
61-
no_results = 0
6260
num_classes = 19
6361
metrics = StreamSegMetrics(num_classes)
6462
metrics.reset()
65-
files = prepare_cognata(args.cognata_dir, cognata_scenarios.folders, cognata_scenarios.cameras)
66-
split = train_val_split(files)
63+
files = read_dataset_csv("val_set.csv")
64+
files = [{'img': os.path.join(args.dataset_path, f['img']), 'label': os.path.join(args.dataset_path, f['label'])} for f in files]
6765
image_size = args.image_size
6866
val_transform = et.ExtCompose([
6967
et.ExtResize((image_size[0], image_size[1])),
7068
et.ExtToTensor(),
7169
et.ExtNormalize(mean=[0.485, 0.456, 0.406],
7270
std=[0.229, 0.224, 0.225]),
7371
])
74-
val_loader = Cognata(split['val'], transform=val_transform)
75-
preds = []
76-
targets = []
72+
val_loader = Cognata(files, transform=val_transform)
7773
for j in results:
7874
idx = j['qsl_idx']
7975
# de-dupe in case loadgen sends the same image multiple times

automotive/semantic-segmentation/cognata.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ def prepare_cognata(root, folders, cameras):
2424

2525
return files
2626

27-
def train_val_split(files):
27+
def train_val_split(files, calibration_length=200):
2828
random.Random(5).shuffle(files)
29-
val_index = round(len(files)*0.8)
30-
return {'train': files[:val_index], 'val': files[val_index:]}
29+
val_index = round(len(files) * 0.8)
30+
calibration_index = len(files) - calibration_length
31+
return {'train': files[:val_index], 'val': files[val_index:calibration_index], 'calibration': files[calibration_index:]}
3132

3233
class Cognata(dataset.Dataset):
3334
CognataClass = namedtuple('CognataClass', ['name', 'id', 'train_id', 'color'])
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import argparse
2+
import importlib
3+
from cognata import Cognata, prepare_cognata, train_val_split
4+
import cognata_scenarios
5+
import csv
6+
7+
def get_args():
8+
parser = argparse.ArgumentParser()
9+
parser.add_argument(
10+
"--dataset-path",
11+
required=True,
12+
help="path to the dataset")
13+
parser.add_argument(
14+
"--calibration-size",
15+
default=200,
16+
type=int,
17+
help="number of items in calibration dataset",
18+
)
19+
args = parser.parse_args()
20+
return args
21+
22+
def write_data_to_csv(file_path, files):
23+
with open(file_path, mode='w', newline='') as csv_file:
24+
writer = csv.writer(csv_file)
25+
writer.writerow(['img', 'label'])
26+
for file in files:
27+
writer.writerow([file['img'], file['label']])
28+
29+
def main():
30+
args = get_args()
31+
files = prepare_cognata(
32+
args.dataset_path, cognata_scenarios.folders, cognata_scenarios.cameras)
33+
files = train_val_split(files, args.calibration_size)
34+
for file_set in files.values():
35+
for file in file_set:
36+
file['img'] = file['img'].replace(args.dataset_path, '')
37+
file['label'] = file['label'].replace(args.dataset_path, '')
38+
write_data_to_csv('val_set.csv', files['val'])
39+
write_data_to_csv('calibration_set.csv', files['calibration'])
40+
41+
main()
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11

2-
'''folders = ['10001_Urban_Clear_Noon', '10002_Urban_Clear_Morning', '10003_Urban_Clear_Noon', '10004_Urban_Clear_Noon', '10005_Urban_Clear_Noon',
2+
folders = ['10001_Urban_Clear_Noon', '10002_Urban_Clear_Morning', '10003_Urban_Clear_Noon', '10004_Urban_Clear_Noon', '10005_Urban_Clear_Noon',
33
'10006_Urban_Clear_Noon', '10007_Highway_Clear_Morning', '10008_Highway_Clear_Noon', '10009_Urban_Rain_Morning', '10010_Urban_Rain_Morning', '10011_Urban_Rain_Evening',
44
'10012_Urban_Rain_Evening', '10013_Highway_Rain_Morning', '10014_Highway_Rain_Noon', '10015_Highway_Clear_Evening', '10016_Highway_Clear_Evening',
55
'10017_Urban_Rain_Evening', '10018_Urban_Rain_Evening', '10019_Urban_HeavyRain_Noon', '10020_Urban_HeavyRain_Afternoon', '10021_Urban_Clear_Morning', '10022_Urban_Clear_Morning',
66
'10023_Urban_Rain_Morning', '10024_Urban_Rain_Evening', '10025_Urban_HeavyRain_Evening', '10026_Urban_HeavyRain_Afternoon']
7-
cameras = ['Cognata_Camera_01_8M', 'Cognata_Camera_02_8M', 'Cognata_Camera_03_8M']'''
8-
folders = ['10001_Urban_Clear_Noon']
97
cameras = ['Cognata_Camera_01_8M', 'Cognata_Camera_02_8M', 'Cognata_Camera_03_8M']

0 commit comments

Comments
 (0)