Skip to content

Commit a14e836

Browse files
committed
Fix image saving from float32 to uint8
1 parent 2995262 commit a14e836

6 files changed

+24
-52
lines changed

generate_raw_data.py

+7-15
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from utils.noise_sampling import random_noise_levels_dnd, random_noise_levels_sidd, add_noise
2222
import utils
2323
import lycon
24+
from skimage import img_as_ubyte
2425

2526
parser = argparse.ArgumentParser(description='RGB2RAW Network: From clean RGB images, generate {RAW_clean, RAW_noisy} pairs')
2627
parser.add_argument('--input_dir', default='./datasets/sample_rgb_images/',
@@ -34,7 +35,6 @@
3435

3536
args = parser.parse_args()
3637

37-
3838
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
3939
os.environ["CUDA_VISIBLE_DEVICES"] = args.gpus
4040

@@ -45,8 +45,6 @@
4545
test_dataset = get_rgb_data(args.input_dir)
4646
test_loader = DataLoader(dataset=test_dataset, batch_size=4, shuffle=False, num_workers=2, drop_last=False)
4747

48-
49-
5048
model_rgb2raw = Rgb2Raw()
5149

5250
utils.load_checkpoint(model_rgb2raw,args.weights)
@@ -58,7 +56,6 @@
5856

5957
model_rgb2raw.eval()
6058

61-
6259
with torch.no_grad():
6360
for ii, data in enumerate(tqdm(test_loader), 0):
6461
rgb_gt = data[0].cuda()
@@ -68,8 +65,6 @@
6865
## Convert clean rgb image to clean raw image
6966
raw_gt = model_rgb2raw(rgb_gt) ## raw_gt is in RGGB format
7067
raw_gt = torch.clamp(raw_gt,0,1)
71-
#raw_noisy = torch.zeros_like(raw_gt).cuda()
72-
#variance = torch.zeros_like(raw_gt).cuda()
7368

7469
########## Add noise to clean raw images ##########
7570
for j in range(raw_gt.shape[0]):
@@ -79,29 +74,26 @@
7974
raw_noisy = add_noise(raw_gt[j], shot_noise, read_noise, use_cuda=True)
8075
raw_noisy = torch.clamp(raw_noisy,0,1) ### CLIP NOISE
8176
variance = shot_noise * raw_noisy + read_noise
77+
8278
#### Unpadding and saving
8379
clean_packed = raw_gt[j]
8480
clean_packed = clean_packed[:,padh[j]//2:-padh[j]//2,padw[j]//2:-padw[j]//2] ## RGGB channels (4 x H/2 x W/2)
85-
clean_unpacked = utils.unpack_raw(clean_packed.unsqueeze(0)) ## Rearrange RGGB channels into Bayer pattern
81+
clean_unpacked = utils.unpack_raw(clean_packed.unsqueeze(0)) ## Rearrange RGGB channels into Bayer pattern
8682
clean_unpacked = clean_unpacked.squeeze().cpu().detach().numpy()
87-
lycon.save(args.result_dir+'png/clean/'+filename[:-4]+'.png',(clean_unpacked*255).astype(np.uint8))
83+
lycon.save(args.result_dir+'png/clean/'+filename[:-4]+'.png',img_as_ubyte(clean_unpacked))
8884

8985
noisy_packed = raw_noisy
9086
noisy_packed = noisy_packed[:,padh[j]//2:-padh[j]//2,padw[j]//2:-padw[j]//2] ## RGGB channels
91-
noisy_unpacked = utils.unpack_raw(noisy_packed.unsqueeze(0)) ## Rearrange RGGB channels into Bayer pattern
87+
noisy_unpacked = utils.unpack_raw(noisy_packed.unsqueeze(0)) ## Rearrange RGGB channels into Bayer pattern
9288
noisy_unpacked = noisy_unpacked.squeeze().cpu().detach().numpy()
93-
lycon.save(args.result_dir+'png/noisy/'+filename[:-4]+'.png',(noisy_unpacked*255).astype(np.uint8))
94-
89+
lycon.save(args.result_dir+'png/noisy/'+filename[:-4]+'.png',img_as_ubyte(noisy_unpacked))
9590

9691
variance_packed = variance[:,padh[j]//2:-padh[j]//2,padw[j]//2:-padw[j]//2] ## RGGB channels
9792

98-
#import pdb;pdb.set_trace()
9993
dict_ = {}
10094
dict_['clean'] = clean_packed.cpu().detach().numpy() ## (4 x H/2 x W/2)
10195
dict_['noisy'] = noisy_packed.cpu().detach().numpy() ## (4 x H/2 x W/2)
102-
dict_['variance'] = variance_packed.cpu().detach().numpy() ## (4 x H/2 x W/2)
96+
dict_['variance'] = variance_packed.cpu().detach().numpy() ## (4 x H/2 x W/2)
10397
dict_['shot_noise'] = shot_noise.cpu().detach().numpy()
10498
dict_['read_noise'] = read_noise.cpu().detach().numpy()
10599
utils.save_dict(dict_, args.result_dir+'pkl/'+filename[:-4]+'.pkl')
106-
107-

generate_rgb_data.py

+5-12
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from utils.noise_sampling import random_noise_levels_dnd, random_noise_levels_sidd, add_noise
2222
import utils
2323
import lycon
24+
from skimage import img_as_ubyte
2425

2526
parser = argparse.ArgumentParser(description='From clean RGB images, generate {RGB_clean, RGB_noisy} pairs')
2627
parser.add_argument('--input_dir', default='./datasets/sample_rgb_images/',
@@ -35,7 +36,6 @@
3536

3637
args = parser.parse_args()
3738

38-
3939
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
4040
os.environ["CUDA_VISIBLE_DEVICES"] = args.gpus
4141

@@ -45,16 +45,13 @@
4545
test_dataset = get_rgb_data(args.input_dir)
4646
test_loader = DataLoader(dataset=test_dataset, batch_size=4, shuffle=False, num_workers=2, drop_last=False)
4747

48-
49-
5048
model_rgb2raw = Rgb2Raw()
5149
model_ccm = CCM()
5250
model_raw2rgb = Raw2Rgb()
5351

5452
utils.load_checkpoint(model_rgb2raw,args.weights_rgb2raw)
5553
utils.load_checkpoint(model_ccm,args.weights_ccm)
5654
utils.load_checkpoint(model_raw2rgb,args.weights_raw2rgb)
57-
#print("===>Testing using weights: ", args.weights)
5855

5956
model_rgb2raw.cuda()
6057
model_ccm.cuda()
@@ -68,13 +65,13 @@
6865
model_ccm.eval()
6966
model_raw2rgb.eval()
7067

71-
7268
with torch.no_grad():
7369
for ii, data in enumerate(tqdm(test_loader), 0):
7470
rgb_gt = data[0].cuda()
7571
filenames = data[1]
7672
padh = data[2]
7773
padw = data[3]
74+
7875
## Convert clean rgb image to clean raw image
7976
raw_gt = model_rgb2raw(rgb_gt) ## raw_gt is in RGGB format
8077
raw_gt = torch.clamp(raw_gt,0,1)
@@ -87,7 +84,6 @@
8784
raw_noisy = add_noise(raw_gt[j], shot_noise, read_noise, use_cuda=True)
8885
raw_noisy = torch.clamp(raw_noisy,0,1) ### CLIP NOISE
8986

90-
9187
#### Convert raw noisy to rgb noisy ####
9288
ccm_tensor = model_ccm(rgb_gt[j].unsqueeze(0))
9389
rgb_noisy = model_raw2rgb(raw_noisy.unsqueeze(0),ccm_tensor)
@@ -96,13 +92,10 @@
9692
rgb_noisy = rgb_noisy.permute(0, 2, 3, 1).squeeze().cpu().detach().numpy()
9793

9894
rgb_clean = rgb_gt[j].permute(1,2,0).cpu().detach().numpy()
95+
9996
## Unpadding
10097
rgb_clean = rgb_clean[padh[j]:-padh[j],padw[j]:-padw[j],:]
10198
rgb_noisy = rgb_noisy[padh[j]:-padh[j],padw[j]:-padw[j],:]
102-
# import pdb;pdb.set_trace()
103-
104-
lycon.save(args.result_dir+'clean/'+filename[:-4]+'.png',(rgb_clean*255).astype(np.uint8))
105-
lycon.save(args.result_dir+'noisy/'+filename[:-4]+'.png',(rgb_noisy*255).astype(np.uint8))
106-
107-
10899

100+
lycon.save(args.result_dir+'clean/'+filename[:-4]+'.png',img_as_ubyte(rgb_clean))
101+
lycon.save(args.result_dir+'noisy/'+filename[:-4]+'.png',img_as_ubyte(rgb_noisy))

test_dnd_raw.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,11 @@
1919
import h5py
2020
import numpy as np
2121
from networks.denoising_raw import DenoiseNet
22-
# from dataloaders.data_raw import get_test_data
2322

2423
import utils
2524
import lycon
2625
from utils.bundle_submissions import bundle_submissions_raw
27-
28-
26+
from skimage import img_as_ubyte
2927

3028
parser = argparse.ArgumentParser(description='RAW denoising evaluation on the DND dataset')
3129
parser.add_argument('--input_dir', default='./datasets/dnd/dnd_raw/',
@@ -83,7 +81,6 @@ def denoiser(raw_noisy,variance):
8381
img = h5py.File(filename, 'r')
8482
noisy = np.float32(np.array(img['Inoisy']).T)
8583

86-
#
8784
# Loads raw Bayer color pattern.
8885
bayer_pattern = np.asarray(info[info['camera'][0][i]]['pattern']).tolist()
8986

@@ -150,9 +147,9 @@ def denoiser(raw_noisy,variance):
150147
sio.savemat(save_file, {'Idenoised_crop': Idenoised_crop})
151148

152149
if args.save_images:
153-
denoised_img = Idenoised_crop*255
150+
denoised_img = img_as_ubyte(Idenoised_crop)
154151
save_file = os.path.join(args.result_dir+ 'png/', '%04d_%02d.png' % (i + 1, k + 1))
155-
lycon.save(save_file, denoised_img.astype(np.uint8))
152+
lycon.save(save_file, denoised_img)
156153

157154
bundle_submissions_raw(args.result_dir+'matfile/', 'raw_results_for_server_submission/')
158155
os.system("rm {}".format(args.result_dir+'matfile/*.mat'))

test_dnd_rgb.py

+3-9
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import utils
2222
import lycon
2323
from utils.bundle_submissions import bundle_submissions_srgb_v1
24-
24+
from skimage import img_as_ubyte
2525

2626
parser = argparse.ArgumentParser(description='RGB denoising evaluation on DND dataset')
2727
parser.add_argument('--input_dir', default='./datasets/dnd/dnd_rgb/',
@@ -45,8 +45,6 @@
4545
test_dataset = get_test_data(args.input_dir)
4646
test_loader = DataLoader(dataset=test_dataset, batch_size=32, shuffle=False, num_workers=8, drop_last=False)
4747

48-
49-
5048
model_restoration = DenoiseNet()
5149

5250
utils.load_checkpoint(model_restoration,args.weights)
@@ -58,7 +56,6 @@
5856

5957
model_restoration.eval()
6058

61-
6259
with torch.no_grad():
6360
psnr_val_rgb = []
6461
for ii, data_test in enumerate(tqdm(test_loader), 0):
@@ -72,13 +69,10 @@
7269

7370
if args.save_images:
7471
for batch in range(len(rgb_noisy)):
75-
#temp = np.concatenate((rgb_noisy[batch]*255, rgb_restored[batch]*255),axis=1)
76-
denoised_img = rgb_restored[batch]*255
77-
lycon.save(args.result_dir + 'png/'+ filenames[batch][:-4] + '.png', denoised_img.astype(np.uint8))
72+
denoised_img = img_as_ubyte(rgb_restored[batch])
73+
lycon.save(args.result_dir + 'png/'+ filenames[batch][:-4] + '.png', denoised_img)
7874
save_file = os.path.join(args.result_dir+ 'matfile/', filenames[batch][:-4] +'.mat')
7975
sio.savemat(save_file, {'Idenoised_crop': np.float32(rgb_restored[batch])})
8076

81-
82-
8377
bundle_submissions_srgb_v1(args.result_dir+'matfile/', 'srgb_results_for_server_submission/')
8478
os.system("rm {}".format(args.result_dir+'matfile/*.mat'))

test_sidd_raw.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import utils
2323
import lycon
24+
from skimage import img_as_ubyte
2425

2526
parser = argparse.ArgumentParser(description='RAW denoising evaluation on the validation set of SIDD')
2627
parser.add_argument('--input_dir', default='./datasets/sidd/sidd_raw/',
@@ -34,7 +35,6 @@
3435

3536
args = parser.parse_args()
3637

37-
3838
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
3939
os.environ["CUDA_VISIBLE_DEVICES"] = args.gpus
4040

@@ -43,11 +43,8 @@
4343
test_dataset = get_validation_data(args.input_dir)
4444
test_loader = DataLoader(dataset=test_dataset, batch_size=16, shuffle=False, num_workers=8, drop_last=False)
4545

46-
47-
4846
model_restoration = DenoiseNet()
4947

50-
5148
utils.load_checkpoint(model_restoration,args.weights)
5249
print("===>Testing using weights: ", args.weights)
5350

@@ -71,9 +68,9 @@
7168
if args.save_images:
7269
for batch in range(len(raw_gt)):
7370
denoised_img = utils.unpack_raw(raw_restored[batch,:,:,:].unsqueeze(0))
74-
denoised_img = denoised_img.permute(0, 2, 3, 1).cpu().detach().numpy()[0] *255
71+
denoised_img = denoised_img.permute(0, 2, 3, 1).cpu().detach().numpy()[0]
7572
denoised_img = np.squeeze(np.stack((denoised_img,) * 3, -1))
76-
lycon.save(args.result_dir + filenames[batch][:-4] + '.png', denoised_img.astype(np.uint8))
73+
lycon.save(args.result_dir + filenames[batch][:-4] + '.png', img_as_ubyte(denoised_img))
7774

7875

7976
psnr_val_raw = sum(psnr_val_raw)/len(psnr_val_raw)

test_sidd_rgb.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from dataloaders.data_rgb import get_validation_data
2121
import utils
2222
import lycon
23+
from skimage import img_as_ubyte
2324

2425
parser = argparse.ArgumentParser(description='RGB denoising evaluation on the validation set of SIDD')
2526
parser.add_argument('--input_dir', default='./datasets/sidd/sidd_rgb/',
@@ -73,10 +74,8 @@
7374

7475
if args.save_images:
7576
for batch in range(len(rgb_gt)):
76-
#temp = np.concatenate((rgb_noisy[batch]*255, rgb_restored[batch]*255, rgb_gt[batch]*255),axis=1)
77-
denoised_img = rgb_restored[batch]*255
78-
lycon.save(args.result_dir + filenames[batch][:-4] + '.png', denoised_img.astype(np.uint8))
77+
denoised_img = img_as_ubyte(rgb_restored[batch])
78+
lycon.save(args.result_dir + filenames[batch][:-4] + '.png', denoised_img)
7979

8080
psnr_val_rgb = sum(psnr_val_rgb)/len(psnr_val_rgb)
8181
print("PSNR: %.2f " %(psnr_val_rgb))
82-

0 commit comments

Comments
 (0)