Skip to content

Commit ca20621

Browse files
committed
refactor: metrics
1 parent 5661790 commit ca20621

File tree

5 files changed

+43
-141
lines changed

5 files changed

+43
-141
lines changed
Lines changed: 2 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -36,47 +36,19 @@
3636

3737
from __future__ import annotations
3838

39-
import argparse
40-
import csv
4139
import json
4240
import os
4341

4442
import numpy as np
4543
import pandas as pd
4644
import utils
4745

48-
4946
# from detectron2.evaluation import COCOEvaluator
5047
from pycocotools.coco import COCO
5148
from pycocotools.cocoeval import COCOeval
5249

53-
from compressai_vision.evaluators.evaluators import BaseEvaluator
54-
5550
CLASSES = ["CLASS-AB", "CLASS-C", "CLASS-D", "CLASS-AB*"]
5651

57-
SEQS_BY_CLASS = {
58-
CLASSES[0]: [
59-
"Traffic_2560x1600_30",
60-
"Kimono_1920x1080_24",
61-
"ParkScene_1920x1080_24",
62-
"Cactus_1920x1080_50",
63-
"BasketballDrive_1920x1080_50",
64-
"BQTerrace_1920x1080_60",
65-
],
66-
CLASSES[1]: [
67-
"BasketballDrill_832x480_50",
68-
"BQMall_832x480_60",
69-
"PartyScene_832x480_50",
70-
"RaceHorses_832x480_832x480_30",
71-
],
72-
CLASSES[2]: [
73-
"BasketballPass_416x240_50",
74-
"BQSquare_416x240_60",
75-
"BlowingBubbles_416x240_50",
76-
"RaceHorses_416x240_30",
77-
],
78-
CLASSES[3]: ["ns_Traffic_2560x1600_30", "ns_BQTerrace_1920x1080_60"],
79-
}
8052

