| 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)
|
|
|
|
|
| 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:
|
|
|
| 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()
|
|
|
|
|
| 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()
|
|
|
|
|
| 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.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 |