From eeb48562e19706d34fac4b556979f3786e6d58ad Mon Sep 17 00:00:00 2001 From: Chaoyue Wang Date: Wed, 19 Jul 2017 21:06:59 -0400 Subject: [PATCH] Repaired code issue --- drawImage/__init__.pyc | Bin 0 -> 189 bytes drawImage/drawModule.py | 5 ++-- drawImage/drawModule.pyc | Bin 0 -> 3262 bytes layers_builder.py | 22 ++++++++--------- pspnet.py | 50 ++++++++++++++++++++++++--------------- weight_converter.py | 20 ++++++++++++++++ 6 files changed, 65 insertions(+), 32 deletions(-) create mode 100644 drawImage/__init__.pyc create mode 100644 drawImage/drawModule.pyc create mode 100644 weight_converter.py diff --git a/drawImage/__init__.pyc b/drawImage/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80696bba86f951e9f95b0fd06a7bc799a836f773 GIT binary patch literal 189 zcmZSn%**xuMsj2_0~9a;X$K%K<^vKbK*Y$9!@v-d!o(1)!3-42{0{^gj6hZih|uzb zu(?30ixSIy^HWN5QZ;})1_V)T3*_pD7N-^!>*wZ{CF>UyW$6b52l%Cy=z6CXB^K+J xq~;ap7p3Lom+ON}@ytz3Pt}i)&&LL~>8Mp5!&@*2JT>CYdkYy3T++cT8?bcYdZ{knX}vZc4W)i7&~VBz5^s5~?R)t6PA4qsThHZANt{<0!U^2pjH$Z-}`RTvjpQC2#8 zGs-GsPrVu%M7gQl>RbUCmL>_S^rgYUvA)3G1STTi z_R>L=g?sjm?w0OUjO=h^F~)7Doh>Da+r?!2I;2K_cI~PfTRiET*zTyYq;Z<}0v;kb zji!aiHPsDB?FW@9t9G6r#_eI*Z|`4AVhs!;tn@=eWPO>b>hV@jd6A_s-XryqI?I+a_$4-l&?xYD?g>aM(>~+hx2lsAO#G`#s9@Og@2Q6as6}DkFN-`X%jkt=R7911F*M4axELIo(mE`n zL!&PO50#a{1+M4jZY`OZ>QoC7oG=bd56LJW-lUmp=u~8kc#Gb;x8lWo_Zt!Y2NZ~C z2B7+SDyvUdC*EvK9X}moY|H9I10B!+xd|d0nV=>=*QNZG@?=h-!LAzgzz*TQx(-NJ zr+~V|P?w%B9jtu40EtD7d1C=~Ilcg}c3K2;#|1Y7*+m2045CIhV5|pZVL-Hl^Jo+n z5W&H!u+SNMh;_5Cm~J_dUOYfVz6^&^qJc$twL{`^`U&H1=ru7W$8YXut%Kh%)r2h z&Y#zIK{yR)`$Px+XVS*Tz{2McLk(J2D_kWiO%>(C%mnYi6op1nav(u9)iFV+yD=XJ z4L(NS;iXVWswX%;STH`C}xzNsl@c> z(x)b|69$oa)g9@_;s?#xpF%T@!0X;6@1l!9p8pkUK4Owi7kPv*KN6^{4xyHFva93E za#WW|Q_r;`W6%ggXL#}9q0nuDMVhc*6G!c z=HXtN*aIyU=xmv^cVP8OGOhh-F$k5QmbvG@N}3pahylP4|7ZjZpNF@38_|0SZveYc z@M2~7!J8t>S$%=x??UKu1Vn~;8bB&WuWkqKphD(kM0gQ2VDX>J1EAN93w;W%o; TSI&`NlOq-1b`e!!`t|<>y||OQ literal 0 HcmV?d00001 diff --git a/layers_builder.py b/layers_builder.py index 2f8ff16..5c04427 100644 --- a/layers_builder.py +++ b/layers_builder.py @@ -44,7 +44,7 @@ def residual_conv(prev, level, prev = Conv2D(64 * level, (1,1), strides=(2,2), use_bias=False, name=names[0])(prev) - prev = BatchNormalization(momentum=0.95, name=names[1])(prev) + prev = BatchNormalization(momentum=0.95, name=names[1], epsilon=1e-5)(prev) prev = Activation('relu')(prev) prev = ZeroPadding2D(padding=(pad,pad))(prev) @@ -53,11 +53,11 @@ def residual_conv(prev, level, name=names[2])(prev) - prev = BatchNormalization(momentum=0.95, name=names[3])(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])(prev) + prev = BatchNormalization(momentum=0.95, name=names[5], epsilon=1e-5)(prev) return prev @@ -76,7 +76,7 @@ def short_convolution_branch(prev, level, prev = Conv2D(256 * level, (1,1), strides=(2,2), use_bias=False, name=names[0])(prev) - prev = BatchNormalization(momentum=0.95, name=names[1])(prev) + prev = BatchNormalization(momentum=0.95, name=names[1], epsilon=1e-5)(prev) return prev @@ -85,7 +85,7 @@ def empty_branch(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) @@ -119,7 +119,7 @@ def interp_block(prev_layer, level, str_lvl=1): 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])(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 @@ -141,19 +141,19 @@ def build_pspnet(): 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])(cnv1) # "conv1_1_3x3_s2/bn" + 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" 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])(cnv1) #"conv1_2_3x3/bn" + bn1 = BatchNormalization(momentum=0.95, name=names[3], epsilon=1e-5)(cnv1) #"conv1_2_3x3/bn" relu1 = Activation('relu')(bn1) #"conv1_2_3x3/relu" 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])(cnv1) #"conv1_3_3x3/bn" + bn1 = BatchNormalization(momentum=0.95, name=names[5], epsilon=1e-5)(cnv1) #"conv1_3_3x3/bn" relu1 = Activation('relu')(bn1) #"conv1_3_3x3/relu" res = ZeroPadding2D(padding=(1,1))(relu1) @@ -174,7 +174,7 @@ def build_pspnet(): #3_1 - 3_3 res = residual_short(res, 2, pad=1, lvl=3, sub_lvl=1, modify_stride=True) - for i in range(2): + 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 @@ -206,7 +206,7 @@ def build_pspnet(): 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")(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) diff --git a/pspnet.py b/pspnet.py index 117bda2..2ec2b33 100644 --- a/pspnet.py +++ b/pspnet.py @@ -25,9 +25,16 @@ def set_weights(model, weights): offset = weights[layer.name]['offset'].reshape(-1) mean = weights[layer.name]['mean'].reshape(-1) variance = weights[layer.name]['variance'].reshape(-1) + + # 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]) elif layer.name[:4] == 'conv' and not layer.name[-4:] == 'relu': print layer.name @@ -52,7 +59,9 @@ if __name__ == "__main__": required=True, help='Path to output') settings, unparsed = parser.parse_known_args() - + mean_r = 123.68 + mean_g = 116.779 + mean_b = 103.939 model = pspnet.build_pspnet() @@ -67,34 +76,37 @@ if __name__ == "__main__": #Load image, resize and paste into 4D tensor image = Image.open(settings.input_path) - data_im = np.asarray(image) + 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_im = np.resize(data_im, [473, 473, 3]) - data[0] = data_im + 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) - pred = np.transpose(pred[0], (2, 1, 0)) - predicted_classes = np.argmax(pred, axis=0) + proto = 'utils/model/pspnet.prototxt' + weights = 'utils/model/pspnet.caffemodel' + colors = 'utils/colorization/color150.mat' + objects = 'utils/colorization/objectName150.mat' - 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[1] - im_Height = predicted_classes.shape[0] - draw = drawImage.BaseDraw(colors, objects, - image, (im_Width, im_Height), - predicted_classes) - simpleSegmentImage = draw.drawSimpleSegment(); - simpleSegmentImage.save(settings.output_path,"JPEG") + 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") diff --git a/weight_converter.py b/weight_converter.py new file mode 100644 index 0000000..c97241f --- /dev/null +++ b/weight_converter.py @@ -0,0 +1,20 @@ +import caffe +import numpy as np +import os, sys + +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))} + elif len(v) == 2: + weights[k] = {"weights": np.transpose(v[0].data[...], (2,3,1,0)), "biases": v[1].data[...]} + elif len(v) == 4: + weights[k.replace('/', '_')] = {"scale": v[0].data[...], "offset": v[1].data[...], "mean": v[2].data[...], "variance": v[3].data[...]} + else: + print "Undefined layer" + exit() + +arr = np.asarray(weights) +np.save("pspnet50_ade20k.npy", arr) \ No newline at end of file