8153
SEQUENCE_TO_OFFSET = {
8254
"Traffic_2560x1600_30": 10000,
@@ -101,7 +73,7 @@
10173
NS_SEQ_PREFIX = "ns_" # Prefix of non-scaled sequences
10274

10375

104-
def compute_overall_mAP(seq_root_names, items):
76+
def compute_per_class_mAP(seq_root_names, items):
10577
classwise_instances_results = []
10678
classwise_anchor_images = []
10779
classwise_annotation = []
@@ -158,10 +130,6 @@ def compute_overall_mAP(seq_root_names, items):
158130
os.remove(TMP_EVAL_FILE)
159131
os.remove(TMP_ANCH_FILE)
160132

161-
# print("\n")
162-
# print(summary)
163-
# print("\n")
164-
165133
return summary
166134

167135

@@ -179,80 +147,10 @@ def coco_evaluation(ann_file, detections):
179147
coco_eval.accumulate()
180148
coco_eval.summarize()
181149

182-
import logging
183150

184151
headers = ["AP", "AP50", "AP75", "APS", "APM", "APL"]
185152
npstat = np.array(coco_eval.stats[:6])
186153
npstat = npstat * 100 # Percent
187-
# npstat = np.around(npstat, 2)
188154
data_frame = pd.DataFrame([npstat], columns=headers)
189155

190-
return data_frame
191-
192-
193-
if __name__ == "__main__":
194-
parser = argparse.ArgumentParser()
195-
196-
parser.add_argument(
197-
"-r",
198-
"--result_path",
199-
required=True,
200-
help="For example, '.../logs/runs/[pipeline]/[codec]/[datacatalog]/' ",
201-
)
202-
parser.add_argument(
203-
"-q",
204-
"--quality_index",
205-
required=False,
206-
default=-1,
207-
type=int,
208-
help="Provide index of quality folders under the `result_path'. quality_index is only meant to point the orderd folders by qp names because there might be different range of qps are used for different sequences",
209-
)
210-
parser.add_argument(
211-
"-a",
212-
"--all_qualities",
213-
action="store_true",
214-
help="run all 6 rate points in MPEG CTCs",
215-
)
216-
parser.add_argument(
217-
"-d",
218-
"--dataset_path",
219-
required=True,
220-
help="For example, '.../vcm_testdata/[dataset]' ",
221-
)
222-
parser.add_argument(
223-
"-c",
224-
"--class_to_compute",
225-
type=str,
226-
choices=CLASSES,
227-
required=True,
228-
)
229-
230-
args = parser.parse_args()
231-
if args.all_qualities:
232-
qualities = range(0, 6)
233-
else:
234-
qualities = [args.quality_index]
235-
236-
with open(
237-
f"{args.result_path}/{args.class_to_compute}.csv", "w", newline=""
238-
) as file:
239-
writer = csv.writer(file)
240-
for q in qualities:
241-
items = utils.search_items(
242-
args.result_path,
243-
args.dataset_path,
244-
q,
245-
SEQS_BY_CLASS[args.class_to_compute],
246-
BaseEvaluator.get_coco_eval_info_name,
247-
)
248-
249-
assert (
250-
len(items) > 0
251-
), "Nothing relevant information found from given directories..."
252-
253-
summary = compute_overall_mAP(SEQS_BY_CLASS[args.class_to_compute], items)
254-
255-
writer.writerow([f"{q}", f"{summary['AP'][0]:.4f}"])
256-
print(f"{'=' * 10} FINAL OVERALL mAP SUMMARY {'=' * 10}")
257-
print(f"{'-' * 32} AP : {summary['AP'][0]:.4f}")
258-
print("\n\n")
156+
return data_frame
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
import json
4040

41-
def compute_overall_mIoU(class_name, items):
41+
def compute_per_class_mIoU(items):
4242
miou_acc = 0.0
4343
for item in items:
4444
with open(item["eval_info"], "r") as f:
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@
4444

4545
from compressai_vision.evaluators.evaluators import MOT_JDE_Eval
4646

47+
CLASSES = ["TVD", "HIEVE-1080P", "HIEVE-720P"]
48+
49+
SEQS_BY_CLASS = {
50+
CLASSES[0]: ["TVD-01", "TVD-02", "TVD-03"],
51+
CLASSES[1]: ["HIEVE-13", "HIEVE-16"],
52+
CLASSES[2]: ["HIEVE-2", "HIEVE-17", "HIEVE-18"],
53+
}
54+
4755

4856
def get_accumulator_res_for_tvd(item: Dict):
4957
_gt_pd = MOT_JDE_Eval._load_gt_in_motchallenge(item[utils.GT_INFO_KEY])
@@ -67,7 +75,7 @@ def get_accumulator_res_for_hieve(item: Dict):
6775
return acc, None, item[utils.SEQ_NAME_KEY]
6876

6977

70-
def compute_overall_mota(class_name, items):
78+
def compute_per_class_mota(class_name, items):
7179
get_accumulator_res = {
7280
CLASSES[0]: get_accumulator_res_for_tvd,
7381
CLASSES[1]: get_accumulator_res_for_hieve,

scripts/metrics/gen_mpeg_cttc_csv.py

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@
4444
import pandas as pd
4545
import utils
4646

47-
from compute_overall_map import compute_overall_mAP
48-
from compute_overall_miou import compute_overall_mIoU
49-
from compute_overall_mot import compute_overall_mota
47+
from compute_per_class_mAP import compute_per_class_mAP
48+
from compute_per_class_mIoU import compute_per_class_mIoU
49+
from compute_per_class_mota import compute_per_class_mota
5050
from curve_fitting import convert_to_monotonic_points_SFU
5151

5252
from compressai_vision.datasets import get_seq_info
@@ -102,18 +102,18 @@ def df_append(df1, df2):
102102
return out
103103

104104

105-
def generate_classwise_df(result_df, classes: dict):
106-
classwise = pd.DataFrame(columns=result_df.columns)
107-
classwise.drop(columns=["fps", "num_of_coded_frame"], inplace=True)
105+
def generate_class_df(result_df, classes: dict):
106+
class_data = pd.DataFrame(columns=result_df.columns)
107+
class_data.drop(columns=["fps", "num_of_coded_frame"], inplace=True)
108108

109109
for tag, item in classes.items():
110-
output = compute_class_wise_results(result_df, tag, item)
111-
classwise_df = df_append(classwise, output)
110+
output = compute_per_class_results(result_df, tag, item)
111+
classwise_df = df_append(class_data, output)
112112

113113
return classwise_df
114114

115115

116-
def compute_class_wise_results(result_df, name, sequences):
116+
def compute_per_class_results(result_df, name, sequences):
117117
samples = None
118118
num_points = prev_num_points = -1
119119
output = pd.DataFrame(columns=result_df.columns)
@@ -168,7 +168,7 @@ def compute_class_wise_results(result_df, name, sequences):
168168
def generate_csv_classwise_video_map(
169169
result_path,
170170
dataset_path,
171-
dict_of_classwise_seq,
171+
dict_of_class_seq,
172172
metric="AP",
173173
gt_folder="annotations",
174174
nb_operation_points: int = 4,
@@ -177,7 +177,7 @@ def generate_csv_classwise_video_map(
177177
dataset_prefix: str = None,
178178
):
179179
seq_list = []
180-
[seq_list.extend(sequences) for sequences in dict_of_classwise_seq.values()]
180+
[seq_list.extend(sequences) for sequences in dict_of_class_seq.values()]
181181

182182
opts_metrics = {"AP": 0, "AP50": 1, "AP75": 2, "APS": 3, "APM": 4, "APL": 5}
183183
results_df = read_df_rec(result_path, dataset_prefix, seq_list, nb_operation_points)
@@ -192,14 +192,14 @@ def generate_csv_classwise_video_map(
192192
## drop columns
193193
output_df.drop(columns=["fps", "num_of_coded_frame"], inplace=True)
194194

195-
for classwise_name, classwise_seqs in dict_of_classwise_seq.items():
195+
for class_name, class_seqs in dict_of_class_seq.items():
196196
class_wise_maps = []
197197
for q in range(nb_operation_points):
198198
items = utils.search_items(
199199
result_path,
200200
dataset_path,
201201
q,
202-
classwise_seqs,
202+
class_seqs,
203203
BaseEvaluator.get_coco_eval_info_name,
204204
by_name=True,
205205
gt_folder=gt_folder,
@@ -212,15 +212,15 @@ def generate_csv_classwise_video_map(
212212
), "No evaluation information found in provided result directories..."
213213

214214
if not skip_classwise:
215-
summary = compute_overall_mAP(
216-
dict_of_classwise_seq[classwise_name], items
215+
summary = compute_per_class_mAP(
216+
dict_of_class_seq[class_name], items
217217
)
218218
maps = summary.values[0][opts_metrics[metric]]
219219
class_wise_maps.append(maps)
220220

221221
if not skip_classwise and nb_operation_points > 0:
222-
class_wise_results_df = generate_classwise_df(
223-
results_df, {classwise_name: classwise_seqs}
222+
class_wise_results_df = generate_class_df(
223+
results_df, {class_name: class_seqs}
224224
)
225225
class_wise_results_df["end_accuracy"] = class_wise_maps
226226

@@ -232,12 +232,12 @@ def generate_csv_classwise_video_map(
232232
def generate_csv_classwise_video_mota(
233233
result_path,
234234
dataset_path,
235-
dict_of_classwise_seq,
235+
dict_of_class_seq,
236236
nb_operation_points: int = 4,
237237
dataset_prefix: str = None,
238238
):
239239
seq_list = []
240-
[seq_list.extend(sequences) for sequences in dict_of_classwise_seq.values()]
240+
[seq_list.extend(sequences) for sequences in dict_of_class_seq.values()]
241241

242242
results_df = read_df_rec(result_path, dataset_prefix, seq_list, nb_operation_points)
243243
results_df = results_df.sort_values(by=["Dataset", "qp"], ascending=[True, True])
@@ -249,29 +249,29 @@ def generate_csv_classwise_video_mota(
249249
## drop columns
250250
output_df.drop(columns=["fps", "num_of_coded_frame"], inplace=True)
251251

252-
for classwise_name, classwise_seqs in dict_of_classwise_seq.items():
252+
for class_name, class_seqs in dict_of_class_seq.items():
253253
class_wise_motas = []
254254
for q in range(nb_operation_points):
255255
items = utils.search_items(
256256
result_path,
257257
dataset_path,
258258
q,
259-
classwise_seqs,
259+
class_seqs,
260260
BaseEvaluator.get_jde_eval_info_name,
261261
)
262262

263263
assert (
264264
len(items) > 0
265265
), "Nothing relevant information found from given directories..."
266266

267-
summary, _ = compute_overall_mota(classwise_name, items)
267+
summary, _ = compute_per_class_mota(class_name, items)
268268

269269
mota = summary.values[-1][13] * 100.0
270270
class_wise_motas.append(mota)
271271

272272
if nb_operation_points > 0:
273-
class_wise_results_df = generate_classwise_df(
274-
results_df, {classwise_name: classwise_seqs}
273+
class_wise_results_df = generate_class_df(
274+
results_df, {class_name: class_seqs}
275275
)
276276

277277
class_wise_results_df["end_accuracy"] = class_wise_motas
@@ -284,12 +284,11 @@ def generate_csv_classwise_video_mota(
284284
def generate_csv_classwise_video_miou(
285285
result_path,
286286
dataset_path,
287-
dict_of_classwise_seq,
287+
dict_of_class_seq,
288288
nb_operation_points: int = 4,
289-
dataset_prefix: str = None,
290289
):
291290
seq_list = []
292-
[seq_list.extend(sequences) for sequences in dict_of_classwise_seq.values()]
291+
[seq_list.extend(sequences) for sequences in dict_of_class_seq.values()]
293292

294293
results_df = read_df_rec(result_path, "", seq_list, nb_operation_points)
295294

@@ -303,14 +302,14 @@ def generate_csv_classwise_video_miou(
303302
## drop columns
304303
output_df.drop(columns=["fps", "num_of_coded_frame"], inplace=True)
305304

306-
for classwise_name, classwise_seqs in dict_of_classwise_seq.items():
305+
for class_name, class_seqs in dict_of_class_seq.items():
307306
class_wise_mious = []
308307
for q in range(nb_operation_points):
309308
items = utils.search_items(
310309
result_path,
311310
dataset_path,
312311
q,
313-
classwise_seqs,
312+
class_seqs,
314313
BaseEvaluator.get_miou_eval_info_name,
315314
by_name=True,
316315
pandaset_flag=True,
@@ -320,16 +319,16 @@ def generate_csv_classwise_video_miou(
320319
len(items) > 0
321320
), "Nothing relevant information found from given directories..."
322321

323-
miou = compute_overall_mIoU(classwise_name, items)
322+
miou = compute_per_class_mIoU(class_name, items)
324323
class_wise_mious.append(miou)
325324

326325
matched_seq_names = []
327326
for seq_info in items:
328327
name, _, _ = get_seq_info(seq_info[utils.SEQ_INFO_KEY])
329328
matched_seq_names.append(name)
330329

331-
class_wise_results_df = generate_classwise_df(
332-
results_df, {classwise_name: classwise_seqs}
330+
class_wise_results_df = generate_class_df(
331+
results_df, {class_name: class_seqs}
333332
)
334333

335334
class_wise_results_df["end_accuracy"] = class_wise_mious

scripts/metrics/utils.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,9 @@
4040
import re
4141

4242
from pathlib import Path
43-
from typing import Dict, Optional
4443

4544
__all__ = [
4645
"get_seq_number",
47-
# "get_eval_info_path",
48-
# "get_seq_info_path",
4946
]
5047

5148
SEQ_NAME_KEY = "seq_name"

0 commit comments

Comments
 (0)