Vincentqyw
fix: roma
c74a070
import torch
import numpy as np
import cv2
import os
from loss import batch_episym
from tqdm import tqdm
import sys
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
sys.path.insert(0, ROOT_DIR)
from utils import evaluation_utils, train_utils
def valid(valid_loader, model, match_loss, config, model_config):
model.eval()
loader_iter = iter(valid_loader)
num_pair = 0
total_loss, total_acc_corr, total_acc_incorr = 0, 0, 0
total_precision, total_recall = torch.zeros(
model_config.layer_num, device="cuda"
), torch.zeros(model_config.layer_num, device="cuda")
total_acc_mid = torch.zeros(len(model_config.seedlayer) - 1, device="cuda")
with torch.no_grad():
if config.local_rank == 0:
loader_iter = tqdm(loader_iter)
print("validating...")
for test_data in loader_iter:
num_pair += 1
test_data = train_utils.tocuda(test_data)
res = model(test_data)
loss_res = match_loss.run(test_data, res)
total_acc_corr += loss_res["acc_corr"]
total_acc_incorr += loss_res["acc_incorr"]
total_loss += loss_res["total_loss"]
if config.model_name == "SGM":
total_acc_mid += loss_res["mid_acc_corr"]
total_precision, total_recall = (
total_precision + loss_res["pre_seed_conf"],
total_recall + loss_res["recall_seed_conf"],
)
total_acc_corr /= num_pair
total_acc_incorr /= num_pair
total_precision /= num_pair
total_recall /= num_pair
total_acc_mid /= num_pair
# apply tensor reduction
(
total_loss,
total_acc_corr,
total_acc_incorr,
total_precision,
total_recall,
total_acc_mid,
) = (
train_utils.reduce_tensor(total_loss, "sum"),
train_utils.reduce_tensor(total_acc_corr, "mean"),
train_utils.reduce_tensor(total_acc_incorr, "mean"),
train_utils.reduce_tensor(total_precision, "mean"),
train_utils.reduce_tensor(total_recall, "mean"),
train_utils.reduce_tensor(total_acc_mid, "mean"),
)
model.train()
return (
total_loss,
total_acc_corr,
total_acc_incorr,
total_precision,
total_recall,
total_acc_mid,
)
def dump_train_vis(res, data, step, config):
# batch matching
p = res["p"][:, :-1, :-1]
score, index1 = torch.max(p, dim=-1)
_, index2 = torch.max(p, dim=-2)
mask_th = score > 0.2
mask_mc = index2.gather(index=index1, dim=1) == torch.arange(len(p[0])).cuda()[None]
mask_p = mask_th & mask_mc # B*N
corr1, corr2 = data["x1"], data["x2"].gather(
index=index1[:, :, None].expand(-1, -1, 2), dim=1
)
corr1_kpt, corr2_kpt = data["kpt1"], data["kpt2"].gather(
index=index1[:, :, None].expand(-1, -1, 2), dim=1
)
epi_dis = batch_episym(corr1, corr2, data["e_gt"])
mask_inlier = epi_dis < config.inlier_th # B*N
# dump vis
for cur_mask_p, cur_mask_inlier, cur_corr1, cur_corr2, img_path1, img_path2 in zip(
mask_p, mask_inlier, corr1_kpt, corr2_kpt, data["img_path1"], data["img_path2"]
):
img1, img2 = cv2.imread(img_path1), cv2.imread(img_path2)
dis_play = evaluation_utils.draw_match(
img1,
img2,
cur_corr1[cur_mask_p].cpu().numpy(),
cur_corr2[cur_mask_p].cpu().numpy(),
inlier=cur_mask_inlier,
)
base_name_seq = os.path.join(
img_path1.split("/")[-1]
+ "_"
+ img_path2.split("/")[-1]
+ "_"
+ img_path1.split("/")[-2]
)
save_path = os.path.join(
config.train_vis_folder,
"train_vis",
config.log_base,
str(step),
base_name_seq + ".png",
)
cv2.imwrite(save_path, dis_play)