Skip to content

Instantly share code, notes, and snippets.

@longjon
Created December 29, 2014 04:43
Show Gist options
  • Select an option

  • Save longjon/1bf3aa1e0b8e788d7e1d to your computer and use it in GitHub Desktop.

Select an option

Save longjon/1bf3aa1e0b8e788d7e1d to your computer and use it in GitHub Desktop.

Revisions

  1. longjon created this gist Dec 29, 2014.
    124 changes: 124 additions & 0 deletions fcn-8s-pascal-deploy.prototxt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,124 @@
    name: 'FCN'

    input: 'data'
    input_dim: 1
    input_dim: 3
    input_dim: 500
    input_dim: 500
    force_backward: true

    layers { bottom: 'data' top: 'conv1_1' name: 'conv1_1' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 64 pad: 100 kernel_size: 3 } }
    layers { bottom: 'conv1_1' top: 'conv1_1' name: 'relu1_1' type: RELU }
    layers { bottom: 'conv1_1' top: 'conv1_2' name: 'conv1_2' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 64 pad: 1 kernel_size: 3 } }
    layers { bottom: 'conv1_2' top: 'conv1_2' name: 'relu1_2' type: RELU }
    layers { name: 'pool1' bottom: 'conv1_2' top: 'pool1' type: POOLING
    pooling_param { pool: MAX kernel_size: 2 stride: 2 } }
    layers { name: 'conv2_1' bottom: 'pool1' top: 'conv2_1' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 128 pad: 1 kernel_size: 3 } }
    layers { bottom: 'conv2_1' top: 'conv2_1' name: 'relu2_1' type: RELU }
    layers { bottom: 'conv2_1' top: 'conv2_2' name: 'conv2_2' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 128 pad: 1 kernel_size: 3 } }
    layers { bottom: 'conv2_2' top: 'conv2_2' name: 'relu2_2' type: RELU }
    layers { bottom: 'conv2_2' top: 'pool2' name: 'pool2' type: POOLING
    pooling_param { pool: MAX kernel_size: 2 stride: 2 } }
    layers { bottom: 'pool2' top: 'conv3_1' name: 'conv3_1' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 256 pad: 1 kernel_size: 3 } }
    layers { bottom: 'conv3_1' top: 'conv3_1' name: 'relu3_1' type: RELU }
    layers { bottom: 'conv3_1' top: 'conv3_2' name: 'conv3_2' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 256 pad: 1 kernel_size: 3 } }
    layers { bottom: 'conv3_2' top: 'conv3_2' name: 'relu3_2' type: RELU }
    layers { bottom: 'conv3_2' top: 'conv3_3' name: 'conv3_3' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 256 pad: 1 kernel_size: 3 } }
    layers { bottom: 'conv3_3' top: 'conv3_3' name: 'relu3_3' type: RELU }
    layers { bottom: 'conv3_3' top: 'pool3' name: 'pool3' type: POOLING
    pooling_param { pool: MAX kernel_size: 2 stride: 2 } }
    layers { bottom: 'pool3' top: 'conv4_1' name: 'conv4_1' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }
    layers { bottom: 'conv4_1' top: 'conv4_1' name: 'relu4_1' type: RELU }
    layers { bottom: 'conv4_1' top: 'conv4_2' name: 'conv4_2' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }
    layers { bottom: 'conv4_2' top: 'conv4_2' name: 'relu4_2' type: RELU }
    layers { bottom: 'conv4_2' top: 'conv4_3' name: 'conv4_3' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }
    layers { bottom: 'conv4_3' top: 'conv4_3' name: 'relu4_3' type: RELU }
    layers { bottom: 'conv4_3' top: 'pool4' name: 'pool4' type: POOLING
    pooling_param { pool: MAX kernel_size: 2 stride: 2 } }
    layers { bottom: 'pool4' top: 'conv5_1' name: 'conv5_1' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }
    layers { bottom: 'conv5_1' top: 'conv5_1' name: 'relu5_1' type: RELU }
    layers { bottom: 'conv5_1' top: 'conv5_2' name: 'conv5_2' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }
    layers { bottom: 'conv5_2' top: 'conv5_2' name: 'relu5_2' type: RELU }
    layers { bottom: 'conv5_2' top: 'conv5_3' name: 'conv5_3' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }
    layers { bottom: 'conv5_3' top: 'conv5_3' name: 'relu5_3' type: RELU }
    layers { bottom: 'conv5_3' top: 'pool5' name: 'pool5' type: POOLING
    pooling_param { pool: MAX kernel_size: 2 stride: 2 } }
    layers { bottom: 'pool5' top: 'fc6' name: 'fc6' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE kernel_size: 7 num_output: 4096 } }
    layers { bottom: 'fc6' top: 'fc6' name: 'relu6' type: RELU }
    layers { bottom: 'fc6' top: 'fc6' name: 'drop6' type: DROPOUT
    dropout_param { dropout_ratio: 0.5 } }
    layers { bottom: 'fc6' top: 'fc7' name: 'fc7' type: CONVOLUTION
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE kernel_size: 1 num_output: 4096 } }
    layers { bottom: 'fc7' top: 'fc7' name: 'relu7' type: RELU }
    layers { bottom: 'fc7' top: 'fc7' name: 'drop7' type: DROPOUT
    dropout_param { dropout_ratio: 0.5 } }
    layers { name: 'score-fr' type: CONVOLUTION bottom: 'fc7' top: 'score'
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 21 kernel_size: 1 } }

    layers { type: DECONVOLUTION name: 'score2' bottom: 'score' top: 'score2'
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { kernel_size: 4 stride: 2 num_output: 21 } }

    layers { name: 'score-pool4' type: CONVOLUTION bottom: 'pool4' top: 'score-pool4'
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 21 kernel_size: 1 } }

    layers { type: CROP name: 'crop' bottom: 'score-pool4' bottom: 'score2'
    top: 'score-pool4c' }

    layers { type: ELTWISE name: 'fuse' bottom: 'score2' bottom: 'score-pool4c'
    top: 'score-fused'
    eltwise_param { operation: SUM } }

    layers { type: DECONVOLUTION name: 'score4' bottom: 'score-fused'
    top: 'score4'
    blobs_lr: 1 weight_decay: 1
    convolution_param { bias_term: false kernel_size: 4 stride: 2 num_output: 21 } }

    layers { name: 'score-pool3' type: CONVOLUTION bottom: 'pool3' top: 'score-pool3'
    blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0
    convolution_param { engine: CAFFE num_output: 21 kernel_size: 1 } }

    layers { type: CROP name: 'crop' bottom: 'score-pool3' bottom: 'score4'
    top: 'score-pool3c' }

    layers { type: ELTWISE name: 'fuse' bottom: 'score4' bottom: 'score-pool3c'
    top: 'score-final'
    eltwise_param { operation: SUM } }

    layers { type: DECONVOLUTION name: 'upsample'
    bottom: 'score-final' top: 'bigscore'
    blobs_lr: 0
    convolution_param { bias_term: false num_output: 21 kernel_size: 16 stride: 8 } }

    layers { type: CROP name: 'crop' bottom: 'bigscore' bottom: 'data' top: 'upscore' }
    24 changes: 24 additions & 0 deletions readme.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,24 @@
    ---
    name: FCN-8s Fully Convolutional Semantic Segmentation on PASCAL
    caffemodel: fcn-8s-pascal.caffemodel
    caffemodel_url: http://dl.caffe.berkeleyvision.org/fcn-8s-pascal.caffemodel
    sha1: dc0bb04ba469599e8f9744de72146edaec9d94a8
    ---

    This is a model from the [paper](http://cs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf):

    Fully Convolutional Networks for Semantic Segmentation
    Jonathan Long, Evan Shelhamer, Trevor Darrell
    arXiv:1411.4038

    This is the three stream, 8 pixel prediction stride version.

    This model was trained for the 21-class (including background) PASCAL VOC segmentation task. The final layer outputs scores for each class, which may be normalized via softmax or argmaxed to obtain per-pixel labels. The first label (index zero) is background, with the rest following the standard alphabetical ordering.

    The input is expected in BGR channel order, with the following per-channel mean subtracted:

    B 104.00698793 G 116.66876762 R 122.67891434

    This is a pre-release: it requires unmerged PRs to run. It should be usable with the branch available at https://github.com/longjon/caffe/tree/future. Training ought to be possible with that code, but the original training scripts have not yet been ported.

    This model obtains 67.5 mean I/U on PASCAL seg val 2011 and 62.2 mean I/U on PASCAL seg test 2012.