Mapper / mia /misc_tools /vis_samples.py
Cherie Ho
Initial upload
fd01725
import argparse
import os
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
from matplotlib.patches import Patch
import pandas as pd
import numpy as np
import tqdm
from ..bev.get_bev import mask2rgb, PRETTY_COLORS as COLORS, VIS_ORDER
from ..fpv.filters import haversine_np, angle_dist
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--dataset_dir", '-d', type=str, required=True, help="Dataset directory")
parser.add_argument("--locations", '-l', type=str, default="all",
help="Location names in CSV format. Set to 'all' to traverse all locations.")
parser.add_argument("--rows", type=int, default=5, help="How many samples per PDF page")
parser.add_argument("--n_samples", type=int, default=30, help="How many samples to visualize?")
parser.add_argument("--store_sat", action="store_true", help="Add sattelite column")
args = parser.parse_args()
MAX_ROWS = args.rows
MAX_COLS = 4 if args.store_sat else 3
MAX_TEXT_LEN=30
locations = list()
if args.locations.lower() == "all":
locations = os.listdir(args.dataset_dir)
locations = [l for l in locations if os.path.isdir(os.path.join(args.dataset_dir, l))]
else:
locations = args.locations.split(",")
print(f"Parsing {len(locations)} locations..")
all_locs_stats = dict()
for location in tqdm.tqdm(locations):
dataset_dir = Path(args.dataset_dir)
location_dir = dataset_dir / location
semantic_mask_dir = location_dir / "semantic_masks"
sat_dir = location_dir / "sattelite"
comp_dir = location_dir / "images"
pq_name = 'image_metadata_filtered_processed.parquet'
df = pd.read_parquet(location_dir / pq_name)
# Calc derrivative attributes
df["loc_descrip"] = haversine_np(
lon1=df["geometry.long"], lat1=df["geometry.lat"],
lon2=df["computed_geometry.long"], lat2=df["computed_geometry.lat"]
)
df["angle_descrip"] = angle_dist(
df["compass_angle"],
df["computed_compass_angle"]
)
with PdfPages(location_dir / 'compare.pdf') as pdf:
# Plot legend page
plt.figure()
key2mask_i = dict(zip(COLORS.keys(), range(len(COLORS))))
patches = [Patch(color=COLORS[key], label=f"{key}") for i,key in enumerate(VIS_ORDER) if COLORS[key] is not None]
plt.legend(handles=patches, loc='center', title='Legend')
plt.axis("off")
plt.tight_layout()
pdf.savefig()
plt.close()
# Plot pairs
row_cnt = 0
fig = plt.figure(figsize=(MAX_COLS*2, MAX_ROWS*2))
for index, row in tqdm.tqdm(df.iterrows()):
id = row["id"]
mask_fp = semantic_mask_dir / f"{id}.npz"
comp_fp = comp_dir / f"{id}_undistorted.jpg"
sat_fp = sat_dir / f"{id}.png"
if not os.path.exists(mask_fp) or not os.path.exists(comp_fp) or \
(args.store_sat and not os.path.exists(sat_fp)):
continue
plt.subplot(MAX_ROWS, MAX_COLS, (row_cnt % MAX_ROWS)*MAX_COLS + 1)
plt.axis("off")
desc = list()
# Display attributes
keys = ["geometry.long", "geometry.lat", "compass_angle",
"loc_descrip", "angle_descrip",
"make", "model", "camera_type",
"quality_score"]
for k in keys:
v = row[k]
if isinstance(v, float):
v = f"{v:.4f}"
bullet = f"{k}: {v}"
if len(bullet) > MAX_TEXT_LEN:
bullet = bullet[:MAX_TEXT_LEN-2] + ".."
desc.append(bullet)
plt.text(0,0, "\n".join(desc), fontsize=7)
plt.title(id)
plt.subplot(MAX_ROWS, MAX_COLS, (row_cnt % MAX_ROWS)*MAX_COLS + 2)
mask = np.load(mask_fp)["arr_0"]
mask_rgb = mask2rgb(mask)
plt.imshow(mask_rgb); plt.axis("off")
plt.title(f"BEV")
H,W,_ = mask_rgb.shape
plt.scatter(np.array([H/2]), np.array([W/2]), marker="x")
plt.subplot(MAX_ROWS, MAX_COLS, (row_cnt % MAX_ROWS)*MAX_COLS + 3)
plt.imshow(plt.imread(comp_fp)); plt.axis("off")
plt.title(f"FPV")
if args.store_sat:
sat_fp = sat_dir / f"{id}.png"
plt.subplot(MAX_ROWS, MAX_COLS, (row_cnt % MAX_ROWS)*MAX_COLS + 4)
plt.imshow(plt.imread(sat_fp)); plt.axis("off")
plt.title(f"SAT")
row_cnt += 1
if row_cnt % MAX_ROWS == 0:
#plt.suptitle(location)
plt.tight_layout()
fig.align_titles()
pdf.savefig()
plt.close()
fig = plt.figure(figsize=(MAX_COLS*2, MAX_ROWS*2))
if row_cnt == args.n_samples:
break