Spaces:
Running
Running
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 | |