| import os
|
| import random
|
| import numpy as np
|
| import tensorflow as tf
|
| from pathlib import Path
|
| from tqdm import tqdm
|
| import cv2
|
|
|
|
|
|
|
|
|
| GENERATOR_PATH = "generator_final.h5"
|
| VIS_FOLDER = "data/train/visible"
|
| IR_FOLDER = "data/train/infrared"
|
| SAVE_DIR = "output/train_results"
|
| NUM_SAMPLES = 10
|
| IMG_SIZE = (256, 256)
|
| SEED = 42
|
|
|
|
|
|
|
|
|
| print(f"Loading generator from {GENERATOR_PATH} ...")
|
| generator = tf.keras.models.load_model(GENERATOR_PATH, compile=False)
|
| print("Generator loaded successfully.")
|
|
|
|
|
|
|
|
|
| def load_and_preprocess_image(img_path, target_size=IMG_SIZE):
|
| img = cv2.imread(img_path)
|
| if img is None:
|
| raise FileNotFoundError(f"Image not found: {img_path}")
|
| img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
|
| img = cv2.resize(img, target_size)
|
| img = img.astype(np.float32) / 127.5 - 1.0
|
| img = np.expand_dims(img, axis=0)
|
| return img
|
|
|
|
|
|
|
|
|
| def to_uint8(tensor):
|
| tensor = np.clip(tensor, -1.0, 1.0)
|
| tensor = (tensor + 1.0) * 127.5
|
| return np.clip(tensor, 0, 255).astype(np.uint8)
|
|
|
|
|
|
|
|
|
| def generate_from_folder(
|
| vis_folder, ir_folder=None, save_dir=SAVE_DIR, num_samples=NUM_SAMPLES
|
| ):
|
| os.makedirs(save_dir, exist_ok=True)
|
| random.seed(SEED)
|
|
|
| vis_paths = sorted(Path(vis_folder).glob("*.*"))
|
| vis_paths = [p for p in vis_paths if p.suffix.lower() in {".png", ".jpg", ".jpeg", ".bmp"}]
|
|
|
| if len(vis_paths) == 0:
|
| raise ValueError(f"No images found in {vis_folder}")
|
|
|
|
|
| sample_paths = random.sample(vis_paths, min(num_samples, len(vis_paths)))
|
|
|
| print(f"Generating {len(sample_paths)} random side-by-side images...")
|
|
|
| for idx, vis_path in enumerate(tqdm(sample_paths)):
|
|
|
| vis_tensor = load_and_preprocess_image(str(vis_path))
|
|
|
|
|
| pred_tensor = generator(vis_tensor, training=False)
|
| pred_img = to_uint8(pred_tensor[0].numpy())
|
|
|
|
|
| ir_img = None
|
| if ir_folder:
|
| ir_path = Path(ir_folder) / vis_path.name
|
| if ir_path.exists():
|
| ir_tensor = load_and_preprocess_image(str(ir_path))
|
| ir_tensor = generator.predict(ir_tensor)
|
|
|
| ir_raw = cv2.imread(str(ir_path))
|
| ir_raw = cv2.cvtColor(ir_raw, cv2.COLOR_BGR2RGB)
|
| ir_raw = cv2.resize(ir_raw, IMG_SIZE)
|
| ir_img = ir_raw
|
| else:
|
| print(f"Warning: IR not found for {vis_path.name}, using black placeholder.")
|
| ir_img = np.zeros((IMG_SIZE[1], IMG_SIZE[0], 3), dtype=np.uint8)
|
|
|
|
|
| if ir_img is None:
|
|
|
| left = np.zeros_like(pred_img)
|
| row = np.concatenate([left, pred_img], axis=1)
|
| title = "Generated Only"
|
| else:
|
|
|
| row = np.concatenate([ir_img, pred_img], axis=1)
|
| title = "GT | Generated"
|
|
|
|
|
| save_path = os.path.join(save_dir, f"sample_{idx:02d}_{vis_path.stem}.png")
|
| cv2.imwrite(save_path, cv2.cvtColor(row, cv2.COLOR_RGB2BGR))
|
|
|
| print(f"All {len(sample_paths)} images saved to {save_dir}")
|
|
|
|
|
|
|
|
|
| if __name__ == "__main__":
|
|
|
| generate_from_folder(
|
| vis_folder=VIS_FOLDER,
|
| ir_folder=IR_FOLDER,
|
| num_samples=NUM_SAMPLES
|
| )
|
|
|
|
|
| |