hash-map commited on
Commit
75b79e6
·
verified ·
1 Parent(s): 808e3c3

Upload 36 files

Browse files
.gitattributes CHANGED
@@ -70,3 +70,36 @@ 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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
73
+ checkpoints/ckpt-34.data-00000-of-00001 filter=lfs diff=lfs merge=lfs -text
74
+ img_00000.png filter=lfs diff=lfs merge=lfs -text
75
+ img_00005.png filter=lfs diff=lfs merge=lfs -text
76
+ img_00010.png filter=lfs diff=lfs merge=lfs -text
77
+ img_00585.png filter=lfs diff=lfs merge=lfs -text
78
+ img_00600.png filter=lfs diff=lfs merge=lfs -text
79
+ img_00605.png filter=lfs diff=lfs merge=lfs -text
80
+ img_00610.png filter=lfs diff=lfs merge=lfs -text
81
+ img_00775.png filter=lfs diff=lfs merge=lfs -text
82
+ img_00785.png filter=lfs diff=lfs merge=lfs -text
83
+ img_01020.png filter=lfs diff=lfs merge=lfs -text
84
+ img_01135.png filter=lfs diff=lfs merge=lfs -text
85
+ img_01775.png filter=lfs diff=lfs merge=lfs -text
86
+ img_01780.png filter=lfs diff=lfs merge=lfs -text
87
+ img_01815.png filter=lfs diff=lfs merge=lfs -text
88
+ img_01820.png filter=lfs diff=lfs merge=lfs -text
89
+ img_02130.png filter=lfs diff=lfs merge=lfs -text
90
+ img_02135.png filter=lfs diff=lfs merge=lfs -text
91
+ img_02140.png filter=lfs diff=lfs merge=lfs -text
92
+ img_02860.png filter=lfs diff=lfs merge=lfs -text
93
+ img_02865.png filter=lfs diff=lfs merge=lfs -text
94
+ img_03180.png filter=lfs diff=lfs merge=lfs -text
95
+ img_03185.png filter=lfs diff=lfs merge=lfs -text
96
+ img_03980.png filter=lfs diff=lfs merge=lfs -text
97
+ img_03985.png filter=lfs diff=lfs merge=lfs -text
98
+ img_06220.png filter=lfs diff=lfs merge=lfs -text
99
+ img_06225.png filter=lfs diff=lfs merge=lfs -text
100
+ img_06780.png filter=lfs diff=lfs merge=lfs -text
101
+ img_06785.png filter=lfs diff=lfs merge=lfs -text
102
+ img_07545.png filter=lfs diff=lfs merge=lfs -text
103
+ img_07550.png filter=lfs diff=lfs merge=lfs -text
104
+ img_09935.png filter=lfs diff=lfs merge=lfs -text
105
+ img_09975.png filter=lfs diff=lfs merge=lfs -text
checkpoints/checkpoint ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ model_checkpoint_path: "ckpt-34"
2
+ all_model_checkpoint_paths: "ckpt-34"
3
+ all_model_checkpoint_timestamps: 1770885364.6021488
4
+ last_preserved_timestamp: 1770885364.6021488
checkpoints/ckpt-34.data-00000-of-00001 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ef70f3bd501ffb9f7c237d49042ca432ac074beecbd4f6853ba23b4e70fb06df
3
+ size 207904461
checkpoints/ckpt-34.index ADDED
Binary file (6.15 kB). View file
 
img_00000.png ADDED

Git LFS Details

  • SHA256: 1df8f953119188935abf70a3063c8001913cae3583ee1a238ef786baa9f11ea2
  • Pointer size: 131 Bytes
  • Size of remote file: 210 kB
img_00005.png ADDED

Git LFS Details

  • SHA256: f90d52a634649dc6c7a09aa5f5f835fb6b97e79b732ad1a538fe412e4b7195ea
  • Pointer size: 131 Bytes
  • Size of remote file: 245 kB
img_00010.png ADDED

Git LFS Details

  • SHA256: 990b3117ddacc58fde49755b6adc71951c34dca3785559482473dd032405f41a
  • Pointer size: 131 Bytes
  • Size of remote file: 233 kB
img_00585.png ADDED

Git LFS Details

  • SHA256: a18fb9fea2ba5e0f2b17251ccfc3e971b58e08fd581df395d98299a0f1ace7e0
  • Pointer size: 131 Bytes
  • Size of remote file: 239 kB
img_00600.png ADDED

Git LFS Details

  • SHA256: c771c223ad0b6bca4bc52fa5a1756a5e204fadd78aa4882a2ce656f6cb3d37b4
  • Pointer size: 131 Bytes
  • Size of remote file: 266 kB
img_00605.png ADDED

Git LFS Details

  • SHA256: f29a4e48788c3f959d7705c9dd7906697d162bfe86619afad44dd774973b9d08
  • Pointer size: 131 Bytes
  • Size of remote file: 270 kB
img_00610.png ADDED

Git LFS Details

  • SHA256: a556e1ead9b6e20cf5cb1e48f48698b7e732b8b4c9232c7de6cecebd8d85fa55
  • Pointer size: 131 Bytes
  • Size of remote file: 324 kB
img_00775.png ADDED

Git LFS Details

  • SHA256: 0c2bea9e5216e73dc05d1d71f64c69962ae6caae0ab27d02d03b489727612c1b
  • Pointer size: 131 Bytes
  • Size of remote file: 300 kB
img_00785.png ADDED

Git LFS Details

  • SHA256: 8b45f2ff4301eecdfe7a5155bb3846c8ddbfaa6e32e3b1b8227cabdb09672c32
  • Pointer size: 131 Bytes
  • Size of remote file: 276 kB
img_01020.png ADDED

Git LFS Details

  • SHA256: 88c3b21e68309eddd7432e6ad956b374f9d3b501e6032ce33146eb9e01c12179
  • Pointer size: 131 Bytes
  • Size of remote file: 319 kB
img_01135.png ADDED

Git LFS Details

  • SHA256: 9e8f39b4ed5dcb9ec98594b23b781ec132b6f79c6e2e670ddddfc64d4af5917a
  • Pointer size: 131 Bytes
  • Size of remote file: 290 kB
img_01775.png ADDED

Git LFS Details

  • SHA256: 3c53e672c41d0f59eb6523da8836c06e40f7b6eb50deb15c5380bf48f420c8d9
  • Pointer size: 131 Bytes
  • Size of remote file: 284 kB
img_01780.png ADDED

Git LFS Details

  • SHA256: c6bcf31b07a0294e4bd120497ce62683f3aeac106d3c52f7f661a532af51480e
  • Pointer size: 131 Bytes
  • Size of remote file: 265 kB
img_01815.png ADDED

Git LFS Details

  • SHA256: c8273477af0024f460ff8c8a3d28ce97be00e593f84dfd4be433d53d70453197
  • Pointer size: 131 Bytes
  • Size of remote file: 302 kB
img_01820.png ADDED

Git LFS Details

  • SHA256: c8eaebf21e82055951b02099323f7c3b25680e7b7b4f6c599b412cc7dcafb178
  • Pointer size: 131 Bytes
  • Size of remote file: 268 kB
img_02130.png ADDED

Git LFS Details

  • SHA256: 1f46126184147962d96f7c1fcc5b2c722b464691d6a0ea9302ddf6f48d22c3b7
  • Pointer size: 131 Bytes
  • Size of remote file: 224 kB
img_02135.png ADDED

Git LFS Details

  • SHA256: 95742e8312eca2bbeea2e7244d91bac412423d7fd2c3457b16876acb820cd4a2
  • Pointer size: 131 Bytes
  • Size of remote file: 242 kB
img_02140.png ADDED

Git LFS Details

  • SHA256: e2679acb3af19899738e50464459e78f5af0c66e176b52fed316241d49fe5921
  • Pointer size: 131 Bytes
  • Size of remote file: 241 kB
img_02860.png ADDED

Git LFS Details

  • SHA256: d8f5ada6d23f57672c3002d61eb5814434433e3b8f7bf6865d3dd352b8492b4d
  • Pointer size: 131 Bytes
  • Size of remote file: 301 kB
img_02865.png ADDED

Git LFS Details

  • SHA256: e49b00770919ccae7d0c460f4a7b3d94347e27895ba62d5dd625404c2c358f20
  • Pointer size: 131 Bytes
  • Size of remote file: 296 kB
img_03180.png ADDED

Git LFS Details

  • SHA256: fe14832236635731268d659d0b4318e3025a2b9887ca250a45f32c54198bc792
  • Pointer size: 131 Bytes
  • Size of remote file: 324 kB
img_03185.png ADDED

Git LFS Details

  • SHA256: 450fe67e2e5373a6d4e79def123be754cee3743d1b60e9a4d8aa5d0b471c2e31
  • Pointer size: 131 Bytes
  • Size of remote file: 327 kB
img_03980.png ADDED

Git LFS Details

  • SHA256: fcbf4d64746794bb951d96d2c313c2a72e01bfa623d9cf916f40468e28f832a8
  • Pointer size: 131 Bytes
  • Size of remote file: 296 kB
img_03985.png ADDED

Git LFS Details

  • SHA256: 59da481d52ca5a4f98575272857b34369b9a489a63bfb0e850b894af67f11240
  • Pointer size: 131 Bytes
  • Size of remote file: 305 kB
img_06220.png ADDED

Git LFS Details

  • SHA256: d2ce42fd4495164e196d5844defba5f9ac30a6b8914bdb6082be0c549ef863a6
  • Pointer size: 131 Bytes
  • Size of remote file: 380 kB
img_06225.png ADDED

Git LFS Details

  • SHA256: 6435b4f16dda3da8254ec5c22c58d6f38fe9acb2bc729ae33a5babf0b2f0c3d2
  • Pointer size: 131 Bytes
  • Size of remote file: 362 kB
img_06780.png ADDED

Git LFS Details

  • SHA256: 411677c7204cb5d45dc040600c937d481b7f4a1d8826c340055c918744f9f028
  • Pointer size: 131 Bytes
  • Size of remote file: 395 kB
img_06785.png ADDED

Git LFS Details

  • SHA256: e961897efe970a13e8a850644097ce984937c31c3b2940133023d6e9d42fb914
  • Pointer size: 131 Bytes
  • Size of remote file: 401 kB
img_07545.png ADDED

Git LFS Details

  • SHA256: 1ef26d9b75651916c7d0a9cb6dd0cd8f6e80b3cc77c862d457c0b39bd334b14c
  • Pointer size: 131 Bytes
  • Size of remote file: 348 kB
img_07550.png ADDED

Git LFS Details

  • SHA256: bf8eabc45338e6768cf0edec4776f7812e918f4fe390f10d95c8c007e69548a0
  • Pointer size: 131 Bytes
  • Size of remote file: 346 kB
img_09935.png ADDED

Git LFS Details

  • SHA256: 750415959e06778964330a84f74cc6ef145c4ebf97423da34fed24c1ae77e918
  • Pointer size: 131 Bytes
  • Size of remote file: 300 kB
img_09975.png ADDED

Git LFS Details

  • SHA256: 284161e20faf76343d0e6f1d026a8fedbdaae70d55e7fd210eab5463a2c7486a
  • Pointer size: 131 Bytes
  • Size of remote file: 290 kB
