You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by GitBox <gi...@apache.org> on 2017/10/25 01:10:04 UTC
[GitHub] qingzhouzhen closed pull request #7786: Pvanet:Deep but Lightweight Neural Neural Networks for Real-time Object Detection
qingzhouzhen closed pull request #7786: Pvanet:Deep but Lightweight Neural Neural Networks for Real-time Object Detection
URL: https://github.com/apache/incubator-mxnet/pull/7786
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git a/example/image-classification/symbols/pvanet.py b/example/image-classification/symbols/pvanet.py
new file mode 100644
index 0000000000..b0ba678977
--- /dev/null
+++ b/example/image-classification/symbols/pvanet.py
@@ -0,0 +1,140 @@
+import mxnet as mx
+def get_symbol(num_classes, **kwargs):
+
+ data = mx.sym.Variable(name='data')
+ conv1_1 = crelu(data=data, num_filter=16, kernel=(7, 7), pad=(3, 3), stride=(2, 2), name='conv1_1') #(192*192)x3/(96*96)x32
+ pool1_1 = mx.sym.Pooling(data=conv1_1, kernel=(3, 3), stride=(2, 2), pad=(1, 1), pool_type='max', name='pool1_1') #(96*96)x32/(48*48)x32
+ conv2_1 = res_crelu(data=pool1_1, middle_filter=[24, 24], num_filter=64, kernel=(3, 3), stride=(1, 1), pad=(1, 1), bsr=False, proj=True, name='conv2_1') #(48*48)x32/(48*48)x64
+ conv2_2 = res_crelu(data=conv2_1, middle_filter=[24, 24], num_filter=64, kernel=(3, 3), stride=(1, 1), pad=(1, 1), bsr=True, proj=False, name='conv2_2') #(48*48)x64/(48*48)x64
+ conv2_3 = res_crelu(data=conv2_2, middle_filter=[24, 24], num_filter=64, kernel=(3, 3), stride=(1, 1), pad=(1, 1), bsr=True, proj=False, name='conv2_3') #(48*48)x64/(48*48)x64
+ scale3_1 = bn_scale_relu(data=conv2_3, name='bsr3_1', suffix='')
+ conv3_1 = res_crelu(data=scale3_1, middle_filter=[48, 48], num_filter=128, kernel=(3, 3), stride=(2, 2), pad=(1, 1), bsr=False, proj=True, name='conv3_1') #(48*48)x64/(24*24)x128
+ conv3_2 = res_crelu(data=conv3_1, middle_filter=[48, 48], num_filter=128, kernel=(3, 3), stride=(1, 1), pad=(1, 1), bsr=True, proj=False, name='conv3_2') #(24*24)x64/(24*24)x128
+ conv3_3 = res_crelu(data=conv3_2, middle_filter=[48, 48], num_filter=128, kernel=(3, 3), stride=(1, 1), pad=(1, 1), bsr=True, proj=False, name='conv3_3') #(24*24)x64/(24*24)x128
+ conv3_4 = res_crelu(data=conv3_3, middle_filter=[48, 48], num_filter=128, kernel=(3, 3), stride=(1, 1), pad=(1, 1), bsr=True, proj=False, name='conv3_4') #(24*24)x64/(24*24)x128
+ conv4_1 = inception(data=conv3_4, middle_filter=[64, [48, 128], [24, 48, 48], 128], num_filter=256, kernel=(3, 3),stride=(2, 2), proj=True, name='conv4_1', suffix='') #(24*24)x128/(12*12)x256
+ conv4_2 = inception(data=conv4_1, middle_filter=[64, [64, 128], [24, 48, 48]], num_filter=256, kernel=(3, 3), stride=(1, 1), proj=False, name='conv4_2', suffix='') #(12*12)x256/(12*12)x256
+ conv4_3 = inception(data=conv4_2, middle_filter=[64, [64, 128], [24, 48, 48]], num_filter=256, kernel=(3, 3), stride=(1, 1), proj=False, name='conv4_3', suffix='') #(12*12)x256/(12*12)x256
+ conv4_4 = inception(data=conv4_3, middle_filter=[64, [64, 128], [24, 48, 48]], num_filter=256, kernel=(3, 3), stride=(1, 1), proj=False, name='conv4_4', suffix='') #(12*12)x256/(12*12)x256
+ conv5_1 = inception(data=conv4_4, middle_filter=[64, [96, 192], [32, 64, 64], 128], num_filter=384, kernel=(3, 3), stride=(2, 2), proj=True, name='conv5_1', suffix='') #(6*6)x256/(6*6)x384
+ conv5_2 = inception(data=conv5_1, middle_filter=[64, [96, 192], [32, 64, 64]], num_filter=384, kernel=(3, 3), stride=(1, 1), proj=False, name='conv5_2', suffix='') #(6*6)x384/(6*6)x384
+ conv5_3 = inception(data=conv5_2, middle_filter=[64, [96, 192], [32, 64, 64]], num_filter=384, kernel=(3, 3), stride=(1, 1), proj=False, name='conv5_3', suffix='') #(6*6)x384/(6*6)x384
+ conv5_4 = inception_last(data=conv5_3, middle_filter=[64, [96, 192], [32, 64, 64]], num_filter=384, kernel=(3, 3), stride=(1, 1), proj=False, name='conv5_4', suffix='') #(6*6)x384/(6*6)x384
+ bsr = bn_scale_relu(data=conv5_4, name='bsr', suffix='last')
+ pool5 = mx.sym.Pooling(data=bsr, kernel=(1, 1), stride=(1, 1), pad=(0, 0), pool_type='max', name='pool5')
+ flatten = mx.sym.Flatten(data=pool5, name='flatten')
+ fc6 = fullconnection(data=flatten, num_hidden=4096, name='fc6', suffix='')
+ fc7 = fullconnection(data=fc6, num_hidden=4096, name='fc7', suffix='')
+ fc8 = mx.sym.FullyConnected(data=fc7, num_hidden=num_classes, name='fc8')
+ output = mx.sym.SoftmaxOutput(data=fc8, name='softmax')
+ return output
+
+def crelu(data, num_filter, kernel, stride, pad, name=None, suffix=''):
+ conv1=mx.symbol.Convolution(data=data, num_filter=num_filter, kernel=kernel, stride=stride, pad=pad, name='%s%s_conv2d' %(name, suffix))
+ bn=mx.symbol.BatchNorm(data=conv1, use_global_stats=True, name='%s%s_batchnorm' %(name, suffix))
+ negative=mx.symbol.negative(data=bn, name='negative')
+ concat=mx.symbol.concat(bn, negative)
+ net=scale_and_shift(concat, num_filter)
+ act=mx.symbol.Activation(data=net, act_type='relu', name='%s%s_relu' %(name, suffix))
+ return act
+
+# use linalg_gemm instead
+def scale_and_shift(data, name=None, suffix=''):
+ alpha = mx.symbol.Variable(name='%s%s_alpha' %(name, suffix), shape=(1), dtype='float32', init=mx.initializer.One())
+ beta = mx.symbol.Variable(name='%s%s_beta' %(name, suffix), shape=(1), dtype='float32', init = mx.initializer.Zero())
+ multi = mx.symbol.broadcast_mul(data, alpha)
+ add = mx.symbol.broadcast_add(multi, beta)
+ return add
+
+def res_crelu(data, middle_filter, num_filter, kernel, stride, pad, bsr, proj, name=None, suffix=''):
+ if bsr:
+ input = bn_scale_relu(data=data, name=name, suffix='bsr')
+ else:
+ input = data
+ if proj:
+ shortcut = mx.sym.Convolution(data=data, num_filter=num_filter, kernel=(1, 1), stride=stride, name='%s%s_proj_con2d' %(name, suffix))
+ else:
+ shortcut = data
+ conv1 = mx.sym.Convolution(data=input, num_filter=middle_filter[0], kernel=(1, 1), stride=stride, pad=(0, 0), name='%s%s_1_con2d' %(name, suffix))
+ bsr = bn_scale_relu(data=conv1, name=name, suffix='group')
+ conv2 = mx.sym.Convolution(data=bsr, num_filter=middle_filter[1], kernel=kernel, stride=(1, 1), pad=pad, name='%s%s_2_con2d' %(name, suffix))
+ bn = mx.sym.BatchNorm(data=conv2, use_global_stats=True, name='%s%s_batchnorm' %(name, suffix), fix_gamma=True)
+ negative = mx.sym.negative(data=bn, name='%s%s_negative'%(name, suffix))
+ concat = mx.sym.concat(bn, negative)
+ scale = scale_and_shift(data=concat, name=name, suffix=suffix)
+ relu = mx.sym.Activation(data=scale, act_type='relu', name='%s%s_relu' %(name, suffix))
+ conv3 = mx.sym.Convolution(data=relu, num_filter=num_filter, kernel=(1, 1), stride=(1, 1), pad=(0, 0), name='%s%s_3_con2d' %(name, suffix))
+ act = conv3+shortcut
+ return act
+
+def bn_scale_relu(data, name=None, suffix=''):
+ bn = mx.sym.BatchNorm(data=data, use_global_stats=True, name='%s%s_batchnorm' % (name, suffix))
+ scale = scale_and_shift(data=bn, name=name, suffix=suffix)
+ act = mx.sym.Activation(data=scale, act_type='relu', name='%s%s_relu' % (name, suffix))
+ return act
+
+def inception(data, middle_filter, num_filter, kernel, stride, proj, name, suffix):
+ if proj:
+ shortcut = mx.sym.Convolution(data=data, num_filter=num_filter, kernel=(1, 1), stride=stride, name='%s_proj' %(name))
+ else:
+ shortcut = data
+ bsr = bn_scale_relu(data=data, name=name, suffix='bsr')
+ conv_a = Conv(data=bsr, num_filter=middle_filter[0], kernel=(1, 1), stride=stride, pad=(0, 0), name=name, suffix='a')
+
+ conv_b1 = Conv(data=bsr, num_filter=middle_filter[1][0], kernel=(1, 1), stride=stride, pad=(0, 0), name=name, suffix='b1')
+ conv_b2 = Conv(data=conv_b1, num_filter=middle_filter[1][1], kernel=kernel, stride=(1, 1), pad=(1, 1), name=name, suffix='b2')
+
+ conv_c1 = Conv(data=bsr, num_filter=middle_filter[2][0], kernel=(1, 1), stride=stride, pad=(0, 0), name=name, suffix='c1')
+ conv_c2 = Conv(data=conv_c1, num_filter=middle_filter[2][1], kernel=kernel, stride=(1, 1), pad=(1, 1), name=name, suffix='c2')
+ conv_c3 = Conv(data=conv_c2, num_filter=middle_filter[2][2], kernel=kernel, stride=(1, 1), pad=(1, 1), name=name, suffix='c3')
+
+ if stride[1] > 1:
+ pool_d = mx.sym.Pooling(data=bsr, kernel=kernel, stride=stride, pad=(1, 1), pool_type='max', name=name+'pool')
+ conv_d = Conv(data=pool_d, num_filter=middle_filter[3], kernel=(1, 1), stride=(1, 1), pad=(0, 0), name=name, suffix='proj_conv')
+ conv_concat = mx.sym.concat(conv_a, conv_b2, conv_c3, conv_d)
+ else:
+ conv_concat = mx.sym.concat(conv_a, conv_b2, conv_c3)
+ conv = mx.sym.Convolution(data=conv_concat, num_filter=num_filter, kernel=(1, 1), stride=(1, 1), pad=(0, 0), name='%s_conv' %(name))
+ output = conv+shortcut
+ return output
+
+def inception_last(data, middle_filter, num_filter, kernel, stride, proj, name, suffix):
+ if proj:
+ shortcut = mx.sym.Convolution(data=data, num_filter=num_filter, kernel=(1, 1), stride=stride, name='%s_proj' %(name))
+ else:
+ shortcut = data
+ bsr = bn_scale_relu(data=data, name=name, suffix='bsr')
+ conv_a = Conv(data=bsr, num_filter=middle_filter[0], kernel=(1, 1), stride=stride, pad=(0, 0), name=name, suffix='a')
+
+ conv_b1 = Conv(data=bsr, num_filter=middle_filter[1][0], kernel=(1, 1), stride=stride, pad=(0, 0), name=name, suffix='b1')
+ conv_b2 = Conv(data=conv_b1, num_filter=middle_filter[1][1], kernel=kernel, stride=(1, 1), pad=(1, 1), name=name, suffix='b2')
+
+ conv_c1 = Conv(data=bsr, num_filter=middle_filter[2][0], kernel=(1, 1), stride=stride, pad=(0, 0), name=name, suffix='c1')
+ conv_c2 = Conv(data=conv_c1, num_filter=middle_filter[2][1], kernel=kernel, stride=(1, 1), pad=(1, 1), name=name, suffix='c2')
+ conv_c3 = Conv(data=conv_c2, num_filter=middle_filter[2][2], kernel=kernel, stride=(1, 1), pad=(1, 1), name=name, suffix='c3')
+
+ if stride[1] > 1:
+ pool_d = mx.sym.Pooling(data=bsr, kernel=kernel, stride=stride, pad=(1, 1), pool_type='max', name=name+'pool')
+ conv_d = Conv(data=pool_d, num_filter=middle_filter[3], kernel=(1, 1), stride=(1, 1), pad=(0, 0), name=name, suffix='proj_conv')
+ conv_concat = mx.sym.concat(conv_a, conv_b2, conv_c3, conv_d)
+ else:
+ conv_concat = mx.sym.concat(conv_a, conv_b2, conv_c3)
+ conv = mx.sym.Convolution(data=conv_concat, num_filter=num_filter, kernel=(1, 1), stride=(1, 1), pad=(0, 0), name='%s_conv' %(name))
+ bn = mx.sym.BatchNorm(data=conv, use_global_stats=True, name='%s%s_batchnorm' % (name, suffix))
+ scale = scale_and_shift(data=bn, name=name, suffix='last')
+ output = scale+shortcut
+ return output
+
+def Conv(data, num_filter=1, kernel=(1, 1), stride=(1, 1), pad=(0, 0), name=None, suffix=''):
+ conv = mx.sym.Convolution(data=data, num_filter=num_filter, kernel=kernel, stride=stride, pad=pad, no_bias=True, name='%s%s_conv2d' %(name, suffix))
+ bn = mx.sym.BatchNorm(data=conv, use_global_stats=True, name='%s%s_batchnorm' %(name, suffix))
+ scale = scale_and_shift(bn, name='%s%s_scale_and_shift' %(name, suffix))
+ act = mx.sym.Activation(data=scale, act_type='relu', name='%s%s_relu' %(name, suffix))
+ return act
+def fullconnection(data, num_hidden, name, suffix):
+ fc = mx.sym.FullyConnected(data=data, num_hidden=num_hidden, name='%s' %(name))
+ bn = mx.sym.BatchNorm(data=fc, use_global_stats=True, name='%s%s_batchnorm' %(name, suffix))
+ scale = scale_and_shift(data=bn, name='%s%s_scaleshift' %(name, suffix))
+ dropout = mx.sym.Dropout(data=scale, name= '%s_dropout' %(name))
+ relu = mx.sym.Activation(data=dropout, act_type='relu', name='%s_relu' %(name))
+ return relu
diff --git a/example/rcnn/rcnn/config.py b/example/rcnn/rcnn/config.py
index 17738f054b..1ef8527fac 100644
--- a/example/rcnn/rcnn/config.py
+++ b/example/rcnn/rcnn/config.py
@@ -153,6 +153,14 @@
network.resnet.FIXED_PARAMS = ['conv0', 'stage1', 'gamma', 'beta']
network.resnet.FIXED_PARAMS_SHARED = ['conv0', 'stage1', 'stage2', 'stage3', 'gamma', 'beta']
+network.pvanet = edict()
+network.pvanet.pretrained = 'model/pvanet'
+network.pvanet.pretrained_epoch = 0
+network.pvanet.PIXEL_MEANS = np.array([0, 0, 0])
+network.pvanet.RPN_FEAT_STRIDE = 16
+network.pvanet.RCNN_FEAT_STRIDE = 16
+network.pvanet.FIXED_PARAMS = ['conv1', 'conv2', 'conv3', 'conv4', 'conv5']
+network.pvanet.FIXED_PARAMS_SHARED = ['conv1', 'conv2', 'conv3', 'conv4', 'conv5']
# dataset settings
dataset = edict()
diff --git a/example/rcnn/rcnn/symbol/__init__.py b/example/rcnn/rcnn/symbol/__init__.py
index 113b52c98a..7b26c661b1 100644
--- a/example/rcnn/rcnn/symbol/__init__.py
+++ b/example/rcnn/rcnn/symbol/__init__.py
@@ -15,5 +15,6 @@
# specific language governing permissions and limitations
# under the License.
+from symbol_pvanet import *
from symbol_vgg import *
from symbol_resnet import *
diff --git a/example/rcnn/rcnn/symbol/symbol_pvanet.py b/example/rcnn/rcnn/symbol/symbol_pvanet.py
new file mode 100644
index 0000000000..9337a392e8
--- /dev/null
+++ b/example/rcnn/rcnn/symbol/symbol_pvanet.py
@@ -0,0 +1,312 @@
+import mxnet as mx
+import proposal
+import proposal_target
+from rcnn.config import config
+
+def get_pvanet_conv(data):
+ conv1_1 = crelu(data=data, num_filter=16, kernel=(7, 7), pad=(3, 3), stride=(2, 2), name='conv1_1') # (1056*640)x3/(528*320)x32
+ pool1_1 = mx.sym.Pooling(data=conv1_1, kernel=(3, 3), stride=(2, 2), pad=(1, 1), pool_type='max', name='pool1_1') # (528*320)x32/(264*160)x32
+ conv2_1 = res_crelu(data=pool1_1, middle_filter=[24, 24], num_filter=64, kernel=(3, 3), stride=(1, 1), pad=(1, 1), bsr=False, proj=True, name='conv2_1') # (264*160)x32/(264*160)x64
+ conv2_2 = res_crelu(data=conv2_1, middle_filter=[24, 24], num_filter=64, kernel=(3, 3), stride=(1, 1), pad=(1, 1), bsr=True, proj=False, name='conv2_2') # (264*160)x64/(264*160)x64
+ conv2_3 = res_crelu(data=conv2_2, middle_filter=[24, 24], num_filter=64, kernel=(3, 3), stride=(1, 1), pad=(1, 1), bsr=True, proj=False, name='conv2_3') # (264*160)x64/(264*160)x64
+ scale3_1 = bn_scale_relu(data=conv2_3, name='bsr3_1', suffix='')
+ conv3_1 = res_crelu(data=scale3_1, middle_filter=[48, 48], num_filter=128, kernel=(3, 3), stride=(2, 2), pad=(1, 1), bsr=False, proj=True, name='conv3_1') # (264*160)x64/(132*80)x128
+ conv3_2 = res_crelu(data=conv3_1, middle_filter=[48, 48], num_filter=128, kernel=(3, 3), stride=(1, 1), pad=(1, 1), bsr=True, proj=False, name='conv3_2') # (132*80)x64/(132*80)x128
+ conv3_3 = res_crelu(data=conv3_2, middle_filter=[48, 48], num_filter=128, kernel=(3, 3), stride=(1, 1), pad=(1, 1), bsr=True, proj=False, name='conv3_3') # (132*80)x64/(132*80)x128
+ conv3_4 = res_crelu(data=conv3_3, middle_filter=[48, 48], num_filter=128, kernel=(3, 3), stride=(1, 1), pad=(1, 1), bsr=True, proj=False, name='conv3_4') # (132*80)x64/(132*80)x128
+ downscale = mx.sym.Pooling(data=conv3_4, kernel=(3, 3), stride=(2, 2), pad=(1, 1), pool_type='max', name='downscole') # (132*80)x64/(66*40)x128
+ conv4_1 = inception(data=conv3_4, middle_filter=[64, [48, 128], [24, 48, 48], 128], num_filter=256, kernel=(3, 3), stride=(2, 2), proj=True, name='conv4_1', suffix='') # (132*80)x128/(66*40)x256
+ conv4_2 = inception(data=conv4_1, middle_filter=[64, [64, 128], [24, 48, 48]], num_filter=256, kernel=(3, 3), stride=(1, 1), proj=False, name='conv4_2', suffix='') # (66*40)x256/(66*40)x256
+ conv4_3 = inception(data=conv4_2, middle_filter=[64, [64, 128], [24, 48, 48]], num_filter=256, kernel=(3, 3), stride=(1, 1), proj=False, name='conv4_3', suffix='') # (66*40)x256/(66*40)x256
+ conv4_4 = inception(data=conv4_3, middle_filter=[64, [64, 128], [24, 48, 48]], num_filter=256, kernel=(3, 3), stride=(1, 1), proj=False, name='conv4_4', suffix='') # (66*40)x256/(66*40)x256
+ conv5_1 = inception(data=conv4_4, middle_filter=[64, [96, 192], [32, 64, 64], 128], num_filter=384, kernel=(3, 3), stride=(2, 2), proj=True, name='conv5_1', suffix='') # (66*40)x256/(33*20)x384
+ conv5_2 = inception(data=conv5_1, middle_filter=[64, [96, 192], [32, 64, 64]], num_filter=384, kernel=(3, 3), stride=(1, 1), proj=False, name='conv5_2', suffix='') # (33*20)x384/(33*20)x384
+ conv5_3 = inception(data=conv5_2, middle_filter=[64, [96, 192], [32, 64, 64]], num_filter=384, kernel=(3, 3), stride=(1, 1), proj=False, name='conv5_3', suffix='') # (33*20)x384/(33*20)x384
+ conv5_4 = inception_last(data=conv5_3, middle_filter=[64, [96, 192], [32, 64, 64]], num_filter=384, kernel=(3, 3), stride=(1, 1), proj=False, name='conv5_4', suffix='') # (33*20)x384/(33*20)x384
+ bsr = bn_scale_relu(data=conv5_4, name='bsr', suffix='last')
+ upscale = mx.sym.Deconvolution(data=bsr, num_filter=384, kernel=(4, 4), stride=(2, 2), pad=(1, 1), name='deconv') # (33*20)x384/(66*40)x384
+ crop = mx.sym.Crop(upscale, downscale, name='crop')
+ concat = mx.sym.concat(downscale, conv4_4, crop, name='concat') # (66*40)x768/(66*40)x768
+ #convf = mx.sym.Convolution(data=concat, num_filter=512, kernel=(1, 1), stride=(1, 1), pad=(0, 0), name='convf') # (66*40)x768/(66*40)x512
+ return concat
+
+def crelu(data, num_filter, kernel, stride, pad, name=None, suffix=''):
+ conv1=mx.symbol.Convolution(data=data, num_filter=num_filter, kernel=kernel, stride=stride, pad=pad, name='%s%s_conv2d' %(name, suffix))
+ bn=mx.symbol.BatchNorm(data=conv1, use_global_stats=True, name='%s%s_batchnorm' %(name, suffix))
+ negative=mx.symbol.negative(data=bn, name='negative')
+ concat=mx.symbol.concat(bn, negative)
+ net=scale_and_shift(concat, num_filter)
+ act=mx.symbol.Activation(data=net, act_type='relu', name='%s%s_relu' %(name, suffix))
+ return act
+
+# use linalg_gemm instead
+def scale_and_shift(data, name=None, suffix=''):
+ alpha = mx.symbol.Variable(name='%s%s_alpha' %(name, suffix), shape=(1), dtype='float32', init=mx.initializer.One())
+ beta = mx.symbol.Variable(name='%s%s_beta' %(name, suffix), shape=(1), dtype='float32', init = mx.initializer.Zero())
+ multi = mx.symbol.broadcast_mul(data, alpha)
+ add = mx.symbol.broadcast_add(multi, beta)
+ return add
+
+def res_crelu(data, middle_filter, num_filter, kernel, stride, pad, bsr, proj, name=None, suffix=''):
+ if bsr:
+ input = bn_scale_relu(data=data, name=name, suffix='bsr')
+ else:
+ input = data
+ if proj:
+ shortcut = mx.sym.Convolution(data=data, num_filter=num_filter, kernel=(1, 1), stride=stride, name='%s%s_proj_con2d' %(name, suffix))
+ else:
+ shortcut = data
+ conv1 = mx.sym.Convolution(data=input, num_filter=middle_filter[0], kernel=(1, 1), stride=stride, pad=(0, 0), name='%s%s_1_con2d' %(name, suffix))
+ bsr = bn_scale_relu(data=conv1, name=name, suffix='group')
+ conv2 = mx.sym.Convolution(data=bsr, num_filter=middle_filter[1], kernel=kernel, stride=(1, 1), pad=pad, name='%s%s_2_con2d' %(name, suffix))
+ bn = mx.sym.BatchNorm(data=conv2, use_global_stats=True, name='%s%s_batchnorm' %(name, suffix), fix_gamma=True)
+ negative = mx.sym.negative(data=bn, name='%s%s_negative'%(name, suffix))
+ concat = mx.sym.concat(bn, negative)
+ scale = scale_and_shift(data=concat, name=name, suffix=suffix)
+ relu = mx.sym.Activation(data=scale, act_type='relu', name='%s%s_relu' %(name, suffix))
+ conv3 = mx.sym.Convolution(data=relu, num_filter=num_filter, kernel=(1, 1), stride=(1, 1), pad=(0, 0), name='%s%s_3_con2d' %(name, suffix))
+ act = conv3+shortcut
+ return act
+
+def bn_scale_relu(data, name=None, suffix=''):
+ bn = mx.sym.BatchNorm(data=data, use_global_stats=True, name='%s%s_batchnorm' % (name, suffix))
+ scale = scale_and_shift(data=bn, name=name, suffix=suffix)
+ act = mx.sym.Activation(data=scale, act_type='relu', name='%s%s_relu' % (name, suffix))
+ return act
+
+def inception(data, middle_filter, num_filter, kernel, stride, proj, name, suffix):
+ if proj:
+ shortcut = mx.sym.Convolution(data=data, num_filter=num_filter, kernel=(1, 1), stride=stride, name='%s_proj' %(name))
+ else:
+ shortcut = data
+ bsr = bn_scale_relu(data=data, name=name, suffix='bsr')
+ conv_a = Conv(data=bsr, num_filter=middle_filter[0], kernel=(1, 1), stride=stride, pad=(0, 0), name=name, suffix='a')
+
+ conv_b1 = Conv(data=bsr, num_filter=middle_filter[1][0], kernel=(1, 1), stride=stride, pad=(0, 0), name=name, suffix='b1')
+ conv_b2 = Conv(data=conv_b1, num_filter=middle_filter[1][1], kernel=kernel, stride=(1, 1), pad=(1, 1), name=name, suffix='b2')
+
+ conv_c1 = Conv(data=bsr, num_filter=middle_filter[2][0], kernel=(1, 1), stride=stride, pad=(0, 0), name=name, suffix='c1')
+ conv_c2 = Conv(data=conv_c1, num_filter=middle_filter[2][1], kernel=kernel, stride=(1, 1), pad=(1, 1), name=name, suffix='c2')
+ conv_c3 = Conv(data=conv_c2, num_filter=middle_filter[2][2], kernel=kernel, stride=(1, 1), pad=(1, 1), name=name, suffix='c3')
+
+ if stride[1] > 1:
+ pool_d = mx.sym.Pooling(data=bsr, kernel=kernel, stride=stride, pad=(1, 1), pool_type='max', name=name+'pool')
+ conv_d = Conv(data=pool_d, num_filter=middle_filter[3], kernel=(1, 1), stride=(1, 1), pad=(0, 0), name=name, suffix='proj_conv')
+ conv_concat = mx.sym.concat(conv_a, conv_b2, conv_c3, conv_d)
+ else:
+ conv_concat = mx.sym.concat(conv_a, conv_b2, conv_c3)
+ conv = mx.sym.Convolution(data=conv_concat, num_filter=num_filter, kernel=(1, 1), stride=(1, 1), pad=(0, 0), name='%s_conv' %(name))
+ output = conv+shortcut
+ return output
+def inception_last(data, middle_filter, num_filter, kernel, stride, proj, name, suffix):
+ if proj:
+ shortcut = mx.sym.Convolution(data=data, num_filter=num_filter, kernel=(1, 1), stride=stride, name='%s_proj' %(name))
+ else:
+ shortcut = data
+ bsr = bn_scale_relu(data=data, name=name, suffix='bsr')
+ conv_a = Conv(data=bsr, num_filter=middle_filter[0], kernel=(1, 1), stride=stride, pad=(0, 0), name=name, suffix='a')
+
+ conv_b1 = Conv(data=bsr, num_filter=middle_filter[1][0], kernel=(1, 1), stride=stride, pad=(0, 0), name=name, suffix='b1')
+ conv_b2 = Conv(data=conv_b1, num_filter=middle_filter[1][1], kernel=kernel, stride=(1, 1), pad=(1, 1), name=name, suffix='b2')
+
+ conv_c1 = Conv(data=bsr, num_filter=middle_filter[2][0], kernel=(1, 1), stride=stride, pad=(0, 0), name=name, suffix='c1')
+ conv_c2 = Conv(data=conv_c1, num_filter=middle_filter[2][1], kernel=kernel, stride=(1, 1), pad=(1, 1), name=name, suffix='c2')
+ conv_c3 = Conv(data=conv_c2, num_filter=middle_filter[2][2], kernel=kernel, stride=(1, 1), pad=(1, 1), name=name, suffix='c3')
+
+ if stride[1] > 1:
+ pool_d = mx.sym.Pooling(data=bsr, kernel=kernel, stride=stride, pad=(1, 1), pool_type='max', name=name+'pool')
+ conv_d = Conv(data=pool_d, num_filter=middle_filter[3], kernel=(1, 1), stride=(1, 1), pad=(0, 0), name=name, suffix='proj_conv')
+ conv_concat = mx.sym.concat(conv_a, conv_b2, conv_c3, conv_d)
+ else:
+ conv_concat = mx.sym.concat(conv_a, conv_b2, conv_c3)
+ conv = mx.sym.Convolution(data=conv_concat, num_filter=num_filter, kernel=(1, 1), stride=(1, 1), pad=(0, 0), name='%s_conv' %(name))
+ bn = mx.sym.BatchNorm(data=conv, use_global_stats=True, name='%s%s_batchnorm' % (name, suffix))
+ scale = scale_and_shift(data=bn, name=name, suffix='last')
+ output = scale+shortcut
+ return output
+
+def Conv(data, num_filter=1, kernel=(1, 1), stride=(1, 1), pad=(0, 0), name=None, suffix=''):
+ conv = mx.sym.Convolution(data=data, num_filter=num_filter, kernel=kernel, stride=stride, pad=pad, no_bias=True, name='%s%s_conv2d' %(name, suffix))
+ bn = mx.sym.BatchNorm(data=conv, use_global_stats=True, name='%s%s_batchnorm' %(name, suffix))
+ scale = scale_and_shift(bn, name='%s%s_scale_and_shift' %(name, suffix))
+ act = mx.sym.Activation(data=scale, act_type='relu', name='%s%s_relu' %(name, suffix))
+ return act
+
+def get_pvanet_test(num_classes=config.NUM_CLASSES, num_anchors=config.NUM_ANCHORS):
+ """
+ Faster R-CNN test with pvanet conv layers
+ :param num_classes: used to determine output size
+ :param num_anchors: used to determine output size
+ :return: Symbol
+ """
+ data = mx.symbol.Variable(name="data")
+ im_info = mx.symbol.Variable(name="im_info")
+
+ # shared convolutional layers
+ concat = get_pvanet_conv(data)
+ conf_rpn = mx.symbol.Convolution(data=concat, kernel=(1, 1), pad=(0, 0), num_filter=128, name="conf_rpn")
+ reluf_rpn = mx.symbol.Activation(data=conf_rpn, act_type="relu", name="reluf_rpn")
+ conf_2 = mx.symbol.Convolution(data=concat, kernel=(1, 1), pad=(0, 0), num_filter=384, name="conf_2")
+ reluf_2 = mx.symbol.Activation(data=conf_2, act_type="relu", name="reluf_2")
+ concat_convf = mx.sym.concat(reluf_rpn, reluf_2)
+ # RPN
+ rpn_conv = mx.symbol.Convolution(
+ data=reluf_rpn, kernel=(3, 3), pad=(1, 1), num_filter=384, name="rpn_conv_3x3")
+ rpn_relu = mx.symbol.Activation(data=rpn_conv, act_type="relu", name="rpn_relu")
+ rpn_cls_score = mx.symbol.Convolution(
+ data=rpn_relu, kernel=(1, 1), pad=(0, 0), num_filter=2 * num_anchors, name="rpn_cls_score")
+ rpn_bbox_pred = mx.symbol.Convolution(
+ data=rpn_relu, kernel=(1, 1), pad=(0, 0), num_filter=4 * num_anchors, name="rpn_bbox_pred")
+
+ # ROI Proposal
+ rpn_cls_score_reshape = mx.symbol.Reshape(
+ data=rpn_cls_score, shape=(0, 2, -1, 0), name="rpn_cls_score_reshape")
+ rpn_cls_prob = mx.symbol.SoftmaxActivation(
+ data=rpn_cls_score_reshape, mode="channel", name="rpn_cls_prob")
+ rpn_cls_prob_reshape = mx.symbol.Reshape(
+ data=rpn_cls_prob, shape=(0, 2 * num_anchors, -1, 0), name='rpn_cls_prob_reshape')
+ if config.TEST.CXX_PROPOSAL:
+ rois = mx.contrib.symbol.Proposal(
+ cls_prob=rpn_cls_prob_reshape, bbox_pred=rpn_bbox_pred, im_info=im_info, name='rois',
+ feature_stride=config.RPN_FEAT_STRIDE, scales=tuple(config.ANCHOR_SCALES), ratios=tuple(config.ANCHOR_RATIOS),
+ rpn_pre_nms_top_n=config.TEST.RPN_PRE_NMS_TOP_N, rpn_post_nms_top_n=config.TEST.RPN_POST_NMS_TOP_N,
+ threshold=config.TEST.RPN_NMS_THRESH, rpn_min_size=config.TEST.RPN_MIN_SIZE)
+ else:
+ rois = mx.symbol.Custom(
+ cls_prob=rpn_cls_prob_reshape, bbox_pred=rpn_bbox_pred, im_info=im_info, name='rois',
+ op_type='proposal', feat_stride=config.RPN_FEAT_STRIDE,
+ scales=tuple(config.ANCHOR_SCALES), ratios=tuple(config.ANCHOR_RATIOS),
+ rpn_pre_nms_top_n=config.TEST.RPN_PRE_NMS_TOP_N, rpn_post_nms_top_n=config.TEST.RPN_POST_NMS_TOP_N,
+ threshold=config.TEST.RPN_NMS_THRESH, rpn_min_size=config.TEST.RPN_MIN_SIZE)
+
+ # Fast R-CNN
+ pool5 = mx.symbol.ROIPooling(
+ name='roi_pool5', data=concat_convf, rois=rois, pooled_size=(6, 6), spatial_scale=1.0 / config.RCNN_FEAT_STRIDE)
+ # group 6
+ flatten = mx.symbol.Flatten(data=pool5, name="flatten")
+ fc6 = mx.symbol.FullyConnected(data=flatten, num_hidden=4096, name="fc6")
+ fc6_bn = mx.sym.BatchNorm(data=fc6, name='fc6_batchnorm')
+ drop6 = mx.symbol.Dropout(data=fc6_bn, p=0.5, name="drop6")
+ relu6 = mx.symbol.Activation(data=drop6, act_type="relu", name="relu6")
+ # group 7
+ fc7 = mx.symbol.FullyConnected(data=relu6, num_hidden=4096, name="fc7")
+ fc7_bn = mx.sym.BatchNorm(data=fc7, name='fc7_batchnorm')
+ drop7 = mx.symbol.Dropout(data=fc7_bn, p=0.5, name="drop7")
+ relu7 = mx.symbol.Activation(data=drop7, act_type="relu", name="relu7")
+
+ # classification
+ cls_score = mx.symbol.FullyConnected(name='cls_score', data=relu7, num_hidden=num_classes)
+ cls_prob = mx.symbol.softmax(name='cls_prob', data=cls_score)
+ # bounding box regression
+ bbox_pred = mx.symbol.FullyConnected(name='bbox_pred', data=relu7, num_hidden=num_classes * 4)
+
+ # reshape output
+ cls_prob = mx.symbol.Reshape(data=cls_prob, shape=(config.TEST.BATCH_IMAGES, -1, num_classes), name='cls_prob_reshape')
+ bbox_pred = mx.symbol.Reshape(data=bbox_pred, shape=(config.TEST.BATCH_IMAGES, -1, 4 * num_classes), name='bbox_pred_reshape')
+
+ # group output
+ group = mx.symbol.Group([rois, cls_prob, bbox_pred])
+ return group
+
+
+def get_pvanet_train(num_classes=config.NUM_CLASSES, num_anchors=config.NUM_ANCHORS):
+ """
+ Faster R-CNN end-to-end with pvanet conv layers
+ :param num_classes: used to determine output size
+ :param num_anchors: used to determine output size
+ :return: Symbol
+ """
+ data = mx.symbol.Variable(name="data")
+ im_info = mx.symbol.Variable(name="im_info")
+ gt_boxes = mx.symbol.Variable(name="gt_boxes")
+ rpn_label = mx.symbol.Variable(name='label')
+ rpn_bbox_target = mx.symbol.Variable(name='bbox_target')
+ rpn_bbox_weight = mx.symbol.Variable(name='bbox_weight')
+
+ # shared convolutional layers
+ concat = get_pvanet_conv(data)
+ conf_rpn = mx.symbol.Convolution(data=concat, kernel=(1, 1), pad=(0, 0), num_filter=128, name="conf_rpn")
+ reluf_rpn = mx.symbol.Activation(data=conf_rpn, act_type="relu", name="reluf_rpn")
+ conf_2 = mx.symbol.Convolution(data=concat, kernel=(1, 1), pad=(0, 0), num_filter=384, name="conf_2")
+ reluf_2 = mx.symbol.Activation(data=conf_2, act_type="relu", name="reluf_2")
+ concat_convf = mx.sym.concat(reluf_rpn, reluf_2)
+
+ # RPN layers
+ rpn_conv = mx.symbol.Convolution(
+ data=reluf_rpn, kernel=(3, 3), pad=(1, 1), num_filter=384, name="rpn_conv_3x3")
+ rpn_relu = mx.symbol.Activation(data=rpn_conv, act_type="relu", name="rpn_relu")
+ rpn_cls_score = mx.symbol.Convolution(
+ data=rpn_relu, kernel=(1, 1), pad=(0, 0), num_filter=2 * num_anchors, name="rpn_cls_score")
+ rpn_bbox_pred = mx.symbol.Convolution(
+ data=rpn_relu, kernel=(1, 1), pad=(0, 0), num_filter=4 * num_anchors, name="rpn_bbox_pred")
+
+ # prepare rpn data
+ rpn_cls_score_reshape = mx.symbol.Reshape(
+ data=rpn_cls_score, shape=(0, 2, -1, 0), name="rpn_cls_score_reshape")
+
+ # classification
+ rpn_cls_prob = mx.symbol.SoftmaxOutput(data=rpn_cls_score_reshape, label=rpn_label, multi_output=True,
+ normalization='valid', use_ignore=True, ignore_label=-1, name="rpn_cls_prob")
+ # bounding box regression
+ rpn_bbox_loss_ = rpn_bbox_weight * mx.symbol.smooth_l1(name='rpn_bbox_loss_', scalar=3.0, data=(rpn_bbox_pred - rpn_bbox_target))
+ rpn_bbox_loss = mx.sym.MakeLoss(name='rpn_bbox_loss', data=rpn_bbox_loss_, grad_scale=1.0 / config.TRAIN.RPN_BATCH_SIZE)
+
+ # ROI proposal
+ rpn_cls_act = mx.symbol.SoftmaxActivation(
+ data=rpn_cls_score_reshape, mode="channel", name="rpn_cls_act")
+ rpn_cls_act_reshape = mx.symbol.Reshape(
+ data=rpn_cls_act, shape=(0, 2 * num_anchors, -1, 0), name='rpn_cls_act_reshape')
+ if config.TRAIN.CXX_PROPOSAL:
+ rois = mx.contrib.symbol.Proposal(
+ cls_prob=rpn_cls_act_reshape, bbox_pred=rpn_bbox_pred, im_info=im_info, name='rois',
+ feature_stride=config.RPN_FEAT_STRIDE, scales=tuple(config.ANCHOR_SCALES), ratios=tuple(config.ANCHOR_RATIOS),
+ rpn_pre_nms_top_n=config.TRAIN.RPN_PRE_NMS_TOP_N, rpn_post_nms_top_n=config.TRAIN.RPN_POST_NMS_TOP_N,
+ threshold=config.TRAIN.RPN_NMS_THRESH, rpn_min_size=config.TRAIN.RPN_MIN_SIZE)
+ else:
+ rois = mx.symbol.Custom(
+ cls_prob=rpn_cls_act_reshape, bbox_pred=rpn_bbox_pred, im_info=im_info, name='rois',
+ op_type='proposal', feat_stride=config.RPN_FEAT_STRIDE,
+ scales=tuple(config.ANCHOR_SCALES), ratios=tuple(config.ANCHOR_RATIOS),
+ rpn_pre_nms_top_n=config.TRAIN.RPN_PRE_NMS_TOP_N, rpn_post_nms_top_n=config.TRAIN.RPN_POST_NMS_TOP_N,
+ threshold=config.TRAIN.RPN_NMS_THRESH, rpn_min_size=config.TRAIN.RPN_MIN_SIZE)
+
+ # ROI proposal target
+ gt_boxes_reshape = mx.symbol.Reshape(data=gt_boxes, shape=(-1, 5), name='gt_boxes_reshape')
+ group = mx.symbol.Custom(rois=rois, gt_boxes=gt_boxes_reshape, op_type='proposal_target',
+ num_classes=num_classes, batch_images=config.TRAIN.BATCH_IMAGES,
+ batch_rois=config.TRAIN.BATCH_ROIS, fg_fraction=config.TRAIN.FG_FRACTION)
+ rois = group[0]
+ label = group[1]
+ bbox_target = group[2]
+ bbox_weight = group[3]
+
+ # Fast R-CNN
+ pool5 = mx.symbol.ROIPooling(
+ name='roi_pool5', data=concat_convf, rois=rois, pooled_size=(6, 6), spatial_scale=1.0 / config.RCNN_FEAT_STRIDE)
+ # group 6
+ flatten = mx.symbol.Flatten(data=pool5, name="flatten")
+ fc6 = mx.symbol.FullyConnected(data=flatten, num_hidden=4096, name="fc6")
+ fc6_bn = mx.sym.BatchNorm(data=fc6, name='fc6_batchnorm')
+ drop6 = mx.symbol.Dropout(data=fc6_bn, p=0.5, name="drop6")
+ relu6 = mx.symbol.Activation(data=drop6, act_type="relu", name="relu6")
+ # group 7
+ fc7 = mx.symbol.FullyConnected(data=relu6, num_hidden=4096, name="fc7")
+ fc7_bn = mx.sym.BatchNorm(data=fc7, name='fc7_batchnorm')
+ drop7 = mx.symbol.Dropout(data=fc7_bn, p=0.5, name="drop7")
+ relu7 = mx.symbol.Activation(data=drop7, act_type="relu", name="relu7")
+
+ # classification
+ cls_score = mx.symbol.FullyConnected(name='cls_score', data=relu7, num_hidden=num_classes)
+ cls_prob = mx.symbol.SoftmaxOutput(name='cls_prob', data=cls_score, label=label, normalization='batch')
+ # bounding box regression
+ bbox_pred = mx.symbol.FullyConnected(name='bbox_pred', data=relu7, num_hidden=num_classes * 4)
+ bbox_loss_ = bbox_weight * mx.symbol.smooth_l1(name='bbox_loss_', scalar=1.0, data=(bbox_pred - bbox_target))
+ bbox_loss = mx.sym.MakeLoss(name='bbox_loss', data=bbox_loss_, grad_scale=1.0 / config.TRAIN.BATCH_ROIS)
+
+ # reshape output
+ label = mx.symbol.Reshape(data=label, shape=(config.TRAIN.BATCH_IMAGES, -1), name='label_reshape')
+ cls_prob = mx.symbol.Reshape(data=cls_prob, shape=(config.TRAIN.BATCH_IMAGES, -1, num_classes), name='cls_prob_reshape')
+ bbox_loss = mx.symbol.Reshape(data=bbox_loss, shape=(config.TRAIN.BATCH_IMAGES, -1, 4 * num_classes), name='bbox_loss_reshape')
+
+ group = mx.symbol.Group([rpn_cls_prob, rpn_bbox_loss, cls_prob, bbox_loss, mx.symbol.BlockGrad(label)])
+ return group
diff --git a/example/rcnn/script/pvanet_voc07.sh b/example/rcnn/script/pvanet_voc07.sh
new file mode 100755
index 0000000000..e1ddd2e965
--- /dev/null
+++ b/example/rcnn/script/pvanet_voc07.sh
@@ -0,0 +1,7 @@
+gpu=${1:0:1}
+
+export MXNET_CUDNN_AUTOTUNE_DEFAULT=0
+export PYTHONUNBUFFERED=1
+
+python train_end2end.py --network pvanet --gpu $1
+python test.py --network pvanet --gpu $gpu
diff --git a/example/rcnn/train_end2end.py b/example/rcnn/train_end2end.py
index 24c658aeca..f0801ad9cb 100644
--- a/example/rcnn/train_end2end.py
+++ b/example/rcnn/train_end2end.py
@@ -93,6 +93,17 @@ def train_net(args, ctx, pretrained, epoch, prefix, begin_epoch, end_epoch,
arg_params['bbox_pred_weight'] = mx.random.normal(0, 0.001, shape=arg_shape_dict['bbox_pred_weight'])
arg_params['bbox_pred_bias'] = mx.nd.zeros(shape=arg_shape_dict['bbox_pred_bias'])
+ if args.network == 'pvanet':
+ arg_params['deconv_weight'] = mx.random.normal(0, 0.001, shape=arg_shape_dict['deconv_weight'])
+ arg_params['fc6_weight'] = mx.random.normal(0, 0.001, shape=arg_shape_dict['fc6_weight'])
+ arg_params['fc6_bias'] = mx.nd.zeros(shape=arg_shape_dict['fc6_bias'])
+ arg_params['fc7_weight'] = mx.random.normal(0, 0.001, shape=arg_shape_dict['fc7_weight'])
+ arg_params['fc7_bias'] = mx.nd.zeros(shape=arg_shape_dict['fc7_bias'])
+ arg_params['conf_rpn_weight'] = mx.random.normal(0, 0.001, shape=arg_shape_dict['conf_rpn_weight'])
+ arg_params['conf_rpn_bias'] = mx.nd.zeros(shape=arg_shape_dict['conf_rpn_bias'])
+ arg_params['conf_2_weight'] = mx.random.normal(0, 0.001, shape=arg_shape_dict['conf_2_weight'])
+ arg_params['conf_2_bias'] = mx.nd.zeros(shape=arg_shape_dict['conf_2_bias'])
+
# check parameter shapes
for k in sym.list_arguments():
if k in data_shape_dict:
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
With regards,
Apache Git Services