From 61cc8492b6e55a11a5252c82dfb21e2d5965d46e Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Tue, 8 Aug 2017 15:12:52 -0400 Subject: [PATCH 1/2] Feed forward is working --- .gitignore | 4 + layers_builder.py | 349 ++++++++++++++++++++------------------------ pspnet.py | 172 ++++++++++------------ utils.py | 32 ++++ weight_converter.py | 34 ++++- 5 files changed, 303 insertions(+), 288 deletions(-) create mode 100644 .gitignore create mode 100644 utils.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..60bf75b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.npy +*.pyc +*.png + diff --git a/layers_builder.py b/layers_builder.py index 5c04427..724f79c 100644 --- a/layers_builder.py +++ b/layers_builder.py @@ -1,225 +1,198 @@ from keras.layers import Conv2D, MaxPooling2D, AveragePooling2D -from keras.layers import BatchNormalization, Activation, Input, Dropout, ZeroPadding2D -from keras.layers import merge, concatenate, Lambda, Reshape +from keras.layers import BatchNormalization, Activation, Input, Dropout, ZeroPadding2D, Lambda +from keras.layers.merge import Concatenate, Add from keras.models import Model +from keras.optimizers import SGD import tensorflow as tf +learning_rate = 1e-3 # Layer specific learning rate +# Weight decay not implemented +def BN(name=""): + return BatchNormalization(momentum=0.95, name=name, epsilon=1e-5) -def Interp(x, size=(60,60)): - print(x.shape) - new_height = size[0] - new_width = size[1] - resized = tf.image.resize_images(x, [new_height, new_width]) - print(resized.shape) - return resized +def Interp(x, shape=(60,60)): + new_height,new_width = shape + resized = tf.image.resize_images(x, [new_height, new_width], align_corners=True) + return resized +def residual_conv(prev, level, pad=1, lvl=1, sub_lvl=1, modify_stride=False): + lvl = str(lvl) + sub_lvl = str(sub_lvl) + names = ["conv"+lvl+"_"+ sub_lvl +"_1x1_reduce" , + "conv"+lvl+"_"+ sub_lvl +"_1x1_reduce_bn", + "conv"+lvl+"_"+ sub_lvl +"_3x3", + "conv"+lvl+"_"+ sub_lvl +"_3x3_bn", + "conv"+lvl+"_"+ sub_lvl +"_1x1_increase", + "conv"+lvl+"_"+ sub_lvl +"_1x1_increase_bn"] + if modify_stride == False: + prev = Conv2D(64 * level, (1,1), strides=(1,1), name=names[0], use_bias=False)(prev) + elif modify_stride == True: + prev = Conv2D(64 * level, (1,1), strides=(2,2), name=names[0], use_bias=False)(prev) -def Interp_zoom(x, zoom=8): - print(x.shape) - old_height = int(x.shape[1]) - old_width = int(x.shape[2]) - new_height = old_height + (old_height-1) * (zoom - 1) - new_width = old_width + (old_width-1) * (zoom - 1) - resized = tf.image.resize_images(x, [new_height, new_width]) - return resized + prev = BN(name=names[1])(prev) + prev = Activation('relu')(prev) + prev = ZeroPadding2D(padding=(pad,pad))(prev) + prev = Conv2D(64 * level, (3,3), strides=(1,1), dilation_rate=pad, name=names[2], use_bias=False)(prev) -def residual_conv(prev, level, - pad=1, lvl=1, sub_lvl=1, modify_stride=False): - - lvl = str(lvl) - sub_lvl = str(sub_lvl) - names = ["conv"+lvl+"_"+ sub_lvl +"_1x1_reduce" , - "conv"+lvl+"_"+ sub_lvl +"_1x1_reduce_bn", - "conv"+lvl+"_"+ sub_lvl +"_3x3", - "conv"+lvl+"_"+ sub_lvl +"_3x3_bn", - "conv"+lvl+"_"+ sub_lvl +"_1x1_increase", - "conv"+lvl+"_"+ sub_lvl +"_1x1_increase_bn"] - if modify_stride == False: - prev = Conv2D(64 * level, (1,1), strides=(1,1), use_bias=False, - name=names[0])(prev) - elif modify_stride == True: - prev = Conv2D(64 * level, (1,1), strides=(2,2), use_bias=False, - name=names[0])(prev) + prev = BN(name=names[3])(prev) + prev = Activation('relu')(prev) + prev = Conv2D(256 * level, (1,1), strides=(1,1), name=names[4], use_bias=False)(prev) + prev = BN(name=names[5])(prev) + return prev - prev = BatchNormalization(momentum=0.95, name=names[1], epsilon=1e-5)(prev) - prev = Activation('relu')(prev) +def short_convolution_branch(prev, level, lvl=1, sub_lvl=1, modify_stride=False): + lvl = str(lvl) + sub_lvl = str(sub_lvl) + names = ["conv"+lvl+"_"+ sub_lvl +"_1x1_proj", + "conv"+lvl+"_"+ sub_lvl +"_1x1_proj_bn"] - prev = ZeroPadding2D(padding=(pad,pad))(prev) - prev = Conv2D(64 * level, (3,3), - strides=(1,1), dilation_rate=pad, use_bias=False, - name=names[2])(prev) - - - prev = BatchNormalization(momentum=0.95, name=names[3], epsilon=1e-5)(prev) - prev = Activation('relu')(prev) - prev = Conv2D(256 * level, (1,1), strides=(1,1), use_bias=False, - name=names[4])(prev) - prev = BatchNormalization(momentum=0.95, name=names[5], epsilon=1e-5)(prev) - return prev - - -def short_convolution_branch(prev, level, - lvl=1, sub_lvl=1, modify_stride=False): - lvl = str(lvl) - sub_lvl = str(sub_lvl) - names = ["conv"+lvl+"_"+ sub_lvl +"_1x1_proj", - "conv"+lvl+"_"+ sub_lvl +"_1x1_proj_bn" - ] - - if modify_stride == False: - prev = Conv2D(256 * level ,(1,1), strides=(1,1), use_bias=False, - name=names[0])(prev) - elif modify_stride == True: - prev = Conv2D(256 * level, (1,1), strides=(2,2), use_bias=False, - name=names[0])(prev) - - prev = BatchNormalization(momentum=0.95, name=names[1], epsilon=1e-5)(prev) - return prev + if modify_stride == False: + prev = Conv2D(256 * level ,(1,1), strides=(1,1), name=names[0], use_bias=False)(prev) + elif modify_stride == True: + prev = Conv2D(256 * level, (1,1), strides=(2,2), name=names[0], use_bias=False)(prev) + prev = BN(name=names[1])(prev) + return prev def empty_branch(prev): - return prev - + return prev def residual_short(prev_layer, level, pad=1, lvl=1, sub_lvl=1, modify_stride=False): - prev_layer = Activation('relu')(prev_layer) - block_1 = residual_conv(prev_layer, level, - pad=pad, lvl=lvl, sub_lvl=sub_lvl, - modify_stride=modify_stride) - - block_2 = short_convolution_branch(prev_layer, level, - lvl=lvl, sub_lvl=sub_lvl, - modify_stride=modify_stride) - - return merge([block_1, block_2], mode='sum') + prev_layer = Activation('relu')(prev_layer) + block_1 = residual_conv(prev_layer, level, + pad=pad, lvl=lvl, sub_lvl=sub_lvl, + modify_stride=modify_stride) + block_2 = short_convolution_branch(prev_layer, level, + lvl=lvl, sub_lvl=sub_lvl, + modify_stride=modify_stride) + added = Add()([block_1, block_2]) + return added def residual_empty(prev_layer, level, pad=1, lvl=1, sub_lvl=1): - prev_layer = Activation('relu')(prev_layer) + prev_layer = Activation('relu')(prev_layer) - block_1 = residual_conv(prev_layer, level, - pad=pad, lvl=lvl, sub_lvl=sub_lvl) - block_2 = empty_branch(prev_layer) - return merge([block_1, block_2], mode='sum') + block_1 = residual_conv(prev_layer, level, + pad=pad, lvl=lvl, sub_lvl=sub_lvl) + block_2 = empty_branch(prev_layer) + added = Add()([block_1, block_2]) + return added +def ResNet(inp): + #Names for the first couple layers of model + names = ["conv1_1_3x3_s2", + "conv1_1_3x3_s2_bn", + "conv1_2_3x3", + "conv1_2_3x3_bn", + "conv1_3_3x3", + "conv1_3_3x3_bn"] + + #---Short branch(only start of network) + + cnv1 = Conv2D(64, (3, 3), strides=(2, 2), padding='same', name=names[0], use_bias=False)(inp) # "conv1_1_3x3_s2" + bn1 = BN(name=names[1])(cnv1) # "conv1_1_3x3_s2/bn" + relu1 = Activation('relu')(bn1) #"conv1_1_3x3_s2/relu" + + cnv1 = Conv2D(64, (3, 3), strides=(1, 1), padding='same', name=names[2], use_bias=False)(relu1) #"conv1_2_3x3" + bn1 = BN(name=names[3])(cnv1) #"conv1_2_3x3/bn" + relu1 = Activation('relu')(bn1) #"conv1_2_3x3/relu" + + cnv1 = Conv2D(128, (3, 3), strides=(1, 1), padding='same', name=names[4], use_bias=False)(relu1) #"conv1_3_3x3" + bn1 = BN(name=names[5])(cnv1) #"conv1_3_3x3/bn" + relu1 = Activation('relu')(bn1) #"conv1_3_3x3/relu" + + res = MaxPooling2D(pool_size=(3,3), padding='same', strides=(2,2))(relu1) #"pool1_3x3_s2" + + #---Residual layers(body of network) + + """ + Modify_stride --Used only once in first 3_1 convolutions block. + changes stride of first convolution from 1 -> 2 + """ + + #2_1- 2_3 + res = residual_short(res, 1, pad=1, lvl=2, sub_lvl=1) + for i in range(2): + res = residual_empty(res, 1, pad=1, lvl=2, sub_lvl=i+2) + + #3_1 - 3_3 + res = residual_short(res, 2, pad=1, lvl=3, sub_lvl=1, modify_stride=True) + for i in range(3): + res = residual_empty(res, 2, pad=1, lvl=3, sub_lvl=i+2) + + #4_1 - 4_6 + res = residual_short(res, 4, pad=2, lvl=4, sub_lvl=1) + for i in range(5): + res = residual_empty(res, 4, pad=2, lvl=4, sub_lvl=i+2) + + #5_1 - 5_3 + res = residual_short(res, 8, pad=4, lvl=5, sub_lvl=1) + for i in range(2): + res = residual_empty(res, 8, pad=4, lvl=5, sub_lvl=i+2) + + res = Activation('relu')(res) + return res def interp_block(prev_layer, level, str_lvl=1): - str_lvl = str(str_lvl) + str_lvl = str(str_lvl) - names = [ - "conv5_3_pool"+str_lvl+"_conv", - "conv5_3_pool"+str_lvl+"_conv_bn" - ] + names = [ + "conv5_3_pool"+str_lvl+"_conv", + "conv5_3_pool"+str_lvl+"_conv_bn" + ] - kernel = (10*level, 10*level) - strides = (10*level, 10*level) - prev_layer = AveragePooling2D(kernel,strides=strides)(prev_layer) - prev_layer = Conv2D(512, (1,1), strides=(1,1), use_bias=False, name=names[0])(prev_layer) - prev_layer = BatchNormalization(momentum=0.95, name=names[1], epsilon=1e-5)(prev_layer) - prev_layer = Activation('relu')(prev_layer) - prev_layer = Lambda(Interp)(prev_layer) - return prev_layer + kernel = (10*level, 10*level) + strides = (10*level, 10*level) + prev_layer = AveragePooling2D(kernel,strides=strides)(prev_layer) + prev_layer = Conv2D(512, (1,1), strides=(1,1), name=names[0], use_bias=False)(prev_layer) + prev_layer = BN(name=names[1])(prev_layer) + prev_layer = Activation('relu')(prev_layer) + prev_layer = Lambda(Interp)(prev_layer) + return prev_layer +def PSPNet(res): -def build_pspnet(): - #Names for the first couple layers of model - names = ["conv1_1_3x3_s2", - "conv1_1_3x3_s2_bn", - "conv1_2_3x3", - "conv1_2_3x3_bn", - "conv1_3_3x3", - "conv1_3_3x3_bn"] + #---PSPNet concat layers with Interpolation - #---Short branch(only start of network) + interp_block1 = interp_block(res, 6, str_lvl=1) + interp_block2 = interp_block(res, 3, str_lvl=2) + interp_block3 = interp_block(res, 2, str_lvl=3) + interp_block6 = interp_block(res, 1, str_lvl=6) - inp = Input((473,473, 3)) + #concat all these layers. resulted shape=(1,60,60,4096) + res = Concatenate()([res, + interp_block6, + interp_block3, + interp_block2, + interp_block1]) + return res - cnv1 = ZeroPadding2D(padding=(1,1))(inp) - cnv1 = Conv2D(64, (3, 3), strides=(2, 2), use_bias=False, name=names[0])(cnv1) # "conv1_1_3x3_s2" - - bn1 = BatchNormalization(momentum=0.95, name=names[1], epsilon=1e-5)(cnv1) # "conv1_1_3x3_s2/bn" - relu1 = Activation('relu')(bn1) #"conv1_1_3x3_s2/relu" +def build_pspnet(activation='softmax'): + ''' + Normal PSPNet. + ''' + inp = Input((473,473,3)) + res = ResNet(inp) + psp = PSPNet(res) - cnv1 = ZeroPadding2D(padding=(1,1))(relu1) - cnv1 = Conv2D(64, (3, 3), strides=(1, 1), use_bias=False, name=names[2])(cnv1) #"conv1_2_3x3" - - bn1 = BatchNormalization(momentum=0.95, name=names[3], epsilon=1e-5)(cnv1) #"conv1_2_3x3/bn" - relu1 = Activation('relu')(bn1) #"conv1_2_3x3/relu" + x = Conv2D(512, (3, 3), strides=(1, 1), padding="same", name="conv5_4", use_bias=False)(psp) + x = BN(name="conv5_4_bn")(x) + x = Activation('relu')(x) + x = Dropout(0.1)(x) - cnv1 = ZeroPadding2D(padding=(1,1))(relu1) - cnv1 = Conv2D(128, (3, 3), strides=(1, 1), use_bias=False, name=names[4])(cnv1) #"conv1_3_3x3" - - bn1 = BatchNormalization(momentum=0.95, name=names[5], epsilon=1e-5)(cnv1) #"conv1_3_3x3/bn" - relu1 = Activation('relu')(bn1) #"conv1_3_3x3/relu" + x = Conv2D(150, (1, 1), strides=(1, 1), name="conv6")(x) + x = Lambda(Interp, arguments={'shape': (473,473)})(x) + x = Activation('softmax')(x) - res = ZeroPadding2D(padding=(1,1))(relu1) - res = MaxPooling2D(pool_size=(3,3), strides=(2,2))(res) #"pool1_3x3_s2" - + model = Model(inputs=inp, outputs=x) - #---Residual layers(body of network) - - """ - Modify_stride --Used only once in first 3_1 convolutions block. - changes stride of first convolution from 1 -> 2 - """ - - #2_1- 2_3 - res = residual_short(res, 1, pad=1, lvl=2, sub_lvl=1) - for i in range(2): - res = residual_empty(res, 1, pad=1, lvl=2, sub_lvl=i+2) - - #3_1 - 3_3 - res = residual_short(res, 2, pad=1, lvl=3, sub_lvl=1, modify_stride=True) - for i in range(3): #for i in range(2): old wrong code - res = residual_empty(res, 2, pad=1, lvl=3, sub_lvl=i+2) - - #4_1 - 4_6 - res = residual_short(res, 4, pad=2, lvl=4, sub_lvl=1) - for i in range(5): - res = residual_empty(res, 4, pad=2, lvl=4, sub_lvl=i+2) - - #5_1 - 5_3 - res = residual_short(res, 8, pad=4, lvl=5, sub_lvl=1) - for i in range(2): - res = residual_empty(res, 8, pad=4, lvl=5, sub_lvl=i+2) - - #---Head of network - #---PSPNet concat layers with Interpolation - - res = Activation('relu')(res) - interp_block1 = interp_block(res, 6, str_lvl=1) - interp_block2 = interp_block(res, 3, str_lvl=2) - interp_block3 = interp_block(res, 2, str_lvl=3) - interp_block4 = interp_block(res, 1, str_lvl=6) - - #concat all these layers by 4th axis(3+1). resulted shape=(1,60,60,4096) - res = concatenate([res, - interp_block1, - interp_block2, - interp_block3, - interp_block4], axis=3) - - res = ZeroPadding2D(padding=(1,1))(res) - res = Conv2D(512, (3, 3), strides=(1, 1), use_bias=False, name="conv5_4")(res) - - res = BatchNormalization(momentum=0.95, name="conv5_4_bn", epsilon=1e-5)(res) - res = Activation('relu')(res) - #res = Dropout(0.1)(res) #used only in training - res = Conv2D(150, (1, 1), strides=(1, 1), name="conv6")(res) - res = Lambda(Interp_zoom)(res) - - - #Use softmax layer for pixelwise prediction - curr_width, curr_height, curr_channels = res._shape_as_list()[1:] - - reshape = Reshape((curr_width*curr_height, curr_channels))(res) - activation = Activation('softmax')(reshape) - reshape = Reshape((curr_width, curr_height, curr_channels))(activation) - - #End of model - model = Model(inputs=inp, outputs=reshape) - return model + # Solver + sgd = SGD(lr=learning_rate, momentum=0.9, nesterov=True) + model.compile(optimizer=sgd, + loss='categorical_crossentropy', + metrics=['accuracy']) + return model diff --git a/pspnet.py b/pspnet.py index 2374e9a..ef000d7 100644 --- a/pspnet.py +++ b/pspnet.py @@ -1,112 +1,96 @@ -from keras import backend as K -from PIL import Image - -import layers_builder as pspnet -import tensorflow as tf -import numpy as np -import drawImage +import os import argparse -import time +import numpy as np +from scipy import misc +from keras import backend as K +import tensorflow as tf +import layers_builder as layers +import utils -def load_weights(): - w = np.load('pspnet50_ade20k.npy').item() - return w +WEIGHTS = 'pspnet50_ade20k.npy' +DATA_MEAN = np.array([[[123.68, 116.779, 103.939]]]) # RGB +class PSPNet: -def set_weights(model, weights): - print 'weights set start' - for layer in model.layers: - if layer.name[:4] == 'conv' and layer.name[-2:] == 'bn': - print layer.name - scale = weights[layer.name]['scale'].reshape(-1) + def __init__(self): + self.model = layers.build_pspnet() + set_npy_weights(self.model, WEIGHTS) - offset = weights[layer.name]['offset'].reshape(-1) - mean = weights[layer.name]['mean'].reshape(-1) - variance = weights[layer.name]['variance'].reshape(-1) + def predict(self, img): + ''' + Arguments: + img: must be 473x473x3 + ''' + h_ori,w_ori = img.shape[:2] - # mean *= scale - # variance *= scale - - # model.get_layer(layer.name).set_weights([mean, variance, - # scale, offset]) - model.get_layer(layer.name).set_weights([scale, offset, - mean, variance]) - # model.get_layer(layer.name).set_weights([scale, offset, - # mean, variance]) + # Preprocess + img = img.resize((473,473)) + img = img - DATA_MEAN + img = img[:,:,::-1] # RGB => BGR + img = img.astype('float32') - elif layer.name[:4] == 'conv' and not layer.name[-4:] == 'relu': - print layer.name - try: - weight = weights[layer.name]['weights'] - model.get_layer(layer.name).set_weights([weight]) - except Exception as err: - biases = weights[layer.name]['biases'] - model.get_layer(layer.name).set_weights([weight, biases]) + probs = self.feed_forward(img) + h,w = probs.shape[:2] + probs = ndimage.zoom(probs, (1.*h_ori/h,1.*w_ori/w,1.), order=1, prefilter=False) + return probs - print 'weights set finish' - return model + def predict_sliding_window(self, img): + pass + def feed_forward(self, data): + assert data.shape == (473,473,3) + data = data[np.newaxis,:,:,:] + + utils.debug(self.model, data) + pred = self.model.predict(data) + return pred[0] + +def set_npy_weights(model, npy_weights): + weights = np.load(npy_weights).item() + + for layer in model.layers: + print layer.name + if layer.name[:4] == 'conv' and layer.name[-2:] == 'bn': + mean = weights[layer.name]['mean'].reshape(-1) + variance = weights[layer.name]['variance'].reshape(-1) + scale = weights[layer.name]['scale'].reshape(-1) + offset = weights[layer.name]['offset'].reshape(-1) + + model.get_layer(layer.name).set_weights([mean, variance, scale, offset]) + + elif layer.name[:4] == 'conv' and not layer.name[-4:] == 'relu': + try: + weight = weights[layer.name]['weights'] + model.get_layer(layer.name).set_weights([weight]) + except Exception as err: + biases = weights[layer.name]['biases'] + model.get_layer(layer.name).set_weights([weight, biases]) + print 'Finished.' + return model if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('--input_path', type=str, default='', required=True, help='Path the input image') + parser.add_argument('--output_path', type=str, default='', required=True, help='Path to output') + parser.add_argument('--id', default="0") + args = parser.parse_args() - settings = None - parser = argparse.ArgumentParser() - parser.add_argument('--input-path', type=str, default='', - required=True, help='Path the input image') - parser.add_argument('--output-path', type=str, default='', - required=True, help='Path to output') + os.environ["CUDA_VISIBLE_DEVICES"] = args.id - settings, unparsed = parser.parse_known_args() - mean_r = 123.68 - mean_g = 116.779 - mean_b = 103.939 + sess = tf.Session() + K.set_session(sess) - model = pspnet.build_pspnet() - - sess = tf.Session() - K.set_session(sess) - - with sess.as_default(): - #Load weights into variable - npy_weights = load_weights() - #Set weights to each laye by name - model = set_weights(model, npy_weights) - - #Load image, resize and paste into 4D tensor - image = Image.open(settings.input_path) - im = image.resize((473, 473)) - input_ = np.array(im, dtype=np.float32) - input_ = input_[:,:,::-1] - input_ -= np.array((mean_b, mean_g, mean_r)) - data = np.zeros([1,473,473,3]) - - data[0] = input_ - - #predict - - startForward = time.time() - pred = model.predict(data, batch_size=1, verbose=0) - finishForward = (time.time() - startForward) - print "Time used: %f" % finishForward - # pred = np.transpose(pred[0], (2, 1, 0)) - print np.shape(pred) - pred = pred[0] - predicted_classes = np.argmax(pred, axis=2) - - proto = 'utils/model/pspnet.prototxt' - weights = 'utils/model/pspnet.caffemodel' - colors = 'utils/colorization/color150.mat' - objects = 'utils/colorization/objectName150.mat' - - - im_Width = predicted_classes.shape[0] - im_Height = predicted_classes.shape[1] - draw = drawImage.BaseDraw(colors, objects, - image, (im_Width, im_Height), - predicted_classes) - simpleSegmentImage = draw.drawSimpleSegment(); - simpleSegmentImage.save(settings.output_path,"JPEG") + with sess.as_default(): + img = misc.imread(args.input_path) + + pspnet = PSPNet() + probs = pspnet.predict(img) + cm = np.argmax(probs, axis=2) + 1 + pm = np.max(probs, axis=2) + color_cm = utils.add_color(cm) + misc.imsave(args.output_path, color_cm) + misc.imsave("probs.jpg", pm) diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..bbf9d82 --- /dev/null +++ b/utils.py @@ -0,0 +1,32 @@ +import colorsys +import numpy as np + +from keras.models import Model + +def add_color(img): + h,w = img.shape + img_color = np.zeros((h,w,3)) + for i in xrange(1,151): + img_color[img == i] = to_color(i) + return img_color + +def to_color(category): + # Maps each category a good distance away + # from each other on the HSV color space + v = (category-1)*(137.5/360) + return colorsys.hsv_to_rgb(v,1,1) + + +# For printing the activations in each layer +# Useful for debugging +def debug(model, data): + names = [layer.name for layer in model.layers] + for name in names[:]: + print_activation(model, name, data) +def print_activation(model, layer_name, data): + intermediate_layer_model = Model(inputs=model.input, + outputs=model.get_layer(layer_name).output) + io = intermediate_layer_model.predict(data) + print layer_name, array_to_str(io) +def array_to_str(a): + return "{} {} {} {} {}".format(a.dtype, a.shape, np.min(a), np.max(a), np.mean(a)) \ No newline at end of file diff --git a/weight_converter.py b/weight_converter.py index c97241f..033beb1 100644 --- a/weight_converter.py +++ b/weight_converter.py @@ -1,20 +1,42 @@ -import caffe +import os +import sys import numpy as np -import os, sys + +import caffe + +# Not needed because Tensorflow and Caffe do convolution the same way +# Needed for conversion to Theano +def rot90(W): + for i in range(W.shape[0]): + for j in range(W.shape[1]): + W[i, j] = np.rot90(W[i, j], 2) + return W weights = {} net = caffe.Net(sys.argv[1], sys.argv[2], caffe.TEST) for k,v in net.params.items(): print "Layer %s, has %d params." % (k, len(v)) if len(v) == 1: - weights[k] = {"weights": np.transpose(v[0].data[...], (2,3,1,0))} + W = v[0].data[...] + W = np.transpose(W, (2,3,1,0)) + weights[k] = {"weights": W} elif len(v) == 2: - weights[k] = {"weights": np.transpose(v[0].data[...], (2,3,1,0)), "biases": v[1].data[...]} + W = v[0].data[...] + W = np.transpose(W, (2,3,1,0)) + b = v[1].data[...] + weights[k] = {"weights": W, "biases": b} elif len(v) == 4: - weights[k.replace('/', '_')] = {"scale": v[0].data[...], "offset": v[1].data[...], "mean": v[2].data[...], "variance": v[3].data[...]} + k = k.replace('/', '_') + mean = v[0].data[...] + variance = v[1].data[...] + scale = v[2].data[...] + offset = v[3].data[...] + weights[k] = {"mean": mean, "variance": variance, "scale": scale, "offset": offset} else: print "Undefined layer" exit() arr = np.asarray(weights) -np.save("pspnet50_ade20k.npy", arr) \ No newline at end of file +np.save("pspnet50_ade20k.npy", arr) + + From 820395bd6aa46cc5e03c707a9cbef509fdb30aa0 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Tue, 8 Aug 2017 15:30:44 -0400 Subject: [PATCH 2/2] Added to readme and fixed bugs --- README.md | 4 +++- out.jpg | Bin 0 -> 62761 bytes probs.jpg | Bin 0 -> 77100 bytes pspnet.py | 6 +++--- 4 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 out.jpg create mode 100644 probs.jpg diff --git a/README.md b/README.md index 57760da..7b44f28 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Converted trained weights needed to run the network. Download converted weights here: -[link:pspnet50_ade20k.npy](https://www.dropbox.com/s/2ksp9hvokzk6qc8/pspnet50_ade20k.npy?dl=0) +[link:pspnet50_ade20k.npy](https://www.dropbox.com/s/ms8afun494dlh1t/pspnet50_ade20k.npy?dl=0) And place in directory with pspnet50_ade20k.npy @@ -24,6 +24,8 @@ Was repaired some issues. But the result is not as well as expected compared to ![Original](test.jpg) ![Processed](test_seg.jpg) ![Alpha mixed](test_seg_blended.jpg) +![New](out.jpg) +![New](probs.jpg) ## Pycaffe result ![Pycaffe results](test_pycaffe.jpg) diff --git a/out.jpg b/out.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14c2689efe7f737faf31831342a16f68dd470d61 GIT binary patch literal 62761 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 WhF+NQgEQci&lcoX#ztY^2L2y_hk=Ly literal 0 HcmV?d00001 diff --git a/probs.jpg b/probs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9bc9563073451aaa7fd05556aa8e6e5d2a552d91 GIT binary patch literal 77100 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

!!4*CJkiCQ`CW*+G065Z1 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 literal 0 HcmV?d00001 diff --git a/pspnet.py b/pspnet.py index ef000d7..fa42f64 100644 --- a/pspnet.py +++ b/pspnet.py @@ -1,7 +1,7 @@ import os import argparse import numpy as np -from scipy import misc +from scipy import misc, ndimage from keras import backend as K import tensorflow as tf @@ -26,7 +26,7 @@ class PSPNet: h_ori,w_ori = img.shape[:2] # Preprocess - img = img.resize((473,473)) + img = misc.imresize(img, (473, 473)) img = img - DATA_MEAN img = img[:,:,::-1] # RGB => BGR img = img.astype('float32') @@ -43,7 +43,7 @@ class PSPNet: assert data.shape == (473,473,3) data = data[np.newaxis,:,:,:] - utils.debug(self.model, data) + # utils.debug(self.model, data) pred = self.model.predict(data) return pred[0]