RIP-AV-su-lab / AV /Tools /utils_test.py
weidai00's picture
Upload 72 files
6c0075d verified
import cv2
import numpy as np
def paint_border_overlap(img, patch_h, patch_w, stride_h, stride_w):
img_h = img.shape[0] #height of the full image
img_w = img.shape[1] #width of the full image
leftover_h = (img_h-patch_h)%stride_h #leftover on the h dim
leftover_w = (img_w-patch_w)%stride_w #leftover on the w dim
if (leftover_h != 0): #change dimension of img_h
tmp_full_imgs = np.zeros((img_h+(stride_h-leftover_h),img_w, 3))
tmp_full_imgs[0:img_h,0:img_w, :] = img
img = tmp_full_imgs
if (leftover_w != 0): #change dimension of img_w
tmp_full_imgs = np.zeros((img.shape[0], img_w+(stride_w - leftover_w), 3))
tmp_full_imgs[0:img.shape[0], 0:img_w, :] = img
img = tmp_full_imgs
return img
def paint_border_overlap_trad(img, patch_h, patch_w, stride_h, stride_w):
img_h = img.shape[0] #height of the full image
img_w = img.shape[1] #width of the full image
leftover_h = (img_h-patch_h)%stride_h #leftover on the h dim
leftover_w = (img_w-patch_w)%stride_w #leftover on the w dim
if (leftover_h != 0): #change dimension of img_h
tmp_full_imgs = np.zeros((img_h+(stride_h-leftover_h),img_w, 2))
tmp_full_imgs[0:img_h,0:img_w, :] = img
img = tmp_full_imgs
if (leftover_w != 0): #change dimension of img_w
tmp_full_imgs = np.zeros((img.shape[0], img_w+(stride_w - leftover_w), 2))
tmp_full_imgs[0:img.shape[0], 0:img_w, :] = img
img = tmp_full_imgs
return img
def pred_only_FOV_AV(data_imgs1,data_imgs2,data_masks1,data_masks2,original_imgs_border_masks,threshold_confusion):
assert (len(data_imgs1.shape)==4 and len(data_masks1.shape)==4) #4D arrays
assert (data_imgs1.shape[0]==data_masks1.shape[0])
assert (data_imgs1.shape[2]==data_masks1.shape[2])
assert (data_imgs1.shape[3]==data_masks1.shape[3])
assert (data_imgs1.shape[1]==1 and data_masks1.shape[1]==1) #check the channel is 1
height = data_imgs1.shape[2]
width = data_imgs1.shape[3]
new_pred_imgs1 = []
new_pred_masks1 = []
new_pred_imgs2 = []
new_pred_masks2 = []
for i in range(data_imgs1.shape[0]): #loop over the full images
for x in range(width):
for y in range(height):
if inside_FOV_DRIVE_AV(i,x,y,data_imgs1,data_imgs2,original_imgs_border_masks,threshold_confusion)==True:
new_pred_imgs1.append(data_imgs1[i,:,y,x])
new_pred_masks1.append(data_masks1[i,:,y,x])
new_pred_imgs2.append(data_imgs2[i,:,y,x])
new_pred_masks2.append(data_masks2[i,:,y,x])
new_pred_imgs1 = np.asarray(new_pred_imgs1)
new_pred_masks1 = np.asarray(new_pred_masks1)
new_pred_imgs2 = np.asarray(new_pred_imgs2)
new_pred_masks2 = np.asarray(new_pred_masks2)
return new_pred_imgs1, new_pred_masks1,new_pred_imgs2, new_pred_masks2
def pred_only_FOV_AV(data_imgs1,data_imgs2,data_masks1,data_masks2,original_imgs_border_masks,threshold_confusion):
assert (len(data_imgs1.shape)==4 and len(data_masks1.shape)==4) #4D arrays
assert (data_imgs1.shape[0]==data_masks1.shape[0])
assert (data_imgs1.shape[2]==data_masks1.shape[2])
assert (data_imgs1.shape[3]==data_masks1.shape[3])
assert (data_imgs1.shape[1]==1 and data_masks1.shape[1]==1) #check the channel is 1
height = data_imgs1.shape[2]
width = data_imgs1.shape[3]
new_pred_imgs1 = []
new_pred_masks1 = []
new_pred_imgs2 = []
new_pred_masks2 = []
for i in range(data_imgs1.shape[0]): #loop over the full images
for x in range(width):
for y in range(height):
if inside_FOV_DRIVE_AV(i,x,y,data_masks1,data_masks2,original_imgs_border_masks,threshold_confusion)==True:
new_pred_imgs1.append(data_imgs1[i,:,y,x])
new_pred_masks1.append(data_masks1[i,:,y,x])
new_pred_imgs2.append(data_imgs2[i,:,y,x])
new_pred_masks2.append(data_masks2[i,:,y,x])
new_pred_imgs1 = np.asarray(new_pred_imgs1)
new_pred_masks1 = np.asarray(new_pred_masks1)
new_pred_imgs2 = np.asarray(new_pred_imgs2)
new_pred_masks2 = np.asarray(new_pred_masks2)
return new_pred_imgs1, new_pred_masks1,new_pred_imgs2, new_pred_masks2
def inside_FOV_DRIVE_AV(i, x, y,data_imgs1,data_imgs2, DRIVE_masks,threshold_confusion):
assert (len(DRIVE_masks.shape)==4) #4D arrays
assert (DRIVE_masks.shape[1]==1) #DRIVE masks is black and white
# DRIVE_masks = DRIVE_masks/255. #NOOO!! otherwise with float numbers takes forever!!
if (x >= DRIVE_masks.shape[3] or y >= DRIVE_masks.shape[2]): #my image bigger than the original
return False
if (DRIVE_masks[i,0,y,x]>0)&((data_imgs1[i,0,y,x]>threshold_confusion)|(data_imgs2[i,0,y,x]>threshold_confusion)): #0==black pixels
# print DRIVE_masks[i,0,y,x] #verify it is working right
return True
else:
return False
def extract_ordered_overlap_trad(img, patch_h, patch_w,stride_h,stride_w,ratio):
img_h = img.shape[0] #height of the full image
img_w = img.shape[1] #width of the full image
assert ((img_h-patch_h)%stride_h==0 and (img_w-patch_w)%stride_w==0)
N_patches_img = ((img_h-patch_h)//stride_h+1)*((img_w-patch_w)//stride_w+1) #// --> division between integers
patches = np.empty((N_patches_img, patch_h//ratio, patch_w//ratio, 2))
iter_tot = 0 #iter over the total number of patches (N_patches)
for h in range((img_h-patch_h)//stride_h+1):
for w in range((img_w-patch_w)//stride_w+1):
patch = img[h*stride_h:(h*stride_h)+patch_h, w*stride_w:(w*stride_w)+patch_w, :]
patch = cv2.resize(patch,(patch_h//ratio, patch_w//ratio))
patches[iter_tot]=patch
iter_tot +=1 #total
assert (iter_tot==N_patches_img)
return patches #array with all the img divided in patches
def make_pad(Patches,pad,sign='',normalize=True):
# h,w,3
mean = [0.485, 0.456, 0.406]
std = [0.229, 0.224, 0.225]
if pad<=0:
return Patches
p = np.zeros((256,256,3),dtype=np.float32)
if sign=='img' and normalize:
p[:,:,0] = (p[:,:,0] - mean[0]) / std[0]
p[:,:,1] = (p[:,:,1] - mean[1]) / std[1]
p[:,:,2] = (p[:,:,2] - mean[2]) / std[2]
p[:Patches.shape[0],:Patches.shape[1],:] = Patches
return p
def extract_ordered_overlap_big(img, patch_h=256, patch_w=256, stride_h=256, stride_w=256):
img_h = img.shape[0] #height of the full image
img_w = img.shape[1] #width of the full image
big_patch_h = int(patch_h * 1.5)
big_patch_w = int(patch_w * 1.5)
assert ((img_h-patch_h)%stride_h==0 and (img_w-patch_w)%stride_w==0)
N_patches_img = ((img_h-patch_h)//stride_h+1)*((img_w-patch_w)//stride_w+1) #// --> division between integers
patches = np.empty((N_patches_img, patch_h, patch_w, 3) )
patches_big = np.empty((N_patches_img, patch_h, patch_w, 3))
img_big = np.zeros((img_h+(big_patch_h-patch_h), img_w+(big_patch_w-patch_w), 3))
img_big[(big_patch_h-patch_h)//2:(big_patch_h-patch_h)//2+img_h, (big_patch_w-patch_w)//2:(big_patch_w-patch_w)//2+img_w, :] = img
iter_tot = 0 #iter over the total number of patches (N_patches)
for h in range((img_h-patch_h)//stride_h+1):
for w in range((img_w-patch_w)//stride_w+1):
patch = img[h*stride_h:(h*stride_h)+patch_h, w*stride_w:(w*stride_w)+patch_w, :]
#patch = cv2.resize(patch,(256, 256))
patches[iter_tot] = patch
if np.unique(patch).shape[0] == 1:
patches_big[iter_tot] = patch
else:
patch_big = img_big[h*stride_h:h*stride_h+big_patch_h, w*stride_w:w*stride_w+big_patch_w, :]
# print(patch_big.shape)
patch_big = cv2.resize(patch_big,(patch_h, patch_w))
patches_big[iter_tot] = patch_big
iter_tot += 1 # total
assert (iter_tot == N_patches_img)
return patches, patches_big # array with all the img divided in patches
def extract_ordered_overlap_big_v2(img, patch_h=256, patch_w=256, stride_h=256, stride_w=256):
img_h = img.shape[0] #height of the full image
img_w = img.shape[1] #width of the full image
assert ((img_h-patch_h)%stride_h==0 and (img_w-patch_w)%stride_w==0)
N_patches_img = ((img_h-patch_h)//stride_h+1)*((img_w-patch_w)//stride_w+1) #// --> division between integers
patches = np.empty((N_patches_img, 256, 256, 3))
patches_big = np.empty((N_patches_img, 256, 256, 3))
iter_tot = 0 #iter over the total number of patches (N_patches)
for h in range((img_h-patch_h)//stride_h+1):
for w in range((img_w-patch_w)//stride_w+1):
patch = img[h*stride_h:(h*stride_h)+patch_h, w*stride_w:(w*stride_w)+patch_w, :]
pad = max(0,256-patch_h)
patch = make_pad(patch,pad,normalize=False)
#patch = cv2.resize(patch,(256, 256))
patches[iter_tot]=patch
# patch_big = img[max(0,h*stride_h-patch_h//4):min((h*stride_h)+patch_h+patch_h//4,img_h),max(0,w*stride_w-patch_w//4):min((w*stride_w)+patch_w+patch_w//4,img_w), :]
if h==0 and w==0:
patch_big = img[0:patch_h+patch_h//2, 0:patch_w+patch_w//2, :]
elif h==0 and w!=0 and w!=((img_w-patch_w)//stride_w):
patch_big = img[0:0+patch_h+patch_h//2, w*stride_w-patch_w//4:(w*stride_w)+patch_w+patch_w//4, :]
elif h==0 and w==((img_w-patch_w)//stride_w):
patch_big = img[0:0+patch_h+patch_h//2, (w)*stride_w-patch_w//2:(w*stride_w)+patch_w, :]
elif h!=0 and h!=((img_h-patch_h)//stride_h) and w==0:
patch_big = img[h*stride_h-patch_h//4:(h*stride_h)+patch_h+patch_h//4, 0:0+patch_w+patch_w//2, :]
elif h==((img_h-patch_h)//stride_h) and w==0:
patch_big = img[(h)*stride_h-patch_h//2:(h*stride_h)+patch_h, 0:patch_w+patch_w//2, :]
elif h==((img_h-patch_h)//stride_h) and w!=0 and w!=((img_w-patch_w)//stride_w):
patch_big = img[h*stride_h-patch_h//2:(h*stride_h)+patch_h, w*stride_w-patch_w//4:(w*stride_w)+patch_w+patch_w//4, :]
elif h==((img_h-patch_h)//stride_h) and w==((img_w-patch_w)//stride_w):
patch_big = img[h*stride_h-patch_h//2:(h*stride_h)+patch_h, (w)*stride_w-patch_w//2:(w*stride_w)+patch_w, :]
elif h!=0 and h!=((img_h-patch_h)//stride_h) and w==((img_w-patch_w)//stride_w):
patch_big = img[h*stride_h-patch_h//4:(h*stride_h)+patch_h+patch_h//4, (w)*stride_w-patch_w//2:(w*stride_w)+patch_w, :]
else:
patch_big = img[h*stride_h-patch_h//4:(h*stride_h)+patch_h+patch_h//4,w*stride_w-patch_w//4:(w*stride_w)+patch_w+patch_w//4, :]
# print(patch_big.shape)
patch_big = cv2.resize(patch_big,(256, 256))
patches_big[iter_tot]=patch_big
iter_tot +=1 #total
assert (iter_tot==N_patches_img)
return patches,patches_big #array with all the img divided in patches
def extract_ordered_overlap_big_v1(img, patch_h, patch_w,stride_h,stride_w):
img_h = img.shape[0] #height of the full image
img_w = img.shape[1] #width of the full image
assert ((img_h-patch_h)%stride_h==0 and (img_w-patch_w)%stride_w==0)
N_patches_img = ((img_h-patch_h)//stride_h+1)*((img_w-patch_w)//stride_w+1) #// --> division between integers
patches = np.empty((N_patches_img, patch_h, patch_w, 3))
patches_big = np.empty((N_patches_img, patch_h, patch_w, 3))
iter_tot = 0 #iter over the total number of patches (N_patches)
for h in range((img_h-patch_h)//stride_h+1):
for w in range((img_w-patch_w)//stride_w+1):
patch = img[h*stride_h:(h*stride_h)+patch_h, w*stride_w:(w*stride_w)+patch_w, :]
#patch = cv2.resize(patch,(256, 256))
patches[iter_tot]=patch
if h==0 and w==0:
patch_big = img[h*stride_h:(h*stride_h)+patch_h+stride_h, w*stride_w:(w*stride_w)+patch_w+stride_w, :]
elif h==0 and w!=0 and w!=((img_w-patch_w)//stride_w):
patch_big = img[h*stride_h:(h*stride_h)+patch_h+stride_h, int((w-0.5)*stride_w):(w*stride_w)+patch_w+stride_w//2, :]
elif h==0 and w==((img_w-patch_w)//stride_w):
patch_big = img[h*stride_h:(h*stride_h)+patch_h+stride_h, (w-1)*stride_w:(w*stride_w)+patch_w, :]
elif h!=0 and h!=((img_h-patch_h)//stride_h) and w==0:
patch_big = img[int((h-0.5)*stride_h):(h*stride_h)+patch_h+stride_h//2, w*stride_w:(w*stride_w)+patch_w+stride_w, :]
elif h==((img_h-patch_h)//stride_h) and w==0:
patch_big = img[(h-1)*stride_h:(h*stride_h)+patch_h, w*stride_w:(w*stride_w)+patch_w+stride_w, :]
elif h==((img_h-patch_h)//stride_h) and w!=0 and w!=((img_w-patch_w)//stride_w):
patch_big = img[(h-1)*stride_h:(h*stride_h)+patch_h, int((w-0.5)*stride_w):(w*stride_w)+patch_w+stride_w//2, :]
elif h==((img_h-patch_h)//stride_h) and w==((img_w-patch_w)//stride_w):
patch_big = img[(h-1)*stride_h:(h*stride_h)+patch_h, (w-1)*stride_w:(w*stride_w)+patch_w, :]
elif h!=0 and h!=((img_h-patch_h)//stride_h) and w==((img_w-patch_w)//stride_w):
patch_big = img[int((h-0.5)*stride_h):(h*stride_h)+patch_h+stride_h//2, (w-1)*stride_w:(w*stride_w)+patch_w, :]
else:
patch_big = img[int((h-0.5)*stride_h):(h*stride_h)+patch_h+stride_h//2, int((w-0.5)*stride_w):(w*stride_w)+patch_w+stride_w//2, :]
patch_big = cv2.resize(patch_big,(256, 256))
patches_big[iter_tot]=patch_big
iter_tot +=1 #total
assert (iter_tot==N_patches_img)
return patches,patches_big #array with all the img divided in patches
def pred_to_imgs(pred,mode="original"):
assert (len(pred.shape)==3) #3D array: (Npatches,height*width,2)
assert (pred.shape[2]==2 ) #check the classes are 2
pred_images = np.empty((pred.shape[0],pred.shape[1])) #(Npatches,height*width)
if mode=="original":
for i in range(pred.shape[0]):
for pix in range(pred.shape[1]):
pred_images[i,pix]=pred[i,pix,1]
elif mode=="threshold":
for i in range(pred.shape[0]):
for pix in range(pred.shape[1]):
if pred[i,pix,1]>=0.5:
pred_images[i,pix]=1
else:
pred_images[i,pix]=0
else:
print("mode " +str(mode) +" not recognized, it can be 'original' or 'threshold'")
exit()
pred_images = np.reshape(pred_images,(pred_images.shape[0],1,48,48))
return pred_images
def recompone_overlap(pred_patches, img_h, img_w, stride_h, stride_w):
assert (len(pred_patches.shape)==4) #4D arrays
#assert (pred_patches.shape[1]==2 or pred_patches.shape[1]==3) #check the channel is 1 or 3
patch_h = pred_patches.shape[2]
patch_w = pred_patches.shape[3]
N_patches_h = (img_h-patch_h)//stride_h+1
N_patches_w = (img_w-patch_w)//stride_w+1
N_patches_img = N_patches_h * N_patches_w
#assert (pred_patches.shape[0]%N_patches_img==0)
#N_full_imgs = pred_patches.shape[0]//N_patches_img
full_prob = np.zeros((pred_patches.shape[1], img_h,img_w,)) #itialize to zero mega array with sum of Probabilities
full_sum = np.zeros((pred_patches.shape[1], img_h,img_w))
k = 0 #iterator over all the patches
for h in range(N_patches_h):
for w in range(N_patches_w):
full_prob[:, h*stride_h:(h*stride_h)+patch_h, w*stride_w:(w*stride_w)+patch_w]+=pred_patches[k]
full_sum[:, h*stride_h:(h*stride_h)+patch_h, w*stride_w:(w*stride_w)+patch_w]+=1
k+=1
assert(k==pred_patches.shape[0])
assert(np.min(full_sum)>=1.0) #at least one
final_avg = full_prob/full_sum
#print(final_avg.shape)
# assert(np.max(final_avg)<=1.0) #max value for a pixel is 1.0
# assert(np.min(final_avg)>=0.0) #min value for a pixel is 0.0
return final_avg
def Normalize(Patches):
mean = [0.485, 0.456, 0.406]
std = [0.229, 0.224, 0.225]
# mean = [0.3261, 0.2287, 0.1592]
# std = [0.2589, 0.1882, 0.1369]
Patches[:,0,:,:] = (Patches[:,0,:,:] - mean[0]) / std[0]
Patches[:,1,:,:] = (Patches[:,1,:,:] - mean[1]) / std[1]
Patches[:,2,:,:] = (Patches[:,2,:,:] - mean[2]) / std[2]
return Patches
def Normalize_patch(Patches):
mean = [0.485, 0.456, 0.406]
std = [0.229, 0.224, 0.225]
Patches[0,:,:] = (Patches[0,:,:] - mean[0]) / std[0]
Patches[1,:,:] = (Patches[1,:,:] - mean[1]) / std[1]
Patches[2,:,:] = (Patches[2,:,:] - mean[2]) / std[2]
return Patches
def sigmoid(x):
return np.exp((x)) / (1 + np.exp(x))
def inside_FOV_DRIVE(x, y, DRIVE_masks):
# DRIVE_masks = DRIVE_masks/255. #NOOO!! otherwise with float numbers takes forever!!
if (x >= DRIVE_masks.shape[1] or y >= DRIVE_masks.shape[0]): #my image bigger than the original
return False
if (DRIVE_masks[y,x]>0): #0==black pixels
return True
else:
return False
def kill_border(pred_img, border_masks):
height = pred_img.shape[1]
width = pred_img.shape[2]
for x in range(width):
for y in range(height):
if inside_FOV_DRIVE(x,y, border_masks)==False:
pred_img[:,y,x]=0.0
return pred_img