alexgkendall / SegNet-Tutorial

Files for a tutorial to train SegNet for road scenes using the CamVid dataset
http://mi.eng.cam.ac.uk/projects/segnet/tutorial.html
847 stars 517 forks source link

Train on Pascal VOC2012 #56

Open marshallixp opened 7 years ago

marshallixp commented 7 years ago

Hi,

I'm trying to use segnet on the Pascal VOC2012 dataset. I modified a little to make the network suit for different input size as shown in Pascal. But, unfortunately, I found it still hard to converge. I add the net make function here and I'm looking forward any help. Thanks in advance.

def segnet(split):
    n = caffe.NetSpec()

    pydata_params = dict(split=split, mean=(104.00699, 116.66877, 122.67892),
                         seed=1337)
    pydata_params['voc_dir'] = '/mnt/hdd0/PascalVOC/VOCdevkit/VOC2012'
    pylayer = 'VOCSegDataLayer'
    n.data, n.label = L.Python(module='voc_layers', layer=pylayer,
                               ntop=2, param_str=str(pydata_params))

    n.conv1_1, n.conv1_1_bn, n.relu1_1 = conv_bn_relu(n.data, 64, param=frozen_param)
    n.conv1_2, n.conv1_2_bn, n.relu1_2 = conv_bn_relu(n.conv1_1, 64, param=frozen_param)
    n.pool1, n.pool1_mask = max_pool(n.conv1_2)

    n.conv2_1, n.conv2_1_bn, n.relu2_1 = conv_bn_relu(n.pool1, 128, param=frozen_param)
    n.conv2_2, n.conv2_2_bn, n.relu2_2 = conv_bn_relu(n.conv2_1, 128, param=frozen_param)
    n.pool2, n.pool2_mask = max_pool(n.conv2_2)

    n.conv3_1, n.conv3_1_bn, n.relu3_1 = conv_bn_relu(n.pool2, 256, param=frozen_param)
    n.conv3_2, n.conv3_2_bn, n.relu3_2 = conv_bn_relu(n.conv3_1, 256, param=frozen_param)
    n.conv3_3, n.conv3_3_bn, n.relu3_3 = conv_bn_relu(n.conv3_2, 256, param=frozen_param)
    n.pool3, n.pool3_mask = max_pool(n.conv3_3)

    n.conv4_1, n.conv4_1_bn, n.relu4_1 = conv_bn_relu(n.pool3, 512, param=frozen_param)
    n.conv4_2, n.conv4_2_bn, n.relu4_2 = conv_bn_relu(n.conv4_1, 512, param=frozen_param)
    n.conv4_3, n.conv4_3_bn, n.relu4_3 = conv_bn_relu(n.conv4_2, 512, param=frozen_param)
    n.pool4, n.pool4_mask = max_pool(n.conv4_3)

    n.conv5_1, n.conv5_1_bn, n.relu5_1 = conv_bn_relu(n.pool4, 512, param=frozen_param)
    n.conv5_2, n.conv5_2_bn, n.relu5_2 = conv_bn_relu(n.conv5_1, 512, param=frozen_param)
    n.conv5_3, n.conv5_3_bn, n.relu5_3 = conv_bn_relu(n.conv5_2, 512, param=frozen_param)
    n.pool5, n.pool5_mask = max_pool(n.conv5_3)

    n.upsample5 = upsample(n.pool5, n.pool5_mask, w=-1, h=-1)
    n.conv5_3_D, n.conv5_3_bn_D, n.relu5_3_D = conv_bn_relu(n.upsample5, 512)
    n.conv5_2_D, n.conv5_2_bn_D, n.relu5_2_D = conv_bn_relu(n.conv5_3_D, 512)
    n.conv5_1_D, n.conv5_1_bn_D, n.relu5_1_D = conv_bn_relu(n.conv5_2_D, 512)

    n.conv5_1_D_crop = L.Crop(n.conv5_1_D, n.pool4_mask, crop_param=dict(axis=2, offset=[0, 0]))
    n.upsample4 = upsample(n.conv5_1_D_crop, n.pool4_mask, w=-1, h=-1)
    n.conv4_3_D, n.conv4_3_bn_D, n.relu4_3_D = conv_bn_relu(n.upsample4, 512)
    n.conv4_2_D, n.conv4_2_bn_D, n.relu4_2_D = conv_bn_relu(n.conv4_3_D, 512)
    n.conv4_1_D, n.conv4_1_bn_D, n.relu4_1_D = conv_bn_relu(n.conv4_2_D, 256)

    n.conv4_1_D_crop = L.Crop(n.conv4_1_D, n.pool3_mask, crop_param=dict(axis=2, offset=[0, 0]))
    n.upsample3 = upsample(n.conv4_1_D_crop, n.pool3_mask, w=-1, h=-1)
    n.conv3_3_D, n.conv3_3_bn_D, n.relu3_3_D = conv_bn_relu(n.upsample3, 256)
    n.conv3_2_D, n.conv3_2_bn_D, n.relu3_2_D = conv_bn_relu(n.conv3_3_D, 256)
    n.conv3_1_D, n.conv3_1_bn_D, n.relu3_1_D = conv_bn_relu(n.conv3_2_D, 128)

    n.conv3_1_D_crop = L.Crop(n.conv3_1_D, n.pool2_mask, crop_param=dict(axis=2, offset=[0, 0]))
    n.upsample2 = upsample(n.conv3_1_D_crop, n.pool2_mask, w=-1, h=-1)
    n.conv2_2_D, n.conv2_2_bn_D, n.relu2_2_D = conv_bn_relu(n.upsample2, 128)
    n.conv2_1_D, n.conv2_1_bn_D, n.relu2_1_D = conv_bn_relu(n.conv2_2_D, 64)

    n.conv2_1_D_crop = L.Crop(n.conv2_1_D, n.pool1_mask, crop_param=dict(axis=2, offset=[0, 0]))
    n.upsample1 = upsample(n.conv2_1_D_crop, n.pool1_mask, w=-1, h=-1)
    n.conv1_2_D, n.conv1_2_bn_D, n.relu1_2_D = conv_bn_relu(n.upsample1, 64)
    n.conv1_1_D = L.Convolution(n.conv1_2_D, kernel_size=3, stride=1,
                                num_output=21, pad=1, param=learned_param)

    n.score = L.Crop(n.conv1_1_D, n.data, crop_param=dict(axis=2, offset=[0, 0]))

    n.loss = L.SoftmaxWithLoss(n.score, n.label,
                               loss_param=dict(ignore_label=255, normalize=True),
                               softmax_param=dict(engine=2))
    n.accuracy, n.per_class_accuracy = L.Accuracy(
        n.score, n.label, ntop=2)

    return n.to_proto()
ksnzh commented 7 years ago

May you release the whole python file that defines the SegNet? It will help me a lot. Thanks.