diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 448ac1d04..000000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.pyc -*.hdf5 \ No newline at end of file diff --git a/README.md b/README.md index db47134b1..b74c98e8a 100644 --- a/README.md +++ b/README.md @@ -8,14 +8,16 @@ The architecture was inspired by [U-Net: Convolutional Networks for Biomedical I ### Data -[Provided data](http://brainiac2.mit.edu/isbi_challenge/) you can download the train and test data from this server. -you can also find data in the data folder. +The original dataset is from [isbi challenge](http://brainiac2.mit.edu/isbi_challenge/), and I've downloaded it and done the pre-processing. -### Pre-processing +You can find it in folder data/membrane. + +### Data augmentation + +The data for training contains 30 512*512 images, which are far not enough to feed a deep learning neural network. I use a module called ImageDataGenerator in keras.preprocessing.image to do data augmentation. + +See dataPrepare.ipynb and data.py for detail. -The images are 3-D volume tiff, you should transfer the stacks into images first. -The data for training contains 30 512*512 images, which are far not enough to feed a deep learning neural network. -To do data augumentation, an image deformation method was used, which was implemented in C++ using opencv. ### Model @@ -28,11 +30,12 @@ makes sure that mask pixels are in \[0, 1\] range. ### Training -The model is trained for 10 epochs. +The model is trained for 5 epochs. + +After 5 epochs, calculated accuracy is about 0.97. -After 10 epochs, calculated accuracy is about 0.97. +Loss function for the training is basically just a binary crossentropy. -Loss function for the training is basically just a binary crossentropy --- @@ -44,34 +47,16 @@ This tutorial depends on the following libraries: * Tensorflow * Keras >= 1.0 -* libtiff(optional) Also, this code should be compatible with Python versions 2.7-3.5. -### Prepare the data - -First transfer 3D volume tiff to 30 512*512 images. - -To feed the unet, data augmentation is necessary. - -An [image deformation](http://faculty.cs.tamu.edu/schaefer/research/mls.pdf) method is used, the code is - -availabel in this [repository](https://github.com/cxcxcxcx/imgwarp-opencv). - - - - -### Define the model - -* Check out ```get_unet()``` in ```unet.py``` to modify the model, optimizer and loss function. +### Run main.py -### Train the model and generate masks for test images +You will see the predicted results of test image in data/membrane/test -* Run ```python unet.py``` to train the model. +### Or follow notebook trainUnet -After this script finishes, in ```imgs_mask_test.npy``` masks for corresponding images in ```imgs_test.npy``` -should be generated. I suggest you examine these masks for getting further insight of your model's performance. ### Results diff --git a/data.py b/data.py index 93e8447e7..956497d3f 100644 --- a/data.py +++ b/data.py @@ -1,238 +1,124 @@ -from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img +from __future__ import print_function +from keras.preprocessing.image import ImageDataGenerator import numpy as np import os import glob -#import cv2 -#from libtiff import TIFF - -class myAugmentation(object): - - """ - A class used to augmentate image - Firstly, read train image and label seperately, and then merge them together for the next process - Secondly, use keras preprocessing to augmentate image - Finally, seperate augmentated image apart into train image and label - """ - - def __init__(self, train_path="train", label_path="label", merge_path="merge", aug_merge_path="aug_merge", aug_train_path="aug_train", aug_label_path="aug_label", img_type="tif"): - - """ - Using glob to get all .img_type form path - """ - - self.train_imgs = glob.glob(train_path+"/*."+img_type) - self.label_imgs = glob.glob(label_path+"/*."+img_type) - self.train_path = train_path - self.label_path = label_path - self.merge_path = merge_path - self.img_type = img_type - self.aug_merge_path = aug_merge_path - self.aug_train_path = aug_train_path - self.aug_label_path = aug_label_path - self.slices = len(self.train_imgs) - self.datagen = ImageDataGenerator( - rotation_range=0.2, - width_shift_range=0.05, - height_shift_range=0.05, - shear_range=0.05, - zoom_range=0.05, - horizontal_flip=True, - fill_mode='nearest') - - def Augmentation(self): - - """ - Start augmentation..... - """ - trains = self.train_imgs - labels = self.label_imgs - path_train = self.train_path - path_label = self.label_path - path_merge = self.merge_path - imgtype = self.img_type - path_aug_merge = self.aug_merge_path - if len(trains) != len(labels) or len(trains) == 0 or len(trains) == 0: - print "trains can't match labels" - return 0 - for i in range(len(trains)): - img_t = load_img(path_train+"/"+str(i)+"."+imgtype) - img_l = load_img(path_label+"/"+str(i)+"."+imgtype) - x_t = img_to_array(img_t) - x_l = img_to_array(img_l) - x_t[:,:,2] = x_l[:,:,0] - img_tmp = array_to_img(x_t) - img_tmp.save(path_merge+"/"+str(i)+"."+imgtype) - img = x_t - img = img.reshape((1,) + img.shape) - savedir = path_aug_merge + "/" + str(i) - if not os.path.lexists(savedir): - os.mkdir(savedir) - self.doAugmentate(img, savedir, str(i)) - - - def doAugmentate(self, img, save_to_dir, save_prefix, batch_size=1, save_format='tif', imgnum=30): - - """ - augmentate one image - """ - datagen = self.datagen - i = 0 - for batch in datagen.flow(img, - batch_size=batch_size, - save_to_dir=save_to_dir, - save_prefix=save_prefix, - save_format=save_format): - i += 1 - if i > imgnum: - break - - def splitMerge(self): - - """ - split merged image apart - """ - path_merge = self.aug_merge_path - path_train = self.aug_train_path - path_label = self.aug_label_path - for i in range(self.slices): - path = path_merge + "/" + str(i) - train_imgs = glob.glob(path+"/*."+self.img_type) - savedir = path_train + "/" + str(i) - if not os.path.lexists(savedir): - os.mkdir(savedir) - savedir = path_label + "/" + str(i) - if not os.path.lexists(savedir): - os.mkdir(savedir) - for imgname in train_imgs: - midname = imgname[imgname.rindex("/")+1:imgname.rindex("."+self.img_type)] - img = cv2.imread(imgname) - img_train = img[:,:,2]#cv2 read image rgb->bgr - img_label = img[:,:,0] - cv2.imwrite(path_train+"/"+str(i)+"/"+midname+"_train"+"."+self.img_type,img_train) - cv2.imwrite(path_label+"/"+str(i)+"/"+midname+"_label"+"."+self.img_type,img_label) - - def splitTransform(self): - - """ - split perspective transform images - """ - #path_merge = "transform" - #path_train = "transform/data/" - #path_label = "transform/label/" - path_merge = "deform/deform_norm2" - path_train = "deform/train/" - path_label = "deform/label/" - train_imgs = glob.glob(path_merge+"/*."+self.img_type) - for imgname in train_imgs: - midname = imgname[imgname.rindex("/")+1:imgname.rindex("."+self.img_type)] - img = cv2.imread(imgname) - img_train = img[:,:,2]#cv2 read image rgb->bgr - img_label = img[:,:,0] - cv2.imwrite(path_train+midname+"."+self.img_type,img_train) - cv2.imwrite(path_label+midname+"."+self.img_type,img_label) - - - -class dataProcess(object): - - def __init__(self, out_rows, out_cols, data_path = "../deform/train", label_path = "../deform/label", test_path = "../test", npy_path = "../npydata", img_type = "tif"): - - """ - - """ - - self.out_rows = out_rows - self.out_cols = out_cols - self.data_path = data_path - self.label_path = label_path - self.img_type = img_type - self.test_path = test_path - self.npy_path = npy_path - - def create_train_data(self): - i = 0 - print('-'*30) - print('Creating training images...') - print('-'*30) - imgs = glob.glob(self.data_path+"/*."+self.img_type) - print(len(imgs)) - imgdatas = np.ndarray((len(imgs),self.out_rows,self.out_cols,1), dtype=np.uint8) - imglabels = np.ndarray((len(imgs),self.out_rows,self.out_cols,1), dtype=np.uint8) - for imgname in imgs: - midname = imgname[imgname.rindex("/")+1:] - img = load_img(self.data_path + "/" + midname,grayscale = True) - label = load_img(self.label_path + "/" + midname,grayscale = True) - img = img_to_array(img) - label = img_to_array(label) - #img = cv2.imread(self.data_path + "/" + midname,cv2.IMREAD_GRAYSCALE) - #label = cv2.imread(self.label_path + "/" + midname,cv2.IMREAD_GRAYSCALE) - #img = np.array([img]) - #label = np.array([label]) - imgdatas[i] = img - imglabels[i] = label - if i % 100 == 0: - print('Done: {0}/{1} images'.format(i, len(imgs))) - i += 1 - print('loading done') - np.save(self.npy_path + '/imgs_train.npy', imgdatas) - np.save(self.npy_path + '/imgs_mask_train.npy', imglabels) - print('Saving to .npy files done.') - - def create_test_data(self): - i = 0 - print('-'*30) - print('Creating test images...') - print('-'*30) - imgs = glob.glob(self.test_path+"/*."+self.img_type) - print(len(imgs)) - imgdatas = np.ndarray((len(imgs),self.out_rows,self.out_cols,1), dtype=np.uint8) - for imgname in imgs: - midname = imgname[imgname.rindex("/")+1:] - img = load_img(self.test_path + "/" + midname,grayscale = True) - img = img_to_array(img) - #img = cv2.imread(self.test_path + "/" + midname,cv2.IMREAD_GRAYSCALE) - #img = np.array([img]) - imgdatas[i] = img - i += 1 - print('loading done') - np.save(self.npy_path + '/imgs_test.npy', imgdatas) - print('Saving to imgs_test.npy files done.') - - def load_train_data(self): - print('-'*30) - print('load train images...') - print('-'*30) - imgs_train = np.load(self.npy_path+"/imgs_train.npy") - imgs_mask_train = np.load(self.npy_path+"/imgs_mask_train.npy") - imgs_train = imgs_train.astype('float32') - imgs_mask_train = imgs_mask_train.astype('float32') - imgs_train /= 255 - #mean = imgs_train.mean(axis = 0) - #imgs_train -= mean - imgs_mask_train /= 255 - imgs_mask_train[imgs_mask_train > 0.5] = 1 - imgs_mask_train[imgs_mask_train <= 0.5] = 0 - return imgs_train,imgs_mask_train - - def load_test_data(self): - print('-'*30) - print('load test images...') - print('-'*30) - imgs_test = np.load(self.npy_path+"/imgs_test.npy") - imgs_test = imgs_test.astype('float32') - imgs_test /= 255 - #mean = imgs_test.mean(axis = 0) - #imgs_test -= mean - return imgs_test - -if __name__ == "__main__": - - #aug = myAugmentation() - #aug.Augmentation() - #aug.splitMerge() - #aug.splitTransform() - mydata = dataProcess(512,512) - mydata.create_train_data() - mydata.create_test_data() - #imgs_train,imgs_mask_train = mydata.load_train_data() - #print imgs_train.shape,imgs_mask_train.shape +import skimage.io as io +import skimage.transform as trans + +Sky = [128,128,128] +Building = [128,0,0] +Pole = [192,192,128] +Road = [128,64,128] +Pavement = [60,40,222] +Tree = [128,128,0] +SignSymbol = [192,128,128] +Fence = [64,64,128] +Car = [64,0,128] +Pedestrian = [64,64,0] +Bicyclist = [0,128,192] +Unlabelled = [0,0,0] + +COLOR_DICT = np.array([Sky, Building, Pole, Road, Pavement, + Tree, SignSymbol, Fence, Car, Pedestrian, Bicyclist, Unlabelled]) + + +def adjustData(img,mask,flag_multi_class,num_class): + if(flag_multi_class): + img = img / 255 + mask = mask[:,:,:,0] if(len(mask.shape) == 4) else mask[:,:,0] + new_mask = np.zeros(mask.shape + (num_class,)) + for i in range(num_class): + #for one pixel in the image, find the class in mask and convert it into one-hot vector + #index = np.where(mask == i) + #index_mask = (index[0],index[1],index[2],np.zeros(len(index[0]),dtype = np.int64) + i) if (len(mask.shape) == 4) else (index[0],index[1],np.zeros(len(index[0]),dtype = np.int64) + i) + #new_mask[index_mask] = 1 + new_mask[mask == i,i] = 1 + new_mask = np.reshape(new_mask,(new_mask.shape[0],new_mask.shape[1]*new_mask.shape[2],new_mask.shape[3])) if flag_multi_class else np.reshape(new_mask,(new_mask.shape[0]*new_mask.shape[1],new_mask.shape[2])) + mask = new_mask + elif(np.max(img) > 1): + img = img / 255 + mask = mask /255 + mask[mask > 0.5] = 1 + mask[mask <= 0.5] = 0 + return (img,mask) + + + +def trainGenerator(batch_size,train_path,image_folder,mask_folder,aug_dict,image_color_mode = "grayscale", + mask_color_mode = "grayscale",image_save_prefix = "image",mask_save_prefix = "mask", + flag_multi_class = False,num_class = 2,save_to_dir = None,target_size = (256,256),seed = 1): + ''' + can generate image and mask at the same time + use the same seed for image_datagen and mask_datagen to ensure the transformation for image and mask is the same + if you want to visualize the results of generator, set save_to_dir = "your path" + ''' + image_datagen = ImageDataGenerator(**aug_dict) + mask_datagen = ImageDataGenerator(**aug_dict) + image_generator = image_datagen.flow_from_directory( + train_path, + classes = [image_folder], + class_mode = None, + color_mode = image_color_mode, + target_size = target_size, + batch_size = batch_size, + save_to_dir = save_to_dir, + save_prefix = image_save_prefix, + seed = seed) + mask_generator = mask_datagen.flow_from_directory( + train_path, + classes = [mask_folder], + class_mode = None, + color_mode = mask_color_mode, + target_size = target_size, + batch_size = batch_size, + save_to_dir = save_to_dir, + save_prefix = mask_save_prefix, + seed = seed) + train_generator = zip(image_generator, mask_generator) + for (img,mask) in train_generator: + img,mask = adjustData(img,mask,flag_multi_class,num_class) + yield (img,mask) + + + +def testGenerator(test_path,num_image = 30,target_size = (256,256),flag_multi_class = False,as_gray = True): + for i in range(num_image): + img = io.imread(os.path.join(test_path,"%d.png"%i),as_gray = as_gray) + img = img / 255 + img = trans.resize(img,target_size) + img = np.reshape(img,img.shape+(1,)) if (not flag_multi_class) else img + img = np.reshape(img,(1,)+img.shape) + yield img + + +def geneTrainNpy(image_path,mask_path,flag_multi_class = False,num_class = 2,image_prefix = "image",mask_prefix = "mask",image_as_gray = True,mask_as_gray = True): + image_name_arr = glob.glob(os.path.join(image_path,"%s*.png"%image_prefix)) + image_arr = [] + mask_arr = [] + for index,item in enumerate(image_name_arr): + img = io.imread(item,as_gray = image_as_gray) + img = np.reshape(img,img.shape + (1,)) if image_as_gray else img + mask = io.imread(item.replace(image_path,mask_path).replace(image_prefix,mask_prefix),as_gray = mask_as_gray) + mask = np.reshape(mask,mask.shape + (1,)) if mask_as_gray else mask + img,mask = adjustData(img,mask,flag_multi_class,num_class) + image_arr.append(img) + mask_arr.append(mask) + image_arr = np.array(image_arr) + mask_arr = np.array(mask_arr) + return image_arr,mask_arr + + +def labelVisualize(num_class,color_dict,img): + img = img[:,:,0] if len(img.shape) == 3 else img + img_out = np.zeros(img.shape + (3,)) + for i in range(num_class): + img_out[img == i,:] = color_dict[i] + return img_out / 255 + + + +def saveResult(save_path,npyfile,flag_multi_class = False,num_class = 2): + for i,item in enumerate(npyfile): + img = labelVisualize(num_class,COLOR_DICT,item) if flag_multi_class else item[:,:,0] + io.imsave(os.path.join(save_path,"%d_predict.png"%i),img) \ No newline at end of file diff --git a/data/test-volume.tif b/data/membrane/test-volume.tif similarity index 100% rename from data/test-volume.tif rename to data/membrane/test-volume.tif diff --git a/data/membrane/test/0.png b/data/membrane/test/0.png new file mode 100644 index 000000000..7401872a5 Binary files /dev/null and b/data/membrane/test/0.png differ diff --git a/data/membrane/test/0_predict.png b/data/membrane/test/0_predict.png new file mode 100644 index 000000000..c03957d2b Binary files /dev/null and b/data/membrane/test/0_predict.png differ diff --git a/data/membrane/test/1.png b/data/membrane/test/1.png new file mode 100644 index 000000000..fa089074c Binary files /dev/null and b/data/membrane/test/1.png differ diff --git a/data/membrane/test/10.png b/data/membrane/test/10.png new file mode 100644 index 000000000..98d4d6b83 Binary files /dev/null and b/data/membrane/test/10.png differ diff --git a/data/membrane/test/10_predict.png b/data/membrane/test/10_predict.png new file mode 100644 index 000000000..9c65d21d6 Binary files /dev/null and b/data/membrane/test/10_predict.png differ diff --git a/data/membrane/test/11.png b/data/membrane/test/11.png new file mode 100644 index 000000000..e2ab0c378 Binary files /dev/null and b/data/membrane/test/11.png differ diff --git a/data/membrane/test/11_predict.png b/data/membrane/test/11_predict.png new file mode 100644 index 000000000..a22755742 Binary files /dev/null and b/data/membrane/test/11_predict.png differ diff --git a/data/membrane/test/12.png b/data/membrane/test/12.png new file mode 100644 index 000000000..cc657efb5 Binary files /dev/null and b/data/membrane/test/12.png differ diff --git a/data/membrane/test/12_predict.png b/data/membrane/test/12_predict.png new file mode 100644 index 000000000..6ac43295b Binary files /dev/null and b/data/membrane/test/12_predict.png differ diff --git a/data/membrane/test/13.png b/data/membrane/test/13.png new file mode 100644 index 000000000..42dd46e70 Binary files /dev/null and b/data/membrane/test/13.png differ diff --git a/data/membrane/test/13_predict.png b/data/membrane/test/13_predict.png new file mode 100644 index 000000000..0a83331b8 Binary files /dev/null and b/data/membrane/test/13_predict.png differ diff --git a/data/membrane/test/14.png b/data/membrane/test/14.png new file mode 100644 index 000000000..d3f11e88d Binary files /dev/null and b/data/membrane/test/14.png differ diff --git a/data/membrane/test/14_predict.png b/data/membrane/test/14_predict.png new file mode 100644 index 000000000..7b17448ca Binary files /dev/null and b/data/membrane/test/14_predict.png differ diff --git a/data/membrane/test/15.png b/data/membrane/test/15.png new file mode 100644 index 000000000..5c09fa91e Binary files /dev/null and b/data/membrane/test/15.png differ diff --git a/data/membrane/test/15_predict.png b/data/membrane/test/15_predict.png new file mode 100644 index 000000000..fa4634825 Binary files /dev/null and b/data/membrane/test/15_predict.png differ diff --git a/data/membrane/test/16.png b/data/membrane/test/16.png new file mode 100644 index 000000000..7682736b2 Binary files /dev/null and b/data/membrane/test/16.png differ diff --git a/data/membrane/test/16_predict.png b/data/membrane/test/16_predict.png new file mode 100644 index 000000000..595642521 Binary files /dev/null and b/data/membrane/test/16_predict.png differ diff --git a/data/membrane/test/17.png b/data/membrane/test/17.png new file mode 100644 index 000000000..b0d4653e8 Binary files /dev/null and b/data/membrane/test/17.png differ diff --git a/data/membrane/test/17_predict.png b/data/membrane/test/17_predict.png new file mode 100644 index 000000000..840484ea7 Binary files /dev/null and b/data/membrane/test/17_predict.png differ diff --git a/data/membrane/test/18.png b/data/membrane/test/18.png new file mode 100644 index 000000000..024d32161 Binary files /dev/null and b/data/membrane/test/18.png differ diff --git a/data/membrane/test/18_predict.png b/data/membrane/test/18_predict.png new file mode 100644 index 000000000..d055d5ad6 Binary files /dev/null and b/data/membrane/test/18_predict.png differ diff --git a/data/membrane/test/19.png b/data/membrane/test/19.png new file mode 100644 index 000000000..8c286eaaf Binary files /dev/null and b/data/membrane/test/19.png differ diff --git a/data/membrane/test/19_predict.png b/data/membrane/test/19_predict.png new file mode 100644 index 000000000..ea3f1cf74 Binary files /dev/null and b/data/membrane/test/19_predict.png differ diff --git a/data/membrane/test/1_predict.png b/data/membrane/test/1_predict.png new file mode 100644 index 000000000..952247289 Binary files /dev/null and b/data/membrane/test/1_predict.png differ diff --git a/data/membrane/test/2.png b/data/membrane/test/2.png new file mode 100644 index 000000000..155daa6bb Binary files /dev/null and b/data/membrane/test/2.png differ diff --git a/data/membrane/test/20.png b/data/membrane/test/20.png new file mode 100644 index 000000000..aa4ac7f88 Binary files /dev/null and b/data/membrane/test/20.png differ diff --git a/data/membrane/test/20_predict.png b/data/membrane/test/20_predict.png new file mode 100644 index 000000000..234862b9a Binary files /dev/null and b/data/membrane/test/20_predict.png differ diff --git a/data/membrane/test/21.png b/data/membrane/test/21.png new file mode 100644 index 000000000..7fc735e60 Binary files /dev/null and b/data/membrane/test/21.png differ diff --git a/data/membrane/test/21_predict.png b/data/membrane/test/21_predict.png new file mode 100644 index 000000000..3fdde692b Binary files /dev/null and b/data/membrane/test/21_predict.png differ diff --git a/data/membrane/test/22.png b/data/membrane/test/22.png new file mode 100644 index 000000000..a3ea89570 Binary files /dev/null and b/data/membrane/test/22.png differ diff --git a/data/membrane/test/22_predict.png b/data/membrane/test/22_predict.png new file mode 100644 index 000000000..7b45042be Binary files /dev/null and b/data/membrane/test/22_predict.png differ diff --git a/data/membrane/test/23.png b/data/membrane/test/23.png new file mode 100644 index 000000000..7ba3dd677 Binary files /dev/null and b/data/membrane/test/23.png differ diff --git a/data/membrane/test/23_predict.png b/data/membrane/test/23_predict.png new file mode 100644 index 000000000..ac39dbb09 Binary files /dev/null and b/data/membrane/test/23_predict.png differ diff --git a/data/membrane/test/24.png b/data/membrane/test/24.png new file mode 100644 index 000000000..eb27e8b90 Binary files /dev/null and b/data/membrane/test/24.png differ diff --git a/data/membrane/test/24_predict.png b/data/membrane/test/24_predict.png new file mode 100644 index 000000000..2d0934ec0 Binary files /dev/null and b/data/membrane/test/24_predict.png differ diff --git a/data/membrane/test/25.png b/data/membrane/test/25.png new file mode 100644 index 000000000..3985714ba Binary files /dev/null and b/data/membrane/test/25.png differ diff --git a/data/membrane/test/25_predict.png b/data/membrane/test/25_predict.png new file mode 100644 index 000000000..81ee639d2 Binary files /dev/null and b/data/membrane/test/25_predict.png differ diff --git a/data/membrane/test/26.png b/data/membrane/test/26.png new file mode 100644 index 000000000..895e774fb Binary files /dev/null and b/data/membrane/test/26.png differ diff --git a/data/membrane/test/26_predict.png b/data/membrane/test/26_predict.png new file mode 100644 index 000000000..351c5ac2d Binary files /dev/null and b/data/membrane/test/26_predict.png differ diff --git a/data/membrane/test/27.png b/data/membrane/test/27.png new file mode 100644 index 000000000..a41d781f1 Binary files /dev/null and b/data/membrane/test/27.png differ diff --git a/data/membrane/test/27_predict.png b/data/membrane/test/27_predict.png new file mode 100644 index 000000000..a74364e42 Binary files /dev/null and b/data/membrane/test/27_predict.png differ diff --git a/data/membrane/test/28.png b/data/membrane/test/28.png new file mode 100644 index 000000000..e91b2dd28 Binary files /dev/null and b/data/membrane/test/28.png differ diff --git a/data/membrane/test/28_predict.png b/data/membrane/test/28_predict.png new file mode 100644 index 000000000..9154a04db Binary files /dev/null and b/data/membrane/test/28_predict.png differ diff --git a/data/membrane/test/29.png b/data/membrane/test/29.png new file mode 100644 index 000000000..e95fb6e5a Binary files /dev/null and b/data/membrane/test/29.png differ diff --git a/data/membrane/test/29_predict.png b/data/membrane/test/29_predict.png new file mode 100644 index 000000000..a2a262d0d Binary files /dev/null and b/data/membrane/test/29_predict.png differ diff --git a/data/membrane/test/2_predict.png b/data/membrane/test/2_predict.png new file mode 100644 index 000000000..efc4fb1ee Binary files /dev/null and b/data/membrane/test/2_predict.png differ diff --git a/data/membrane/test/3.png b/data/membrane/test/3.png new file mode 100644 index 000000000..ec4364341 Binary files /dev/null and b/data/membrane/test/3.png differ diff --git a/data/membrane/test/3_predict.png b/data/membrane/test/3_predict.png new file mode 100644 index 000000000..d31edd6df Binary files /dev/null and b/data/membrane/test/3_predict.png differ diff --git a/data/membrane/test/4.png b/data/membrane/test/4.png new file mode 100644 index 000000000..c40ca861b Binary files /dev/null and b/data/membrane/test/4.png differ diff --git a/data/membrane/test/4_predict.png b/data/membrane/test/4_predict.png new file mode 100644 index 000000000..c33faff4f Binary files /dev/null and b/data/membrane/test/4_predict.png differ diff --git a/data/membrane/test/5.png b/data/membrane/test/5.png new file mode 100644 index 000000000..4fc82a571 Binary files /dev/null and b/data/membrane/test/5.png differ diff --git a/data/membrane/test/5_predict.png b/data/membrane/test/5_predict.png new file mode 100644 index 000000000..811fb731b Binary files /dev/null and b/data/membrane/test/5_predict.png differ diff --git a/data/membrane/test/6.png b/data/membrane/test/6.png new file mode 100644 index 000000000..927cd81c8 Binary files /dev/null and b/data/membrane/test/6.png differ diff --git a/data/membrane/test/6_predict.png b/data/membrane/test/6_predict.png new file mode 100644 index 000000000..48ab14614 Binary files /dev/null and b/data/membrane/test/6_predict.png differ diff --git a/data/membrane/test/7.png b/data/membrane/test/7.png new file mode 100644 index 000000000..96188411a Binary files /dev/null and b/data/membrane/test/7.png differ diff --git a/data/membrane/test/7_predict.png b/data/membrane/test/7_predict.png new file mode 100644 index 000000000..4413ddc32 Binary files /dev/null and b/data/membrane/test/7_predict.png differ diff --git a/data/membrane/test/8.png b/data/membrane/test/8.png new file mode 100644 index 000000000..71bd9b49d Binary files /dev/null and b/data/membrane/test/8.png differ diff --git a/data/membrane/test/8_predict.png b/data/membrane/test/8_predict.png new file mode 100644 index 000000000..a495ea47b Binary files /dev/null and b/data/membrane/test/8_predict.png differ diff --git a/data/membrane/test/9.png b/data/membrane/test/9.png new file mode 100644 index 000000000..78d171a06 Binary files /dev/null and b/data/membrane/test/9.png differ diff --git a/data/membrane/test/9_predict.png b/data/membrane/test/9_predict.png new file mode 100644 index 000000000..1f4609f5a Binary files /dev/null and b/data/membrane/test/9_predict.png differ diff --git a/data/train-labels.tif b/data/membrane/train-labels.tif similarity index 100% rename from data/train-labels.tif rename to data/membrane/train-labels.tif diff --git a/data/train-volume.tif b/data/membrane/train-volume.tif similarity index 100% rename from data/train-volume.tif rename to data/membrane/train-volume.tif diff --git a/data/membrane/train/aug/image_0_6144147.png b/data/membrane/train/aug/image_0_6144147.png new file mode 100644 index 000000000..d33893f89 Binary files /dev/null and b/data/membrane/train/aug/image_0_6144147.png differ diff --git a/data/membrane/train/aug/image_0_9312159.png b/data/membrane/train/aug/image_0_9312159.png new file mode 100644 index 000000000..d33893f89 Binary files /dev/null and b/data/membrane/train/aug/image_0_9312159.png differ diff --git a/data/membrane/train/aug/image_10_4725015.png b/data/membrane/train/aug/image_10_4725015.png new file mode 100644 index 000000000..c04a1fbfc Binary files /dev/null and b/data/membrane/train/aug/image_10_4725015.png differ diff --git a/data/membrane/train/aug/image_10_6658724.png b/data/membrane/train/aug/image_10_6658724.png new file mode 100644 index 000000000..c04a1fbfc Binary files /dev/null and b/data/membrane/train/aug/image_10_6658724.png differ diff --git a/data/membrane/train/aug/image_11_7305766.png b/data/membrane/train/aug/image_11_7305766.png new file mode 100644 index 000000000..bbbbc280d Binary files /dev/null and b/data/membrane/train/aug/image_11_7305766.png differ diff --git a/data/membrane/train/aug/image_11_9762238.png b/data/membrane/train/aug/image_11_9762238.png new file mode 100644 index 000000000..bbbbc280d Binary files /dev/null and b/data/membrane/train/aug/image_11_9762238.png differ diff --git a/data/membrane/train/aug/image_12_4186302.png b/data/membrane/train/aug/image_12_4186302.png new file mode 100644 index 000000000..ba950172a Binary files /dev/null and b/data/membrane/train/aug/image_12_4186302.png differ diff --git a/data/membrane/train/aug/image_12_4486064.png b/data/membrane/train/aug/image_12_4486064.png new file mode 100644 index 000000000..ba950172a Binary files /dev/null and b/data/membrane/train/aug/image_12_4486064.png differ diff --git a/data/membrane/train/aug/image_13_3027714.png b/data/membrane/train/aug/image_13_3027714.png new file mode 100644 index 000000000..71f45d94d Binary files /dev/null and b/data/membrane/train/aug/image_13_3027714.png differ diff --git a/data/membrane/train/aug/image_13_8372481.png b/data/membrane/train/aug/image_13_8372481.png new file mode 100644 index 000000000..71f45d94d Binary files /dev/null and b/data/membrane/train/aug/image_13_8372481.png differ diff --git a/data/membrane/train/aug/image_14_3602105.png b/data/membrane/train/aug/image_14_3602105.png new file mode 100644 index 000000000..be5fba72c Binary files /dev/null and b/data/membrane/train/aug/image_14_3602105.png differ diff --git a/data/membrane/train/aug/image_14_8620165.png b/data/membrane/train/aug/image_14_8620165.png new file mode 100644 index 000000000..be5fba72c Binary files /dev/null and b/data/membrane/train/aug/image_14_8620165.png differ diff --git a/data/membrane/train/aug/image_15_7797249.png b/data/membrane/train/aug/image_15_7797249.png new file mode 100644 index 000000000..f895453e9 Binary files /dev/null and b/data/membrane/train/aug/image_15_7797249.png differ diff --git a/data/membrane/train/aug/image_15_7856748.png b/data/membrane/train/aug/image_15_7856748.png new file mode 100644 index 000000000..f895453e9 Binary files /dev/null and b/data/membrane/train/aug/image_15_7856748.png differ diff --git a/data/membrane/train/aug/image_16_7404918.png b/data/membrane/train/aug/image_16_7404918.png new file mode 100644 index 000000000..a8fae3448 Binary files /dev/null and b/data/membrane/train/aug/image_16_7404918.png differ diff --git a/data/membrane/train/aug/image_16_9397072.png b/data/membrane/train/aug/image_16_9397072.png new file mode 100644 index 000000000..a8fae3448 Binary files /dev/null and b/data/membrane/train/aug/image_16_9397072.png differ diff --git a/data/membrane/train/aug/image_17_3911616.png b/data/membrane/train/aug/image_17_3911616.png new file mode 100644 index 000000000..a8c2188c9 Binary files /dev/null and b/data/membrane/train/aug/image_17_3911616.png differ diff --git a/data/membrane/train/aug/image_17_5677330.png b/data/membrane/train/aug/image_17_5677330.png new file mode 100644 index 000000000..a8c2188c9 Binary files /dev/null and b/data/membrane/train/aug/image_17_5677330.png differ diff --git a/data/membrane/train/aug/image_18_1533065.png b/data/membrane/train/aug/image_18_1533065.png new file mode 100644 index 000000000..eebe7ef8a Binary files /dev/null and b/data/membrane/train/aug/image_18_1533065.png differ diff --git a/data/membrane/train/aug/image_18_7670894.png b/data/membrane/train/aug/image_18_7670894.png new file mode 100644 index 000000000..eebe7ef8a Binary files /dev/null and b/data/membrane/train/aug/image_18_7670894.png differ diff --git a/data/membrane/train/aug/image_19_2043583.png b/data/membrane/train/aug/image_19_2043583.png new file mode 100644 index 000000000..e9fa7c434 Binary files /dev/null and b/data/membrane/train/aug/image_19_2043583.png differ diff --git a/data/membrane/train/aug/image_19_5366147.png b/data/membrane/train/aug/image_19_5366147.png new file mode 100644 index 000000000..e9fa7c434 Binary files /dev/null and b/data/membrane/train/aug/image_19_5366147.png differ diff --git a/data/membrane/train/aug/image_1_9323655.png b/data/membrane/train/aug/image_1_9323655.png new file mode 100644 index 000000000..9a0781783 Binary files /dev/null and b/data/membrane/train/aug/image_1_9323655.png differ diff --git a/data/membrane/train/aug/image_1_9353417.png b/data/membrane/train/aug/image_1_9353417.png new file mode 100644 index 000000000..9a0781783 Binary files /dev/null and b/data/membrane/train/aug/image_1_9353417.png differ diff --git a/data/membrane/train/aug/image_20_3601991.png b/data/membrane/train/aug/image_20_3601991.png new file mode 100644 index 000000000..50ec52d63 Binary files /dev/null and b/data/membrane/train/aug/image_20_3601991.png differ diff --git a/data/membrane/train/aug/image_20_7053067.png b/data/membrane/train/aug/image_20_7053067.png new file mode 100644 index 000000000..50ec52d63 Binary files /dev/null and b/data/membrane/train/aug/image_20_7053067.png differ diff --git a/data/membrane/train/aug/image_21_3732585.png b/data/membrane/train/aug/image_21_3732585.png new file mode 100644 index 000000000..ea3ce0de3 Binary files /dev/null and b/data/membrane/train/aug/image_21_3732585.png differ diff --git a/data/membrane/train/aug/image_21_8506147.png b/data/membrane/train/aug/image_21_8506147.png new file mode 100644 index 000000000..ea3ce0de3 Binary files /dev/null and b/data/membrane/train/aug/image_21_8506147.png differ diff --git a/data/membrane/train/aug/image_22_1880892.png b/data/membrane/train/aug/image_22_1880892.png new file mode 100644 index 000000000..cbdbdfbb8 Binary files /dev/null and b/data/membrane/train/aug/image_22_1880892.png differ diff --git a/data/membrane/train/aug/image_22_2808126.png b/data/membrane/train/aug/image_22_2808126.png new file mode 100644 index 000000000..cbdbdfbb8 Binary files /dev/null and b/data/membrane/train/aug/image_22_2808126.png differ diff --git a/data/membrane/train/aug/image_23_833746.png b/data/membrane/train/aug/image_23_833746.png new file mode 100644 index 000000000..0aee96588 Binary files /dev/null and b/data/membrane/train/aug/image_23_833746.png differ diff --git a/data/membrane/train/aug/image_23_9704808.png b/data/membrane/train/aug/image_23_9704808.png new file mode 100644 index 000000000..0aee96588 Binary files /dev/null and b/data/membrane/train/aug/image_23_9704808.png differ diff --git a/data/membrane/train/aug/image_24_7854683.png b/data/membrane/train/aug/image_24_7854683.png new file mode 100644 index 000000000..965ee81ea Binary files /dev/null and b/data/membrane/train/aug/image_24_7854683.png differ diff --git a/data/membrane/train/aug/image_24_7890115.png b/data/membrane/train/aug/image_24_7890115.png new file mode 100644 index 000000000..965ee81ea Binary files /dev/null and b/data/membrane/train/aug/image_24_7890115.png differ diff --git a/data/membrane/train/aug/image_25_32689.png b/data/membrane/train/aug/image_25_32689.png new file mode 100644 index 000000000..5a146acbe Binary files /dev/null and b/data/membrane/train/aug/image_25_32689.png differ diff --git a/data/membrane/train/aug/image_25_6277072.png b/data/membrane/train/aug/image_25_6277072.png new file mode 100644 index 000000000..5a146acbe Binary files /dev/null and b/data/membrane/train/aug/image_25_6277072.png differ diff --git a/data/membrane/train/aug/image_26_3928388.png b/data/membrane/train/aug/image_26_3928388.png new file mode 100644 index 000000000..5312b4160 Binary files /dev/null and b/data/membrane/train/aug/image_26_3928388.png differ diff --git a/data/membrane/train/aug/image_26_8717052.png b/data/membrane/train/aug/image_26_8717052.png new file mode 100644 index 000000000..5312b4160 Binary files /dev/null and b/data/membrane/train/aug/image_26_8717052.png differ diff --git a/data/membrane/train/aug/image_27_1760328.png b/data/membrane/train/aug/image_27_1760328.png new file mode 100644 index 000000000..05324ef6e Binary files /dev/null and b/data/membrane/train/aug/image_27_1760328.png differ diff --git a/data/membrane/train/aug/image_27_2952813.png b/data/membrane/train/aug/image_27_2952813.png new file mode 100644 index 000000000..05324ef6e Binary files /dev/null and b/data/membrane/train/aug/image_27_2952813.png differ diff --git a/data/membrane/train/aug/image_28_1813420.png b/data/membrane/train/aug/image_28_1813420.png new file mode 100644 index 000000000..e37dbd61e Binary files /dev/null and b/data/membrane/train/aug/image_28_1813420.png differ diff --git a/data/membrane/train/aug/image_28_3604435.png b/data/membrane/train/aug/image_28_3604435.png new file mode 100644 index 000000000..e37dbd61e Binary files /dev/null and b/data/membrane/train/aug/image_28_3604435.png differ diff --git a/data/membrane/train/aug/image_29_6023041.png b/data/membrane/train/aug/image_29_6023041.png new file mode 100644 index 000000000..9f849d997 Binary files /dev/null and b/data/membrane/train/aug/image_29_6023041.png differ diff --git a/data/membrane/train/aug/image_29_8617811.png b/data/membrane/train/aug/image_29_8617811.png new file mode 100644 index 000000000..9f849d997 Binary files /dev/null and b/data/membrane/train/aug/image_29_8617811.png differ diff --git a/data/membrane/train/aug/image_2_4218729.png b/data/membrane/train/aug/image_2_4218729.png new file mode 100644 index 000000000..f09e9a0c6 Binary files /dev/null and b/data/membrane/train/aug/image_2_4218729.png differ diff --git a/data/membrane/train/aug/image_2_4242621.png b/data/membrane/train/aug/image_2_4242621.png new file mode 100644 index 000000000..f09e9a0c6 Binary files /dev/null and b/data/membrane/train/aug/image_2_4242621.png differ diff --git a/data/membrane/train/aug/image_3_3355733.png b/data/membrane/train/aug/image_3_3355733.png new file mode 100644 index 000000000..aad36dc19 Binary files /dev/null and b/data/membrane/train/aug/image_3_3355733.png differ diff --git a/data/membrane/train/aug/image_3_6123244.png b/data/membrane/train/aug/image_3_6123244.png new file mode 100644 index 000000000..aad36dc19 Binary files /dev/null and b/data/membrane/train/aug/image_3_6123244.png differ diff --git a/data/membrane/train/aug/image_4_4272795.png b/data/membrane/train/aug/image_4_4272795.png new file mode 100644 index 000000000..07e976eee Binary files /dev/null and b/data/membrane/train/aug/image_4_4272795.png differ diff --git a/data/membrane/train/aug/image_4_9292489.png b/data/membrane/train/aug/image_4_9292489.png new file mode 100644 index 000000000..07e976eee Binary files /dev/null and b/data/membrane/train/aug/image_4_9292489.png differ diff --git a/data/membrane/train/aug/image_5_2683761.png b/data/membrane/train/aug/image_5_2683761.png new file mode 100644 index 000000000..3fb36868b Binary files /dev/null and b/data/membrane/train/aug/image_5_2683761.png differ diff --git a/data/membrane/train/aug/image_5_555502.png b/data/membrane/train/aug/image_5_555502.png new file mode 100644 index 000000000..3fb36868b Binary files /dev/null and b/data/membrane/train/aug/image_5_555502.png differ diff --git a/data/membrane/train/aug/image_6_5544540.png b/data/membrane/train/aug/image_6_5544540.png new file mode 100644 index 000000000..fdfbc1185 Binary files /dev/null and b/data/membrane/train/aug/image_6_5544540.png differ diff --git a/data/membrane/train/aug/image_6_5592345.png b/data/membrane/train/aug/image_6_5592345.png new file mode 100644 index 000000000..fdfbc1185 Binary files /dev/null and b/data/membrane/train/aug/image_6_5592345.png differ diff --git a/data/membrane/train/aug/image_7_236371.png b/data/membrane/train/aug/image_7_236371.png new file mode 100644 index 000000000..ef2ddbdcc Binary files /dev/null and b/data/membrane/train/aug/image_7_236371.png differ diff --git a/data/membrane/train/aug/image_7_9599882.png b/data/membrane/train/aug/image_7_9599882.png new file mode 100644 index 000000000..ef2ddbdcc Binary files /dev/null and b/data/membrane/train/aug/image_7_9599882.png differ diff --git a/data/membrane/train/aug/image_8_3936874.png b/data/membrane/train/aug/image_8_3936874.png new file mode 100644 index 000000000..68d77a24f Binary files /dev/null and b/data/membrane/train/aug/image_8_3936874.png differ diff --git a/data/membrane/train/aug/image_8_4974953.png b/data/membrane/train/aug/image_8_4974953.png new file mode 100644 index 000000000..68d77a24f Binary files /dev/null and b/data/membrane/train/aug/image_8_4974953.png differ diff --git a/data/membrane/train/aug/image_9_6936014.png b/data/membrane/train/aug/image_9_6936014.png new file mode 100644 index 000000000..10bd8ef13 Binary files /dev/null and b/data/membrane/train/aug/image_9_6936014.png differ diff --git a/data/membrane/train/aug/image_9_7535981.png b/data/membrane/train/aug/image_9_7535981.png new file mode 100644 index 000000000..10bd8ef13 Binary files /dev/null and b/data/membrane/train/aug/image_9_7535981.png differ diff --git a/data/membrane/train/aug/mask_0_6144147.png b/data/membrane/train/aug/mask_0_6144147.png new file mode 100644 index 000000000..444a4e3ee Binary files /dev/null and b/data/membrane/train/aug/mask_0_6144147.png differ diff --git a/data/membrane/train/aug/mask_0_9312159.png b/data/membrane/train/aug/mask_0_9312159.png new file mode 100644 index 000000000..444a4e3ee Binary files /dev/null and b/data/membrane/train/aug/mask_0_9312159.png differ diff --git a/data/membrane/train/aug/mask_10_4725015.png b/data/membrane/train/aug/mask_10_4725015.png new file mode 100644 index 000000000..f20df6e64 Binary files /dev/null and b/data/membrane/train/aug/mask_10_4725015.png differ diff --git a/data/membrane/train/aug/mask_10_6658724.png b/data/membrane/train/aug/mask_10_6658724.png new file mode 100644 index 000000000..f20df6e64 Binary files /dev/null and b/data/membrane/train/aug/mask_10_6658724.png differ diff --git a/data/membrane/train/aug/mask_11_7305766.png b/data/membrane/train/aug/mask_11_7305766.png new file mode 100644 index 000000000..5f2aefdaf Binary files /dev/null and b/data/membrane/train/aug/mask_11_7305766.png differ diff --git a/data/membrane/train/aug/mask_11_9762238.png b/data/membrane/train/aug/mask_11_9762238.png new file mode 100644 index 000000000..5f2aefdaf Binary files /dev/null and b/data/membrane/train/aug/mask_11_9762238.png differ diff --git a/data/membrane/train/aug/mask_12_4186302.png b/data/membrane/train/aug/mask_12_4186302.png new file mode 100644 index 000000000..1af5bcd62 Binary files /dev/null and b/data/membrane/train/aug/mask_12_4186302.png differ diff --git a/data/membrane/train/aug/mask_12_4486064.png b/data/membrane/train/aug/mask_12_4486064.png new file mode 100644 index 000000000..1af5bcd62 Binary files /dev/null and b/data/membrane/train/aug/mask_12_4486064.png differ diff --git a/data/membrane/train/aug/mask_13_3027714.png b/data/membrane/train/aug/mask_13_3027714.png new file mode 100644 index 000000000..59a632057 Binary files /dev/null and b/data/membrane/train/aug/mask_13_3027714.png differ diff --git a/data/membrane/train/aug/mask_13_8372481.png b/data/membrane/train/aug/mask_13_8372481.png new file mode 100644 index 000000000..59a632057 Binary files /dev/null and b/data/membrane/train/aug/mask_13_8372481.png differ diff --git a/data/membrane/train/aug/mask_14_3602105.png b/data/membrane/train/aug/mask_14_3602105.png new file mode 100644 index 000000000..5c845e36d Binary files /dev/null and b/data/membrane/train/aug/mask_14_3602105.png differ diff --git a/data/membrane/train/aug/mask_14_8620165.png b/data/membrane/train/aug/mask_14_8620165.png new file mode 100644 index 000000000..5c845e36d Binary files /dev/null and b/data/membrane/train/aug/mask_14_8620165.png differ diff --git a/data/membrane/train/aug/mask_15_7797249.png b/data/membrane/train/aug/mask_15_7797249.png new file mode 100644 index 000000000..4b8bd6b52 Binary files /dev/null and b/data/membrane/train/aug/mask_15_7797249.png differ diff --git a/data/membrane/train/aug/mask_15_7856748.png b/data/membrane/train/aug/mask_15_7856748.png new file mode 100644 index 000000000..4b8bd6b52 Binary files /dev/null and b/data/membrane/train/aug/mask_15_7856748.png differ diff --git a/data/membrane/train/aug/mask_16_7404918.png b/data/membrane/train/aug/mask_16_7404918.png new file mode 100644 index 000000000..e8c2b5d3b Binary files /dev/null and b/data/membrane/train/aug/mask_16_7404918.png differ diff --git a/data/membrane/train/aug/mask_16_9397072.png b/data/membrane/train/aug/mask_16_9397072.png new file mode 100644 index 000000000..e8c2b5d3b Binary files /dev/null and b/data/membrane/train/aug/mask_16_9397072.png differ diff --git a/data/membrane/train/aug/mask_17_3911616.png b/data/membrane/train/aug/mask_17_3911616.png new file mode 100644 index 000000000..ef33be52a Binary files /dev/null and b/data/membrane/train/aug/mask_17_3911616.png differ diff --git a/data/membrane/train/aug/mask_17_5677330.png b/data/membrane/train/aug/mask_17_5677330.png new file mode 100644 index 000000000..ef33be52a Binary files /dev/null and b/data/membrane/train/aug/mask_17_5677330.png differ diff --git a/data/membrane/train/aug/mask_18_1533065.png b/data/membrane/train/aug/mask_18_1533065.png new file mode 100644 index 000000000..86698570a Binary files /dev/null and b/data/membrane/train/aug/mask_18_1533065.png differ diff --git a/data/membrane/train/aug/mask_18_7670894.png b/data/membrane/train/aug/mask_18_7670894.png new file mode 100644 index 000000000..86698570a Binary files /dev/null and b/data/membrane/train/aug/mask_18_7670894.png differ diff --git a/data/membrane/train/aug/mask_19_2043583.png b/data/membrane/train/aug/mask_19_2043583.png new file mode 100644 index 000000000..dce7f907a Binary files /dev/null and b/data/membrane/train/aug/mask_19_2043583.png differ diff --git a/data/membrane/train/aug/mask_19_5366147.png b/data/membrane/train/aug/mask_19_5366147.png new file mode 100644 index 000000000..dce7f907a Binary files /dev/null and b/data/membrane/train/aug/mask_19_5366147.png differ diff --git a/data/membrane/train/aug/mask_1_9323655.png b/data/membrane/train/aug/mask_1_9323655.png new file mode 100644 index 000000000..4ddde3eda Binary files /dev/null and b/data/membrane/train/aug/mask_1_9323655.png differ diff --git a/data/membrane/train/aug/mask_1_9353417.png b/data/membrane/train/aug/mask_1_9353417.png new file mode 100644 index 000000000..4ddde3eda Binary files /dev/null and b/data/membrane/train/aug/mask_1_9353417.png differ diff --git a/data/membrane/train/aug/mask_20_3601991.png b/data/membrane/train/aug/mask_20_3601991.png new file mode 100644 index 000000000..d5560c164 Binary files /dev/null and b/data/membrane/train/aug/mask_20_3601991.png differ diff --git a/data/membrane/train/aug/mask_20_7053067.png b/data/membrane/train/aug/mask_20_7053067.png new file mode 100644 index 000000000..d5560c164 Binary files /dev/null and b/data/membrane/train/aug/mask_20_7053067.png differ diff --git a/data/membrane/train/aug/mask_21_3732585.png b/data/membrane/train/aug/mask_21_3732585.png new file mode 100644 index 000000000..d7e332aa1 Binary files /dev/null and b/data/membrane/train/aug/mask_21_3732585.png differ diff --git a/data/membrane/train/aug/mask_21_8506147.png b/data/membrane/train/aug/mask_21_8506147.png new file mode 100644 index 000000000..d7e332aa1 Binary files /dev/null and b/data/membrane/train/aug/mask_21_8506147.png differ diff --git a/data/membrane/train/aug/mask_22_1880892.png b/data/membrane/train/aug/mask_22_1880892.png new file mode 100644 index 000000000..38015bf10 Binary files /dev/null and b/data/membrane/train/aug/mask_22_1880892.png differ diff --git a/data/membrane/train/aug/mask_22_2808126.png b/data/membrane/train/aug/mask_22_2808126.png new file mode 100644 index 000000000..38015bf10 Binary files /dev/null and b/data/membrane/train/aug/mask_22_2808126.png differ diff --git a/data/membrane/train/aug/mask_23_833746.png b/data/membrane/train/aug/mask_23_833746.png new file mode 100644 index 000000000..7c9d5265a Binary files /dev/null and b/data/membrane/train/aug/mask_23_833746.png differ diff --git a/data/membrane/train/aug/mask_23_9704808.png b/data/membrane/train/aug/mask_23_9704808.png new file mode 100644 index 000000000..7c9d5265a Binary files /dev/null and b/data/membrane/train/aug/mask_23_9704808.png differ diff --git a/data/membrane/train/aug/mask_24_7854683.png b/data/membrane/train/aug/mask_24_7854683.png new file mode 100644 index 000000000..c10a90fb4 Binary files /dev/null and b/data/membrane/train/aug/mask_24_7854683.png differ diff --git a/data/membrane/train/aug/mask_24_7890115.png b/data/membrane/train/aug/mask_24_7890115.png new file mode 100644 index 000000000..c10a90fb4 Binary files /dev/null and b/data/membrane/train/aug/mask_24_7890115.png differ diff --git a/data/membrane/train/aug/mask_25_32689.png b/data/membrane/train/aug/mask_25_32689.png new file mode 100644 index 000000000..e40a394a5 Binary files /dev/null and b/data/membrane/train/aug/mask_25_32689.png differ diff --git a/data/membrane/train/aug/mask_25_6277072.png b/data/membrane/train/aug/mask_25_6277072.png new file mode 100644 index 000000000..e40a394a5 Binary files /dev/null and b/data/membrane/train/aug/mask_25_6277072.png differ diff --git a/data/membrane/train/aug/mask_26_3928388.png b/data/membrane/train/aug/mask_26_3928388.png new file mode 100644 index 000000000..bbfb6c256 Binary files /dev/null and b/data/membrane/train/aug/mask_26_3928388.png differ diff --git a/data/membrane/train/aug/mask_26_8717052.png b/data/membrane/train/aug/mask_26_8717052.png new file mode 100644 index 000000000..bbfb6c256 Binary files /dev/null and b/data/membrane/train/aug/mask_26_8717052.png differ diff --git a/data/membrane/train/aug/mask_27_1760328.png b/data/membrane/train/aug/mask_27_1760328.png new file mode 100644 index 000000000..d2854be7f Binary files /dev/null and b/data/membrane/train/aug/mask_27_1760328.png differ diff --git a/data/membrane/train/aug/mask_27_2952813.png b/data/membrane/train/aug/mask_27_2952813.png new file mode 100644 index 000000000..d2854be7f Binary files /dev/null and b/data/membrane/train/aug/mask_27_2952813.png differ diff --git a/data/membrane/train/aug/mask_28_1813420.png b/data/membrane/train/aug/mask_28_1813420.png new file mode 100644 index 000000000..0f0f752b9 Binary files /dev/null and b/data/membrane/train/aug/mask_28_1813420.png differ diff --git a/data/membrane/train/aug/mask_28_3604435.png b/data/membrane/train/aug/mask_28_3604435.png new file mode 100644 index 000000000..0f0f752b9 Binary files /dev/null and b/data/membrane/train/aug/mask_28_3604435.png differ diff --git a/data/membrane/train/aug/mask_29_6023041.png b/data/membrane/train/aug/mask_29_6023041.png new file mode 100644 index 000000000..899831397 Binary files /dev/null and b/data/membrane/train/aug/mask_29_6023041.png differ diff --git a/data/membrane/train/aug/mask_29_8617811.png b/data/membrane/train/aug/mask_29_8617811.png new file mode 100644 index 000000000..899831397 Binary files /dev/null and b/data/membrane/train/aug/mask_29_8617811.png differ diff --git a/data/membrane/train/aug/mask_2_4218729.png b/data/membrane/train/aug/mask_2_4218729.png new file mode 100644 index 000000000..57aa913fa Binary files /dev/null and b/data/membrane/train/aug/mask_2_4218729.png differ diff --git a/data/membrane/train/aug/mask_2_4242621.png b/data/membrane/train/aug/mask_2_4242621.png new file mode 100644 index 000000000..57aa913fa Binary files /dev/null and b/data/membrane/train/aug/mask_2_4242621.png differ diff --git a/data/membrane/train/aug/mask_3_3355733.png b/data/membrane/train/aug/mask_3_3355733.png new file mode 100644 index 000000000..71e646b57 Binary files /dev/null and b/data/membrane/train/aug/mask_3_3355733.png differ diff --git a/data/membrane/train/aug/mask_3_6123244.png b/data/membrane/train/aug/mask_3_6123244.png new file mode 100644 index 000000000..71e646b57 Binary files /dev/null and b/data/membrane/train/aug/mask_3_6123244.png differ diff --git a/data/membrane/train/aug/mask_4_4272795.png b/data/membrane/train/aug/mask_4_4272795.png new file mode 100644 index 000000000..9b4cd0958 Binary files /dev/null and b/data/membrane/train/aug/mask_4_4272795.png differ diff --git a/data/membrane/train/aug/mask_4_9292489.png b/data/membrane/train/aug/mask_4_9292489.png new file mode 100644 index 000000000..9b4cd0958 Binary files /dev/null and b/data/membrane/train/aug/mask_4_9292489.png differ diff --git a/data/membrane/train/aug/mask_5_2683761.png b/data/membrane/train/aug/mask_5_2683761.png new file mode 100644 index 000000000..16c661850 Binary files /dev/null and b/data/membrane/train/aug/mask_5_2683761.png differ diff --git a/data/membrane/train/aug/mask_5_555502.png b/data/membrane/train/aug/mask_5_555502.png new file mode 100644 index 000000000..16c661850 Binary files /dev/null and b/data/membrane/train/aug/mask_5_555502.png differ diff --git a/data/membrane/train/aug/mask_6_5544540.png b/data/membrane/train/aug/mask_6_5544540.png new file mode 100644 index 000000000..51d4d343f Binary files /dev/null and b/data/membrane/train/aug/mask_6_5544540.png differ diff --git a/data/membrane/train/aug/mask_6_5592345.png b/data/membrane/train/aug/mask_6_5592345.png new file mode 100644 index 000000000..51d4d343f Binary files /dev/null and b/data/membrane/train/aug/mask_6_5592345.png differ diff --git a/data/membrane/train/aug/mask_7_236371.png b/data/membrane/train/aug/mask_7_236371.png new file mode 100644 index 000000000..76c79b36e Binary files /dev/null and b/data/membrane/train/aug/mask_7_236371.png differ diff --git a/data/membrane/train/aug/mask_7_9599882.png b/data/membrane/train/aug/mask_7_9599882.png new file mode 100644 index 000000000..76c79b36e Binary files /dev/null and b/data/membrane/train/aug/mask_7_9599882.png differ diff --git a/data/membrane/train/aug/mask_8_3936874.png b/data/membrane/train/aug/mask_8_3936874.png new file mode 100644 index 000000000..ff58837d9 Binary files /dev/null and b/data/membrane/train/aug/mask_8_3936874.png differ diff --git a/data/membrane/train/aug/mask_8_4974953.png b/data/membrane/train/aug/mask_8_4974953.png new file mode 100644 index 000000000..ff58837d9 Binary files /dev/null and b/data/membrane/train/aug/mask_8_4974953.png differ diff --git a/data/membrane/train/aug/mask_9_6936014.png b/data/membrane/train/aug/mask_9_6936014.png new file mode 100644 index 000000000..1d42403f4 Binary files /dev/null and b/data/membrane/train/aug/mask_9_6936014.png differ diff --git a/data/membrane/train/aug/mask_9_7535981.png b/data/membrane/train/aug/mask_9_7535981.png new file mode 100644 index 000000000..1d42403f4 Binary files /dev/null and b/data/membrane/train/aug/mask_9_7535981.png differ diff --git a/data/membrane/train/image/0.png b/data/membrane/train/image/0.png new file mode 100644 index 000000000..95f3aaa15 Binary files /dev/null and b/data/membrane/train/image/0.png differ diff --git a/data/membrane/train/image/1.png b/data/membrane/train/image/1.png new file mode 100644 index 000000000..0d5cdf42f Binary files /dev/null and b/data/membrane/train/image/1.png differ diff --git a/data/membrane/train/image/10.png b/data/membrane/train/image/10.png new file mode 100644 index 000000000..e8923bdae Binary files /dev/null and b/data/membrane/train/image/10.png differ diff --git a/data/membrane/train/image/11.png b/data/membrane/train/image/11.png new file mode 100644 index 000000000..689924cb8 Binary files /dev/null and b/data/membrane/train/image/11.png differ diff --git a/data/membrane/train/image/12.png b/data/membrane/train/image/12.png new file mode 100644 index 000000000..e5d9f39c7 Binary files /dev/null and b/data/membrane/train/image/12.png differ diff --git a/data/membrane/train/image/13.png b/data/membrane/train/image/13.png new file mode 100644 index 000000000..8d7ab6089 Binary files /dev/null and b/data/membrane/train/image/13.png differ diff --git a/data/membrane/train/image/14.png b/data/membrane/train/image/14.png new file mode 100644 index 000000000..2611d52ab Binary files /dev/null and b/data/membrane/train/image/14.png differ diff --git a/data/membrane/train/image/15.png b/data/membrane/train/image/15.png new file mode 100644 index 000000000..8fa1a18c7 Binary files /dev/null and b/data/membrane/train/image/15.png differ diff --git a/data/membrane/train/image/16.png b/data/membrane/train/image/16.png new file mode 100644 index 000000000..13090cc9b Binary files /dev/null and b/data/membrane/train/image/16.png differ diff --git a/data/membrane/train/image/17.png b/data/membrane/train/image/17.png new file mode 100644 index 000000000..0e33e8f56 Binary files /dev/null and b/data/membrane/train/image/17.png differ diff --git a/data/membrane/train/image/18.png b/data/membrane/train/image/18.png new file mode 100644 index 000000000..4c2a7faf7 Binary files /dev/null and b/data/membrane/train/image/18.png differ diff --git a/data/membrane/train/image/19.png b/data/membrane/train/image/19.png new file mode 100644 index 000000000..9d17745c7 Binary files /dev/null and b/data/membrane/train/image/19.png differ diff --git a/data/membrane/train/image/2.png b/data/membrane/train/image/2.png new file mode 100644 index 000000000..ecf757a35 Binary files /dev/null and b/data/membrane/train/image/2.png differ diff --git a/data/membrane/train/image/20.png b/data/membrane/train/image/20.png new file mode 100644 index 000000000..810e1086e Binary files /dev/null and b/data/membrane/train/image/20.png differ diff --git a/data/membrane/train/image/21.png b/data/membrane/train/image/21.png new file mode 100644 index 000000000..177783a68 Binary files /dev/null and b/data/membrane/train/image/21.png differ diff --git a/data/membrane/train/image/22.png b/data/membrane/train/image/22.png new file mode 100644 index 000000000..a429f8e16 Binary files /dev/null and b/data/membrane/train/image/22.png differ diff --git a/data/membrane/train/image/23.png b/data/membrane/train/image/23.png new file mode 100644 index 000000000..fc59728f6 Binary files /dev/null and b/data/membrane/train/image/23.png differ diff --git a/data/membrane/train/image/24.png b/data/membrane/train/image/24.png new file mode 100644 index 000000000..db4aa1ad7 Binary files /dev/null and b/data/membrane/train/image/24.png differ diff --git a/data/membrane/train/image/25.png b/data/membrane/train/image/25.png new file mode 100644 index 000000000..a2ec68253 Binary files /dev/null and b/data/membrane/train/image/25.png differ diff --git a/data/membrane/train/image/26.png b/data/membrane/train/image/26.png new file mode 100644 index 000000000..ed5bfb303 Binary files /dev/null and b/data/membrane/train/image/26.png differ diff --git a/data/membrane/train/image/27.png b/data/membrane/train/image/27.png new file mode 100644 index 000000000..779f809e9 Binary files /dev/null and b/data/membrane/train/image/27.png differ diff --git a/data/membrane/train/image/28.png b/data/membrane/train/image/28.png new file mode 100644 index 000000000..56d8beda9 Binary files /dev/null and b/data/membrane/train/image/28.png differ diff --git a/data/membrane/train/image/29.png b/data/membrane/train/image/29.png new file mode 100644 index 000000000..4d074a296 Binary files /dev/null and b/data/membrane/train/image/29.png differ diff --git a/data/membrane/train/image/3.png b/data/membrane/train/image/3.png new file mode 100644 index 000000000..7b8ef3e6b Binary files /dev/null and b/data/membrane/train/image/3.png differ diff --git a/data/membrane/train/image/4.png b/data/membrane/train/image/4.png new file mode 100644 index 000000000..8f0835cb0 Binary files /dev/null and b/data/membrane/train/image/4.png differ diff --git a/data/membrane/train/image/5.png b/data/membrane/train/image/5.png new file mode 100644 index 000000000..797192f57 Binary files /dev/null and b/data/membrane/train/image/5.png differ diff --git a/data/membrane/train/image/6.png b/data/membrane/train/image/6.png new file mode 100644 index 000000000..8a7d3d22c Binary files /dev/null and b/data/membrane/train/image/6.png differ diff --git a/data/membrane/train/image/7.png b/data/membrane/train/image/7.png new file mode 100644 index 000000000..8a472d73e Binary files /dev/null and b/data/membrane/train/image/7.png differ diff --git a/data/membrane/train/image/8.png b/data/membrane/train/image/8.png new file mode 100644 index 000000000..a88ed01da Binary files /dev/null and b/data/membrane/train/image/8.png differ diff --git a/data/membrane/train/image/9.png b/data/membrane/train/image/9.png new file mode 100644 index 000000000..4ead8a510 Binary files /dev/null and b/data/membrane/train/image/9.png differ diff --git a/data/membrane/train/label/0.png b/data/membrane/train/label/0.png new file mode 100644 index 000000000..80d4d9479 Binary files /dev/null and b/data/membrane/train/label/0.png differ diff --git a/data/membrane/train/label/1.png b/data/membrane/train/label/1.png new file mode 100644 index 000000000..8f99c6937 Binary files /dev/null and b/data/membrane/train/label/1.png differ diff --git a/data/membrane/train/label/10.png b/data/membrane/train/label/10.png new file mode 100644 index 000000000..8dd0b6e45 Binary files /dev/null and b/data/membrane/train/label/10.png differ diff --git a/data/membrane/train/label/11.png b/data/membrane/train/label/11.png new file mode 100644 index 000000000..8c4a5517b Binary files /dev/null and b/data/membrane/train/label/11.png differ diff --git a/data/membrane/train/label/12.png b/data/membrane/train/label/12.png new file mode 100644 index 000000000..9457bc754 Binary files /dev/null and b/data/membrane/train/label/12.png differ diff --git a/data/membrane/train/label/13.png b/data/membrane/train/label/13.png new file mode 100644 index 000000000..7dd67c064 Binary files /dev/null and b/data/membrane/train/label/13.png differ diff --git a/data/membrane/train/label/14.png b/data/membrane/train/label/14.png new file mode 100644 index 000000000..57fe62e26 Binary files /dev/null and b/data/membrane/train/label/14.png differ diff --git a/data/membrane/train/label/15.png b/data/membrane/train/label/15.png new file mode 100644 index 000000000..beb5cf0a5 Binary files /dev/null and b/data/membrane/train/label/15.png differ diff --git a/data/membrane/train/label/16.png b/data/membrane/train/label/16.png new file mode 100644 index 000000000..8b3b3b49e Binary files /dev/null and b/data/membrane/train/label/16.png differ diff --git a/data/membrane/train/label/17.png b/data/membrane/train/label/17.png new file mode 100644 index 000000000..d445e73cf Binary files /dev/null and b/data/membrane/train/label/17.png differ diff --git a/data/membrane/train/label/18.png b/data/membrane/train/label/18.png new file mode 100644 index 000000000..52343e8bb Binary files /dev/null and b/data/membrane/train/label/18.png differ diff --git a/data/membrane/train/label/19.png b/data/membrane/train/label/19.png new file mode 100644 index 000000000..a46da01a3 Binary files /dev/null and b/data/membrane/train/label/19.png differ diff --git a/data/membrane/train/label/2.png b/data/membrane/train/label/2.png new file mode 100644 index 000000000..b0525e7c3 Binary files /dev/null and b/data/membrane/train/label/2.png differ diff --git a/data/membrane/train/label/20.png b/data/membrane/train/label/20.png new file mode 100644 index 000000000..884f6ae7b Binary files /dev/null and b/data/membrane/train/label/20.png differ diff --git a/data/membrane/train/label/21.png b/data/membrane/train/label/21.png new file mode 100644 index 000000000..22be1a83c Binary files /dev/null and b/data/membrane/train/label/21.png differ diff --git a/data/membrane/train/label/22.png b/data/membrane/train/label/22.png new file mode 100644 index 000000000..d45b5e350 Binary files /dev/null and b/data/membrane/train/label/22.png differ diff --git a/data/membrane/train/label/23.png b/data/membrane/train/label/23.png new file mode 100644 index 000000000..b6f35f895 Binary files /dev/null and b/data/membrane/train/label/23.png differ diff --git a/data/membrane/train/label/24.png b/data/membrane/train/label/24.png new file mode 100644 index 000000000..f30d1dee5 Binary files /dev/null and b/data/membrane/train/label/24.png differ diff --git a/data/membrane/train/label/25.png b/data/membrane/train/label/25.png new file mode 100644 index 000000000..95c335921 Binary files /dev/null and b/data/membrane/train/label/25.png differ diff --git a/data/membrane/train/label/26.png b/data/membrane/train/label/26.png new file mode 100644 index 000000000..f79936663 Binary files /dev/null and b/data/membrane/train/label/26.png differ diff --git a/data/membrane/train/label/27.png b/data/membrane/train/label/27.png new file mode 100644 index 000000000..f831a591d Binary files /dev/null and b/data/membrane/train/label/27.png differ diff --git a/data/membrane/train/label/28.png b/data/membrane/train/label/28.png new file mode 100644 index 000000000..7323decc6 Binary files /dev/null and b/data/membrane/train/label/28.png differ diff --git a/data/membrane/train/label/29.png b/data/membrane/train/label/29.png new file mode 100644 index 000000000..5892b2255 Binary files /dev/null and b/data/membrane/train/label/29.png differ diff --git a/data/membrane/train/label/3.png b/data/membrane/train/label/3.png new file mode 100644 index 000000000..ab5499e1c Binary files /dev/null and b/data/membrane/train/label/3.png differ diff --git a/data/membrane/train/label/4.png b/data/membrane/train/label/4.png new file mode 100644 index 000000000..16b0929d1 Binary files /dev/null and b/data/membrane/train/label/4.png differ diff --git a/data/membrane/train/label/5.png b/data/membrane/train/label/5.png new file mode 100644 index 000000000..367f9df98 Binary files /dev/null and b/data/membrane/train/label/5.png differ diff --git a/data/membrane/train/label/6.png b/data/membrane/train/label/6.png new file mode 100644 index 000000000..0e206e92d Binary files /dev/null and b/data/membrane/train/label/6.png differ diff --git a/data/membrane/train/label/7.png b/data/membrane/train/label/7.png new file mode 100644 index 000000000..a83d9263e Binary files /dev/null and b/data/membrane/train/label/7.png differ diff --git a/data/membrane/train/label/8.png b/data/membrane/train/label/8.png new file mode 100644 index 000000000..e6d80ecf6 Binary files /dev/null and b/data/membrane/train/label/8.png differ diff --git a/data/membrane/train/label/9.png b/data/membrane/train/label/9.png new file mode 100644 index 000000000..ede999b91 Binary files /dev/null and b/data/membrane/train/label/9.png differ diff --git a/data/test/0.tif b/data/test/0.tif deleted file mode 100644 index 11824456e..000000000 Binary files a/data/test/0.tif and /dev/null differ diff --git a/data/test/1.tif b/data/test/1.tif deleted file mode 100644 index fe5ca7cf4..000000000 Binary files a/data/test/1.tif and /dev/null differ diff --git a/data/test/10.tif b/data/test/10.tif deleted file mode 100644 index e8f24e161..000000000 Binary files a/data/test/10.tif and /dev/null differ diff --git a/data/test/11.tif b/data/test/11.tif deleted file mode 100644 index 971baccd4..000000000 Binary files a/data/test/11.tif and /dev/null differ diff --git a/data/test/12.tif b/data/test/12.tif deleted file mode 100644 index 314037093..000000000 Binary files a/data/test/12.tif and /dev/null differ diff --git a/data/test/13.tif b/data/test/13.tif deleted file mode 100644 index 4376b7a34..000000000 Binary files a/data/test/13.tif and /dev/null differ diff --git a/data/test/14.tif b/data/test/14.tif deleted file mode 100644 index 5faad8468..000000000 Binary files a/data/test/14.tif and /dev/null differ diff --git a/data/test/15.tif b/data/test/15.tif deleted file mode 100644 index efca6fbd5..000000000 Binary files a/data/test/15.tif and /dev/null differ diff --git a/data/test/16.tif b/data/test/16.tif deleted file mode 100644 index ab7461ed4..000000000 Binary files a/data/test/16.tif and /dev/null differ diff --git a/data/test/17.tif b/data/test/17.tif deleted file mode 100644 index 62e33f50e..000000000 Binary files a/data/test/17.tif and /dev/null differ diff --git a/data/test/18.tif b/data/test/18.tif deleted file mode 100644 index 50bf1c04a..000000000 Binary files a/data/test/18.tif and /dev/null differ diff --git a/data/test/19.tif b/data/test/19.tif deleted file mode 100644 index 122b3c0f6..000000000 Binary files a/data/test/19.tif and /dev/null differ diff --git a/data/test/2.tif b/data/test/2.tif deleted file mode 100644 index bbfb35260..000000000 Binary files a/data/test/2.tif and /dev/null differ diff --git a/data/test/20.tif b/data/test/20.tif deleted file mode 100644 index a18b18794..000000000 Binary files a/data/test/20.tif and /dev/null differ diff --git a/data/test/21.tif b/data/test/21.tif deleted file mode 100644 index c2f24aba9..000000000 Binary files a/data/test/21.tif and /dev/null differ diff --git a/data/test/22.tif b/data/test/22.tif deleted file mode 100644 index 6f0072df5..000000000 Binary files a/data/test/22.tif and /dev/null differ diff --git a/data/test/23.tif b/data/test/23.tif deleted file mode 100644 index 4299d58ec..000000000 Binary files a/data/test/23.tif and /dev/null differ diff --git a/data/test/24.tif b/data/test/24.tif deleted file mode 100644 index a2af054cb..000000000 Binary files a/data/test/24.tif and /dev/null differ diff --git a/data/test/25.tif b/data/test/25.tif deleted file mode 100644 index a3626b43e..000000000 Binary files a/data/test/25.tif and /dev/null differ diff --git a/data/test/26.tif b/data/test/26.tif deleted file mode 100644 index 15154a4a8..000000000 Binary files a/data/test/26.tif and /dev/null differ diff --git a/data/test/27.tif b/data/test/27.tif deleted file mode 100644 index e7137d361..000000000 Binary files a/data/test/27.tif and /dev/null differ diff --git a/data/test/28.tif b/data/test/28.tif deleted file mode 100644 index 3f82fd88d..000000000 Binary files a/data/test/28.tif and /dev/null differ diff --git a/data/test/29.tif b/data/test/29.tif deleted file mode 100644 index dd3a69e96..000000000 Binary files a/data/test/29.tif and /dev/null differ diff --git a/data/test/3.tif b/data/test/3.tif deleted file mode 100644 index 18917f351..000000000 Binary files a/data/test/3.tif and /dev/null differ diff --git a/data/test/4.tif b/data/test/4.tif deleted file mode 100644 index 0ae5d086b..000000000 Binary files a/data/test/4.tif and /dev/null differ diff --git a/data/test/5.tif b/data/test/5.tif deleted file mode 100644 index 0e282152b..000000000 Binary files a/data/test/5.tif and /dev/null differ diff --git a/data/test/6.tif b/data/test/6.tif deleted file mode 100644 index 29036f777..000000000 Binary files a/data/test/6.tif and /dev/null differ diff --git a/data/test/7.tif b/data/test/7.tif deleted file mode 100644 index a58fa24a5..000000000 Binary files a/data/test/7.tif and /dev/null differ diff --git a/data/test/8.tif b/data/test/8.tif deleted file mode 100644 index 0e2867cd2..000000000 Binary files a/data/test/8.tif and /dev/null differ diff --git a/data/test/9.tif b/data/test/9.tif deleted file mode 100644 index 19f86cb58..000000000 Binary files a/data/test/9.tif and /dev/null differ diff --git a/data/train/image/0.tif b/data/train/image/0.tif deleted file mode 100644 index e8f09ae72..000000000 Binary files a/data/train/image/0.tif and /dev/null differ diff --git a/data/train/image/1.tif b/data/train/image/1.tif deleted file mode 100644 index a2d43fab5..000000000 Binary files a/data/train/image/1.tif and /dev/null differ diff --git a/data/train/image/10.tif b/data/train/image/10.tif deleted file mode 100644 index 9c64bfb55..000000000 Binary files a/data/train/image/10.tif and /dev/null differ diff --git a/data/train/image/11.tif b/data/train/image/11.tif deleted file mode 100644 index 8beaf95d2..000000000 Binary files a/data/train/image/11.tif and /dev/null differ diff --git a/data/train/image/12.tif b/data/train/image/12.tif deleted file mode 100644 index 5fa6098be..000000000 Binary files a/data/train/image/12.tif and /dev/null differ diff --git a/data/train/image/13.tif b/data/train/image/13.tif deleted file mode 100644 index 9ddb7dd80..000000000 Binary files a/data/train/image/13.tif and /dev/null differ diff --git a/data/train/image/14.tif b/data/train/image/14.tif deleted file mode 100644 index 6c00a0f96..000000000 Binary files a/data/train/image/14.tif and /dev/null differ diff --git a/data/train/image/15.tif b/data/train/image/15.tif deleted file mode 100644 index b34342acb..000000000 Binary files a/data/train/image/15.tif and /dev/null differ diff --git a/data/train/image/16.tif b/data/train/image/16.tif deleted file mode 100644 index eef8a5390..000000000 Binary files a/data/train/image/16.tif and /dev/null differ diff --git a/data/train/image/17.tif b/data/train/image/17.tif deleted file mode 100644 index 6c5af71db..000000000 Binary files a/data/train/image/17.tif and /dev/null differ diff --git a/data/train/image/18.tif b/data/train/image/18.tif deleted file mode 100644 index 93ea709b3..000000000 Binary files a/data/train/image/18.tif and /dev/null differ diff --git a/data/train/image/19.tif b/data/train/image/19.tif deleted file mode 100644 index bb2cc1396..000000000 Binary files a/data/train/image/19.tif and /dev/null differ diff --git a/data/train/image/2.tif b/data/train/image/2.tif deleted file mode 100644 index 5d1e602e7..000000000 Binary files a/data/train/image/2.tif and /dev/null differ diff --git a/data/train/image/20.tif b/data/train/image/20.tif deleted file mode 100644 index 539022b0f..000000000 Binary files a/data/train/image/20.tif and /dev/null differ diff --git a/data/train/image/21.tif b/data/train/image/21.tif deleted file mode 100644 index a5def2b33..000000000 Binary files a/data/train/image/21.tif and /dev/null differ diff --git a/data/train/image/22.tif b/data/train/image/22.tif deleted file mode 100644 index 2a467040d..000000000 Binary files a/data/train/image/22.tif and /dev/null differ diff --git a/data/train/image/23.tif b/data/train/image/23.tif deleted file mode 100644 index 4bcd2a9a3..000000000 Binary files a/data/train/image/23.tif and /dev/null differ diff --git a/data/train/image/24.tif b/data/train/image/24.tif deleted file mode 100644 index 78ec86e35..000000000 Binary files a/data/train/image/24.tif and /dev/null differ diff --git a/data/train/image/25.tif b/data/train/image/25.tif deleted file mode 100644 index 75d4d5ea6..000000000 Binary files a/data/train/image/25.tif and /dev/null differ diff --git a/data/train/image/26.tif b/data/train/image/26.tif deleted file mode 100644 index dd5d12bfc..000000000 Binary files a/data/train/image/26.tif and /dev/null differ diff --git a/data/train/image/27.tif b/data/train/image/27.tif deleted file mode 100644 index e509d2c5d..000000000 Binary files a/data/train/image/27.tif and /dev/null differ diff --git a/data/train/image/28.tif b/data/train/image/28.tif deleted file mode 100644 index 5bc24f0d6..000000000 Binary files a/data/train/image/28.tif and /dev/null differ diff --git a/data/train/image/29.tif b/data/train/image/29.tif deleted file mode 100644 index 3c129612b..000000000 Binary files a/data/train/image/29.tif and /dev/null differ diff --git a/data/train/image/3.tif b/data/train/image/3.tif deleted file mode 100644 index 0637dd647..000000000 Binary files a/data/train/image/3.tif and /dev/null differ diff --git a/data/train/image/4.tif b/data/train/image/4.tif deleted file mode 100644 index d406059f3..000000000 Binary files a/data/train/image/4.tif and /dev/null differ diff --git a/data/train/image/5.tif b/data/train/image/5.tif deleted file mode 100644 index 118a3012f..000000000 Binary files a/data/train/image/5.tif and /dev/null differ diff --git a/data/train/image/6.tif b/data/train/image/6.tif deleted file mode 100644 index 1f8a9ee48..000000000 Binary files a/data/train/image/6.tif and /dev/null differ diff --git a/data/train/image/7.tif b/data/train/image/7.tif deleted file mode 100644 index 66f95705d..000000000 Binary files a/data/train/image/7.tif and /dev/null differ diff --git a/data/train/image/8.tif b/data/train/image/8.tif deleted file mode 100644 index e6d60b5a7..000000000 Binary files a/data/train/image/8.tif and /dev/null differ diff --git a/data/train/image/9.tif b/data/train/image/9.tif deleted file mode 100644 index 0386acd7f..000000000 Binary files a/data/train/image/9.tif and /dev/null differ diff --git a/data/train/label/0.tif b/data/train/label/0.tif deleted file mode 100644 index e6830a515..000000000 Binary files a/data/train/label/0.tif and /dev/null differ diff --git a/data/train/label/1.tif b/data/train/label/1.tif deleted file mode 100644 index 4b9769028..000000000 Binary files a/data/train/label/1.tif and /dev/null differ diff --git a/data/train/label/10.tif b/data/train/label/10.tif deleted file mode 100644 index b37b04294..000000000 Binary files a/data/train/label/10.tif and /dev/null differ diff --git a/data/train/label/11.tif b/data/train/label/11.tif deleted file mode 100644 index e984fa829..000000000 Binary files a/data/train/label/11.tif and /dev/null differ diff --git a/data/train/label/12.tif b/data/train/label/12.tif deleted file mode 100644 index 0db7bd081..000000000 Binary files a/data/train/label/12.tif and /dev/null differ diff --git a/data/train/label/13.tif b/data/train/label/13.tif deleted file mode 100644 index b42d8932f..000000000 Binary files a/data/train/label/13.tif and /dev/null differ diff --git a/data/train/label/14.tif b/data/train/label/14.tif deleted file mode 100644 index b2ad4f55e..000000000 Binary files a/data/train/label/14.tif and /dev/null differ diff --git a/data/train/label/15.tif b/data/train/label/15.tif deleted file mode 100644 index d178f51fe..000000000 Binary files a/data/train/label/15.tif and /dev/null differ diff --git a/data/train/label/16.tif b/data/train/label/16.tif deleted file mode 100644 index 6da42700b..000000000 Binary files a/data/train/label/16.tif and /dev/null differ diff --git a/data/train/label/17.tif b/data/train/label/17.tif deleted file mode 100644 index 4401fd119..000000000 Binary files a/data/train/label/17.tif and /dev/null differ diff --git a/data/train/label/18.tif b/data/train/label/18.tif deleted file mode 100644 index f0c36aaac..000000000 Binary files a/data/train/label/18.tif and /dev/null differ diff --git a/data/train/label/19.tif b/data/train/label/19.tif deleted file mode 100644 index 58ab4664a..000000000 Binary files a/data/train/label/19.tif and /dev/null differ diff --git a/data/train/label/2.tif b/data/train/label/2.tif deleted file mode 100644 index 1e1c3f800..000000000 Binary files a/data/train/label/2.tif and /dev/null differ diff --git a/data/train/label/20.tif b/data/train/label/20.tif deleted file mode 100644 index d4a383edf..000000000 Binary files a/data/train/label/20.tif and /dev/null differ diff --git a/data/train/label/21.tif b/data/train/label/21.tif deleted file mode 100644 index 3f46c5fd1..000000000 Binary files a/data/train/label/21.tif and /dev/null differ diff --git a/data/train/label/22.tif b/data/train/label/22.tif deleted file mode 100644 index c6aaaa34b..000000000 Binary files a/data/train/label/22.tif and /dev/null differ diff --git a/data/train/label/23.tif b/data/train/label/23.tif deleted file mode 100644 index a75363a6e..000000000 Binary files a/data/train/label/23.tif and /dev/null differ diff --git a/data/train/label/24.tif b/data/train/label/24.tif deleted file mode 100644 index 9d470a31c..000000000 Binary files a/data/train/label/24.tif and /dev/null differ diff --git a/data/train/label/25.tif b/data/train/label/25.tif deleted file mode 100644 index 4370d2593..000000000 Binary files a/data/train/label/25.tif and /dev/null differ diff --git a/data/train/label/26.tif b/data/train/label/26.tif deleted file mode 100644 index fadef904c..000000000 Binary files a/data/train/label/26.tif and /dev/null differ diff --git a/data/train/label/27.tif b/data/train/label/27.tif deleted file mode 100644 index a35c25595..000000000 Binary files a/data/train/label/27.tif and /dev/null differ diff --git a/data/train/label/28.tif b/data/train/label/28.tif deleted file mode 100644 index 35852daf3..000000000 Binary files a/data/train/label/28.tif and /dev/null differ diff --git a/data/train/label/29.tif b/data/train/label/29.tif deleted file mode 100644 index cf0a9c088..000000000 Binary files a/data/train/label/29.tif and /dev/null differ diff --git a/data/train/label/3.tif b/data/train/label/3.tif deleted file mode 100644 index 7e2ced840..000000000 Binary files a/data/train/label/3.tif and /dev/null differ diff --git a/data/train/label/4.tif b/data/train/label/4.tif deleted file mode 100644 index b2ea15ca9..000000000 Binary files a/data/train/label/4.tif and /dev/null differ diff --git a/data/train/label/5.tif b/data/train/label/5.tif deleted file mode 100644 index f9864d315..000000000 Binary files a/data/train/label/5.tif and /dev/null differ diff --git a/data/train/label/6.tif b/data/train/label/6.tif deleted file mode 100644 index 65540925a..000000000 Binary files a/data/train/label/6.tif and /dev/null differ diff --git a/data/train/label/7.tif b/data/train/label/7.tif deleted file mode 100644 index 611efc358..000000000 Binary files a/data/train/label/7.tif and /dev/null differ diff --git a/data/train/label/8.tif b/data/train/label/8.tif deleted file mode 100644 index dd6e62740..000000000 Binary files a/data/train/label/8.tif and /dev/null differ diff --git a/data/train/label/9.tif b/data/train/label/9.tif deleted file mode 100644 index 38fbcf7d4..000000000 Binary files a/data/train/label/9.tif and /dev/null differ diff --git a/dataPrepare.ipynb b/dataPrepare.ipynb new file mode 100644 index 000000000..9639938b8 --- /dev/null +++ b/dataPrepare.ipynb @@ -0,0 +1,127 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\SoftWare\\Anaconda2\\envs\\python3\\lib\\site-packages\\h5py\\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", + " from ._conv import register_converters as _register_converters\n", + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "from data import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# data augmentation \n", + "\n", + "In deep learning tasks, a lot of data is need to train DNN model, when the dataset is not big enough, data augmentation should be applied.\n", + "\n", + "keras.preprocessing.image.ImageDataGenerator is a data generator, which can feed the DNN with data like : (data,label), it can also do data augmentation at the same time.\n", + "\n", + "It is very convenient for us to use keras.preprocessing.image.ImageDataGenerator to do data augmentation by implement image rotation, shift, rescale and so on... see [keras documentation](https://keras.io/preprocessing/image/) for detail.\n", + "\n", + "For image segmentation tasks, the image and mask must be transformed **together!!**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## define your data generator\n", + "\n", + "If you want to visualize your data augmentation result, set save_to_dir = your path" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "#if you don't want to do data augmentation, set data_gen_args as an empty dict.\n", + "#data_gen_args = dict()\n", + "\n", + "data_gen_args = dict(rotation_range=0.2,\n", + " width_shift_range=0.05,\n", + " height_shift_range=0.05,\n", + " shear_range=0.05,\n", + " zoom_range=0.05,\n", + " horizontal_flip=True,\n", + " fill_mode='nearest')\n", + "myGenerator = trainGenerator(20,'data/membrane/train','image','label',data_gen_args,save_to_dir = \"data/train/aug\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## visualize your data augmentation result" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "#you will see 60 transformed images and their masks in data/train/aug\n", + "num_batch = 3\n", + "for i,batch in enumerate(myGenerator):\n", + " if(i >= num_batch):\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## create .npy data\n", + "\n", + "If your computer has enough memory, you can create npy files containing all your images and masks, and feed your DNN with them." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "image_arr,mask_arr = geneTrainNpy(\"data/membrane/train/aug/\",\"data/membrane/train/aug/\")\n", + "#np.save(\"data/image_arr.npy\",image_arr)\n", + "#np.save(\"data/mask_arr.npy\",mask_arr)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/main.py b/main.py new file mode 100644 index 000000000..f6041b875 --- /dev/null +++ b/main.py @@ -0,0 +1,22 @@ +from model import * +from data import * + +#os.environ["CUDA_VISIBLE_DEVICES"] = "0" + + +data_gen_args = dict(rotation_range=0.2, + width_shift_range=0.05, + height_shift_range=0.05, + shear_range=0.05, + zoom_range=0.05, + horizontal_flip=True, + fill_mode='nearest') +myGene = trainGenerator(2,'data/membrane/train','image','label',data_gen_args,save_to_dir = None) + +model = unet() +model_checkpoint = ModelCheckpoint('unet_membrane.hdf5', monitor='loss',verbose=1, save_best_only=True) +model.fit_generator(myGene,steps_per_epoch=300,epochs=1,callbacks=[model_checkpoint]) + +testGene = testGenerator("data/membrane/test") +results = model.predict_generator(testGene,30,verbose=1) +saveResult("data/membrane/test",results) \ No newline at end of file diff --git a/model.py b/model.py new file mode 100644 index 000000000..0ebd5ab19 --- /dev/null +++ b/model.py @@ -0,0 +1,66 @@ +import numpy as np +import os +import skimage.io as io +import skimage.transform as trans +import numpy as np +from keras.models import * +from keras.layers import * +from keras.optimizers import * +from keras.callbacks import ModelCheckpoint, LearningRateScheduler +from keras import backend as keras + + +def unet(pretrained_weights = None,input_size = (256,256,1)): + inputs = Input(input_size) + conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(inputs) + conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv1) + pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) + conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1) + conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv2) + pool2 = MaxPooling2D(pool_size=(2, 2))(conv2) + conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool2) + conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv3) + pool3 = MaxPooling2D(pool_size=(2, 2))(conv3) + conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool3) + conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv4) + drop4 = Dropout(0.5)(conv4) + pool4 = MaxPooling2D(pool_size=(2, 2))(drop4) + + conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool4) + conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv5) + drop5 = Dropout(0.5)(conv5) + + up6 = Conv2D(512, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(drop5)) + merge6 = merge([drop4,up6], mode = 'concat', concat_axis = 3) + conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge6) + conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv6) + + up7 = Conv2D(256, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv6)) + merge7 = merge([conv3,up7], mode = 'concat', concat_axis = 3) + conv7 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge7) + conv7 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv7) + + up8 = Conv2D(128, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv7)) + merge8 = merge([conv2,up8], mode = 'concat', concat_axis = 3) + conv8 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge8) + conv8 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv8) + + up9 = Conv2D(64, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv8)) + merge9 = merge([conv1,up9], mode = 'concat', concat_axis = 3) + conv9 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge9) + conv9 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9) + conv9 = Conv2D(2, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9) + conv10 = Conv2D(1, 1, activation = 'sigmoid')(conv9) + + model = Model(input = inputs, output = conv10) + + model.compile(optimizer = Adam(lr = 1e-4), loss = 'binary_crossentropy', metrics = ['accuracy']) + + #model.summary() + + if(pretrained_weights): + model.load_weights(pretrained_weights) + + return model + + diff --git a/split_merge_tif.py b/split_merge_tif.py deleted file mode 100644 index 106931899..000000000 --- a/split_merge_tif.py +++ /dev/null @@ -1,40 +0,0 @@ -''' -split 30 single images from an array of images : train-volume.tif label-volume.tif test-volume.tif -''' -from libtiff import TIFF3D,TIFF -dirtype = ("train","label","test") - -def split_img(): - - ''' - split a tif volume into single tif - ''' - - for t in dirtype: - imgdir = TIFF3D.open(t + "-volume.tif") - imgarr = imgdir.read_image() - for i in range(imgarr.shape[0]): - imgname = t + "/" + str(i) + ".tif" - img = TIFF.open(imgname,'w') - img.write_image(imgarr[i]) - -def merge_img(): - - ''' - merge single tif into a tif volume - ''' - - path = '/home/zhixuhao/Downloads/imgs_mask_test_server2/' - imgdir = TIFF3D.open("test_mask_volume_server2.tif",'w') - imgarr = [] - for i in range(30): - img = TIFF.open(path + str(i) + ".tif") - imgarr.append(img.read_image()) - imgdir.write_image(imgarr) - -if __name__ == "__main__": - - merge_img() - - - diff --git a/test_predict.py b/test_predict.py deleted file mode 100644 index 503e236bd..000000000 --- a/test_predict.py +++ /dev/null @@ -1,16 +0,0 @@ -from unet import * -from data import * - -mydata = dataProcess(512,512) - -imgs_test = mydata.load_test_data() - -myunet = myUnet() - -model = myunet.get_unet() - -model.load_weights('unet.hdf5') - -imgs_mask_test = model.predict(imgs_test, verbose=1) - -np.save('imgs_mask_test.npy', imgs_mask_test) \ No newline at end of file diff --git a/trainUnet.ipynb b/trainUnet.ipynb new file mode 100644 index 000000000..07f07d675 --- /dev/null +++ b/trainUnet.ipynb @@ -0,0 +1,227 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\SoftWare\\Anaconda2\\envs\\python3\\lib\\site-packages\\h5py\\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", + " from ._conv import register_converters as _register_converters\n", + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "from model import *\n", + "from data import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train your Unet with membrane data\n", + "membrane data is in folder membrane/, it is a binary classification task.\n", + "\n", + "The input shape of image and mask are the same :(batch_size,rows,cols,channel = 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Train with data generator" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\xuhaozhi\\Documents\\Study\\unet\\model.py:34: UserWarning: The `merge` function is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc.\n", + " merge6 = merge([drop4,up6], mode = 'concat', concat_axis = 3)\n", + "C:\\SoftWare\\Anaconda2\\envs\\python3\\lib\\site-packages\\keras\\legacy\\layers.py:465: UserWarning: The `Merge` layer is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc.\n", + " name=name)\n", + "C:\\Users\\xuhaozhi\\Documents\\Study\\unet\\model.py:39: UserWarning: The `merge` function is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc.\n", + " merge7 = merge([conv3,up7], mode = 'concat', concat_axis = 3)\n", + "C:\\Users\\xuhaozhi\\Documents\\Study\\unet\\model.py:44: UserWarning: The `merge` function is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc.\n", + " merge8 = merge([conv2,up8], mode = 'concat', concat_axis = 3)\n", + "C:\\Users\\xuhaozhi\\Documents\\Study\\unet\\model.py:49: UserWarning: The `merge` function is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc.\n", + " merge9 = merge([conv1,up9], mode = 'concat', concat_axis = 3)\n", + "C:\\Users\\xuhaozhi\\Documents\\Study\\unet\\model.py:55: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=Tensor(\"co...)`\n", + " model = Model(input = inputs, output = conv10)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/5\n", + "Found 30 images belonging to 1 classes.\n", + "Found 30 images belonging to 1 classes.\n", + "2000/2000 [==============================] - 538s 269ms/step - loss: 0.1951 - acc: 0.9140\n", + "\n", + "Epoch 00001: loss improved from inf to 0.19511, saving model to unet_membrane.hdf5\n", + "Epoch 2/5\n", + "2000/2000 [==============================] - 535s 268ms/step - loss: 0.1210 - acc: 0.9469\n", + "\n", + "Epoch 00002: loss improved from 0.19511 to 0.12099, saving model to unet_membrane.hdf5\n", + "Epoch 3/5\n", + "2000/2000 [==============================] - 534s 267ms/step - loss: 0.0926 - acc: 0.9596\n", + "\n", + "Epoch 00003: loss improved from 0.12099 to 0.09256, saving model to unet_membrane.hdf5\n", + "Epoch 4/5\n", + "2000/2000 [==============================] - 534s 267ms/step - loss: 0.0788 - acc: 0.9656\n", + "\n", + "Epoch 00004: loss improved from 0.09256 to 0.07882, saving model to unet_membrane.hdf5\n", + "Epoch 5/5\n", + "2000/2000 [==============================] - 534s 267ms/step - loss: 0.0707 - acc: 0.9691\n", + "\n", + "Epoch 00005: loss improved from 0.07882 to 0.07074, saving model to unet_membrane.hdf5\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_gen_args = dict(rotation_range=0.2,\n", + " width_shift_range=0.05,\n", + " height_shift_range=0.05,\n", + " shear_range=0.05,\n", + " zoom_range=0.05,\n", + " horizontal_flip=True,\n", + " fill_mode='nearest')\n", + "myGene = trainGenerator(2,'data/membrane/train','image','label',data_gen_args,save_to_dir = None)\n", + "model = unet()\n", + "model_checkpoint = ModelCheckpoint('unet_membrane.hdf5', monitor='loss',verbose=1, save_best_only=True)\n", + "model.fit_generator(myGene,steps_per_epoch=2000,epochs=5,callbacks=[model_checkpoint])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Train with npy file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#imgs_train,imgs_mask_train = geneTrainNpy(\"data/membrane/train/aug/\",\"data/membrane/train/aug/\")\n", + "#model.fit(imgs_train, imgs_mask_train, batch_size=2, nb_epoch=10, verbose=1,validation_split=0.2, shuffle=True, callbacks=[model_checkpoint])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### test your model and save predicted results" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\xuhaozhi\\Documents\\Study\\unet\\model.py:34: UserWarning: The `merge` function is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc.\n", + " merge6 = merge([drop4,up6], mode = 'concat', concat_axis = 3)\n", + "C:\\SoftWare\\Anaconda2\\envs\\python3\\lib\\site-packages\\keras\\legacy\\layers.py:465: UserWarning: The `Merge` layer is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc.\n", + " name=name)\n", + "C:\\Users\\xuhaozhi\\Documents\\Study\\unet\\model.py:39: UserWarning: The `merge` function is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc.\n", + " merge7 = merge([conv3,up7], mode = 'concat', concat_axis = 3)\n", + "C:\\Users\\xuhaozhi\\Documents\\Study\\unet\\model.py:44: UserWarning: The `merge` function is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc.\n", + " merge8 = merge([conv2,up8], mode = 'concat', concat_axis = 3)\n", + "C:\\Users\\xuhaozhi\\Documents\\Study\\unet\\model.py:49: UserWarning: The `merge` function is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc.\n", + " merge9 = merge([conv1,up9], mode = 'concat', concat_axis = 3)\n", + "C:\\Users\\xuhaozhi\\Documents\\Study\\unet\\model.py:55: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=Tensor(\"co...)`\n", + " model = Model(input = inputs, output = conv10)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\r", + " 1/30 [>.............................] - ETA: 4s" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\SoftWare\\Anaconda2\\envs\\python3\\lib\\site-packages\\skimage\\transform\\_warps.py:105: UserWarning: The default mode, 'constant', will be changed to 'reflect' in skimage 0.15.\n", + " warn(\"The default mode, 'constant', will be changed to 'reflect' in \"\n", + "C:\\SoftWare\\Anaconda2\\envs\\python3\\lib\\site-packages\\skimage\\transform\\_warps.py:110: UserWarning: Anti-aliasing will be enabled by default in skimage 0.15 to avoid aliasing artifacts when down-sampling images.\n", + " warn(\"Anti-aliasing will be enabled by default in skimage 0.15 to \"\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "30/30 [==============================] - 1s 47ms/step\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\SoftWare\\Anaconda2\\envs\\python3\\lib\\site-packages\\skimage\\util\\dtype.py:130: UserWarning: Possible precision loss when converting from float32 to uint16\n", + " .format(dtypeobj_in, dtypeobj_out))\n" + ] + } + ], + "source": [ + "testGene = testGenerator(\"data/membrane/test\")\n", + "model = unet()\n", + "model.load_weights(\"unet_membrane.hdf5\")\n", + "results = model.predict_generator(testGene,30,verbose=1)\n", + "saveResult(\"data/membrane/test\",results)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/unet.py b/unet.py deleted file mode 100644 index 9a2233e49..000000000 --- a/unet.py +++ /dev/null @@ -1,189 +0,0 @@ -import os -#os.environ["CUDA_VISIBLE_DEVICES"] = "0" -import numpy as np -from keras.models import * -from keras.layers import Input, merge, Conv2D, MaxPooling2D, UpSampling2D, Dropout, Cropping2D -from keras.optimizers import * -from keras.callbacks import ModelCheckpoint, LearningRateScheduler -from keras import backend as keras -from data import * - -class myUnet(object): - - def __init__(self, img_rows = 512, img_cols = 512): - - self.img_rows = img_rows - self.img_cols = img_cols - - def load_data(self): - - mydata = dataProcess(self.img_rows, self.img_cols) - imgs_train, imgs_mask_train = mydata.load_train_data() - imgs_test = mydata.load_test_data() - return imgs_train, imgs_mask_train, imgs_test - - def get_unet(self): - - inputs = Input((self.img_rows, self.img_cols,1)) - - ''' - unet with crop(because padding = valid) - - conv1 = Conv2D(64, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(inputs) - print "conv1 shape:",conv1.shape - conv1 = Conv2D(64, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(conv1) - print "conv1 shape:",conv1.shape - crop1 = Cropping2D(cropping=((90,90),(90,90)))(conv1) - print "crop1 shape:",crop1.shape - pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) - print "pool1 shape:",pool1.shape - - conv2 = Conv2D(128, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(pool1) - print "conv2 shape:",conv2.shape - conv2 = Conv2D(128, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(conv2) - print "conv2 shape:",conv2.shape - crop2 = Cropping2D(cropping=((41,41),(41,41)))(conv2) - print "crop2 shape:",crop2.shape - pool2 = MaxPooling2D(pool_size=(2, 2))(conv2) - print "pool2 shape:",pool2.shape - - conv3 = Conv2D(256, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(pool2) - print "conv3 shape:",conv3.shape - conv3 = Conv2D(256, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(conv3) - print "conv3 shape:",conv3.shape - crop3 = Cropping2D(cropping=((16,17),(16,17)))(conv3) - print "crop3 shape:",crop3.shape - pool3 = MaxPooling2D(pool_size=(2, 2))(conv3) - print "pool3 shape:",pool3.shape - - conv4 = Conv2D(512, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(pool3) - conv4 = Conv2D(512, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(conv4) - drop4 = Dropout(0.5)(conv4) - crop4 = Cropping2D(cropping=((4,4),(4,4)))(drop4) - pool4 = MaxPooling2D(pool_size=(2, 2))(drop4) - - conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(pool4) - conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(conv5) - drop5 = Dropout(0.5)(conv5) - - up6 = Conv2D(512, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(drop5)) - merge6 = merge([crop4,up6], mode = 'concat', concat_axis = 3) - conv6 = Conv2D(512, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(merge6) - conv6 = Conv2D(512, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(conv6) - - up7 = Conv2D(256, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv6)) - merge7 = merge([crop3,up7], mode = 'concat', concat_axis = 3) - conv7 = Conv2D(256, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(merge7) - conv7 = Conv2D(256, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(conv7) - - up8 = Conv2D(128, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv7)) - merge8 = merge([crop2,up8], mode = 'concat', concat_axis = 3) - conv8 = Conv2D(128, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(merge8) - conv8 = Conv2D(128, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(conv8) - - up9 = Conv2D(64, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv8)) - merge9 = merge([crop1,up9], mode = 'concat', concat_axis = 3) - conv9 = Conv2D(64, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(merge9) - conv9 = Conv2D(64, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(conv9) - conv9 = Conv2D(2, 3, activation = 'relu', padding = 'valid', kernel_initializer = 'he_normal')(conv9) - ''' - - conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(inputs) - print "conv1 shape:",conv1.shape - conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv1) - print "conv1 shape:",conv1.shape - pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) - print "pool1 shape:",pool1.shape - - conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1) - print "conv2 shape:",conv2.shape - conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv2) - print "conv2 shape:",conv2.shape - pool2 = MaxPooling2D(pool_size=(2, 2))(conv2) - print "pool2 shape:",pool2.shape - - conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool2) - print "conv3 shape:",conv3.shape - conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv3) - print "conv3 shape:",conv3.shape - pool3 = MaxPooling2D(pool_size=(2, 2))(conv3) - print "pool3 shape:",pool3.shape - - conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool3) - conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv4) - drop4 = Dropout(0.5)(conv4) - pool4 = MaxPooling2D(pool_size=(2, 2))(drop4) - - conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool4) - conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv5) - drop5 = Dropout(0.5)(conv5) - - up6 = Conv2D(512, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(drop5)) - merge6 = merge([drop4,up6], mode = 'concat', concat_axis = 3) - conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge6) - conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv6) - - up7 = Conv2D(256, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv6)) - merge7 = merge([conv3,up7], mode = 'concat', concat_axis = 3) - conv7 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge7) - conv7 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv7) - - up8 = Conv2D(128, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv7)) - merge8 = merge([conv2,up8], mode = 'concat', concat_axis = 3) - conv8 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge8) - conv8 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv8) - - up9 = Conv2D(64, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv8)) - merge9 = merge([conv1,up9], mode = 'concat', concat_axis = 3) - conv9 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge9) - conv9 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9) - conv9 = Conv2D(2, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9) - conv10 = Conv2D(1, 1, activation = 'sigmoid')(conv9) - - model = Model(input = inputs, output = conv10) - - model.compile(optimizer = Adam(lr = 1e-4), loss = 'binary_crossentropy', metrics = ['accuracy']) - - return model - - - def train(self): - - print("loading data") - imgs_train, imgs_mask_train, imgs_test = self.load_data() - print("loading data done") - model = self.get_unet() - print("got unet") - - model_checkpoint = ModelCheckpoint('unet.hdf5', monitor='loss',verbose=1, save_best_only=True) - print('Fitting model...') - model.fit(imgs_train, imgs_mask_train, batch_size=4, nb_epoch=10, verbose=1,validation_split=0.2, shuffle=True, callbacks=[model_checkpoint]) - - print('predict test data') - imgs_mask_test = model.predict(imgs_test, batch_size=1, verbose=1) - np.save('../results/imgs_mask_test.npy', imgs_mask_test) - - def save_img(self): - - print("array to image") - imgs = np.load('imgs_mask_test.npy') - for i in range(imgs.shape[0]): - img = imgs[i] - img = array_to_img(img) - img.save("../results/%d.jpg"%(i)) - - - - -if __name__ == '__main__': - myunet = myUnet() - myunet.train() - myunet.save_img() - - - - - - - -