hash-map commited on
Commit
b466b8b
·
verified ·
1 Parent(s): cd5ce2a
.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

  • SHA256: e08158e3edbf3ce0067d437392077d68e7ba57acc20bf8831a2aa24bcfd574b4
  • Pointer size: 131 Bytes
  • Size of remote file: 300 kB
sample_01_040256.png ADDED

Git LFS Details

  • SHA256: e266a690df109c1873500051dc91a16387bd71e787bbef5998625cfbed7fd9c9
  • Pointer size: 131 Bytes
  • Size of remote file: 208 kB
sample_02_010411.png ADDED

Git LFS Details

  • SHA256: c018d04ea41b1747de71dd1ec8b4b005528f4df713a140b9398fd657c14985c0
  • Pointer size: 131 Bytes
  • Size of remote file: 151 kB
sample_03_081078.png ADDED

Git LFS Details

  • SHA256: 278dc50bbc9eb249feb860d4743669d211444e230afbff4740ead27a88cad14a
  • Pointer size: 131 Bytes
  • Size of remote file: 223 kB
sample_04_080581.png ADDED

Git LFS Details

  • SHA256: 9540c7751ae758e04dc310a44392dfc82cfbee32902a257e16aad36bbf0b6f89
  • Pointer size: 131 Bytes
  • Size of remote file: 240 kB
sample_05_080223.png ADDED

Git LFS Details

  • SHA256: 1bd5efdb187ff246402662950780dadf14fd80301d3ac1ac9a4ef51631b92a78
  • Pointer size: 131 Bytes
  • Size of remote file: 192 kB
sample_06_050244.png ADDED

Git LFS Details

  • SHA256: 9a28e328bb2e2824b75dcb3453bf0df9ac0bffe09ff091a4bb2e562459c78da6
  • Pointer size: 131 Bytes
  • Size of remote file: 156 kB
sample_07_040111.png ADDED

Git LFS Details

  • SHA256: 665cbdf79a37b55f75c72e475287b87b5cff9d76ff8546d684f9b986f2187c0a
  • Pointer size: 131 Bytes
  • Size of remote file: 200 kB
sample_08_170404.png ADDED

Git LFS Details

  • SHA256: 0b0532871ec9dd9a8261f3a1b3a396631507768dffe0e5958004b6b0bb0813bc
  • Pointer size: 131 Bytes
  • Size of remote file: 286 kB
sample_09_130480.png ADDED

Git LFS Details

  • SHA256: 61256fdf1767b7b95820813657c42af3432154bb2fad8e3c484638ab041cbbeb
  • Pointer size: 131 Bytes
  • Size of remote file: 277 kB