visible-to-thermal-f7984f (1).ipynb ADDED
@@ -0,0 +1,3574 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "id": "3df26cb5",
7
+ "metadata": {
8
+ "execution": {
9
+ "iopub.execute_input": "2026-02-12T21:58:41.908567Z",
10
+ "iopub.status.busy": "2026-02-12T21:58:41.908310Z",
11
+ "iopub.status.idle": "2026-02-12T21:59:00.902318Z",
12
+ "shell.execute_reply": "2026-02-12T21:59:00.901653Z"
13
+ },
14
+ "papermill": {
15
+ "duration": 19.000924,
16
+ "end_time": "2026-02-12T21:59:00.903787",
17
+ "exception": false,
18
+ "start_time": "2026-02-12T21:58:41.902863",
19
+ "status": "completed"
20
+ },
21
+ "tags": []
22
+ },
23
+ "outputs": [
24
+ {
25
+ "name": "stderr",
26
+ "output_type": "stream",
27
+ "text": [
28
+ "2026-02-12 21:58:43.423256: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
29
+ "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n",
30
+ "E0000 00:00:1770933523.610196 20 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
31
+ "E0000 00:00:1770933523.667872 20 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
32
+ "I0000 00:00:1770933537.686778 20 gpu_device.cc:2022] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 15511 MB memory: -> device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:00:04.0, compute capability: 6.0\n"
33
+ ]
34
+ }
35
+ ],
36
+ "source": [
37
+ "import glob\n",
38
+ "import os\n",
39
+ "import time\n",
40
+ "import numpy as np\n",
41
+ "import tensorflow as tf\n",
42
+ "from tensorflow.keras import layers, Model, Input\n",
43
+ "from tensorflow.keras.layers import Conv2D, Conv2DTranspose, LeakyReLU, Dropout, Concatenate\n",
44
+ "from tensorflow.keras.optimizers import Adam\n",
45
+ "from tensorflow.keras.applications import VGG19\n",
46
+ "\n",
47
+ "# -------------------- Settings --------------------\n",
48
+ "IMG_SIZE = 256\n",
49
+ "BATCH_SIZE = 1\n",
50
+ "EPOCHS = 190\n",
51
+ "BASE_DIR = \"/kaggle/input/llvip-dataset/LLVIP\" # change if needed\n",
52
+ "CHECKPOINT_DIR = \"checkpoints\"\n",
53
+ "OUTPUT_DIR = \"outputs\"\n",
54
+ "LOG_INTERVAL = 100\n",
55
+ "SAVE_INTERVAL_EPOCHS = 10\n",
56
+ "\n",
57
+ "# Discriminator update steps per generator step (1 or 2)\n",
58
+ "D_steps_per_G = 1\n",
59
+ "\n",
60
+ "# -------------------- Dataset Helpers --------------------\n",
61
+ "def load_image_pair(visible_path, ir_path, image_size=(IMG_SIZE, IMG_SIZE)):\n",
62
+ " vis = tf.io.read_file(visible_path)\n",
63
+ " vis = tf.image.decode_png(vis, channels=3)\n",
64
+ " vis = tf.image.resize(vis, image_size)\n",
65
+ " vis = tf.cast(vis, tf.float32) / 127.5 - 1.0 # [-1,1]\n",
66
+ "\n",
67
+ " ir = tf.io.read_file(ir_path)\n",
68
+ " ir = tf.image.decode_png(ir, channels=3)\n",
69
+ " ir = tf.image.resize(ir, image_size)\n",
70
+ " ir = tf.cast(ir, tf.float32) / 127.5 - 1.0\n",
71
+ "\n",
72
+ " return vis, ir\n",
73
+ "def augment_image(vis, ir):\n",
74
+ " vis = tf.image.random_contrast(vis, lower=0.8, upper=1.2)\n",
75
+ " vis = tf.image.random_brightness(vis, max_delta=0.1)\n",
76
+ " ir = tf.image.random_contrast(ir, lower=0.8, upper=1.2)\n",
77
+ " return vis, ir\n",
78
+ "\n",
79
+ "def make_dataset(\n",
80
+ " visible_dir,\n",
81
+ " ir_dir,\n",
82
+ " image_size=256,\n",
83
+ " batch_size=1,\n",
84
+ " shuffle=False,\n",
85
+ " start=None,\n",
86
+ " limit=None # NEW\n",
87
+ "):\n",
88
+ " visible_files = sorted(glob.glob(os.path.join(visible_dir, \"*\")))\n",
89
+ " ir_files = sorted(glob.glob(os.path.join(ir_dir, \"*\")))\n",
90
+ "\n",
91
+ " print(f\"Found {len(visible_files)} visible images and {len(ir_files)} IR images\")\n",
92
+ "\n",
93
+ " if len(visible_files) == 0 or len(ir_files) == 0:\n",
94
+ " raise ValueError(\"❌ No images found! Check paths.\")\n",
95
+ "\n",
96
+ " # ---- LIMIT DATASET SIZE ----\n",
97
+ " if limit is not None:\n",
98
+ " visible_files = visible_files[start:limit]\n",
99
+ " ir_files = ir_files[start:limit]\n",
100
+ " print(f\"Using only {limit} image pairs\")\n",
101
+ "\n",
102
+ " dataset = tf.data.Dataset.from_tensor_slices((visible_files, ir_files))\n",
103
+ "\n",
104
+ " if shuffle and len(visible_files) > 1:\n",
105
+ " dataset = dataset.shuffle(buffer_size=len(visible_files))\n",
106
+ "\n",
107
+ " dataset = dataset.map(\n",
108
+ " lambda v, i: load_image_pair(v, i, image_size),\n",
109
+ " num_parallel_calls=tf.data.AUTOTUNE\n",
110
+ " )\n",
111
+ "\n",
112
+ " dataset = dataset.batch(batch_size).prefetch(tf.data.AUTOTUNE)\n",
113
+ " dataset = dataset.map(augment_image, num_parallel_calls=tf.data.AUTOTUNE)\n",
114
+ "\n",
115
+ " return dataset\n",
116
+ "\n",
117
+ "\n",
118
+ "def get_train_dataset(base_dir=BASE_DIR):\n",
119
+ " train_visible = os.path.join(base_dir, \"visible/train\")\n",
120
+ " train_ir = os.path.join(base_dir, \"infrared/train\")\n",
121
+ "\n",
122
+ " return make_dataset(\n",
123
+ " train_visible,\n",
124
+ " train_ir,\n",
125
+ " (IMG_SIZE, IMG_SIZE),\n",
126
+ " batch_size=BATCH_SIZE,\n",
127
+ " start=0,\n",
128
+ " limit=12025 # 🔥 10K TRAIN\n",
129
+ " )\n",
130
+ "\n",
131
+ "\n",
132
+ "def get_val_dataset(base_dir=BASE_DIR):\n",
133
+ " val_visible = os.path.join(base_dir, \"visible/train\")\n",
134
+ " val_ir = os.path.join(base_dir, \"infrared/train\")\n",
135
+ "\n",
136
+ " return make_dataset(\n",
137
+ " val_visible,\n",
138
+ " val_ir,\n",
139
+ " (IMG_SIZE, IMG_SIZE),\n",
140
+ " batch_size=1,\n",
141
+ " shuffle=True,\n",
142
+ " start=10000,\n",
143
+ " limit=12025 # 🔥 2.5K TEST\n",
144
+ " )\n",
145
+ "\n",
146
+ "\n",
147
+ "# -------------------- Instance Normalization (per-channel) --------------------\n",
148
+ "class InstanceNormalization(layers.Layer):\n",
149
+ " def __init__(self, epsilon=1e-5, **kwargs):\n",
150
+ " super().__init__(**kwargs)\n",
151
+ " self.epsilon = epsilon\n",
152
+ "\n",
153
+ " def build(self, input_shape):\n",
154
+ " channels = int(input_shape[-1])\n",
155
+ " self.gamma = self.add_weight(name='gamma', shape=(1,1,1,channels), initializer='ones', trainable=True)\n",
156
+ " self.beta = self.add_weight(name='beta', shape=(1,1,1,channels), initializer='zeros', trainable=True)\n",
157
+ "\n",
158
+ " def call(self, inputs):\n",
159
+ " mean, var = tf.nn.moments(inputs, axes=[1,2], keepdims=True)\n",
160
+ " normalized = (inputs - mean) / tf.sqrt(var + self.epsilon)\n",
161
+ " return self.gamma * normalized + self.beta\n",
162
+ "\n",
163
+ "from tensorflow.keras.layers import Layer\n",
164
+ "\n",
165
+ "class AddNoise(Layer):\n",
166
+ " def __init__(self, stddev=0.02, **kwargs):\n",
167
+ " super().__init__(**kwargs)\n",
168
+ " self.stddev = stddev\n",
169
+ "\n",
170
+ " def call(self, inputs, training=None):\n",
171
+ " # you might choose to only add noise during training, or always\n",
172
+ " noise = tf.random.normal(tf.shape(inputs), mean=0.0, stddev=self.stddev)\n",
173
+ " return inputs + noise\n",
174
+ "\n",
175
+ " def get_config(self):\n",
176
+ " config = super().get_config()\n",
177
+ " config.update({\"stddev\": self.stddev})\n",
178
+ " return config\n",
179
+ "\n",
180
+ "\n",
181
+ "def build_generator_attention(img_size=256):\n",
182
+ " inputs = Input(shape=(img_size, img_size, 3))\n",
183
+ " x = AddNoise(stddev=0.02)(inputs)\n",
184
+ "\n",
185
+ " e1 = Conv2D(64, 4, strides=2, padding='same')(x)\n",
186
+ " e1 = LeakyReLU(0.2)(e1)\n",
187
+ "\n",
188
+ " e2 = Conv2D(128, 4, strides=2, padding='same')(e1)\n",
189
+ " e2 = LeakyReLU(0.2)(e2)\n",
190
+ "\n",
191
+ " e3 = Conv2D(256, 4, strides=2, padding='same')(e2)\n",
192
+ " e3 = LeakyReLU(0.2)(e3)\n",
193
+ "\n",
194
+ " e4 = Conv2D(512, 4, strides=2, padding='same')(e3)\n",
195
+ " e4 = LeakyReLU(0.2)(e4)\n",
196
+ "\n",
197
+ " # Bottleneck + Attention block (optional)\n",
198
+ " b = Conv2D(512, 4, strides=2, padding='same')(e4)\n",
199
+ " b = LeakyReLU(0.2)(b)\n",
200
+ "\n",
201
+ " # Decoder\n",
202
+ " d1 = Conv2DTranspose(512, 4, strides=2, padding='same')(b)\n",
203
+ " d1 = tf.keras.layers.ReLU()(d1)\n",
204
+ " d1 = Concatenate()([d1, e4])\n",
205
+ "\n",
206
+ " d2 = Conv2DTranspose(256, 4, strides=2, padding='same')(d1)\n",
207
+ " d2 = tf.keras.layers.ReLU()(d2)\n",
208
+ " d2 = Concatenate()([d2, e3])\n",
209
+ "\n",
210
+ " d3 = Conv2DTranspose(128, 4, strides=2, padding='same')(d2)\n",
211
+ " d3 = tf.keras.layers.ReLU()(d3)\n",
212
+ " d3 = Concatenate()([d3, e2])\n",
213
+ "\n",
214
+ " d4 = Conv2DTranspose(64, 4, strides=2, padding='same')(d3)\n",
215
+ " d4 = tf.keras.layers.ReLU()(d4)\n",
216
+ " d4 = Concatenate()([d4, e1])\n",
217
+ "\n",
218
+ " output = Conv2DTranspose(3, 4, strides=2, padding='same', activation='tanh')(d4)\n",
219
+ "\n",
220
+ " return Model(inputs, output, name='Generator')\n",
221
+ "\n",
222
+ "\n",
223
+ "# -------------------- Stronger PatchGAN Discriminator --------------------\n",
224
+ "def build_patch_discriminator(img_size=IMG_SIZE):\n",
225
+ " inp = Input(shape=(img_size, img_size, 3))\n",
226
+ " tar = Input(shape=(img_size, img_size, 3))\n",
227
+ " x = Concatenate()([inp, tar]) # condition on input\n",
228
+ "\n",
229
+ " x = Conv2D(64, 4, strides=2, padding='same')(x)\n",
230
+ " x = LeakyReLU(0.2)(x)\n",
231
+ "\n",
232
+ " x = Conv2D(128, 4, strides=2, padding='same', use_bias=False)(x)\n",
233
+ " x = InstanceNormalization()(x)\n",
234
+ " x = LeakyReLU(0.2)(x)\n",
235
+ "\n",
236
+ " x = Conv2D(256, 4, strides=2, padding='same', use_bias=False)(x)\n",
237
+ " x = InstanceNormalization()(x)\n",
238
+ " x = LeakyReLU(0.2)(x)\n",
239
+ "\n",
240
+ " out = Conv2D(1, 4, strides=1, padding='same')(x)\n",
241
+ " return Model([inp, tar], out, name='PatchDiscriminator')\n",
242
+ "\n",
243
+ "\n",
244
+ "# -------------------- Losses & VGG perceptual --------------------\n",
245
+ "\n",
246
+ "\n",
247
+ "# -------------------- Perceptual model setup --------------------\n",
248
+ "from tensorflow.keras.applications.vgg19 import VGG19, preprocess_input\n",
249
+ "from tensorflow.keras import Model\n",
250
+ "\n",
251
+ "from tensorflow.keras.applications import VGG19\n",
252
+ "from tensorflow.keras.models import Model\n",
253
+ "\n",
254
+ "# Initialize VGG19 without top layers and no weights\n",
255
+ "vgg_model = VGG19(include_top=False, weights=None, input_shape=(256, 256, 3))\n",
256
+ "\n",
257
+ "# Load the manually downloaded weights\n",
258
+ "weights_path = '/kaggle/input/models/saisumathappala/vgg19-base-model/tensorflow2/default/1/vgg19_weights_tf_dim_ordering_tf_kernels_notop.h5'\n",
259
+ "vgg_model.load_weights(weights_path)\n",
260
+ "\n",
261
+ "# Freeze all layers\n",
262
+ "vgg_model.trainable = False\n",
263
+ "\n",
264
+ "# Use block4_conv2 output for perceptual loss\n",
265
+ "perceptual_model = Model(inputs=vgg_model.input,\n",
266
+ " outputs=vgg_model.get_layer('block4_conv2').output)\n",
267
+ "# from tensorflow.keras.applications import VGG19\n",
268
+ "# from tensorflow.keras.models import Model\n",
269
+ "# from tensorflow.keras.applications.vgg19 import preprocess_input\n",
270
+ "\n",
271
+ "# base_model = tf.keras.applications.VGG19(\n",
272
+ "# weights='imagenet',\n",
273
+ "# input_shape=(IMG_SIZE, IMG_SIZE, 3),\n",
274
+ "# include_top=False)\n",
275
+ "\n",
276
+ "# base_model.trainable = False\n",
277
+ "\n",
278
+ "# Perceptual layer\n",
279
+ "\n",
280
+ "\n",
281
+ "bce = tf.keras.losses.BinaryCrossentropy(from_logits=True)\n",
282
+ "def discriminator_loss_fn(real_logits, fake_logits):\n",
283
+ " real_loss = bce(tf.ones_like(real_logits), real_logits)\n",
284
+ " fake_loss = bce(tf.zeros_like(fake_logits), fake_logits)\n",
285
+ " total_loss = (real_loss + fake_loss) * 0.5\n",
286
+ " return total_loss\n",
287
+ "\n",
288
+ "# ---------------- GAN loss ----------------\n",
289
+ "def generator_adv_loss(d_outs):\n",
290
+ " loss = 0.0\n",
291
+ " for out in d_outs:\n",
292
+ " loss += bce(tf.ones_like(out), out)\n",
293
+ " return loss / len(d_outs)\n",
294
+ "\n",
295
+ "\n",
296
+ "# ---------------- Weighted L1 ----------------\n",
297
+ "def weighted_l1_loss(target, gen):\n",
298
+ " t = (target + 1.0) / 2.0\n",
299
+ " g = (gen + 1.0) / 2.0\n",
300
+ " weight = tf.clip_by_value(t ** 2 * 4.0, 1.0, 4.0)\n",
301
+ " return tf.reduce_mean(weight * tf.abs(t - g))\n",
302
+ "\n",
303
+ "\n",
304
+ "# ---------------- Perceptual ----------------\n",
305
+ "from tensorflow.keras.applications.vgg19 import preprocess_input\n",
306
+ "\n",
307
+ "def perceptual_loss(target, gen):\n",
308
+ " target_rgb = preprocess_input((target + 1.0) * 127.5)\n",
309
+ " gen_rgb = preprocess_input((gen + 1.0) * 127.5)\n",
310
+ "\n",
311
+ " f_t = perceptual_model(target_rgb)\n",
312
+ " f_g = perceptual_model(gen_rgb)\n",
313
+ "\n",
314
+ " return tf.reduce_mean(tf.abs(f_t - f_g))\n",
315
+ "\n",
316
+ "def generator_total_loss(d_out, gen_out, target):\n",
317
+ "\n",
318
+ " adv = generator_adv_loss([d_out]) # wrap in list\n",
319
+ " wl1 = weighted_l1_loss(target, gen_out)\n",
320
+ " perc = perceptual_loss(target, gen_out)\n",
321
+ "\n",
322
+ " # Recommended weights for LLVIP\n",
323
+ " total_loss = (\n",
324
+ " 1.0 * adv + # realism\n",
325
+ " 100.0 * wl1 + # alignment\n",
326
+ " 10.0 * perc # structure\n",
327
+ " )\n",
328
+ "\n",
329
+ " return total_loss, adv, wl1, perc\n",
330
+ "\n",
331
+ "\n",
332
+ "\n",
333
+ "\n",
334
+ "\n",
335
+ "generator = build_generator_attention(IMG_SIZE)\n",
336
+ "D_full = build_patch_discriminator(IMG_SIZE)\n",
337
+ "\n",
338
+ "# TTUR: different LRs for G and D\n",
339
+ "generator_optimizer = Adam(2e-4, beta_1=0.5)\n",
340
+ "d_optimizer = Adam(5e-5, beta_1=0.5)\n",
341
+ "\n",
342
+ "# Checkpoints\n",
343
+ "import tensorflow as tf\n",
344
+ "import numpy as np\n",
345
+ "import cv2\n",
346
+ "import os\n",
347
+ "from tqdm import tqdm\n",
348
+ "import matplotlib.pyplot as plt\n",
349
+ "\n",
350
+ "# -------------------- Checkpoint Paths --------------------\n",
351
+ "\n",
352
+ "# 1️⃣ Pretrained checkpoint (read-only Kaggle input)\n",
353
+ "PRETRAINED_DIR = \"/kaggle/input/models/saisumathappala/image-to-ir-gan/tensorflow2/default/2\"\n",
354
+ "\n",
355
+ "# 2️⃣ Training checkpoint (writeable)\n",
356
+ "CHECKPOINT_DIR = \"checkpoints\"\n",
357
+ "\n",
358
+ "os.makedirs(CHECKPOINT_DIR, exist_ok=True)\n",
359
+ "\n",
360
+ "\n",
361
+ "# -------------------- Checkpoint Objects --------------------\n",
362
+ "ckpt = tf.train.Checkpoint(\n",
363
+ " generator=generator,\n",
364
+ " D_full=D_full,\n",
365
+ " generator_optimizer=generator_optimizer,\n",
366
+ " d_optimizer=d_optimizer\n",
367
+ ")\n",
368
+ "\n",
369
+ "# Manager for TRAINING checkpoints\n",
370
+ "ckpt_manager = tf.train.CheckpointManager(\n",
371
+ " ckpt,\n",
372
+ " CHECKPOINT_DIR,\n",
373
+ " max_to_keep=5\n",
374
+ ")\n"
375
+ ]
376
+ },
377
+ {
378
+ "cell_type": "code",
379
+ "execution_count": 2,
380
+ "id": "0c5c2773",
381
+ "metadata": {
382
+ "execution": {
383
+ "iopub.execute_input": "2026-02-12T21:59:00.912705Z",
384
+ "iopub.status.busy": "2026-02-12T21:59:00.911688Z",
385
+ "iopub.status.idle": "2026-02-12T21:59:01.885299Z",
386
+ "shell.execute_reply": "2026-02-12T21:59:01.884435Z"
387
+ },
388
+ "papermill": {
389
+ "duration": 0.979,
390
+ "end_time": "2026-02-12T21:59:01.886677",
391
+ "exception": false,
392
+ "start_time": "2026-02-12T21:59:00.907677",
393
+ "status": "completed"
394
+ },
395
+ "tags": []
396
+ },
397
+ "outputs": [
398
+ {
399
+ "name": "stdout",
400
+ "output_type": "stream",
401
+ "text": [
402
+ "No training checkpoint found. Loading pretrained weights...\n",
403
+ "✅ Restored pretrained weights from: /kaggle/input/models/saisumathappala/image-to-ir-gan/tensorflow2/default/2/ckpt-34\n"
404
+ ]
405
+ }
406
+ ],
407
+ "source": [
408
+ "# -------------------- Restore Logic --------------------\n",
409
+ "\n",
410
+ "if ckpt_manager.latest_checkpoint:\n",
411
+ " # Case 1 → Resume training normally\n",
412
+ " ckpt.restore(ckpt_manager.latest_checkpoint).expect_partial()\n",
413
+ " print(f\"✅ Resumed from training checkpoint: {ckpt_manager.latest_checkpoint}\")\n",
414
+ "\n",
415
+ "else:\n",
416
+ " # Case 2 → First run → Load pretrained weights ONCE\n",
417
+ " print(\"No training checkpoint found. Loading pretrained weights...\")\n",
418
+ "\n",
419
+ " pretrained_ckpt = tf.train.latest_checkpoint(PRETRAINED_DIR)\n",
420
+ "\n",
421
+ " if pretrained_ckpt:\n",
422
+ " ckpt.restore(pretrained_ckpt).expect_partial()\n",
423
+ " print(f\"✅ Restored pretrained weights from: {pretrained_ckpt}\")\n",
424
+ " else:\n",
425
+ " print(\"⚠️ No pretrained checkpoint found. Training from scratch.\")\n"
426
+ ]
427
+ },
428
+ {
429
+ "cell_type": "code",
430
+ "execution_count": 3,
431
+ "id": "358eb256",
432
+ "metadata": {
433
+ "execution": {
434
+ "iopub.execute_input": "2026-02-12T21:59:01.895018Z",
435
+ "iopub.status.busy": "2026-02-12T21:59:01.894351Z",
436
+ "iopub.status.idle": "2026-02-12T21:59:01.900980Z",
437
+ "shell.execute_reply": "2026-02-12T21:59:01.900207Z"
438
+ },
439
+ "papermill": {
440
+ "duration": 0.011908,
441
+ "end_time": "2026-02-12T21:59:01.902226",
442
+ "exception": false,
443
+ "start_time": "2026-02-12T21:59:01.890318",
444
+ "status": "completed"
445
+ },
446
+ "tags": []
447
+ },
448
+ "outputs": [],
449
+ "source": [
450
+ "@tf.function\n",
451
+ "def d_train_step(input_vis, target_ir, gen_out):\n",
452
+ "\n",
453
+ " with tf.GradientTape() as tape:\n",
454
+ "\n",
455
+ " d_real = D_full([input_vis, target_ir], training=True)\n",
456
+ " d_fake = D_full([input_vis, gen_out], training=True)\n",
457
+ "\n",
458
+ " d_loss = discriminator_loss_fn(d_real, d_fake)\n",
459
+ "\n",
460
+ " d_vars = D_full.trainable_variables\n",
461
+ " d_grads = tape.gradient(d_loss, d_vars)\n",
462
+ "\n",
463
+ " d_optimizer.apply_gradients(zip(d_grads, d_vars))\n",
464
+ "\n",
465
+ " return d_loss\n",
466
+ "\n",
467
+ "# -------------------- Generator Train Step --------------------\n",
468
+ "@tf.function\n",
469
+ "def g_train_step(input_vis, target_ir):\n",
470
+ "\n",
471
+ " with tf.GradientTape() as tape:\n",
472
+ "\n",
473
+ " gen_out = generator(input_vis, training=True)\n",
474
+ "\n",
475
+ " d_fake = D_full([input_vis, gen_out], training=True)\n",
476
+ "\n",
477
+ " total_g_loss, adv_loss, wl1_loss, perc_loss = \\\n",
478
+ " generator_total_loss(d_fake, gen_out, target_ir)\n",
479
+ "\n",
480
+ " g_vars = generator.trainable_variables\n",
481
+ " g_grads = tape.gradient(total_g_loss, g_vars)\n",
482
+ "\n",
483
+ " generator_optimizer.apply_gradients(zip(g_grads, g_vars))\n",
484
+ "\n",
485
+ " return total_g_loss, adv_loss, wl1_loss, perc_loss, gen_out\n"
486
+ ]
487
+ },
488
+ {
489
+ "cell_type": "code",
490
+ "execution_count": 4,
491
+ "id": "f2e569db",
492
+ "metadata": {
493
+ "execution": {
494
+ "iopub.execute_input": "2026-02-12T21:59:01.910320Z",
495
+ "iopub.status.busy": "2026-02-12T21:59:01.909856Z",
496
+ "iopub.status.idle": "2026-02-12T21:59:01.916085Z",
497
+ "shell.execute_reply": "2026-02-12T21:59:01.915351Z"
498
+ },
499
+ "papermill": {
500
+ "duration": 0.011612,
501
+ "end_time": "2026-02-12T21:59:01.917295",
502
+ "exception": false,
503
+ "start_time": "2026-02-12T21:59:01.905683",
504
+ "status": "completed"
505
+ },
506
+ "tags": []
507
+ },
508
+ "outputs": [],
509
+ "source": [
510
+ "def train(train_ds, val_ds=None, epochs=EPOCHS):\n",
511
+ "\n",
512
+ " global_step = 0\n",
513
+ "\n",
514
+ " for epoch in range(1, epochs + 1):\n",
515
+ "\n",
516
+ " start = time.time()\n",
517
+ " print(f\"\\nEpoch {epoch}/{epochs}\")\n",
518
+ "\n",
519
+ " for batch, (inp, tar) in enumerate(train_ds):\n",
520
+ "\n",
521
+ " # --------------------\n",
522
+ " # Generator forward\n",
523
+ " # --------------------\n",
524
+ " gen_out = generator(inp, training=True)\n",
525
+ "\n",
526
+ " # --------------------\n",
527
+ " # Train Discriminator\n",
528
+ " # --------------------\n",
529
+ " for _ in range(D_steps_per_G):\n",
530
+ " d_loss_val = d_train_step(inp, tar, gen_out)\n",
531
+ "\n",
532
+ " # --------------------\n",
533
+ " # Train Generator\n",
534
+ " # --------------------\n",
535
+ " g_total, g_adv, g_l1, g_perc, gen_out = \\\n",
536
+ " g_train_step(inp, tar)\n",
537
+ "\n",
538
+ " global_step += 1\n",
539
+ "\n",
540
+ " # Step logging\n",
541
+ " if batch % 50 == 0:\n",
542
+ " print(\n",
543
+ " f\"Step {global_step}: \"\n",
544
+ " f\"D={d_loss_val:.4f}, \"\n",
545
+ " f\"G={g_total:.4f}, \"\n",
546
+ " f\"Adv={g_adv:.4f}, \"\n",
547
+ " f\"L1={g_l1:.4f}, \"\n",
548
+ " f\"Perc={g_perc:.4f}\"\n",
549
+ " )\n",
550
+ "\n",
551
+ " # --------------------\n",
552
+ " # Visualization (TEST SET)\n",
553
+ " # --------------------\n",
554
+ " if val_ds is not None:\n",
555
+ " print(\"🖼 Generating validation samples...\")\n",
556
+ " generate_and_save_images(generator, val_ds, epoch)\n",
557
+ "\n",
558
+ " # --------------------\n",
559
+ " # Checkpoint\n",
560
+ " # --------------------\n",
561
+ " if epoch % SAVE_INTERVAL_EPOCHS == 0:\n",
562
+ " path = ckpt_manager.save()\n",
563
+ " print(f\" Saved checkpoint: {path}\")\n",
564
+ "\n",
565
+ " print(f\" Epoch {epoch} finished in {time.time()-start:.1f}s\")\n"
566
+ ]
567
+ },
568
+ {
569
+ "cell_type": "code",
570
+ "execution_count": 5,
571
+ "id": "bb729cec",
572
+ "metadata": {
573
+ "execution": {
574
+ "iopub.execute_input": "2026-02-12T21:59:01.924705Z",
575
+ "iopub.status.busy": "2026-02-12T21:59:01.924476Z",
576
+ "iopub.status.idle": "2026-02-12T21:59:01.931295Z",
577
+ "shell.execute_reply": "2026-02-12T21:59:01.930717Z"
578
+ },
579
+ "papermill": {
580
+ "duration": 0.011607,
581
+ "end_time": "2026-02-12T21:59:01.932316",
582
+ "exception": false,
583
+ "start_time": "2026-02-12T21:59:01.920709",
584
+ "status": "completed"
585
+ },
586
+ "tags": []
587
+ },
588
+ "outputs": [],
589
+ "source": [
590
+ "import os\n",
591
+ "import tensorflow as tf\n",
592
+ "\n",
593
+ "# -------------------- Visualization Utilities --------------------\n",
594
+ "def to_uint8(x):\n",
595
+ " \"\"\"Convert tensor from [-1,1] → uint8 [0,255].\"\"\"\n",
596
+ " x = (x + 1.0) * 127.5\n",
597
+ " x = tf.clip_by_value(x, 0, 255)\n",
598
+ " return tf.cast(x, tf.uint8)\n",
599
+ "\n",
600
+ "def generate_and_save_images(model, val_ds, epoch, out_dir=OUTPUT_DIR, num_rows=5):\n",
601
+ " \"\"\"\n",
602
+ " Creates a 5-row image where each row = [Visible | Real IR | Generated IR].\n",
603
+ " \"\"\"\n",
604
+ " os.makedirs(out_dir, exist_ok=True)\n",
605
+ "\n",
606
+ " # Collect up to num_rows samples\n",
607
+ " rows = []\n",
608
+ " for i, (v_inp, v_tar) in enumerate(val_ds.take(num_rows)):\n",
609
+ " pred = model(v_inp, training=False)\n",
610
+ "\n",
611
+ " vis = to_uint8(v_inp[0])\n",
612
+ " targ = to_uint8(v_tar[0])\n",
613
+ " gen = to_uint8(pred[0])\n",
614
+ "\n",
615
+ " # Ensure same height\n",
616
+ " h = min(vis.shape[0], targ.shape[0], gen.shape[0])\n",
617
+ " w = min(vis.shape[1], targ.shape[1], gen.shape[1])\n",
618
+ " vis, targ, gen = vis[:h, :w], targ[:h, :w], gen[:h, :w]\n",
619
+ "\n",
620
+ " # Concatenate horizontally\n",
621
+ " row = tf.concat([vis, targ, gen], axis=1)\n",
622
+ " rows.append(row)\n",
623
+ "\n",
624
+ " # Stack vertically → 5-row image\n",
625
+ " grid = tf.concat(rows, axis=0)\n",
626
+ "\n",
627
+ " out_path = os.path.join(out_dir, f\"epoch_{epoch:03d}.png\")\n",
628
+ " tf.keras.preprocessing.image.save_img(out_path, grid.numpy())\n"
629
+ ]
630
+ },
631
+ {
632
+ "cell_type": "code",
633
+ "execution_count": 6,
634
+ "id": "302e6898",
635
+ "metadata": {
636
+ "execution": {
637
+ "iopub.execute_input": "2026-02-12T21:59:01.939607Z",
638
+ "iopub.status.busy": "2026-02-12T21:59:01.939374Z",
639
+ "iopub.status.idle": "2026-02-12T21:59:01.945225Z",
640
+ "shell.execute_reply": "2026-02-12T21:59:01.944630Z"
641
+ },
642
+ "papermill": {
643
+ "duration": 0.010711,
644
+ "end_time": "2026-02-12T21:59:01.946333",
645
+ "exception": false,
646
+ "start_time": "2026-02-12T21:59:01.935622",
647
+ "status": "completed"
648
+ },
649
+ "tags": []
650
+ },
651
+ "outputs": [],
652
+ "source": [
653
+ "def train(train_ds, val_ds=None, epochs=EPOCHS):\n",
654
+ " global_step = 0\n",
655
+ " for epoch in range(1, epochs + 1):\n",
656
+ " start = time.time()\n",
657
+ " print(f\"\\nEpoch {epoch}/{epochs}\")\n",
658
+ "\n",
659
+ " for batch, (inp, tar) in enumerate(train_ds):\n",
660
+ " gen_out = generator(inp, training=True)\n",
661
+ "\n",
662
+ " # Train Discriminator\n",
663
+ " for _ in range(D_steps_per_G):\n",
664
+ " d_loss_val = d_train_step(inp, tar, gen_out)\n",
665
+ "\n",
666
+ " # Train Generator\n",
667
+ " g_total_loss, g_adv, g_l1,g_prec, gen_out2 = g_train_step(inp, tar)\n",
668
+ " global_step += 1\n",
669
+ " print(f\" step {global_step}: \"\n",
670
+ " f\"D={d_loss_val:.4f}, G={g_total_loss:.4f}, Adv={g_adv:.4f}, L1={g_l1:.4f} , prec={g_prec:.4f}\")\n",
671
+ "\n",
672
+ " # Save visualization\n",
673
+ " if val_ds is not None:\n",
674
+ " print(f\"🖼 Generating sample output for epoch {epoch}...\")\n",
675
+ " generate_and_save_images(generator, val_ds, epoch)\n",
676
+ "\n",
677
+ " # Save checkpoint\n",
678
+ " if epoch % SAVE_INTERVAL_EPOCHS == 0:\n",
679
+ " path = ckpt_manager.save()\n",
680
+ " print(f\" Saved checkpoint: {path}\")\n",
681
+ "\n",
682
+ " print(f\" Epoch {epoch} finished in {time.time() - start:.1f}s\")"
683
+ ]
684
+ },
685
+ {
686
+ "cell_type": "code",
687
+ "execution_count": 7,
688
+ "id": "2581acd4",
689
+ "metadata": {
690
+ "execution": {
691
+ "iopub.execute_input": "2026-02-12T21:59:01.953697Z",
692
+ "iopub.status.busy": "2026-02-12T21:59:01.953474Z",
693
+ "iopub.status.idle": "2026-02-12T21:59:02.537240Z",
694
+ "shell.execute_reply": "2026-02-12T21:59:02.536482Z"
695
+ },
696
+ "papermill": {
697
+ "duration": 0.589004,
698
+ "end_time": "2026-02-12T21:59:02.538691",
699
+ "exception": false,
700
+ "start_time": "2026-02-12T21:59:01.949687",
701
+ "status": "completed"
702
+ },
703
+ "tags": []
704
+ },
705
+ "outputs": [
706
+ {
707
+ "name": "stdout",
708
+ "output_type": "stream",
709
+ "text": [
710
+ "Found 12025 visible images and 12025 IR images\n",
711
+ "Using only 12025 image pairs\n"
712
+ ]
713
+ }
714
+ ],
715
+ "source": [
716
+ "train_ds = get_train_dataset()"
717
+ ]
718
+ },
719
+ {
720
+ "cell_type": "code",
721
+ "execution_count": 8,
722
+ "id": "9f18cfa2",
723
+ "metadata": {
724
+ "execution": {
725
+ "iopub.execute_input": "2026-02-12T21:59:02.548373Z",
726
+ "iopub.status.busy": "2026-02-12T21:59:02.547591Z",
727
+ "iopub.status.idle": "2026-02-12T21:59:02.551403Z",
728
+ "shell.execute_reply": "2026-02-12T21:59:02.550725Z"
729
+ },
730
+ "papermill": {
731
+ "duration": 0.009773,
732
+ "end_time": "2026-02-12T21:59:02.552655",
733
+ "exception": false,
734
+ "start_time": "2026-02-12T21:59:02.542882",
735
+ "status": "completed"
736
+ },
737
+ "tags": []
738
+ },
739
+ "outputs": [],
740
+ "source": [
741
+ "# val_ds = train_ds.take(75)\n",
742
+ "# train_ds = train_ds.skip(75)"
743
+ ]
744
+ },
745
+ {
746
+ "cell_type": "code",
747
+ "execution_count": 9,
748
+ "id": "7b2a39df",
749
+ "metadata": {
750
+ "execution": {
751
+ "iopub.execute_input": "2026-02-12T21:59:02.561724Z",
752
+ "iopub.status.busy": "2026-02-12T21:59:02.561429Z",
753
+ "iopub.status.idle": "2026-02-12T21:59:02.573514Z",
754
+ "shell.execute_reply": "2026-02-12T21:59:02.572847Z"
755
+ },
756
+ "papermill": {
757
+ "duration": 0.018255,
758
+ "end_time": "2026-02-12T21:59:02.575056",
759
+ "exception": false,
760
+ "start_time": "2026-02-12T21:59:02.556801",
761
+ "status": "completed"
762
+ },
763
+ "tags": []
764
+ },
765
+ "outputs": [],
766
+ "source": [
767
+ "import matplotlib.pyplot as plt\n",
768
+ "import tensorflow as tf\n",
769
+ "import numpy as np\n",
770
+ "\n",
771
+ "def to_uint8(x):\n",
772
+ " \"\"\"Convert tensor from [-1,1] → uint8 [0,255].\"\"\"\n",
773
+ " x = (x + 1.0) * 127.5\n",
774
+ " x = tf.clip_by_value(x, 0, 255)\n",
775
+ " return tf.cast(x, tf.uint8)\n",
776
+ "\n",
777
+ "# Shuffle the dataset to take random samples\n",
778
+ "train_ds_shuffled = train_ds.shuffle(buffer_size=1000, reshuffle_each_iteration=True)\n",
779
+ "\n",
780
+ "# Take 10 images\n",
781
+ "sample_ds = train_ds_shuffled.take(10)"
782
+ ]
783
+ },
784
+ {
785
+ "cell_type": "code",
786
+ "execution_count": 10,
787
+ "id": "4f876063",
788
+ "metadata": {
789
+ "execution": {
790
+ "iopub.execute_input": "2026-02-12T21:59:02.584167Z",
791
+ "iopub.status.busy": "2026-02-12T21:59:02.583876Z",
792
+ "iopub.status.idle": "2026-02-12T21:59:02.587381Z",
793
+ "shell.execute_reply": "2026-02-12T21:59:02.586759Z"
794
+ },
795
+ "papermill": {
796
+ "duration": 0.009294,
797
+ "end_time": "2026-02-12T21:59:02.588465",
798
+ "exception": false,
799
+ "start_time": "2026-02-12T21:59:02.579171",
800
+ "status": "completed"
801
+ },
802
+ "tags": []
803
+ },
804
+ "outputs": [],
805
+ "source": [
806
+ "# train(train_ds, val_ds, epochs=EPOCHS)"
807
+ ]
808
+ },
809
+ {
810
+ "cell_type": "code",
811
+ "execution_count": null,
812
+ "id": "a4a82990",
813
+ "metadata": {
814
+ "papermill": {
815
+ "duration": 0.003627,
816
+ "end_time": "2026-02-12T21:59:02.596030",
817
+ "exception": false,
818
+ "start_time": "2026-02-12T21:59:02.592403",
819
+ "status": "completed"
820
+ },
821
+ "tags": []
822
+ },
823
+ "outputs": [],
824
+ "source": []
825
+ },
826
+ {
827
+ "cell_type": "code",
828
+ "execution_count": 11,
829
+ "id": "bb6cd8e0",
830
+ "metadata": {
831
+ "execution": {
832
+ "iopub.execute_input": "2026-02-12T21:59:02.604728Z",
833
+ "iopub.status.busy": "2026-02-12T21:59:02.604438Z",
834
+ "iopub.status.idle": "2026-02-12T22:08:25.100908Z",
835
+ "shell.execute_reply": "2026-02-12T22:08:25.099998Z"
836
+ },
837
+ "papermill": {
838
+ "duration": 562.502476,
839
+ "end_time": "2026-02-12T22:08:25.102199",
840
+ "exception": false,
841
+ "start_time": "2026-02-12T21:59:02.599723",
842
+ "status": "completed"
843
+ },
844
+ "tags": []
845
+ },
846
+ "outputs": [
847
+ {
848
+ "name": "stdout",
849
+ "output_type": "stream",
850
+ "text": [
851
+ "No training checkpoint found. Loading pretrained weights...\n",
852
+ "✅ Restored pretrained weights from: /kaggle/input/models/saisumathappala/image-to-ir-gan/tensorflow2/default/2/ckpt-34\n",
853
+ "No checkpoint found, using uninitialized model\n",
854
+ "Found 12025 visible images and 12025 IR images\n",
855
+ "Using only 12025 image pairs\n"
856
+ ]
857
+ },
858
+ {
859
+ "name": "stderr",
860
+ "output_type": "stream",
861
+ "text": [
862
+ " 0%| | 0/12025 [00:00<?, ?it/s]I0000 00:00:1770933543.075318 20 cuda_dnn.cc:529] Loaded cuDNN version 90300\n",
863
+ "100%|██████████| 12025/12025 [09:22<00:00, 21.39it/s]"
864
+ ]
865
+ },
866
+ {
867
+ "name": "stdout",
868
+ "output_type": "stream",
869
+ "text": [
870
+ "==== Test Dataset Metrics ====\n",
871
+ "L1 Loss : 0.1371\n",
872
+ "PSNR : 20.8206\n",
873
+ "SSIM : 0.5706\n"
874
+ ]
875
+ },
876
+ {
877
+ "name": "stderr",
878
+ "output_type": "stream",
879
+ "text": [
880
+ "\n"
881
+ ]
882
+ }
883
+ ],
884
+ "source": [
885
+ "import tensorflow as tf\n",
886
+ "import numpy as np\n",
887
+ "import cv2\n",
888
+ "import os\n",
889
+ "from tqdm import tqdm\n",
890
+ "import matplotlib.pyplot as plt\n",
891
+ "# -------------------- Load Checkpoint --------------------\n",
892
+ "ckpt = tf.train.Checkpoint(generator=generator,\n",
893
+ " D_full=D_full,\n",
894
+ " generator_optimizer=generator_optimizer,\n",
895
+ " d_optimizer=d_optimizer)\n",
896
+ "ckpt_manager = tf.train.CheckpointManager(ckpt, CHECKPOINT_DIR, max_to_keep=1)\n",
897
+ "# -------------------- Restore Logic --------------------\n",
898
+ "\n",
899
+ "if ckpt_manager.latest_checkpoint:\n",
900
+ " # Case 1 → Resume training normally\n",
901
+ " ckpt.restore(ckpt_manager.latest_checkpoint).expect_partial()\n",
902
+ " print(f\"✅ Resumed from training checkpoint: {ckpt_manager.latest_checkpoint}\")\n",
903
+ "\n",
904
+ "else:\n",
905
+ " # Case 2 → First run → Load pretrained weights ONCE\n",
906
+ " print(\"No training checkpoint found. Loading pretrained weights...\")\n",
907
+ "\n",
908
+ " pretrained_ckpt = tf.train.latest_checkpoint(PRETRAINED_DIR)\n",
909
+ "\n",
910
+ " if pretrained_ckpt:\n",
911
+ " ckpt.restore(pretrained_ckpt).expect_partial()\n",
912
+ " print(f\"✅ Restored pretrained weights from: {pretrained_ckpt}\")\n",
913
+ " else:\n",
914
+ " print(\"⚠️ No pretrained checkpoint found. Training from scratch.\")\n",
915
+ "\n",
916
+ "\n",
917
+ "# Restore latest checkpoint\n",
918
+ "if ckpt_manager.latest_checkpoint:\n",
919
+ " ckpt.restore(ckpt_manager.latest_checkpoint).expect_partial()\n",
920
+ " print(f\"Restored from {ckpt_manager.latest_checkpoint}\")\n",
921
+ "else:\n",
922
+ " print(\"No checkpoint found, using uninitialized model\")\n",
923
+ "\n",
924
+ "# -------------------- Dataset Evaluation --------------------\n",
925
+ "def l1_loss(y_true, y_pred):\n",
926
+ " return tf.reduce_mean(tf.abs(y_true - y_pred))\n",
927
+ "\n",
928
+ "def evaluate(test_ds):\n",
929
+ " l1_list, psnr_list, ssim_list = [], [], []\n",
930
+ " for vis, ir in tqdm(test_ds):\n",
931
+ " pred = generator(vis, training=False)\n",
932
+ " l1 = l1_loss(ir, pred).numpy()\n",
933
+ " psnr = tf.image.psnr(ir, pred, max_val=2.0).numpy()\n",
934
+ " ssim = tf.image.ssim(ir, pred, max_val=2.0).numpy()\n",
935
+ "\n",
936
+ " l1_list.append(l1)\n",
937
+ " psnr_list.append(np.mean(psnr))\n",
938
+ " ssim_list.append(np.mean(ssim))\n",
939
+ "\n",
940
+ " print(\"==== Test Dataset Metrics ====\")\n",
941
+ " print(f\"L1 Loss : {np.mean(l1_list):.4f}\")\n",
942
+ " print(f\"PSNR : {np.mean(psnr_list):.4f}\")\n",
943
+ " print(f\"SSIM : {np.mean(ssim_list):.4f}\")\n",
944
+ "\n",
945
+ "# Example usage\n",
946
+ "test_ds = get_val_dataset() # Define this function\n",
947
+ "evaluate(train_ds)"
948
+ ]
949
+ },
950
+ {
951
+ "cell_type": "code",
952
+ "execution_count": 12,
953
+ "id": "268eb52f",
954
+ "metadata": {
955
+ "execution": {
956
+ "iopub.execute_input": "2026-02-12T22:08:25.423242Z",
957
+ "iopub.status.busy": "2026-02-12T22:08:25.422959Z",
958
+ "iopub.status.idle": "2026-02-12T22:08:25.430078Z",
959
+ "shell.execute_reply": "2026-02-12T22:08:25.429489Z"
960
+ },
961
+ "papermill": {
962
+ "duration": 0.166727,
963
+ "end_time": "2026-02-12T22:08:25.431112",
964
+ "exception": false,
965
+ "start_time": "2026-02-12T22:08:25.264385",
966
+ "status": "completed"
967
+ },
968
+ "tags": []
969
+ },
970
+ "outputs": [],
971
+ "source": [
972
+ "import os\n",
973
+ "import tensorflow as tf\n",
974
+ "\n",
975
+ "OUTPUT_DIR = \"outputs\"\n",
976
+ "\n",
977
+ "\n",
978
+ "# -------------------- Utils --------------------\n",
979
+ "def to_uint8(x):\n",
980
+ " \"\"\"\n",
981
+ " Convert tensor from [-1,1] → uint8 [0,255]\n",
982
+ " \"\"\"\n",
983
+ " x = (x + 1.0) * 127.5\n",
984
+ " x = tf.clip_by_value(x, 0, 255)\n",
985
+ " return tf.cast(x, tf.uint8)\n",
986
+ "\n",
987
+ "\n",
988
+ "# -------------------- Save 3 Images in 1 --------------------\n",
989
+ "def generate(\n",
990
+ " model,\n",
991
+ " dataset,\n",
992
+ " epoch,\n",
993
+ " out_dir=OUTPUT_DIR):\n",
994
+ "\n",
995
+ " os.makedirs(out_dir, exist_ok=True)\n",
996
+ "\n",
997
+ " for idx, (visible, real_ir) in enumerate(dataset):\n",
998
+ " if idx%5==0:\n",
999
+ "\n",
1000
+ " # Generate fake IR\n",
1001
+ " fake_ir = model(visible, training=False)\n",
1002
+ " \n",
1003
+ " # Convert → uint8\n",
1004
+ " vis = to_uint8(visible[0])\n",
1005
+ " real = to_uint8(real_ir[0])\n",
1006
+ " fake = to_uint8(fake_ir[0])\n",
1007
+ " \n",
1008
+ " # Safety crop (if any mismatch)\n",
1009
+ " h = min(vis.shape[0], real.shape[0], fake.shape[0])\n",
1010
+ " w = min(vis.shape[1], real.shape[1], fake.shape[1])\n",
1011
+ " \n",
1012
+ " vis = vis[:h, :w]\n",
1013
+ " real = real[:h, :w]\n",
1014
+ " fake = fake[:h, :w]\n",
1015
+ "\n",
1016
+ " # -------- Concatenate 3 images horizontally --------\n",
1017
+ " trio = tf.concat([vis, real, fake], axis=1)\n",
1018
+ " \n",
1019
+ " # Save path\n",
1020
+ " save_path = os.path.join(\n",
1021
+ " out_dir,\n",
1022
+ " f\"img_{idx:05d}.png\"\n",
1023
+ " )\n",
1024
+ " \n",
1025
+ " # Save image\n",
1026
+ " tf.keras.preprocessing.image.save_img(\n",
1027
+ " save_path,\n",
1028
+ " trio.numpy()\n",
1029
+ " )\n",
1030
+ " print(idx)"
1031
+ ]
1032
+ },
1033
+ {
1034
+ "cell_type": "code",
1035
+ "execution_count": 13,
1036
+ "id": "161508e1",
1037
+ "metadata": {
1038
+ "execution": {
1039
+ "iopub.execute_input": "2026-02-12T22:08:25.750226Z",
1040
+ "iopub.status.busy": "2026-02-12T22:08:25.749948Z",
1041
+ "iopub.status.idle": "2026-02-12T22:12:22.229019Z",
1042
+ "shell.execute_reply": "2026-02-12T22:12:22.228225Z"
1043
+ },
1044
+ "papermill": {
1045
+ "duration": 236.642335,
1046
+ "end_time": "2026-02-12T22:12:22.230235",
1047
+ "exception": false,
1048
+ "start_time": "2026-02-12T22:08:25.587900",
1049
+ "status": "completed"
1050
+ },
1051
+ "tags": []
1052
+ },
1053
+ "outputs": [
1054
+ {
1055
+ "name": "stdout",
1056
+ "output_type": "stream",
1057
+ "text": [
1058
+ "0\n",
1059
+ "5\n",
1060
+ "10\n",
1061
+ "15\n",
1062
+ "20\n",
1063
+ "25\n",
1064
+ "30\n",
1065
+ "35\n",
1066
+ "40\n",
1067
+ "45\n",
1068
+ "50\n",
1069
+ "55\n",
1070
+ "60\n",
1071
+ "65\n",
1072
+ "70\n",
1073
+ "75\n",
1074
+ "80\n",
1075
+ "85\n",
1076
+ "90\n",
1077
+ "95\n",
1078
+ "100\n",
1079
+ "105\n",
1080
+ "110\n",
1081
+ "115\n",
1082
+ "120\n",
1083
+ "125\n",
1084
+ "130\n",
1085
+ "135\n",
1086
+ "140\n",
1087
+ "145\n",
1088
+ "150\n",
1089
+ "155\n",
1090
+ "160\n",
1091
+ "165\n",
1092
+ "170\n",
1093
+ "175\n",
1094
+ "180\n",
1095
+ "185\n",
1096
+ "190\n",
1097
+ "195\n",
1098
+ "200\n",
1099
+ "205\n",
1100
+ "210\n",
1101
+ "215\n",
1102
+ "220\n",
1103
+ "225\n",
1104
+ "230\n",
1105
+ "235\n",
1106
+ "240\n",
1107
+ "245\n",
1108
+ "250\n",
1109
+ "255\n",
1110
+ "260\n",
1111
+ "265\n",
1112
+ "270\n",
1113
+ "275\n",
1114
+ "280\n",
1115
+ "285\n",
1116
+ "290\n",
1117
+ "295\n",
1118
+ "300\n",
1119
+ "305\n",
1120
+ "310\n",
1121
+ "315\n",
1122
+ "320\n",
1123
+ "325\n",
1124
+ "330\n",
1125
+ "335\n",
1126
+ "340\n",
1127
+ "345\n",
1128
+ "350\n",
1129
+ "355\n",
1130
+ "360\n",
1131
+ "365\n",
1132
+ "370\n",
1133
+ "375\n",
1134
+ "380\n",
1135
+ "385\n",
1136
+ "390\n",
1137
+ "395\n",
1138
+ "400\n",
1139
+ "405\n",
1140
+ "410\n",
1141
+ "415\n",
1142
+ "420\n",
1143
+ "425\n",
1144
+ "430\n",
1145
+ "435\n",
1146
+ "440\n",
1147
+ "445\n",
1148
+ "450\n",
1149
+ "455\n",
1150
+ "460\n",
1151
+ "465\n",
1152
+ "470\n",
1153
+ "475\n",
1154
+ "480\n",
1155
+ "485\n",
1156
+ "490\n",
1157
+ "495\n",
1158
+ "500\n",
1159
+ "505\n",
1160
+ "510\n",
1161
+ "515\n",
1162
+ "520\n",
1163
+ "525\n",
1164
+ "530\n",
1165
+ "535\n",
1166
+ "540\n",
1167
+ "545\n",
1168
+ "550\n",
1169
+ "555\n",
1170
+ "560\n",
1171
+ "565\n",
1172
+ "570\n",
1173
+ "575\n",
1174
+ "580\n",
1175
+ "585\n",
1176
+ "590\n",
1177
+ "595\n",
1178
+ "600\n",
1179
+ "605\n",
1180
+ "610\n",
1181
+ "615\n",
1182
+ "620\n",
1183
+ "625\n",
1184
+ "630\n",
1185
+ "635\n",
1186
+ "640\n",
1187
+ "645\n",
1188
+ "650\n",
1189
+ "655\n",
1190
+ "660\n",
1191
+ "665\n",
1192
+ "670\n",
1193
+ "675\n",
1194
+ "680\n",
1195
+ "685\n",
1196
+ "690\n",
1197
+ "695\n",
1198
+ "700\n",
1199
+ "705\n",
1200
+ "710\n",
1201
+ "715\n",
1202
+ "720\n",
1203
+ "725\n",
1204
+ "730\n",
1205
+ "735\n",
1206
+ "740\n",
1207
+ "745\n",
1208
+ "750\n",
1209
+ "755\n",
1210
+ "760\n",
1211
+ "765\n",
1212
+ "770\n",
1213
+ "775\n",
1214
+ "780\n",
1215
+ "785\n",
1216
+ "790\n",
1217
+ "795\n",
1218
+ "800\n",
1219
+ "805\n",
1220
+ "810\n",
1221
+ "815\n",
1222
+ "820\n",
1223
+ "825\n",
1224
+ "830\n",
1225
+ "835\n",
1226
+ "840\n",
1227
+ "845\n",
1228
+ "850\n",
1229
+ "855\n",
1230
+ "860\n",
1231
+ "865\n",
1232
+ "870\n",
1233
+ "875\n",
1234
+ "880\n",
1235
+ "885\n",
1236
+ "890\n",
1237
+ "895\n",
1238
+ "900\n",
1239
+ "905\n",
1240
+ "910\n",
1241
+ "915\n",
1242
+ "920\n",
1243
+ "925\n",
1244
+ "930\n",
1245
+ "935\n",
1246
+ "940\n",
1247
+ "945\n",
1248
+ "950\n",
1249
+ "955\n",
1250
+ "960\n",
1251
+ "965\n",
1252
+ "970\n",
1253
+ "975\n",
1254
+ "980\n",
1255
+ "985\n",
1256
+ "990\n",
1257
+ "995\n",
1258
+ "1000\n",
1259
+ "1005\n",
1260
+ "1010\n",
1261
+ "1015\n",
1262
+ "1020\n",
1263
+ "1025\n",
1264
+ "1030\n",
1265
+ "1035\n",
1266
+ "1040\n",
1267
+ "1045\n",
1268
+ "1050\n",
1269
+ "1055\n",
1270
+ "1060\n",
1271
+ "1065\n",
1272
+ "1070\n",
1273
+ "1075\n",
1274
+ "1080\n",
1275
+ "1085\n",
1276
+ "1090\n",
1277
+ "1095\n",
1278
+ "1100\n",
1279
+ "1105\n",
1280
+ "1110\n",
1281
+ "1115\n",
1282
+ "1120\n",
1283
+ "1125\n",
1284
+ "1130\n",
1285
+ "1135\n",
1286
+ "1140\n",
1287
+ "1145\n",
1288
+ "1150\n",
1289
+ "1155\n",
1290
+ "1160\n",
1291
+ "1165\n",
1292
+ "1170\n",
1293
+ "1175\n",
1294
+ "1180\n",
1295
+ "1185\n",
1296
+ "1190\n",
1297
+ "1195\n",
1298
+ "1200\n",
1299
+ "1205\n",
1300
+ "1210\n",
1301
+ "1215\n",
1302
+ "1220\n",
1303
+ "1225\n",
1304
+ "1230\n",
1305
+ "1235\n",
1306
+ "1240\n",
1307
+ "1245\n",
1308
+ "1250\n",
1309
+ "1255\n",
1310
+ "1260\n",
1311
+ "1265\n",
1312
+ "1270\n",
1313
+ "1275\n",
1314
+ "1280\n",
1315
+ "1285\n",
1316
+ "1290\n",
1317
+ "1295\n",
1318
+ "1300\n",
1319
+ "1305\n",
1320
+ "1310\n",
1321
+ "1315\n",
1322
+ "1320\n",
1323
+ "1325\n",
1324
+ "1330\n",
1325
+ "1335\n",
1326
+ "1340\n",
1327
+ "1345\n",
1328
+ "1350\n",
1329
+ "1355\n",
1330
+ "1360\n",
1331
+ "1365\n",
1332
+ "1370\n",
1333
+ "1375\n",
1334
+ "1380\n",
1335
+ "1385\n",
1336
+ "1390\n",
1337
+ "1395\n",
1338
+ "1400\n",
1339
+ "1405\n",
1340
+ "1410\n",
1341
+ "1415\n",
1342
+ "1420\n",
1343
+ "1425\n",
1344
+ "1430\n",
1345
+ "1435\n",
1346
+ "1440\n",
1347
+ "1445\n",
1348
+ "1450\n",
1349
+ "1455\n",
1350
+ "1460\n",
1351
+ "1465\n",
1352
+ "1470\n",
1353
+ "1475\n",
1354
+ "1480\n",
1355
+ "1485\n",
1356
+ "1490\n",
1357
+ "1495\n",
1358
+ "1500\n",
1359
+ "1505\n",
1360
+ "1510\n",
1361
+ "1515\n",
1362
+ "1520\n",
1363
+ "1525\n",
1364
+ "1530\n",
1365
+ "1535\n",
1366
+ "1540\n",
1367
+ "1545\n",
1368
+ "1550\n",
1369
+ "1555\n",
1370
+ "1560\n",
1371
+ "1565\n",
1372
+ "1570\n",
1373
+ "1575\n",
1374
+ "1580\n",
1375
+ "1585\n",
1376
+ "1590\n",
1377
+ "1595\n",
1378
+ "1600\n",
1379
+ "1605\n",
1380
+ "1610\n",
1381
+ "1615\n",
1382
+ "1620\n",
1383
+ "1625\n",
1384
+ "1630\n",
1385
+ "1635\n",
1386
+ "1640\n",
1387
+ "1645\n",
1388
+ "1650\n",
1389
+ "1655\n",
1390
+ "1660\n",
1391
+ "1665\n",
1392
+ "1670\n",
1393
+ "1675\n",
1394
+ "1680\n",
1395
+ "1685\n",
1396
+ "1690\n",
1397
+ "1695\n",
1398
+ "1700\n",
1399
+ "1705\n",
1400
+ "1710\n",
1401
+ "1715\n",
1402
+ "1720\n",
1403
+ "1725\n",
1404
+ "1730\n",
1405
+ "1735\n",
1406
+ "1740\n",
1407
+ "1745\n",
1408
+ "1750\n",
1409
+ "1755\n",
1410
+ "1760\n",
1411
+ "1765\n",
1412
+ "1770\n",
1413
+ "1775\n",
1414
+ "1780\n",
1415
+ "1785\n",
1416
+ "1790\n",
1417
+ "1795\n",
1418
+ "1800\n",
1419
+ "1805\n",
1420
+ "1810\n",
1421
+ "1815\n",
1422
+ "1820\n",
1423
+ "1825\n",
1424
+ "1830\n",
1425
+ "1835\n",
1426
+ "1840\n",
1427
+ "1845\n",
1428
+ "1850\n",
1429
+ "1855\n",
1430
+ "1860\n",
1431
+ "1865\n",
1432
+ "1870\n",
1433
+ "1875\n",
1434
+ "1880\n",
1435
+ "1885\n",
1436
+ "1890\n",
1437
+ "1895\n",
1438
+ "1900\n",
1439
+ "1905\n",
1440
+ "1910\n",
1441
+ "1915\n",
1442
+ "1920\n",
1443
+ "1925\n",
1444
+ "1930\n",
1445
+ "1935\n",
1446
+ "1940\n",
1447
+ "1945\n",
1448
+ "1950\n",
1449
+ "1955\n",
1450
+ "1960\n",
1451
+ "1965\n",
1452
+ "1970\n",
1453
+ "1975\n",
1454
+ "1980\n",
1455
+ "1985\n",
1456
+ "1990\n",
1457
+ "1995\n",
1458
+ "2000\n",
1459
+ "2005\n",
1460
+ "2010\n",
1461
+ "2015\n",
1462
+ "2020\n",
1463
+ "2025\n",
1464
+ "2030\n",
1465
+ "2035\n",
1466
+ "2040\n",
1467
+ "2045\n",
1468
+ "2050\n",
1469
+ "2055\n",
1470
+ "2060\n",
1471
+ "2065\n",
1472
+ "2070\n",
1473
+ "2075\n",
1474
+ "2080\n",
1475
+ "2085\n",
1476
+ "2090\n",
1477
+ "2095\n",
1478
+ "2100\n",
1479
+ "2105\n",
1480
+ "2110\n",
1481
+ "2115\n",
1482
+ "2120\n",
1483
+ "2125\n",
1484
+ "2130\n",
1485
+ "2135\n",
1486
+ "2140\n",
1487
+ "2145\n",
1488
+ "2150\n",
1489
+ "2155\n",
1490
+ "2160\n",
1491
+ "2165\n",
1492
+ "2170\n",
1493
+ "2175\n",
1494
+ "2180\n",
1495
+ "2185\n",
1496
+ "2190\n",
1497
+ "2195\n",
1498
+ "2200\n",
1499
+ "2205\n",
1500
+ "2210\n",
1501
+ "2215\n",
1502
+ "2220\n",
1503
+ "2225\n",
1504
+ "2230\n",
1505
+ "2235\n",
1506
+ "2240\n",
1507
+ "2245\n",
1508
+ "2250\n",
1509
+ "2255\n",
1510
+ "2260\n",
1511
+ "2265\n",
1512
+ "2270\n",
1513
+ "2275\n",
1514
+ "2280\n",
1515
+ "2285\n",
1516
+ "2290\n",
1517
+ "2295\n",
1518
+ "2300\n",
1519
+ "2305\n",
1520
+ "2310\n",
1521
+ "2315\n",
1522
+ "2320\n",
1523
+ "2325\n",
1524
+ "2330\n",
1525
+ "2335\n",
1526
+ "2340\n",
1527
+ "2345\n",
1528
+ "2350\n",
1529
+ "2355\n",
1530
+ "2360\n",
1531
+ "2365\n",
1532
+ "2370\n",
1533
+ "2375\n",
1534
+ "2380\n",
1535
+ "2385\n",
1536
+ "2390\n",
1537
+ "2395\n",
1538
+ "2400\n",
1539
+ "2405\n",
1540
+ "2410\n",
1541
+ "2415\n",
1542
+ "2420\n",
1543
+ "2425\n",
1544
+ "2430\n",
1545
+ "2435\n",
1546
+ "2440\n",
1547
+ "2445\n",
1548
+ "2450\n",
1549
+ "2455\n",
1550
+ "2460\n",
1551
+ "2465\n",
1552
+ "2470\n",
1553
+ "2475\n",
1554
+ "2480\n",
1555
+ "2485\n",
1556
+ "2490\n",
1557
+ "2495\n",
1558
+ "2500\n",
1559
+ "2505\n",
1560
+ "2510\n",
1561
+ "2515\n",
1562
+ "2520\n",
1563
+ "2525\n",
1564
+ "2530\n",
1565
+ "2535\n",
1566
+ "2540\n",
1567
+ "2545\n",
1568
+ "2550\n",
1569
+ "2555\n",
1570
+ "2560\n",
1571
+ "2565\n",
1572
+ "2570\n",
1573
+ "2575\n",
1574
+ "2580\n",
1575
+ "2585\n",
1576
+ "2590\n",
1577
+ "2595\n",
1578
+ "2600\n",
1579
+ "2605\n",
1580
+ "2610\n",
1581
+ "2615\n",
1582
+ "2620\n",
1583
+ "2625\n",
1584
+ "2630\n",
1585
+ "2635\n",
1586
+ "2640\n",
1587
+ "2645\n",
1588
+ "2650\n",
1589
+ "2655\n",
1590
+ "2660\n",
1591
+ "2665\n",
1592
+ "2670\n",
1593
+ "2675\n",
1594
+ "2680\n",
1595
+ "2685\n",
1596
+ "2690\n",
1597
+ "2695\n",
1598
+ "2700\n",
1599
+ "2705\n",
1600
+ "2710\n",
1601
+ "2715\n",
1602
+ "2720\n",
1603
+ "2725\n",
1604
+ "2730\n",
1605
+ "2735\n",
1606
+ "2740\n",
1607
+ "2745\n",
1608
+ "2750\n",
1609
+ "2755\n",
1610
+ "2760\n",
1611
+ "2765\n",
1612
+ "2770\n",
1613
+ "2775\n",
1614
+ "2780\n",
1615
+ "2785\n",
1616
+ "2790\n",
1617
+ "2795\n",
1618
+ "2800\n",
1619
+ "2805\n",
1620
+ "2810\n",
1621
+ "2815\n",
1622
+ "2820\n",
1623
+ "2825\n",
1624
+ "2830\n",
1625
+ "2835\n",
1626
+ "2840\n",
1627
+ "2845\n",
1628
+ "2850\n",
1629
+ "2855\n",
1630
+ "2860\n",
1631
+ "2865\n",
1632
+ "2870\n",
1633
+ "2875\n",
1634
+ "2880\n",
1635
+ "2885\n",
1636
+ "2890\n",
1637
+ "2895\n",
1638
+ "2900\n",
1639
+ "2905\n",
1640
+ "2910\n",
1641
+ "2915\n",
1642
+ "2920\n",
1643
+ "2925\n",
1644
+ "2930\n",
1645
+ "2935\n",
1646
+ "2940\n",
1647
+ "2945\n",
1648
+ "2950\n",
1649
+ "2955\n",
1650
+ "2960\n",
1651
+ "2965\n",
1652
+ "2970\n",
1653
+ "2975\n",
1654
+ "2980\n",
1655
+ "2985\n",
1656
+ "2990\n",
1657
+ "2995\n",
1658
+ "3000\n",
1659
+ "3005\n",
1660
+ "3010\n",
1661
+ "3015\n",
1662
+ "3020\n",
1663
+ "3025\n",
1664
+ "3030\n",
1665
+ "3035\n",
1666
+ "3040\n",
1667
+ "3045\n",
1668
+ "3050\n",
1669
+ "3055\n",
1670
+ "3060\n",
1671
+ "3065\n",
1672
+ "3070\n",
1673
+ "3075\n",
1674
+ "3080\n",
1675
+ "3085\n",
1676
+ "3090\n",
1677
+ "3095\n",
1678
+ "3100\n",
1679
+ "3105\n",
1680
+ "3110\n",
1681
+ "3115\n",
1682
+ "3120\n",
1683
+ "3125\n",
1684
+ "3130\n",
1685
+ "3135\n",
1686
+ "3140\n",
1687
+ "3145\n",
1688
+ "3150\n",
1689
+ "3155\n",
1690
+ "3160\n",
1691
+ "3165\n",
1692
+ "3170\n",
1693
+ "3175\n",
1694
+ "3180\n",
1695
+ "3185\n",
1696
+ "3190\n",
1697
+ "3195\n",
1698
+ "3200\n",
1699
+ "3205\n",
1700
+ "3210\n",
1701
+ "3215\n",
1702
+ "3220\n",
1703
+ "3225\n",
1704
+ "3230\n",
1705
+ "3235\n",
1706
+ "3240\n",
1707
+ "3245\n",
1708
+ "3250\n",
1709
+ "3255\n",
1710
+ "3260\n",
1711
+ "3265\n",
1712
+ "3270\n",
1713
+ "3275\n",
1714
+ "3280\n",
1715
+ "3285\n",
1716
+ "3290\n",
1717
+ "3295\n",
1718
+ "3300\n",
1719
+ "3305\n",
1720
+ "3310\n",
1721
+ "3315\n",
1722
+ "3320\n",
1723
+ "3325\n",
1724
+ "3330\n",
1725
+ "3335\n",
1726
+ "3340\n",
1727
+ "3345\n",
1728
+ "3350\n",
1729
+ "3355\n",
1730
+ "3360\n",
1731
+ "3365\n",
1732
+ "3370\n",
1733
+ "3375\n",
1734
+ "3380\n",
1735
+ "3385\n",
1736
+ "3390\n",
1737
+ "3395\n",
1738
+ "3400\n",
1739
+ "3405\n",
1740
+ "3410\n",
1741
+ "3415\n",
1742
+ "3420\n",
1743
+ "3425\n",
1744
+ "3430\n",
1745
+ "3435\n",
1746
+ "3440\n",
1747
+ "3445\n",
1748
+ "3450\n",
1749
+ "3455\n",
1750
+ "3460\n",
1751
+ "3465\n",
1752
+ "3470\n",
1753
+ "3475\n",
1754
+ "3480\n",
1755
+ "3485\n",
1756
+ "3490\n",
1757
+ "3495\n",
1758
+ "3500\n",
1759
+ "3505\n",
1760
+ "3510\n",
1761
+ "3515\n",
1762
+ "3520\n",
1763
+ "3525\n",
1764
+ "3530\n",
1765
+ "3535\n",
1766
+ "3540\n",
1767
+ "3545\n",
1768
+ "3550\n",
1769
+ "3555\n",
1770
+ "3560\n",
1771
+ "3565\n",
1772
+ "3570\n",
1773
+ "3575\n",
1774
+ "3580\n",
1775
+ "3585\n",
1776
+ "3590\n",
1777
+ "3595\n",
1778
+ "3600\n",
1779
+ "3605\n",
1780
+ "3610\n",
1781
+ "3615\n",
1782
+ "3620\n",
1783
+ "3625\n",
1784
+ "3630\n",
1785
+ "3635\n",
1786
+ "3640\n",
1787
+ "3645\n",
1788
+ "3650\n",
1789
+ "3655\n",
1790
+ "3660\n",
1791
+ "3665\n",
1792
+ "3670\n",
1793
+ "3675\n",
1794
+ "3680\n",
1795
+ "3685\n",
1796
+ "3690\n",
1797
+ "3695\n",
1798
+ "3700\n",
1799
+ "3705\n",
1800
+ "3710\n",
1801
+ "3715\n",
1802
+ "3720\n",
1803
+ "3725\n",
1804
+ "3730\n",
1805
+ "3735\n",
1806
+ "3740\n",
1807
+ "3745\n",
1808
+ "3750\n",
1809
+ "3755\n",
1810
+ "3760\n",
1811
+ "3765\n",
1812
+ "3770\n",
1813
+ "3775\n",
1814
+ "3780\n",
1815
+ "3785\n",
1816
+ "3790\n",
1817
+ "3795\n",
1818
+ "3800\n",
1819
+ "3805\n",
1820
+ "3810\n",
1821
+ "3815\n",
1822
+ "3820\n",
1823
+ "3825\n",
1824
+ "3830\n",
1825
+ "3835\n",
1826
+ "3840\n",
1827
+ "3845\n",
1828
+ "3850\n",
1829
+ "3855\n",
1830
+ "3860\n",
1831
+ "3865\n",
1832
+ "3870\n",
1833
+ "3875\n",
1834
+ "3880\n",
1835
+ "3885\n",
1836
+ "3890\n",
1837
+ "3895\n",
1838
+ "3900\n",
1839
+ "3905\n",
1840
+ "3910\n",
1841
+ "3915\n",
1842
+ "3920\n",
1843
+ "3925\n",
1844
+ "3930\n",
1845
+ "3935\n",
1846
+ "3940\n",
1847
+ "3945\n",
1848
+ "3950\n",
1849
+ "3955\n",
1850
+ "3960\n",
1851
+ "3965\n",
1852
+ "3970\n",
1853
+ "3975\n",
1854
+ "3980\n",
1855
+ "3985\n",
1856
+ "3990\n",
1857
+ "3995\n",
1858
+ "4000\n",
1859
+ "4005\n",
1860
+ "4010\n",
1861
+ "4015\n",
1862
+ "4020\n",
1863
+ "4025\n",
1864
+ "4030\n",
1865
+ "4035\n",
1866
+ "4040\n",
1867
+ "4045\n",
1868
+ "4050\n",
1869
+ "4055\n",
1870
+ "4060\n",
1871
+ "4065\n",
1872
+ "4070\n",
1873
+ "4075\n",
1874
+ "4080\n",
1875
+ "4085\n",
1876
+ "4090\n",
1877
+ "4095\n",
1878
+ "4100\n",
1879
+ "4105\n",
1880
+ "4110\n",
1881
+ "4115\n",
1882
+ "4120\n",
1883
+ "4125\n",
1884
+ "4130\n",
1885
+ "4135\n",
1886
+ "4140\n",
1887
+ "4145\n",
1888
+ "4150\n",
1889
+ "4155\n",
1890
+ "4160\n",
1891
+ "4165\n",
1892
+ "4170\n",
1893
+ "4175\n",
1894
+ "4180\n",
1895
+ "4185\n",
1896
+ "4190\n",
1897
+ "4195\n",
1898
+ "4200\n",
1899
+ "4205\n",
1900
+ "4210\n",
1901
+ "4215\n",
1902
+ "4220\n",
1903
+ "4225\n",
1904
+ "4230\n",
1905
+ "4235\n",
1906
+ "4240\n",
1907
+ "4245\n",
1908
+ "4250\n",
1909
+ "4255\n",
1910
+ "4260\n",
1911
+ "4265\n",
1912
+ "4270\n",
1913
+ "4275\n",
1914
+ "4280\n",
1915
+ "4285\n",
1916
+ "4290\n",
1917
+ "4295\n",
1918
+ "4300\n",
1919
+ "4305\n",
1920
+ "4310\n",
1921
+ "4315\n",
1922
+ "4320\n",
1923
+ "4325\n",
1924
+ "4330\n",
1925
+ "4335\n",
1926
+ "4340\n",
1927
+ "4345\n",
1928
+ "4350\n",
1929
+ "4355\n",
1930
+ "4360\n",
1931
+ "4365\n",
1932
+ "4370\n",
1933
+ "4375\n",
1934
+ "4380\n",
1935
+ "4385\n",
1936
+ "4390\n",
1937
+ "4395\n",
1938
+ "4400\n",
1939
+ "4405\n",
1940
+ "4410\n",
1941
+ "4415\n",
1942
+ "4420\n",
1943
+ "4425\n",
1944
+ "4430\n",
1945
+ "4435\n",
1946
+ "4440\n",
1947
+ "4445\n",
1948
+ "4450\n",
1949
+ "4455\n",
1950
+ "4460\n",
1951
+ "4465\n",
1952
+ "4470\n",
1953
+ "4475\n",
1954
+ "4480\n",
1955
+ "4485\n",
1956
+ "4490\n",
1957
+ "4495\n",
1958
+ "4500\n",
1959
+ "4505\n",
1960
+ "4510\n",
1961
+ "4515\n",
1962
+ "4520\n",
1963
+ "4525\n",
1964
+ "4530\n",
1965
+ "4535\n",
1966
+ "4540\n",
1967
+ "4545\n",
1968
+ "4550\n",
1969
+ "4555\n",
1970
+ "4560\n",
1971
+ "4565\n",
1972
+ "4570\n",
1973
+ "4575\n",
1974
+ "4580\n",
1975
+ "4585\n",
1976
+ "4590\n",
1977
+ "4595\n",
1978
+ "4600\n",
1979
+ "4605\n",
1980
+ "4610\n",
1981
+ "4615\n",
1982
+ "4620\n",
1983
+ "4625\n",
1984
+ "4630\n",
1985
+ "4635\n",
1986
+ "4640\n",
1987
+ "4645\n",
1988
+ "4650\n",
1989
+ "4655\n",
1990
+ "4660\n",
1991
+ "4665\n",
1992
+ "4670\n",
1993
+ "4675\n",
1994
+ "4680\n",
1995
+ "4685\n",
1996
+ "4690\n",
1997
+ "4695\n",
1998
+ "4700\n",
1999
+ "4705\n",
2000
+ "4710\n",
2001
+ "4715\n",
2002
+ "4720\n",
2003
+ "4725\n",
2004
+ "4730\n",
2005
+ "4735\n",
2006
+ "4740\n",
2007
+ "4745\n",
2008
+ "4750\n",
2009
+ "4755\n",
2010
+ "4760\n",
2011
+ "4765\n",
2012
+ "4770\n",
2013
+ "4775\n",
2014
+ "4780\n",
2015
+ "4785\n",
2016
+ "4790\n",
2017
+ "4795\n",
2018
+ "4800\n",
2019
+ "4805\n",
2020
+ "4810\n",
2021
+ "4815\n",
2022
+ "4820\n",
2023
+ "4825\n",
2024
+ "4830\n",
2025
+ "4835\n",
2026
+ "4840\n",
2027
+ "4845\n",
2028
+ "4850\n",
2029
+ "4855\n",
2030
+ "4860\n",
2031
+ "4865\n",
2032
+ "4870\n",
2033
+ "4875\n",
2034
+ "4880\n",
2035
+ "4885\n",
2036
+ "4890\n",
2037
+ "4895\n",
2038
+ "4900\n",
2039
+ "4905\n",
2040
+ "4910\n",
2041
+ "4915\n",
2042
+ "4920\n",
2043
+ "4925\n",
2044
+ "4930\n",
2045
+ "4935\n",
2046
+ "4940\n",
2047
+ "4945\n",
2048
+ "4950\n",
2049
+ "4955\n",
2050
+ "4960\n",
2051
+ "4965\n",
2052
+ "4970\n",
2053
+ "4975\n",
2054
+ "4980\n",
2055
+ "4985\n",
2056
+ "4990\n",
2057
+ "4995\n",
2058
+ "5000\n",
2059
+ "5005\n",
2060
+ "5010\n",
2061
+ "5015\n",
2062
+ "5020\n",
2063
+ "5025\n",
2064
+ "5030\n",
2065
+ "5035\n",
2066
+ "5040\n",
2067
+ "5045\n",
2068
+ "5050\n",
2069
+ "5055\n",
2070
+ "5060\n",
2071
+ "5065\n",
2072
+ "5070\n",
2073
+ "5075\n",
2074
+ "5080\n",
2075
+ "5085\n",
2076
+ "5090\n",
2077
+ "5095\n",
2078
+ "5100\n",
2079
+ "5105\n",
2080
+ "5110\n",
2081
+ "5115\n",
2082
+ "5120\n",
2083
+ "5125\n",
2084
+ "5130\n",
2085
+ "5135\n",
2086
+ "5140\n",
2087
+ "5145\n",
2088
+ "5150\n",
2089
+ "5155\n",
2090
+ "5160\n",
2091
+ "5165\n",
2092
+ "5170\n",
2093
+ "5175\n",
2094
+ "5180\n",
2095
+ "5185\n",
2096
+ "5190\n",
2097
+ "5195\n",
2098
+ "5200\n",
2099
+ "5205\n",
2100
+ "5210\n",
2101
+ "5215\n",
2102
+ "5220\n",
2103
+ "5225\n",
2104
+ "5230\n",
2105
+ "5235\n",
2106
+ "5240\n",
2107
+ "5245\n",
2108
+ "5250\n",
2109
+ "5255\n",
2110
+ "5260\n",
2111
+ "5265\n",
2112
+ "5270\n",
2113
+ "5275\n",
2114
+ "5280\n",
2115
+ "5285\n",
2116
+ "5290\n",
2117
+ "5295\n",
2118
+ "5300\n",
2119
+ "5305\n",
2120
+ "5310\n",
2121
+ "5315\n",
2122
+ "5320\n",
2123
+ "5325\n",
2124
+ "5330\n",
2125
+ "5335\n",
2126
+ "5340\n",
2127
+ "5345\n",
2128
+ "5350\n",
2129
+ "5355\n",
2130
+ "5360\n",
2131
+ "5365\n",
2132
+ "5370\n",
2133
+ "5375\n",
2134
+ "5380\n",
2135
+ "5385\n",
2136
+ "5390\n",
2137
+ "5395\n",
2138
+ "5400\n",
2139
+ "5405\n",
2140
+ "5410\n",
2141
+ "5415\n",
2142
+ "5420\n",
2143
+ "5425\n",
2144
+ "5430\n",
2145
+ "5435\n",
2146
+ "5440\n",
2147
+ "5445\n",
2148
+ "5450\n",
2149
+ "5455\n",
2150
+ "5460\n",
2151
+ "5465\n",
2152
+ "5470\n",
2153
+ "5475\n",
2154
+ "5480\n",
2155
+ "5485\n",
2156
+ "5490\n",
2157
+ "5495\n",
2158
+ "5500\n",
2159
+ "5505\n",
2160
+ "5510\n",
2161
+ "5515\n",
2162
+ "5520\n",
2163
+ "5525\n",
2164
+ "5530\n",
2165
+ "5535\n",
2166
+ "5540\n",
2167
+ "5545\n",
2168
+ "5550\n",
2169
+ "5555\n",
2170
+ "5560\n",
2171
+ "5565\n",
2172
+ "5570\n",
2173
+ "5575\n",
2174
+ "5580\n",
2175
+ "5585\n",
2176
+ "5590\n",
2177
+ "5595\n",
2178
+ "5600\n",
2179
+ "5605\n",
2180
+ "5610\n",
2181
+ "5615\n",
2182
+ "5620\n",
2183
+ "5625\n",
2184
+ "5630\n",
2185
+ "5635\n",
2186
+ "5640\n",
2187
+ "5645\n",
2188
+ "5650\n",
2189
+ "5655\n",
2190
+ "5660\n",
2191
+ "5665\n",
2192
+ "5670\n",
2193
+ "5675\n",
2194
+ "5680\n",
2195
+ "5685\n",
2196
+ "5690\n",
2197
+ "5695\n",
2198
+ "5700\n",
2199
+ "5705\n",
2200
+ "5710\n",
2201
+ "5715\n",
2202
+ "5720\n",
2203
+ "5725\n",
2204
+ "5730\n",
2205
+ "5735\n",
2206
+ "5740\n",
2207
+ "5745\n",
2208
+ "5750\n",
2209
+ "5755\n",
2210
+ "5760\n",
2211
+ "5765\n",
2212
+ "5770\n",
2213
+ "5775\n",
2214
+ "5780\n",
2215
+ "5785\n",
2216
+ "5790\n",
2217
+ "5795\n",
2218
+ "5800\n",
2219
+ "5805\n",
2220
+ "5810\n",
2221
+ "5815\n",
2222
+ "5820\n",
2223
+ "5825\n",
2224
+ "5830\n",
2225
+ "5835\n",
2226
+ "5840\n",
2227
+ "5845\n",
2228
+ "5850\n",
2229
+ "5855\n",
2230
+ "5860\n",
2231
+ "5865\n",
2232
+ "5870\n",
2233
+ "5875\n",
2234
+ "5880\n",
2235
+ "5885\n",
2236
+ "5890\n",
2237
+ "5895\n",
2238
+ "5900\n",
2239
+ "5905\n",
2240
+ "5910\n",
2241
+ "5915\n",
2242
+ "5920\n",
2243
+ "5925\n",
2244
+ "5930\n",
2245
+ "5935\n",
2246
+ "5940\n",
2247
+ "5945\n",
2248
+ "5950\n",
2249
+ "5955\n",
2250
+ "5960\n",
2251
+ "5965\n",
2252
+ "5970\n",
2253
+ "5975\n",
2254
+ "5980\n",
2255
+ "5985\n",
2256
+ "5990\n",
2257
+ "5995\n",
2258
+ "6000\n",
2259
+ "6005\n",
2260
+ "6010\n",
2261
+ "6015\n",
2262
+ "6020\n",
2263
+ "6025\n",
2264
+ "6030\n",
2265
+ "6035\n",
2266
+ "6040\n",
2267
+ "6045\n",
2268
+ "6050\n",
2269
+ "6055\n",
2270
+ "6060\n",
2271
+ "6065\n",
2272
+ "6070\n",
2273
+ "6075\n",
2274
+ "6080\n",
2275
+ "6085\n",
2276
+ "6090\n",
2277
+ "6095\n",
2278
+ "6100\n",
2279
+ "6105\n",
2280
+ "6110\n",
2281
+ "6115\n",
2282
+ "6120\n",
2283
+ "6125\n",
2284
+ "6130\n",
2285
+ "6135\n",
2286
+ "6140\n",
2287
+ "6145\n",
2288
+ "6150\n",
2289
+ "6155\n",
2290
+ "6160\n",
2291
+ "6165\n",
2292
+ "6170\n",
2293
+ "6175\n",
2294
+ "6180\n",
2295
+ "6185\n",
2296
+ "6190\n",
2297
+ "6195\n",
2298
+ "6200\n",
2299
+ "6205\n",
2300
+ "6210\n",
2301
+ "6215\n",
2302
+ "6220\n",
2303
+ "6225\n",
2304
+ "6230\n",
2305
+ "6235\n",
2306
+ "6240\n",
2307
+ "6245\n",
2308
+ "6250\n",
2309
+ "6255\n",
2310
+ "6260\n",
2311
+ "6265\n",
2312
+ "6270\n",
2313
+ "6275\n",
2314
+ "6280\n",
2315
+ "6285\n",
2316
+ "6290\n",
2317
+ "6295\n",
2318
+ "6300\n",
2319
+ "6305\n",
2320
+ "6310\n",
2321
+ "6315\n",
2322
+ "6320\n",
2323
+ "6325\n",
2324
+ "6330\n",
2325
+ "6335\n",
2326
+ "6340\n",
2327
+ "6345\n",
2328
+ "6350\n",
2329
+ "6355\n",
2330
+ "6360\n",
2331
+ "6365\n",
2332
+ "6370\n",
2333
+ "6375\n",
2334
+ "6380\n",
2335
+ "6385\n",
2336
+ "6390\n",
2337
+ "6395\n",
2338
+ "6400\n",
2339
+ "6405\n",
2340
+ "6410\n",
2341
+ "6415\n",
2342
+ "6420\n",
2343
+ "6425\n",
2344
+ "6430\n",
2345
+ "6435\n",
2346
+ "6440\n",
2347
+ "6445\n",
2348
+ "6450\n",
2349
+ "6455\n",
2350
+ "6460\n",
2351
+ "6465\n",
2352
+ "6470\n",
2353
+ "6475\n",
2354
+ "6480\n",
2355
+ "6485\n",
2356
+ "6490\n",
2357
+ "6495\n",
2358
+ "6500\n",
2359
+ "6505\n",
2360
+ "6510\n",
2361
+ "6515\n",
2362
+ "6520\n",
2363
+ "6525\n",
2364
+ "6530\n",
2365
+ "6535\n",
2366
+ "6540\n",
2367
+ "6545\n",
2368
+ "6550\n",
2369
+ "6555\n",
2370
+ "6560\n",
2371
+ "6565\n",
2372
+ "6570\n",
2373
+ "6575\n",
2374
+ "6580\n",
2375
+ "6585\n",
2376
+ "6590\n",
2377
+ "6595\n",
2378
+ "6600\n",
2379
+ "6605\n",
2380
+ "6610\n",
2381
+ "6615\n",
2382
+ "6620\n",
2383
+ "6625\n",
2384
+ "6630\n",
2385
+ "6635\n",
2386
+ "6640\n",
2387
+ "6645\n",
2388
+ "6650\n",
2389
+ "6655\n",
2390
+ "6660\n",
2391
+ "6665\n",
2392
+ "6670\n",
2393
+ "6675\n",
2394
+ "6680\n",
2395
+ "6685\n",
2396
+ "6690\n",
2397
+ "6695\n",
2398
+ "6700\n",
2399
+ "6705\n",
2400
+ "6710\n",
2401
+ "6715\n",
2402
+ "6720\n",
2403
+ "6725\n",
2404
+ "6730\n",
2405
+ "6735\n",
2406
+ "6740\n",
2407
+ "6745\n",
2408
+ "6750\n",
2409
+ "6755\n",
2410
+ "6760\n",
2411
+ "6765\n",
2412
+ "6770\n",
2413
+ "6775\n",
2414
+ "6780\n",
2415
+ "6785\n",
2416
+ "6790\n",
2417
+ "6795\n",
2418
+ "6800\n",
2419
+ "6805\n",
2420
+ "6810\n",
2421
+ "6815\n",
2422
+ "6820\n",
2423
+ "6825\n",
2424
+ "6830\n",
2425
+ "6835\n",
2426
+ "6840\n",
2427
+ "6845\n",
2428
+ "6850\n",
2429
+ "6855\n",
2430
+ "6860\n",
2431
+ "6865\n",
2432
+ "6870\n",
2433
+ "6875\n",
2434
+ "6880\n",
2435
+ "6885\n",
2436
+ "6890\n",
2437
+ "6895\n",
2438
+ "6900\n",
2439
+ "6905\n",
2440
+ "6910\n",
2441
+ "6915\n",
2442
+ "6920\n",
2443
+ "6925\n",
2444
+ "6930\n",
2445
+ "6935\n",
2446
+ "6940\n",
2447
+ "6945\n",
2448
+ "6950\n",
2449
+ "6955\n",
2450
+ "6960\n",
2451
+ "6965\n",
2452
+ "6970\n",
2453
+ "6975\n",
2454
+ "6980\n",
2455
+ "6985\n",
2456
+ "6990\n",
2457
+ "6995\n",
2458
+ "7000\n",
2459
+ "7005\n",
2460
+ "7010\n",
2461
+ "7015\n",
2462
+ "7020\n",
2463
+ "7025\n",
2464
+ "7030\n",
2465
+ "7035\n",
2466
+ "7040\n",
2467
+ "7045\n",
2468
+ "7050\n",
2469
+ "7055\n",
2470
+ "7060\n",
2471
+ "7065\n",
2472
+ "7070\n",
2473
+ "7075\n",
2474
+ "7080\n",
2475
+ "7085\n",
2476
+ "7090\n",
2477
+ "7095\n",
2478
+ "7100\n",
2479
+ "7105\n",
2480
+ "7110\n",
2481
+ "7115\n",
2482
+ "7120\n",
2483
+ "7125\n",
2484
+ "7130\n",
2485
+ "7135\n",
2486
+ "7140\n",
2487
+ "7145\n",
2488
+ "7150\n",
2489
+ "7155\n",
2490
+ "7160\n",
2491
+ "7165\n",
2492
+ "7170\n",
2493
+ "7175\n",
2494
+ "7180\n",
2495
+ "7185\n",
2496
+ "7190\n",
2497
+ "7195\n",
2498
+ "7200\n",
2499
+ "7205\n",
2500
+ "7210\n",
2501
+ "7215\n",
2502
+ "7220\n",
2503
+ "7225\n",
2504
+ "7230\n",
2505
+ "7235\n",
2506
+ "7240\n",
2507
+ "7245\n",
2508
+ "7250\n",
2509
+ "7255\n",
2510
+ "7260\n",
2511
+ "7265\n",
2512
+ "7270\n",
2513
+ "7275\n",
2514
+ "7280\n",
2515
+ "7285\n",
2516
+ "7290\n",
2517
+ "7295\n",
2518
+ "7300\n",
2519
+ "7305\n",
2520
+ "7310\n",
2521
+ "7315\n",
2522
+ "7320\n",
2523
+ "7325\n",
2524
+ "7330\n",
2525
+ "7335\n",
2526
+ "7340\n",
2527
+ "7345\n",
2528
+ "7350\n",
2529
+ "7355\n",
2530
+ "7360\n",
2531
+ "7365\n",
2532
+ "7370\n",
2533
+ "7375\n",
2534
+ "7380\n",
2535
+ "7385\n",
2536
+ "7390\n",
2537
+ "7395\n",
2538
+ "7400\n",
2539
+ "7405\n",
2540
+ "7410\n",
2541
+ "7415\n",
2542
+ "7420\n",
2543
+ "7425\n",
2544
+ "7430\n",
2545
+ "7435\n",
2546
+ "7440\n",
2547
+ "7445\n",
2548
+ "7450\n",
2549
+ "7455\n",
2550
+ "7460\n",
2551
+ "7465\n",
2552
+ "7470\n",
2553
+ "7475\n",
2554
+ "7480\n",
2555
+ "7485\n",
2556
+ "7490\n",
2557
+ "7495\n",
2558
+ "7500\n",
2559
+ "7505\n",
2560
+ "7510\n",
2561
+ "7515\n",
2562
+ "7520\n",
2563
+ "7525\n",
2564
+ "7530\n",
2565
+ "7535\n",
2566
+ "7540\n",
2567
+ "7545\n",
2568
+ "7550\n",
2569
+ "7555\n",
2570
+ "7560\n",
2571
+ "7565\n",
2572
+ "7570\n",
2573
+ "7575\n",
2574
+ "7580\n",
2575
+ "7585\n",
2576
+ "7590\n",
2577
+ "7595\n",
2578
+ "7600\n",
2579
+ "7605\n",
2580
+ "7610\n",
2581
+ "7615\n",
2582
+ "7620\n",
2583
+ "7625\n",
2584
+ "7630\n",
2585
+ "7635\n",
2586
+ "7640\n",
2587
+ "7645\n",
2588
+ "7650\n",
2589
+ "7655\n",
2590
+ "7660\n",
2591
+ "7665\n",
2592
+ "7670\n",
2593
+ "7675\n",
2594
+ "7680\n",
2595
+ "7685\n",
2596
+ "7690\n",
2597
+ "7695\n",
2598
+ "7700\n",
2599
+ "7705\n",
2600
+ "7710\n",
2601
+ "7715\n",
2602
+ "7720\n",
2603
+ "7725\n",
2604
+ "7730\n",
2605
+ "7735\n",
2606
+ "7740\n",
2607
+ "7745\n",
2608
+ "7750\n",
2609
+ "7755\n",
2610
+ "7760\n",
2611
+ "7765\n",
2612
+ "7770\n",
2613
+ "7775\n",
2614
+ "7780\n",
2615
+ "7785\n",
2616
+ "7790\n",
2617
+ "7795\n",
2618
+ "7800\n",
2619
+ "7805\n",
2620
+ "7810\n",
2621
+ "7815\n",
2622
+ "7820\n",
2623
+ "7825\n",
2624
+ "7830\n",
2625
+ "7835\n",
2626
+ "7840\n",
2627
+ "7845\n",
2628
+ "7850\n",
2629
+ "7855\n",
2630
+ "7860\n",
2631
+ "7865\n",
2632
+ "7870\n",
2633
+ "7875\n",
2634
+ "7880\n",
2635
+ "7885\n",
2636
+ "7890\n",
2637
+ "7895\n",
2638
+ "7900\n",
2639
+ "7905\n",
2640
+ "7910\n",
2641
+ "7915\n",
2642
+ "7920\n",
2643
+ "7925\n",
2644
+ "7930\n",
2645
+ "7935\n",
2646
+ "7940\n",
2647
+ "7945\n",
2648
+ "7950\n",
2649
+ "7955\n",
2650
+ "7960\n",
2651
+ "7965\n",
2652
+ "7970\n",
2653
+ "7975\n",
2654
+ "7980\n",
2655
+ "7985\n",
2656
+ "7990\n",
2657
+ "7995\n",
2658
+ "8000\n",
2659
+ "8005\n",
2660
+ "8010\n",
2661
+ "8015\n",
2662
+ "8020\n",
2663
+ "8025\n",
2664
+ "8030\n",
2665
+ "8035\n",
2666
+ "8040\n",
2667
+ "8045\n",
2668
+ "8050\n",
2669
+ "8055\n",
2670
+ "8060\n",
2671
+ "8065\n",
2672
+ "8070\n",
2673
+ "8075\n",
2674
+ "8080\n",
2675
+ "8085\n",
2676
+ "8090\n",
2677
+ "8095\n",
2678
+ "8100\n",
2679
+ "8105\n",
2680
+ "8110\n",
2681
+ "8115\n",
2682
+ "8120\n",
2683
+ "8125\n",
2684
+ "8130\n",
2685
+ "8135\n",
2686
+ "8140\n",
2687
+ "8145\n",
2688
+ "8150\n",
2689
+ "8155\n",
2690
+ "8160\n",
2691
+ "8165\n",
2692
+ "8170\n",
2693
+ "8175\n",
2694
+ "8180\n",
2695
+ "8185\n",
2696
+ "8190\n",
2697
+ "8195\n",
2698
+ "8200\n",
2699
+ "8205\n",
2700
+ "8210\n",
2701
+ "8215\n",
2702
+ "8220\n",
2703
+ "8225\n",
2704
+ "8230\n",
2705
+ "8235\n",
2706
+ "8240\n",
2707
+ "8245\n",
2708
+ "8250\n",
2709
+ "8255\n",
2710
+ "8260\n",
2711
+ "8265\n",
2712
+ "8270\n",
2713
+ "8275\n",
2714
+ "8280\n",
2715
+ "8285\n",
2716
+ "8290\n",
2717
+ "8295\n",
2718
+ "8300\n",
2719
+ "8305\n",
2720
+ "8310\n",
2721
+ "8315\n",
2722
+ "8320\n",
2723
+ "8325\n",
2724
+ "8330\n",
2725
+ "8335\n",
2726
+ "8340\n",
2727
+ "8345\n",
2728
+ "8350\n",
2729
+ "8355\n",
2730
+ "8360\n",
2731
+ "8365\n",
2732
+ "8370\n",
2733
+ "8375\n",
2734
+ "8380\n",
2735
+ "8385\n",
2736
+ "8390\n",
2737
+ "8395\n",
2738
+ "8400\n",
2739
+ "8405\n",
2740
+ "8410\n",
2741
+ "8415\n",
2742
+ "8420\n",
2743
+ "8425\n",
2744
+ "8430\n",
2745
+ "8435\n",
2746
+ "8440\n",
2747
+ "8445\n",
2748
+ "8450\n",
2749
+ "8455\n",
2750
+ "8460\n",
2751
+ "8465\n",
2752
+ "8470\n",
2753
+ "8475\n",
2754
+ "8480\n",
2755
+ "8485\n",
2756
+ "8490\n",
2757
+ "8495\n",
2758
+ "8500\n",
2759
+ "8505\n",
2760
+ "8510\n",
2761
+ "8515\n",
2762
+ "8520\n",
2763
+ "8525\n",
2764
+ "8530\n",
2765
+ "8535\n",
2766
+ "8540\n",
2767
+ "8545\n",
2768
+ "8550\n",
2769
+ "8555\n",
2770
+ "8560\n",
2771
+ "8565\n",
2772
+ "8570\n",
2773
+ "8575\n",
2774
+ "8580\n",
2775
+ "8585\n",
2776
+ "8590\n",
2777
+ "8595\n",
2778
+ "8600\n",
2779
+ "8605\n",
2780
+ "8610\n",
2781
+ "8615\n",
2782
+ "8620\n",
2783
+ "8625\n",
2784
+ "8630\n",
2785
+ "8635\n",
2786
+ "8640\n",
2787
+ "8645\n",
2788
+ "8650\n",
2789
+ "8655\n",
2790
+ "8660\n",
2791
+ "8665\n",
2792
+ "8670\n",
2793
+ "8675\n",
2794
+ "8680\n",
2795
+ "8685\n",
2796
+ "8690\n",
2797
+ "8695\n",
2798
+ "8700\n",
2799
+ "8705\n",
2800
+ "8710\n",
2801
+ "8715\n",
2802
+ "8720\n",
2803
+ "8725\n",
2804
+ "8730\n",
2805
+ "8735\n",
2806
+ "8740\n",
2807
+ "8745\n",
2808
+ "8750\n",
2809
+ "8755\n",
2810
+ "8760\n",
2811
+ "8765\n",
2812
+ "8770\n",
2813
+ "8775\n",
2814
+ "8780\n",
2815
+ "8785\n",
2816
+ "8790\n",
2817
+ "8795\n",
2818
+ "8800\n",
2819
+ "8805\n",
2820
+ "8810\n",
2821
+ "8815\n",
2822
+ "8820\n",
2823
+ "8825\n",
2824
+ "8830\n",
2825
+ "8835\n",
2826
+ "8840\n",
2827
+ "8845\n",
2828
+ "8850\n",
2829
+ "8855\n",
2830
+ "8860\n",
2831
+ "8865\n",
2832
+ "8870\n",
2833
+ "8875\n",
2834
+ "8880\n",
2835
+ "8885\n",
2836
+ "8890\n",
2837
+ "8895\n",
2838
+ "8900\n",
2839
+ "8905\n",
2840
+ "8910\n",
2841
+ "8915\n",
2842
+ "8920\n",
2843
+ "8925\n",
2844
+ "8930\n",
2845
+ "8935\n",
2846
+ "8940\n",
2847
+ "8945\n",
2848
+ "8950\n",
2849
+ "8955\n",
2850
+ "8960\n",
2851
+ "8965\n",
2852
+ "8970\n",
2853
+ "8975\n",
2854
+ "8980\n",
2855
+ "8985\n",
2856
+ "8990\n",
2857
+ "8995\n",
2858
+ "9000\n",
2859
+ "9005\n",
2860
+ "9010\n",
2861
+ "9015\n",
2862
+ "9020\n",
2863
+ "9025\n",
2864
+ "9030\n",
2865
+ "9035\n",
2866
+ "9040\n",
2867
+ "9045\n",
2868
+ "9050\n",
2869
+ "9055\n",
2870
+ "9060\n",
2871
+ "9065\n",
2872
+ "9070\n",
2873
+ "9075\n",
2874
+ "9080\n",
2875
+ "9085\n",
2876
+ "9090\n",
2877
+ "9095\n",
2878
+ "9100\n",
2879
+ "9105\n",
2880
+ "9110\n",
2881
+ "9115\n",
2882
+ "9120\n",
2883
+ "9125\n",
2884
+ "9130\n",
2885
+ "9135\n",
2886
+ "9140\n",
2887
+ "9145\n",
2888
+ "9150\n",
2889
+ "9155\n",
2890
+ "9160\n",
2891
+ "9165\n",
2892
+ "9170\n",
2893
+ "9175\n",
2894
+ "9180\n",
2895
+ "9185\n",
2896
+ "9190\n",
2897
+ "9195\n",
2898
+ "9200\n",
2899
+ "9205\n",
2900
+ "9210\n",
2901
+ "9215\n",
2902
+ "9220\n",
2903
+ "9225\n",
2904
+ "9230\n",
2905
+ "9235\n",
2906
+ "9240\n",
2907
+ "9245\n",
2908
+ "9250\n",
2909
+ "9255\n",
2910
+ "9260\n",
2911
+ "9265\n",
2912
+ "9270\n",
2913
+ "9275\n",
2914
+ "9280\n",
2915
+ "9285\n",
2916
+ "9290\n",
2917
+ "9295\n",
2918
+ "9300\n",
2919
+ "9305\n",
2920
+ "9310\n",
2921
+ "9315\n",
2922
+ "9320\n",
2923
+ "9325\n",
2924
+ "9330\n",
2925
+ "9335\n",
2926
+ "9340\n",
2927
+ "9345\n",
2928
+ "9350\n",
2929
+ "9355\n",
2930
+ "9360\n",
2931
+ "9365\n",
2932
+ "9370\n",
2933
+ "9375\n",
2934
+ "9380\n",
2935
+ "9385\n",
2936
+ "9390\n",
2937
+ "9395\n",
2938
+ "9400\n",
2939
+ "9405\n",
2940
+ "9410\n",
2941
+ "9415\n",
2942
+ "9420\n",
2943
+ "9425\n",
2944
+ "9430\n",
2945
+ "9435\n",
2946
+ "9440\n",
2947
+ "9445\n",
2948
+ "9450\n",
2949
+ "9455\n",
2950
+ "9460\n",
2951
+ "9465\n",
2952
+ "9470\n",
2953
+ "9475\n",
2954
+ "9480\n",
2955
+ "9485\n",
2956
+ "9490\n",
2957
+ "9495\n",
2958
+ "9500\n",
2959
+ "9505\n",
2960
+ "9510\n",
2961
+ "9515\n",
2962
+ "9520\n",
2963
+ "9525\n",
2964
+ "9530\n",
2965
+ "9535\n",
2966
+ "9540\n",
2967
+ "9545\n",
2968
+ "9550\n",
2969
+ "9555\n",
2970
+ "9560\n",
2971
+ "9565\n",
2972
+ "9570\n",
2973
+ "9575\n",
2974
+ "9580\n",
2975
+ "9585\n",
2976
+ "9590\n",
2977
+ "9595\n",
2978
+ "9600\n",
2979
+ "9605\n",
2980
+ "9610\n",
2981
+ "9615\n",
2982
+ "9620\n",
2983
+ "9625\n",
2984
+ "9630\n",
2985
+ "9635\n",
2986
+ "9640\n",
2987
+ "9645\n",
2988
+ "9650\n",
2989
+ "9655\n",
2990
+ "9660\n",
2991
+ "9665\n",
2992
+ "9670\n",
2993
+ "9675\n",
2994
+ "9680\n",
2995
+ "9685\n",
2996
+ "9690\n",
2997
+ "9695\n",
2998
+ "9700\n",
2999
+ "9705\n",
3000
+ "9710\n",
3001
+ "9715\n",
3002
+ "9720\n",
3003
+ "9725\n",
3004
+ "9730\n",
3005
+ "9735\n",
3006
+ "9740\n",
3007
+ "9745\n",
3008
+ "9750\n",
3009
+ "9755\n",
3010
+ "9760\n",
3011
+ "9765\n",
3012
+ "9770\n",
3013
+ "9775\n",
3014
+ "9780\n",
3015
+ "9785\n",
3016
+ "9790\n",
3017
+ "9795\n",
3018
+ "9800\n",
3019
+ "9805\n",
3020
+ "9810\n",
3021
+ "9815\n",
3022
+ "9820\n",
3023
+ "9825\n",
3024
+ "9830\n",
3025
+ "9835\n",
3026
+ "9840\n",
3027
+ "9845\n",
3028
+ "9850\n",
3029
+ "9855\n",
3030
+ "9860\n",
3031
+ "9865\n",
3032
+ "9870\n",
3033
+ "9875\n",
3034
+ "9880\n",
3035
+ "9885\n",
3036
+ "9890\n",
3037
+ "9895\n",
3038
+ "9900\n",
3039
+ "9905\n",
3040
+ "9910\n",
3041
+ "9915\n",
3042
+ "9920\n",
3043
+ "9925\n",
3044
+ "9930\n",
3045
+ "9935\n",
3046
+ "9940\n",
3047
+ "9945\n",
3048
+ "9950\n",
3049
+ "9955\n",
3050
+ "9960\n",
3051
+ "9965\n",
3052
+ "9970\n",
3053
+ "9975\n",
3054
+ "9980\n",
3055
+ "9985\n",
3056
+ "9990\n",
3057
+ "9995\n",
3058
+ "10000\n",
3059
+ "10005\n",
3060
+ "10010\n",
3061
+ "10015\n",
3062
+ "10020\n",
3063
+ "10025\n",
3064
+ "10030\n",
3065
+ "10035\n",
3066
+ "10040\n",
3067
+ "10045\n",
3068
+ "10050\n",
3069
+ "10055\n",
3070
+ "10060\n",
3071
+ "10065\n",
3072
+ "10070\n",
3073
+ "10075\n",
3074
+ "10080\n",
3075
+ "10085\n",
3076
+ "10090\n",
3077
+ "10095\n",
3078
+ "10100\n",
3079
+ "10105\n",
3080
+ "10110\n",
3081
+ "10115\n",
3082
+ "10120\n",
3083
+ "10125\n",
3084
+ "10130\n",
3085
+ "10135\n",
3086
+ "10140\n",
3087
+ "10145\n",
3088
+ "10150\n",
3089
+ "10155\n",
3090
+ "10160\n",
3091
+ "10165\n",
3092
+ "10170\n",
3093
+ "10175\n",
3094
+ "10180\n",
3095
+ "10185\n",
3096
+ "10190\n",
3097
+ "10195\n",
3098
+ "10200\n",
3099
+ "10205\n",
3100
+ "10210\n",
3101
+ "10215\n",
3102
+ "10220\n",
3103
+ "10225\n",
3104
+ "10230\n",
3105
+ "10235\n",
3106
+ "10240\n",
3107
+ "10245\n",
3108
+ "10250\n",
3109
+ "10255\n",
3110
+ "10260\n",
3111
+ "10265\n",
3112
+ "10270\n",
3113
+ "10275\n",
3114
+ "10280\n",
3115
+ "10285\n",
3116
+ "10290\n",
3117
+ "10295\n",
3118
+ "10300\n",
3119
+ "10305\n",
3120
+ "10310\n",
3121
+ "10315\n",
3122
+ "10320\n",
3123
+ "10325\n",
3124
+ "10330\n",
3125
+ "10335\n",
3126
+ "10340\n",
3127
+ "10345\n",
3128
+ "10350\n",
3129
+ "10355\n",
3130
+ "10360\n",
3131
+ "10365\n",
3132
+ "10370\n",
3133
+ "10375\n",
3134
+ "10380\n",
3135
+ "10385\n",
3136
+ "10390\n",
3137
+ "10395\n",
3138
+ "10400\n",
3139
+ "10405\n",
3140
+ "10410\n",
3141
+ "10415\n",
3142
+ "10420\n",
3143
+ "10425\n",
3144
+ "10430\n",
3145
+ "10435\n",
3146
+ "10440\n",
3147
+ "10445\n",
3148
+ "10450\n",
3149
+ "10455\n",
3150
+ "10460\n",
3151
+ "10465\n",
3152
+ "10470\n",
3153
+ "10475\n",
3154
+ "10480\n",
3155
+ "10485\n",
3156
+ "10490\n",
3157
+ "10495\n",
3158
+ "10500\n",
3159
+ "10505\n",
3160
+ "10510\n",
3161
+ "10515\n",
3162
+ "10520\n",
3163
+ "10525\n",
3164
+ "10530\n",
3165
+ "10535\n",
3166
+ "10540\n",
3167
+ "10545\n",
3168
+ "10550\n",
3169
+ "10555\n",
3170
+ "10560\n",
3171
+ "10565\n",
3172
+ "10570\n",
3173
+ "10575\n",
3174
+ "10580\n",
3175
+ "10585\n",
3176
+ "10590\n",
3177
+ "10595\n",
3178
+ "10600\n",
3179
+ "10605\n",
3180
+ "10610\n",
3181
+ "10615\n",
3182
+ "10620\n",
3183
+ "10625\n",
3184
+ "10630\n",
3185
+ "10635\n",
3186
+ "10640\n",
3187
+ "10645\n",
3188
+ "10650\n",
3189
+ "10655\n",
3190
+ "10660\n",
3191
+ "10665\n",
3192
+ "10670\n",
3193
+ "10675\n",
3194
+ "10680\n",
3195
+ "10685\n",
3196
+ "10690\n",
3197
+ "10695\n",
3198
+ "10700\n",
3199
+ "10705\n",
3200
+ "10710\n",
3201
+ "10715\n",
3202
+ "10720\n",
3203
+ "10725\n",
3204
+ "10730\n",
3205
+ "10735\n",
3206
+ "10740\n",
3207
+ "10745\n",
3208
+ "10750\n",
3209
+ "10755\n",
3210
+ "10760\n",
3211
+ "10765\n",
3212
+ "10770\n",
3213
+ "10775\n",
3214
+ "10780\n",
3215
+ "10785\n",
3216
+ "10790\n",
3217
+ "10795\n",
3218
+ "10800\n",
3219
+ "10805\n",
3220
+ "10810\n",
3221
+ "10815\n",
3222
+ "10820\n",
3223
+ "10825\n",
3224
+ "10830\n",
3225
+ "10835\n",
3226
+ "10840\n",
3227
+ "10845\n",
3228
+ "10850\n",
3229
+ "10855\n",
3230
+ "10860\n",
3231
+ "10865\n",
3232
+ "10870\n",
3233
+ "10875\n",
3234
+ "10880\n",
3235
+ "10885\n",
3236
+ "10890\n",
3237
+ "10895\n",
3238
+ "10900\n",
3239
+ "10905\n",
3240
+ "10910\n",
3241
+ "10915\n",
3242
+ "10920\n",
3243
+ "10925\n",
3244
+ "10930\n",
3245
+ "10935\n",
3246
+ "10940\n",
3247
+ "10945\n",
3248
+ "10950\n",
3249
+ "10955\n",
3250
+ "10960\n",
3251
+ "10965\n",
3252
+ "10970\n",
3253
+ "10975\n",
3254
+ "10980\n",
3255
+ "10985\n",
3256
+ "10990\n",
3257
+ "10995\n",
3258
+ "11000\n",
3259
+ "11005\n",
3260
+ "11010\n",
3261
+ "11015\n",
3262
+ "11020\n",
3263
+ "11025\n",
3264
+ "11030\n",
3265
+ "11035\n",
3266
+ "11040\n",
3267
+ "11045\n",
3268
+ "11050\n",
3269
+ "11055\n",
3270
+ "11060\n",
3271
+ "11065\n",
3272
+ "11070\n",
3273
+ "11075\n",
3274
+ "11080\n",
3275
+ "11085\n",
3276
+ "11090\n",
3277
+ "11095\n",
3278
+ "11100\n",
3279
+ "11105\n",
3280
+ "11110\n",
3281
+ "11115\n",
3282
+ "11120\n",
3283
+ "11125\n",
3284
+ "11130\n",
3285
+ "11135\n",
3286
+ "11140\n",
3287
+ "11145\n",
3288
+ "11150\n",
3289
+ "11155\n",
3290
+ "11160\n",
3291
+ "11165\n",
3292
+ "11170\n",
3293
+ "11175\n",
3294
+ "11180\n",
3295
+ "11185\n",
3296
+ "11190\n",
3297
+ "11195\n",
3298
+ "11200\n",
3299
+ "11205\n",
3300
+ "11210\n",
3301
+ "11215\n",
3302
+ "11220\n",
3303
+ "11225\n",
3304
+ "11230\n",
3305
+ "11235\n",
3306
+ "11240\n",
3307
+ "11245\n",
3308
+ "11250\n",
3309
+ "11255\n",
3310
+ "11260\n",
3311
+ "11265\n",
3312
+ "11270\n",
3313
+ "11275\n",
3314
+ "11280\n",
3315
+ "11285\n",
3316
+ "11290\n",
3317
+ "11295\n",
3318
+ "11300\n",
3319
+ "11305\n",
3320
+ "11310\n",
3321
+ "11315\n",
3322
+ "11320\n",
3323
+ "11325\n",
3324
+ "11330\n",
3325
+ "11335\n",
3326
+ "11340\n",
3327
+ "11345\n",
3328
+ "11350\n",
3329
+ "11355\n",
3330
+ "11360\n",
3331
+ "11365\n",
3332
+ "11370\n",
3333
+ "11375\n",
3334
+ "11380\n",
3335
+ "11385\n",
3336
+ "11390\n",
3337
+ "11395\n",
3338
+ "11400\n",
3339
+ "11405\n",
3340
+ "11410\n",
3341
+ "11415\n",
3342
+ "11420\n",
3343
+ "11425\n",
3344
+ "11430\n",
3345
+ "11435\n",
3346
+ "11440\n",
3347
+ "11445\n",
3348
+ "11450\n",
3349
+ "11455\n",
3350
+ "11460\n",
3351
+ "11465\n",
3352
+ "11470\n",
3353
+ "11475\n",
3354
+ "11480\n",
3355
+ "11485\n",
3356
+ "11490\n",
3357
+ "11495\n",
3358
+ "11500\n",
3359
+ "11505\n",
3360
+ "11510\n",
3361
+ "11515\n",
3362
+ "11520\n",
3363
+ "11525\n",
3364
+ "11530\n",
3365
+ "11535\n",
3366
+ "11540\n",
3367
+ "11545\n",
3368
+ "11550\n",
3369
+ "11555\n",
3370
+ "11560\n",
3371
+ "11565\n",
3372
+ "11570\n",
3373
+ "11575\n",
3374
+ "11580\n",
3375
+ "11585\n",
3376
+ "11590\n",
3377
+ "11595\n",
3378
+ "11600\n",
3379
+ "11605\n",
3380
+ "11610\n",
3381
+ "11615\n",
3382
+ "11620\n",
3383
+ "11625\n",
3384
+ "11630\n",
3385
+ "11635\n",
3386
+ "11640\n",
3387
+ "11645\n",
3388
+ "11650\n",
3389
+ "11655\n",
3390
+ "11660\n",
3391
+ "11665\n",
3392
+ "11670\n",
3393
+ "11675\n",
3394
+ "11680\n",
3395
+ "11685\n",
3396
+ "11690\n",
3397
+ "11695\n",
3398
+ "11700\n",
3399
+ "11705\n",
3400
+ "11710\n",
3401
+ "11715\n",
3402
+ "11720\n",
3403
+ "11725\n",
3404
+ "11730\n",
3405
+ "11735\n",
3406
+ "11740\n",
3407
+ "11745\n",
3408
+ "11750\n",
3409
+ "11755\n",
3410
+ "11760\n",
3411
+ "11765\n",
3412
+ "11770\n",
3413
+ "11775\n",
3414
+ "11780\n",
3415
+ "11785\n",
3416
+ "11790\n",
3417
+ "11795\n",
3418
+ "11800\n",
3419
+ "11805\n",
3420
+ "11810\n",
3421
+ "11815\n",
3422
+ "11820\n",
3423
+ "11825\n",
3424
+ "11830\n",
3425
+ "11835\n",
3426
+ "11840\n",
3427
+ "11845\n",
3428
+ "11850\n",
3429
+ "11855\n",
3430
+ "11860\n",
3431
+ "11865\n",
3432
+ "11870\n",
3433
+ "11875\n",
3434
+ "11880\n",
3435
+ "11885\n",
3436
+ "11890\n",
3437
+ "11895\n",
3438
+ "11900\n",
3439
+ "11905\n",
3440
+ "11910\n",
3441
+ "11915\n",
3442
+ "11920\n",
3443
+ "11925\n",
3444
+ "11930\n",
3445
+ "11935\n",
3446
+ "11940\n",
3447
+ "11945\n",
3448
+ "11950\n",
3449
+ "11955\n",
3450
+ "11960\n",
3451
+ "11965\n",
3452
+ "11970\n",
3453
+ "11975\n",
3454
+ "11980\n",
3455
+ "11985\n",
3456
+ "11990\n",
3457
+ "11995\n",
3458
+ "12000\n",
3459
+ "12005\n",
3460
+ "12010\n",
3461
+ "12015\n",
3462
+ "12020\n"
3463
+ ]
3464
+ }
3465
+ ],
3466
+ "source": [
3467
+ "# test_ds = get_val_dataset()\n",
3468
+ "# # Run evaluation\n",
3469
+ "# print(test_ds)\n",
3470
+ "generate(\n",
3471
+ " model=generator,\n",
3472
+ " dataset=train_ds,\n",
3473
+ " epoch=150 # change if you want more rows\n",
3474
+ " )"
3475
+ ]
3476
+ },
3477
+ {
3478
+ "cell_type": "code",
3479
+ "execution_count": null,
3480
+ "id": "a1bbabe5",
3481
+ "metadata": {
3482
+ "papermill": {
3483
+ "duration": 0.191322,
3484
+ "end_time": "2026-02-12T22:12:22.615266",
3485
+ "exception": false,
3486
+ "start_time": "2026-02-12T22:12:22.423944",
3487
+ "status": "completed"
3488
+ },
3489
+ "tags": []
3490
+ },
3491
+ "outputs": [],
3492
+ "source": []
3493
+ },
3494
+ {
3495
+ "cell_type": "code",
3496
+ "execution_count": null,
3497
+ "id": "619ef3ab",
3498
+ "metadata": {
3499
+ "papermill": {
3500
+ "duration": 0.201882,
3501
+ "end_time": "2026-02-12T22:12:23.012230",
3502
+ "exception": false,
3503
+ "start_time": "2026-02-12T22:12:22.810348",
3504
+ "status": "completed"
3505
+ },
3506
+ "tags": []
3507
+ },
3508
+ "outputs": [],
3509
+ "source": []
3510
+ }
3511
+ ],
3512
+ "metadata": {
3513
+ "kaggle": {
3514
+ "accelerator": "gpu",
3515
+ "dataSources": [
3516
+ {
3517
+ "datasetId": 8436032,
3518
+ "sourceId": 13308561,
3519
+ "sourceType": "datasetVersion"
3520
+ },
3521
+ {
3522
+ "isSourceIdPinned": false,
3523
+ "modelId": 583820,
3524
+ "modelInstanceId": 571510,
3525
+ "sourceId": 748364,
3526
+ "sourceType": "modelInstanceVersion"
3527
+ },
3528
+ {
3529
+ "isSourceIdPinned": true,
3530
+ "modelId": 584139,
3531
+ "modelInstanceId": 571806,
3532
+ "sourceId": 749667,
3533
+ "sourceType": "modelInstanceVersion"
3534
+ }
3535
+ ],
3536
+ "dockerImageVersionId": 31154,
3537
+ "isGpuEnabled": true,
3538
+ "isInternetEnabled": false,
3539
+ "language": "python",
3540
+ "sourceType": "notebook"
3541
+ },
3542
+ "kernelspec": {
3543
+ "display_name": "Python 3",
3544
+ "language": "python",
3545
+ "name": "python3"
3546
+ },
3547
+ "language_info": {
3548
+ "codemirror_mode": {
3549
+ "name": "ipython",
3550
+ "version": 3
3551
+ },
3552
+ "file_extension": ".py",
3553
+ "mimetype": "text/x-python",
3554
+ "name": "python",
3555
+ "nbconvert_exporter": "python",
3556
+ "pygments_lexer": "ipython3",
3557
+ "version": "3.11.13"
3558
+ },
3559
+ "papermill": {
3560
+ "default_parameters": {},
3561
+ "duration": 828.406063,
3562
+ "end_time": "2026-02-12T22:12:26.638920",
3563
+ "environment_variables": {},
3564
+ "exception": null,
3565
+ "input_path": "__notebook__.ipynb",
3566
+ "output_path": "__notebook__.ipynb",
3567
+ "parameters": {},
3568
+ "start_time": "2026-02-12T21:58:38.232857",
3569
+ "version": "2.6.0"
3570
+ }
3571
+ },
3572
+ "nbformat": 4,
3573
+ "nbformat_minor": 5
3574
+ }