ijkguo / mx-rcnn

Parallel Faster R-CNN implementation with MXNet.
Other
671 stars 290 forks source link

ResNet: overflow problem in bbox #30

Closed longwoo closed 7 years ago

longwoo commented 8 years ago

Recently,I replaced VGG16 pretained model into VGG19,VGG_CNN_S,VGG_CNN_M_1024,and it worked. However, when I replace the VGG16 pretained model into ResNet,it gives me overflow problems as follow

/home/sp/mx-rcnn/helper/processing/bbox_transform.py:61: RuntimeWarning: overflow encountered in exp pred_w = np.exp(dw) * widths[:, np.newaxis]

And in the rpn training stage,the smoothL1Loss reduce little.

The symbol is like this

def get_resnet_conv(data):
    """
    shared convolutional layers
    :param data: Symbol
    :return: Symbol
    """
    filter_list = [64, 64, 128, 256, 512]

    data = mx.sym.BatchNorm(data=data, fix_gamma=True, eps=2e-5, momentum=0.9, name='bn_data')

    body = mx.sym.Convolution(data=data, num_filter=filter_list[0], kernel=(7, 7), stride=(2,2), pad=(3, 3),
                              no_bias=True, name="conv0", workspace=512)
    body = mx.sym.BatchNorm(data=body, fix_gamma=False, eps=2e-5, momentum=0.9, name='bn0')
    body = mx.sym.Activation(data=body, act_type='relu', name='relu0')
    body = mx.symbol.Pooling(data=body, kernel=(3, 3), stride=(2,2), pad=(1,1), pool_type='max',name='pooling0')

    name1_1 = 'stage%d_unit%d' % (1, 1)

    bn1 = mx.sym.BatchNorm(data=body, fix_gamma=False, momentum=0.9, eps=2e-5, name=name1_1 + '_bn1')
    act1 = mx.sym.Activation(data=bn1, act_type='relu', name=name1_1 + '_relu1')
    conv1 = mx.sym.Convolution(data=act1, num_filter=filter_list[1], kernel=(3, 3), stride=(1, 1), pad=(1, 1),
                               no_bias=True, workspace=512, name=name1_1 + '_conv1')
    bn2 = mx.sym.BatchNorm(data=conv1, fix_gamma=False, momentum=0.9, eps=2e-5, name=name1_1 + '_bn2')
    act2 = mx.sym.Activation(data=bn2, act_type='relu', name=name1_1 + '_relu2')
    conv2 = mx.sym.Convolution(data=act2, num_filter=filter_list[1], kernel=(3, 3), stride=(1, 1), pad=(1, 1),
                               no_bias=True, workspace=512, name=name1_1 + '_conv2')
    shortcut1_1 = mx.sym.Convolution(data=act1, num_filter=filter_list[1], kernel=(1, 1), stride=(1, 1), no_bias=True,
                                     workspace=512, name=name1_1 + '_sc')
    body1_1 = conv2 + shortcut1_1

    name1_2 = 'stage%d_unit%d' % (1, 2)

    bn1 = mx.sym.BatchNorm(data=body1_1, fix_gamma=False, momentum=0.9, eps=2e-5, name=name1_2 + '_bn1')
    act1 = mx.sym.Activation(data=bn1, act_type='relu', name=name1_2 + '_relu1')
    conv1 = mx.sym.Convolution(data=act1, num_filter=filter_list[1], kernel=(3, 3), stride=(1,1), pad=(1, 1),
                               no_bias=True, workspace=512, name=name1_2 + '_conv1')
    bn2 = mx.sym.BatchNorm(data=conv1, fix_gamma=False, momentum=0.9, eps=2e-5, name=name1_2 + '_bn2')
    act2 = mx.sym.Activation(data=bn2, act_type='relu', name=name1_2 + '_relu2')
    conv2 = mx.sym.Convolution(data=act2, num_filter=filter_list[1], kernel=(3, 3), stride=(1, 1), pad=(1, 1),
                               no_bias=True, workspace=512, name=name1_2 + '_conv2')
    shortcut1_2 = body1_1
    body1_2 = conv2 + shortcut1_2

    name2_1='stage%d_unit%d' % (2, 1)

    bn1 = mx.sym.BatchNorm(data=body1_2, fix_gamma=False, momentum=0.9, eps=2e-5, name=name2_1 + '_bn1')
    act1 = mx.sym.Activation(data=bn1, act_type='relu', name=name2_1 + '_relu1')
    conv1 = mx.sym.Convolution(data=act1, num_filter=filter_list[2], kernel=(3, 3), stride=(2, 2), pad=(1, 1),
                               no_bias=True, workspace=512, name=name2_1 + '_conv1')
    bn2 = mx.sym.BatchNorm(data=conv1, fix_gamma=False, momentum=0.9, eps=2e-5, name=name2_1 + '_bn2')
    act2 = mx.sym.Activation(data=bn2, act_type='relu', name=name2_1 + '_relu2')
    conv2 = mx.sym.Convolution(data=act2, num_filter=filter_list[2], kernel=(3, 3), stride=(1, 1), pad=(1, 1),
                               no_bias=True, workspace=512, name=name2_1 + '_conv2')
    shortcut2_1 = mx.sym.Convolution(data=act1, num_filter=filter_list[2], kernel=(1, 1), stride=(2, 2), no_bias=True,
                                  workspace=512, name=name2_1 + '_sc')
    body2_1 = conv2 + shortcut2_1

    name2_2 = 'stage%d_unit%d' % (2, 2)

    bn1 = mx.sym.BatchNorm(data=body2_1, fix_gamma=False, momentum=0.9, eps=2e-5, name=name2_2 + '_bn1')
    act1 = mx.sym.Activation(data=bn1, act_type='relu', name=name2_2 + '_relu1')
    conv1 = mx.sym.Convolution(data=act1, num_filter=filter_list[2], kernel=(3, 3), stride=(1, 1), pad=(1, 1),
                               no_bias=True, workspace=512, name=name2_2 + '_conv1')
    bn2 = mx.sym.BatchNorm(data=conv1, fix_gamma=False, momentum=0.9, eps=2e-5, name=name2_2 + '_bn2')
    act2 = mx.sym.Activation(data=bn2, act_type='relu', name=name2_2 + '_relu2')
    conv2 = mx.sym.Convolution(data=act2, num_filter=filter_list[2], kernel=(3, 3), stride=(1, 1), pad=(1, 1),
                               no_bias=True, workspace=512, name=name2_2 + '_conv2')
    shortcut2_2 = body2_1
    body2_2 = conv2 + shortcut2_2

    name3_1='stage%d_unit%d' % (3, 1)

    bn1 = mx.sym.BatchNorm(data=body2_2, fix_gamma=False, momentum=0.9, eps=2e-5, name=name3_1 + '_bn1')
    act1 = mx.sym.Activation(data=bn1, act_type='relu', name=name3_1 + '_relu1')
    conv1 = mx.sym.Convolution(data=act1, num_filter=filter_list[3], kernel=(3, 3), stride=(2, 2), pad=(1, 1),
                               no_bias=True, workspace=512, name=name3_1 + '_conv1')
    bn2 = mx.sym.BatchNorm(data=conv1, fix_gamma=False, momentum=0.9, eps=2e-5, name=name3_1 + '_bn2')
    act2 = mx.sym.Activation(data=bn2, act_type='relu', name=name3_1 + '_relu2')
    conv2 = mx.sym.Convolution(data=act2, num_filter=filter_list[3], kernel=(3, 3), stride=(1, 1), pad=(1, 1),
                               no_bias=True, workspace=512, name=name3_1 + '_conv2')
    shortcut3_1 = mx.sym.Convolution(data=act1, num_filter=filter_list[3], kernel=(1, 1), stride=(2, 2), no_bias=True,
                                  workspace=512, name=name3_1 + '_sc')
    body3_1 = conv2 + shortcut3_1

    name3_2 = 'stage%d_unit%d' % (3, 2)

    bn1 = mx.sym.BatchNorm(data=body3_1, fix_gamma=False, momentum=0.9, eps=2e-5, name=name3_2 + '_bn1')
    act1 = mx.sym.Activation(data=bn1, act_type='relu', name=name3_2 + '_relu1')
    conv1 = mx.sym.Convolution(data=act1, num_filter=filter_list[3], kernel=(3, 3), stride=(1, 1), pad=(1, 1),
                               no_bias=True, workspace=512, name=name3_2 + '_conv1')
    bn2 = mx.sym.BatchNorm(data=conv1, fix_gamma=False, momentum=0.9, eps=2e-5, name=name3_2 + '_bn2')
    act2 = mx.sym.Activation(data=bn2, act_type='relu', name=name3_2 + '_relu2')
    conv2 = mx.sym.Convolution(data=act2, num_filter=filter_list[3], kernel=(3, 3), stride=(1, 1), pad=(1, 1),
                               no_bias=True, workspace=512, name=name3_2 + '_conv2')
    shortcut3_2 = body3_1
    body3_2 = conv2 + shortcut3_2

    name4_1 = 'stage%d_unit%d' % (4, 1)
    body = residual_unit(body3_2, filter_list[4], (2, 2), False,
                         name=name4_1, bottle_neck=False, workspace=512)
    name4_2 = 'stage%d_unit%d' % (4, 2)
    body = residual_unit(body, filter_list[4], (1,1), True, name=name4_2,
                         bottle_neck=False, workspace=512)

    bn1 = mx.sym.BatchNorm(data=body, fix_gamma=False, eps=2e-5, momentum=0.9, name='bn1')
    resnet_conv4 = mx.sym.Activation(data=bn1, act_type='relu', name='relu1')

    return resnet_conv4
ijkguo commented 8 years ago

Some resources on resnet detection can be found at py-faster-rcnn/issues. Happy hacking!

tornadomeet commented 8 years ago

i have used resnet-50 for training face detection, https://github.com/tornadomeet/mx-rcnn/blob/master/rcnn/resnet.py, the fddb result you can found in https://github.com/tornadomeet/mxnet-face#face-detection.

ijkguo commented 7 years ago

Checkout ResNet support.