-
-
Save rdelassus/5b908efd07ae030a2650584e199ff25b to your computer and use it in GitHub Desktop.
| #from __future__ import absolute_import | |
| from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img | |
| from keras.callbacks import ModelCheckpoint | |
| from keras.models import Sequential | |
| from keras.layers import Convolution2D, MaxPooling2D | |
| from keras.layers import Layer, Dense, Dropout, Activation, Flatten, Reshape, Merge, Permute | |
| from keras.layers import ZeroPadding2D, UpSampling2D | |
| from keras.layers.normalization import BatchNormalization | |
| import sys | |
| import os | |
| import numpy as np | |
| import matplotlib | |
| import matplotlib.pyplot as plt | |
| #from preprocessing.visualize_prepro import shiftedColorMap | |
| import itertools | |
| import tensorflow as tf | |
| path = sys.argv[1] | |
| # input image dimensions | |
| img_rows, img_cols = 400, 400 | |
| # output image dimensions | |
| label_rows, label_cols = 400, 400 | |
| with tf.device('/gpu:1'): | |
| # we create two instances with the same arguments | |
| img_data_gen_args = dict( | |
| # featurewise_center=True, | |
| # featurewise_std_normalization=True, | |
| rescale=1. / 255, | |
| rotation_range=90., | |
| width_shift_range=0.1, | |
| height_shift_range=0.1, | |
| zoom_range=0.2, | |
| fill_mode="constant", | |
| cval=0 | |
| ) | |
| label_data_gen_args = dict( | |
| rotation_range=90., | |
| width_shift_range=0.1, | |
| height_shift_range=0.1, | |
| zoom_range=0.2, | |
| fill_mode="constant", | |
| cval=1 | |
| ) | |
| image_datagen = ImageDataGenerator(**img_data_gen_args) | |
| mask_datagen = ImageDataGenerator(**label_data_gen_args) | |
| # Provide the same seed and keyword arguments to the fit and flow methods | |
| seed = 1 | |
| # image_datagen.fit(images, augment=True, seed=seed) | |
| # mask_datagen.fit(masks, augment=True, seed=seed) | |
| image_generator = image_datagen.flow_from_directory( | |
| os.path.join(path, '3band/'), | |
| target_size=(img_rows, img_cols), | |
| class_mode=None, | |
| batch_size=8, | |
| shuffle=False, | |
| seed=seed) | |
| mask_generator = mask_datagen.flow_from_directory( | |
| os.path.join(path, 'labels'), | |
| target_size=(label_rows, label_cols), | |
| class_mode=None, | |
| batch_size=8, | |
| shuffle=False, | |
| color_mode='grayscale', | |
| seed=seed) | |
| # combine generators into one which yields image and masks | |
| train_generator = itertools.izip(image_generator, mask_generator) | |
| kernel = 3 | |
| filter_size = 64 | |
| pad = 1 | |
| pool_size = 2 | |
| model = Sequential() | |
| model.add(Layer(input_shape=(img_rows, img_cols, 3))) | |
| # encoding layers | |
| model.add(ZeroPadding2D(padding=(pad, pad))) | |
| model.add(Convolution2D(filter_size, kernel, kernel, border_mode='valid')) | |
| model.add(BatchNormalization()) | |
| model.add(MaxPooling2D(pool_size=(pool_size, pool_size))) | |
| model.add(ZeroPadding2D(padding=(pad, pad))) | |
| model.add(Convolution2D(128, kernel, kernel, border_mode='valid')) | |
| model.add(BatchNormalization()) | |
| model.add(Activation('relu')) | |
| model.add(MaxPooling2D(pool_size=(pool_size, pool_size))) | |
| model.add(ZeroPadding2D(padding=(pad, pad))) | |
| model.add(Convolution2D(256, kernel, kernel, border_mode='valid')) | |
| model.add(BatchNormalization()) | |
| model.add(Activation('relu')) | |
| model.add(MaxPooling2D(pool_size=(pool_size, pool_size))) | |
| model.add(ZeroPadding2D(padding=(pad, pad))) | |
| model.add(Convolution2D(512, kernel, kernel, border_mode='valid')) | |
| model.add(BatchNormalization()) | |
| model.add(Activation('relu')) | |
| # decoding layers | |
| model.add(ZeroPadding2D(padding=(pad, pad))) | |
| model.add(Convolution2D(512, kernel, kernel, border_mode='valid')) | |
| model.add(BatchNormalization()) | |
| model.add(UpSampling2D(size=(pool_size, pool_size))) | |
| model.add(ZeroPadding2D(padding=(pad, pad))) | |
| model.add(Convolution2D(256, kernel, kernel, border_mode='valid')) | |
| model.add(BatchNormalization()) | |
| model.add(UpSampling2D(size=(pool_size, pool_size))) | |
| model.add(ZeroPadding2D(padding=(pad, pad))) | |
| model.add(Convolution2D(128, kernel, kernel, border_mode='valid')) | |
| model.add(BatchNormalization()) | |
| model.add(UpSampling2D(size=(pool_size, pool_size))) | |
| model.add(ZeroPadding2D(padding=(pad, pad))) | |
| model.add(Convolution2D(filter_size, kernel, kernel, border_mode='valid')) | |
| model.add(BatchNormalization()) | |
| model.add(Convolution2D(1, 1, 1, border_mode='valid',)) | |
| print model.output_shape | |
| model.add(Reshape((label_rows * label_cols,))) | |
| model.add(Activation('sigmoid')) | |
| model.add(Reshape((label_rows, label_cols, 1))) | |
| model.compile(loss="binary_crossentropy", optimizer='rmsprop', | |
| metrics=['binary_accuracy']) | |
| model.summary() | |
| checkpointer = ModelCheckpoint(filepath="weights.hdf5", verbose=1, save_best_only=False) | |
| model.fit_generator( | |
| train_generator, | |
| samples_per_epoch=1000, | |
| nb_epoch=20, | |
| callbacks=[checkpointer]) | |
| model.save('spacenetmodel2.h5') |
Hello,
I would like to use your model for road detection. However, I get the following error from the Reshape function in line 128:
ValueError: total size of new array must be unchanged
The output of the print(model.output_shape) statement is (None, 0, 0, 1).
Do you know what the problem might be?
Thank you in advance!
Hi
I'm currently doing something similar and because I'm new to the subject of machine learning, I've got a question regarding the masks:
If we want to identify buildings, we've got typically a single image with a lot of instances (the buildings). If the network then requests the mask(s) for a specific image, do I have to return a single image which consists of all the masks/buildings on this single image or do I have to return an image where only one building is masked at a time?
Thanks for your help!
- I think you should return a single image which consists all the masks/ buildings
Hi
I'm currently doing something similar and because I'm new to the subject of machine learning, I've got a question regarding the masks:
If we want to identify buildings, we've got typically a single image with a lot of instances (the buildings). If the network then requests the mask(s) for a specific image, do I have to return a single image which consists of all the masks/buildings on this single image or do I have to return an image where only one building is masked at a time?
Thanks for your help!