files
Browse files- .gitattributes +10 -0
- infer.py +121 -0
- sample_00_160363.png +3 -0
- sample_01_040256.png +3 -0
- sample_02_010411.png +3 -0
- sample_03_081078.png +3 -0
- sample_04_080581.png +3 -0
- sample_05_080223.png +3 -0
- sample_06_050244.png +3 -0
- sample_07_040111.png +3 -0
- sample_08_170404.png +3 -0
- sample_09_130480.png +3 -0
.gitattributes
CHANGED
|
@@ -60,3 +60,13 @@ test_5269.png filter=lfs diff=lfs merge=lfs -text
|
|
| 60 |
test_5361.png filter=lfs diff=lfs merge=lfs -text
|
| 61 |
test_7255.png filter=lfs diff=lfs merge=lfs -text
|
| 62 |
test_7362.png filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
test_5361.png filter=lfs diff=lfs merge=lfs -text
|
| 61 |
test_7255.png filter=lfs diff=lfs merge=lfs -text
|
| 62 |
test_7362.png filter=lfs diff=lfs merge=lfs -text
|
| 63 |
+
sample_00_160363.png filter=lfs diff=lfs merge=lfs -text
|
| 64 |
+
sample_01_040256.png filter=lfs diff=lfs merge=lfs -text
|
| 65 |
+
sample_02_010411.png filter=lfs diff=lfs merge=lfs -text
|
| 66 |
+
sample_03_081078.png filter=lfs diff=lfs merge=lfs -text
|
| 67 |
+
sample_04_080581.png filter=lfs diff=lfs merge=lfs -text
|
| 68 |
+
sample_05_080223.png filter=lfs diff=lfs merge=lfs -text
|
| 69 |
+
sample_06_050244.png filter=lfs diff=lfs merge=lfs -text
|
| 70 |
+
sample_07_040111.png filter=lfs diff=lfs merge=lfs -text
|
| 71 |
+
sample_08_170404.png filter=lfs diff=lfs merge=lfs -text
|
| 72 |
+
sample_09_130480.png filter=lfs diff=lfs merge=lfs -text
|
infer.py
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import random
|
| 3 |
+
import numpy as np
|
| 4 |
+
import tensorflow as tf
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
from tqdm import tqdm
|
| 7 |
+
import cv2 # for reading images from disk
|
| 8 |
+
|
| 9 |
+
# -------------------------------------------------
|
| 10 |
+
# CONFIGURATION
|
| 11 |
+
# -------------------------------------------------
|
| 12 |
+
GENERATOR_PATH = "generator_final.h5" # <-- your model
|
| 13 |
+
VIS_FOLDER = "data/train/visible" # <-- folder with visible images
|
| 14 |
+
IR_FOLDER = "data/train/infrared" # <-- (optional) ground-truth IR
|
| 15 |
+
SAVE_DIR = "output/train_results" # where to save side-by-side
|
| 16 |
+
NUM_SAMPLES = 10
|
| 17 |
+
IMG_SIZE = (256, 256) # adjust to your model's input size
|
| 18 |
+
SEED = 42
|
| 19 |
+
|
| 20 |
+
# -------------------------------------------------
|
| 21 |
+
# 1. Load the generator
|
| 22 |
+
# -------------------------------------------------
|
| 23 |
+
print(f"Loading generator from {GENERATOR_PATH} ...")
|
| 24 |
+
generator = tf.keras.models.load_model(GENERATOR_PATH, compile=False)
|
| 25 |
+
print("Generator loaded successfully.")
|
| 26 |
+
|
| 27 |
+
# -------------------------------------------------
|
| 28 |
+
# 2. Helper: preprocess image (resize + normalize to [-1, 1])
|
| 29 |
+
# -------------------------------------------------
|
| 30 |
+
def load_and_preprocess_image(img_path, target_size=IMG_SIZE):
|
| 31 |
+
img = cv2.imread(img_path)
|
| 32 |
+
if img is None:
|
| 33 |
+
raise FileNotFoundError(f"Image not found: {img_path}")
|
| 34 |
+
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
|
| 35 |
+
img = cv2.resize(img, target_size)
|
| 36 |
+
img = img.astype(np.float32) / 127.5 - 1.0 # → [-1, 1]
|
| 37 |
+
img = np.expand_dims(img, axis=0) # (1, H, W, 3)
|
| 38 |
+
return img
|
| 39 |
+
|
| 40 |
+
# -------------------------------------------------
|
| 41 |
+
# 3. Helper: convert [-1,1] tensor → uint8 image
|
| 42 |
+
# -------------------------------------------------
|
| 43 |
+
def to_uint8(tensor):
|
| 44 |
+
tensor = np.clip(tensor, -1.0, 1.0)
|
| 45 |
+
tensor = (tensor + 1.0) * 127.5
|
| 46 |
+
return np.clip(tensor, 0, 255).astype(np.uint8)
|
| 47 |
+
|
| 48 |
+
# -------------------------------------------------
|
| 49 |
+
# 4. Main function
|
| 50 |
+
# -------------------------------------------------
|
| 51 |
+
def generate_from_folder(
|
| 52 |
+
vis_folder, ir_folder=None, save_dir=SAVE_DIR, num_samples=NUM_SAMPLES
|
| 53 |
+
):
|
| 54 |
+
os.makedirs(save_dir, exist_ok=True)
|
| 55 |
+
random.seed(SEED)
|
| 56 |
+
|
| 57 |
+
vis_paths = sorted(Path(vis_folder).glob("*.*"))
|
| 58 |
+
vis_paths = [p for p in vis_paths if p.suffix.lower() in {".png", ".jpg", ".jpeg", ".bmp"}]
|
| 59 |
+
|
| 60 |
+
if len(vis_paths) == 0:
|
| 61 |
+
raise ValueError(f"No images found in {vis_folder}")
|
| 62 |
+
|
| 63 |
+
# Sample random images
|
| 64 |
+
sample_paths = random.sample(vis_paths, min(num_samples, len(vis_paths)))
|
| 65 |
+
|
| 66 |
+
print(f"Generating {len(sample_paths)} random side-by-side images...")
|
| 67 |
+
|
| 68 |
+
for idx, vis_path in enumerate(tqdm(sample_paths)):
|
| 69 |
+
# Load visible image
|
| 70 |
+
vis_tensor = load_and_preprocess_image(str(vis_path))
|
| 71 |
+
|
| 72 |
+
# Generate IR
|
| 73 |
+
pred_tensor = generator(vis_tensor, training=False) # (1, H, W, C)
|
| 74 |
+
pred_img = to_uint8(pred_tensor[0].numpy()) # (H, W, 3)
|
| 75 |
+
|
| 76 |
+
# Optional: load ground-truth IR (same filename)
|
| 77 |
+
ir_img = None
|
| 78 |
+
if ir_folder:
|
| 79 |
+
ir_path = Path(ir_folder) / vis_path.name
|
| 80 |
+
if ir_path.exists():
|
| 81 |
+
ir_tensor = load_and_preprocess_image(str(ir_path))
|
| 82 |
+
ir_tensor = generator.predict(ir_tensor) # not needed, just load raw
|
| 83 |
+
# Actually just read and convert
|
| 84 |
+
ir_raw = cv2.imread(str(ir_path))
|
| 85 |
+
ir_raw = cv2.cvtColor(ir_raw, cv2.COLOR_BGR2RGB)
|
| 86 |
+
ir_raw = cv2.resize(ir_raw, IMG_SIZE)
|
| 87 |
+
ir_img = ir_raw
|
| 88 |
+
else:
|
| 89 |
+
print(f"Warning: IR not found for {vis_path.name}, using black placeholder.")
|
| 90 |
+
ir_img = np.zeros((IMG_SIZE[1], IMG_SIZE[0], 3), dtype=np.uint8)
|
| 91 |
+
|
| 92 |
+
# If no IR folder, show only generated
|
| 93 |
+
if ir_img is None:
|
| 94 |
+
# Show: [Black | Generated]
|
| 95 |
+
left = np.zeros_like(pred_img)
|
| 96 |
+
row = np.concatenate([left, pred_img], axis=1)
|
| 97 |
+
title = "Generated Only"
|
| 98 |
+
else:
|
| 99 |
+
# Show: [Ground Truth IR | Generated]
|
| 100 |
+
row = np.concatenate([ir_img, pred_img], axis=1)
|
| 101 |
+
title = "GT | Generated"
|
| 102 |
+
|
| 103 |
+
# Save
|
| 104 |
+
save_path = os.path.join(save_dir, f"sample_{idx:02d}_{vis_path.stem}.png")
|
| 105 |
+
cv2.imwrite(save_path, cv2.cvtColor(row, cv2.COLOR_RGB2BGR))
|
| 106 |
+
|
| 107 |
+
print(f"All {len(sample_paths)} images saved to {save_dir}")
|
| 108 |
+
|
| 109 |
+
# -------------------------------------------------
|
| 110 |
+
# 5. RUN
|
| 111 |
+
# -------------------------------------------------
|
| 112 |
+
if __name__ == "__main__":
|
| 113 |
+
# Case 1: You have ground-truth IR images (same filename)
|
| 114 |
+
generate_from_folder(
|
| 115 |
+
vis_folder=VIS_FOLDER,
|
| 116 |
+
ir_folder=IR_FOLDER, # set to None if you don't have GT
|
| 117 |
+
num_samples=NUM_SAMPLES
|
| 118 |
+
)
|
| 119 |
+
|
| 120 |
+
# Case 2: Only visible images → show generated only
|
| 121 |
+
# generate_from_folder(vis_folder=VIS_FOLDER, ir_folder=None)
|
sample_00_160363.png
ADDED
|
Git LFS Details
|
sample_01_040256.png
ADDED
|
Git LFS Details
|
sample_02_010411.png
ADDED
|
Git LFS Details
|
sample_03_081078.png
ADDED
|
Git LFS Details
|
sample_04_080581.png
ADDED
|
Git LFS Details
|
sample_05_080223.png
ADDED
|
Git LFS Details
|
sample_06_050244.png
ADDED
|
Git LFS Details
|
sample_07_040111.png
ADDED
|
Git LFS Details
|
sample_08_170404.png
ADDED
|
Git LFS Details
|
sample_09_130480.png
ADDED
|
Git LFS Details
|