-
mattminder authoredmattminder authored
neural_network.py 3.94 KiB
# -*- coding: utf-8 -*-
"""
Created on Sat Dec 21 18:54:10 2019
"""
from model import *
from data import *
#from quality_measures import *
from segment import *
from data_processing import *
import numpy as np
import skimage
from skimage import io
def create_directory_if_not_exists(path):
"""
Create in the file system a new directory if it doesn't exist yet.
Param:
path: the path of the new directory
"""
if not os.path.exists(path):
os.makedirs(path)
def threshold(im,th = None):
"""
Binarize an image with a threshold given by the user, or if the threshold is None, calculate the better threshold with isodata
Param:
im: a numpy array image (numpy array)
th: the value of the threshold (feature to select threshold was asked by the lab)
Return:
bi: threshold given by the user (numpy array)
"""
im2 = im.copy()
if th == None:
th = skimage.filters.threshold_isodata(im2)
bi = im2
bi[bi > th] = 255
bi[bi <= th] = 0
return bi
def prediction(im):
"""
Calculate the prediction of the label corresponding to image im
Param:
im: a numpy array image (numpy array), with max size 2048x2048
Return:
res: the predicted distribution of probability of the labels (numpy array)
"""
path_test = './tmp/test/image/'
create_directory_if_not_exists(path_test)
io.imsave(path_test+'0.png',im)
# TESTING SET
# img_num, resized_shape, original_shape = generate_test_set(im,path_test)
# WHOLE CELL PREDICTION
testGene = testGenerator(path_test,
1,
target_size = (2048,2048) )
model = unet( pretrained_weights = None,
input_size = (2048,2048,1) )
model.load_weights('./unet_weights_batchsize_25_Nepochs_100_full.hdf5')
results = model.predict_generator(testGene,
1,
verbose=1)
# res = reconstruct_result(236, results[:,10:246,10:246,0], resized_shape,original_shape)
# if the size of the image is not 2048x2048, the difference between 2048x2048
# and the original size is cut off here. (in the prediction it is
# artificially augmented from the original size to 2048x2048)
index_x = 2048-len(im[:,0])
index_y = 2048-len(im[0,:])
#this bolean values are true if index_x(y)/2 else they are false.
#they are initialized to false.
flagx = False
flagy = False
#test if x dimension of im is not already the max size
if index_x != 0:
#if index_x not the 0 (im has not max size in x axis) then the
#the difference is divided by two, index_x is the difference between
#size of im in x axis and max size 2048
ind_x = index_x/2
if index_x%2 == 0:
ind_x = int(ind_x)
flagx = True
else:
#if already max size, it is set to 0
ind_x = 0
flagx = True
#test if y dimension of im is not already the max size
if index_y != 0:
#if index_y not the 0 (im has not max size in y axis) then the
#the difference is divided by two, index_y is the difference between
#size of im in y axis and max size 2048
ind_y = index_y/2
if index_y%2 == 0:
ind_y = int(ind_y)
flagy = True
else:
ind_y = 0
flagy = True
if flagx and flagy:
res = results[0,ind_x:2048-ind_x,ind_y:2048-ind_y,0]
return res
elif not(flagx) and flagy:
res = results[0,int(ind_x):2048-(int(ind_x)+1),ind_y:2048-ind_y,0]
return res
elif flagx and not(flagy):
res = results[0,ind_x:2048-ind_x, int(ind_y):2048-(int(ind_y)+1),0]
return res
else:
res = results[0, int(ind_x):2048-(int(ind_x)+1),int(ind_y):2048-(int(ind_y)+1),0]
return res