Spaces:
Sleeping
Sleeping
import torch | |
import numpy as np | |
from utils import BoxMetrics, concat_labels, concat_preds | |
import fiftyone as fo | |
from seametrics.fo_utils.utils import fo_to_payload | |
from const import INDEX_MAPPING, CLASS_MAPPING, INDEX_MAPPING_INV | |
from tqdm import tqdm | |
tags = ["WHALES"] | |
cameras = ["thermal_narrow"] | |
dataset_name = "SENTRY_VIDEOS_DATASET_QA" | |
#dataset_name = "SENTRY_VIDEOS_DATASET_QA" | |
model = "cerulean-level-17_11_2023_RL_SPLIT_ep147_CNN" | |
det_gt_field = "ground_truth_det" | |
cm = BoxMetrics(nc=10, conf=0, iou_thres=0) | |
if dataset_name == "SAILING_DATASET_QA": | |
cameras = ["thermal_left"] | |
dataset_view = fo.load_dataset(dataset_name).match_tags(tags).select_group_slices(cameras).filter_labels(f"{model}", True, only_matches=False) | |
sequences = dataset_view.distinct("sequence") | |
if dataset_name == "SENTRY_VIDEOS_DATASET_QA": | |
cameras = ["thermal_wide"] | |
dataset_view = fo.load_dataset(dataset_name).match_tags(tags).select_group_slices(cameras).filter_labels(f"frames.{model}", True, only_matches=False) | |
sequences = dataset_view.distinct("sequence") | |
for sequence in tqdm(sequences): | |
payload = fo_to_payload(dataset = dataset_name, | |
gt_field = det_gt_field, | |
models = [model], | |
tracking_mode = True, | |
sequence_list = [sequence], | |
excluded_classes = ["BIRD"],) | |
target = payload["sequences"][sequence][det_gt_field] | |
preds = payload["sequences"][sequence][model] | |
resolution = payload["sequences"][sequence]["resolution"] | |
target_tm = [] | |
preds_tm = [] | |
for frame in target: | |
target_tm_batch = [] | |
for det in frame: | |
if CLASS_MAPPING[det["label"]] is not None: | |
label = INDEX_MAPPING[CLASS_MAPPING[det["label"]]]-1 | |
else: | |
continue | |
box = det["bounding_box"] | |
x1, y1, x2, y2 = box[0], box[1], box[0]+box[2], box[1]+box[3] | |
x1, y1, x2, y2 = x1*resolution[1], y1*resolution[0], x2*resolution[1], y2*resolution[0] | |
target_tm_batch.append([label, x1, y1, x2, y2]) | |
target_tm.append(torch.tensor(target_tm_batch) if len(target_tm_batch) > 0 else torch.empty((0, 5))) | |
for frame in preds: | |
pred_tm_batch = [] | |
for det in frame: | |
label = INDEX_MAPPING[det["label"]]-1 | |
box = det["bounding_box"] | |
x1, y1, x2, y2 = box[0], box[1], box[0]+box[2], box[1]+box[3] | |
x1, y1, x2, y2 = x1*resolution[1], y1*resolution[0], x2*resolution[1], y2*resolution[0] | |
conf = 1 | |
pred_tm_batch.append([x1, y1, x2, y2, conf, label]) | |
preds_tm.append(torch.tensor(pred_tm_batch) if len(pred_tm_batch) > 0 else torch.empty((0, 6))) | |
for i in range(len(target_tm)): | |
target_batch = target_tm[i] | |
pred_batch = preds_tm[i] | |
cm.process_batch(pred_batch, target_batch) | |
print("SUMMARY: ") | |
print("\nmodel: ", model) | |
print("\nconfusion matrix: ") | |
print(cm.matrix.astype(int)) | |
tp = cm.matrix[:-1, :-1].sum() | |
fp = cm.matrix[:-1, -1].sum() | |
fn = cm.matrix[-1, :-1].sum() | |
print("\nTP: ", tp, "FP: ", fp, "FN: ", fn, "support: ", tp + fn) | |
#Detection Rates: | |
print("\nDetection Rates:") | |
for i in range(10): | |
tp = cm.matrix[:-1, i].sum() | |
fn = cm.matrix[-1, i].sum() | |
if tp + fn == 0: | |
print(f"{INDEX_MAPPING_INV[i+1]}: NaN") | |
else: | |
print(f"{INDEX_MAPPING_INV[i+1]}: {tp/(tp+fn)}") |