圖像識別-ResNet-18網絡結構圖示及解讀

一、介紹

ResNet系列網絡,圖像分類領域的知名算法,經久不衰,歷久彌新,直到今天依舊具有廣泛的研究意義和應用場景。被業界各種改進,經常用於圖像識別任務。

今天主要介紹一下ResNet-18網絡結構,其他深層次網絡,可以依次類推。

ResNet-18,數字代表的是網絡的深度,也就是說ResNet18 網絡就是18層的嗎?實則不然,其實這裏的18指定的是帶有權重的 18層,包括卷積層和全連接層,不包括池化層和BN層。

二、網絡結構

本文主要基於caffe框架,解讀Resnet-18網絡結構~

1. 網絡參數

在這裏插入圖片描述

2. 網絡圖示

網絡結構圖,由caffe train.prototxt文件內容繪製:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
caffe train.prototxt文件內容:

name: "ResNet-18"

layer {
  name: "data"
    type: "Data"
    top: "data"
    top: "label"
    include {
    phase: TRAIN
      }
  transform_param {
    mirror: true
      crop_size: 224
      mean_file: "/home/vgenty/git/caffe/build/tools/ub_seven_class_train_mean.binary"
      }
  data_param {
    source: "/home/vgenty/git/caffe/build/tools/ub_seven_class_train.db"
      batch_size: 8
      backend: LMDB
      }

}

layer {
  name: "data"
    type: "Data"
    top: "data"
    top: "label"
    include {
    phase: TEST
      }
  transform_param {
    mirror: false
      crop_size: 224
      mean_file: "/home/vgenty/git/caffe/build/tools/ub_seven_class_valid_mean.binary"
      }
  data_param {
    source: "/home/vgenty/git/caffe/build/tools/ub_seven_class_valid.db"
      batch_size:8
      backend: LMDB
      }
}

layer {
  bottom: "data"
    top: "conv1"
    name: "conv1"
    type: "Convolution"
    convolution_param {
    num_output: 64
      kernel_size: 7
      pad: 3
      stride: 2
      }
}

layer {
  bottom: "conv1"
    top: "conv1"
    name: "bn_conv1"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "conv1"
    top: "conv1"
    name: "scale_conv1"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "conv1"
    top: "conv1"
    name: "conv1_relu"
    type: "ReLU"
    }

layer {
  bottom: "conv1"
    top: "pool1"
    name: "pool1"
    type: "Pooling"
    pooling_param {
    kernel_size: 3
      stride: 2
      pool: MAX
      }
}
##########################
######first shortcut######
##########################
layer {
  bottom: "pool1"
    top: "res2a_branch1"
    name: "res2a_branch1"
    type: "Convolution"
    convolution_param {
    num_output: 64
      kernel_size: 1
      pad: 0
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res2a_branch1"
    top: "res2a_branch1"
    name: "bn2a_branch1"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res2a_branch1"
    top: "res2a_branch1"
    name: "scale2a_branch1"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "pool1"
    top: "res2a_branch2a"
    name: "res2a_branch2a"
    type: "Convolution"
    convolution_param {
    num_output: 64
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res2a_branch2a"
    top: "res2a_branch2a"
    name: "bn2a_branch2a"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res2a_branch2a"
    top: "res2a_branch2a"
    name: "scale2a_branch2a"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res2a_branch2a"
    top: "res2a_branch2a"
    name: "res2a_branch2a_relu"
    type: "ReLU"
    }

layer {
  bottom: "res2a_branch2a"
    top: "res2a_branch2b"
    name: "res2a_branch2b"
    type: "Convolution"
    convolution_param {
    num_output: 64
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res2a_branch2b"
    top: "res2a_branch2b"
    name: "bn2a_branch2b"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res2a_branch2b"
    top: "res2a_branch2b"
    name: "scale2a_branch2b"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
    bottom: "res2a_branch1"
    bottom: "res2a_branch2b"
    top: "res2a"
    name: "res2a"
    type: "Eltwise"
    }

layer {
  bottom: "res2a"
    top: "res2a"
    name: "res2a_relu"
    type: "ReLU"
    }

##########################
######first-2 shortcut####
##########################

layer {
  bottom: "res2a"
    top: "res2b_branch1"
    name: "res2b_branch1"
    type: "Convolution"
    convolution_param {
    num_output: 64
      kernel_size: 1
      pad: 0
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res2b_branch1"
    top: "res2b_branch1"
    name: "bn2b_branch1"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res2b_branch1"
    top: "res2b_branch1"
    name: "scale2b_branch1"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}


layer {
    bottom: "res2a"
    top: "res2b_branch2a"
    name: "res2b_branch2a"
    type: "Convolution"
    convolution_param {
    num_output: 64
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res2b_branch2a"
    top: "res2b_branch2a"
    name: "bn2b_branch2a"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res2b_branch2a"
    top: "res2b_branch2a"
    name: "scale2b_branch2a"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res2b_branch2a"
    top: "res2b_branch2a"
    name: "res2b_branch2a_relu"
    type: "ReLU"
    }

layer {
  bottom: "res2b_branch2a"
    top: "res2b_branch2b"
    name: "res2b_branch2b"
    type: "Convolution"
    convolution_param {
    num_output: 64
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res2b_branch2b"
    top: "res2b_branch2b"
    name: "bn2b_branch2b"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res2b_branch2b"
    top: "res2b_branch2b"
    name: "scale2b_branch2b"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
    bottom: "res2b_branch1"
    bottom: "res2b_branch2b"
    top: "res2b"
    name: "res2b"
    type: "Eltwise"
    }

layer {
  bottom: "res2b"
    top: "res2b"
    name: "res2b_relu"
    type: "ReLU"
    }


##########################
######second shortcut#####
##########################

layer {
  bottom: "res2b"
    top: "res3a_branch1"
    name: "res3a_branch1"
    type: "Convolution"
    convolution_param {
    num_output: 128
      kernel_size: 1
      pad: 0
      stride: 2
      bias_term: false
      }
}

layer {
  bottom: "res3a_branch1"
    top: "res3a_branch1"
    name: "bn3a_branch1"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res3a_branch1"
    top: "res3a_branch1"
    name: "scale3a_branch1"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res2b"
    top: "res3a_branch2a"
    name: "res3a_branch2a"
    type: "Convolution"
    convolution_param {
    num_output: 128
      kernel_size: 3
      pad: 1
      stride: 2
      bias_term: false
      }
}

layer {
  bottom: "res3a_branch2a"
    top: "res3a_branch2a"
    name: "bn3a_branch2a"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res3a_branch2a"
    top: "res3a_branch2a"
    name: "scale3a_branch2a"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res3a_branch2a"
    top: "res3a_branch2a"
    name: "res3a_branch2a_relu"
    type: "ReLU"
    }

layer {
  bottom: "res3a_branch2a"
    top: "res3a_branch2b"
    name: "res3a_branch2b"
    type: "Convolution"
    convolution_param {
    num_output: 128
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res3a_branch2b"
    top: "res3a_branch2b"
    name: "bn3a_branch2b"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res3a_branch2b"
    top: "res3a_branch2b"
    name: "scale3a_branch2b"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res3a_branch1"
    bottom: "res3a_branch2b"
    top: "res3a"
    name: "res3a"
    type: "Eltwise"
    }

layer {
  bottom: "res3a"
    top: "res3a"
    name: "res3a_relu"
    type: "ReLU"
    }


##########################
######second-2 shortcut#####
##########################

layer {
  bottom: "res3a"
    top: "res3b_branch1"
    name: "res3b_branch1"
    type: "Convolution"
    convolution_param {
    num_output: 128
      kernel_size: 1
      pad: 0
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res3b_branch1"
    top: "res3b_branch1"
    name: "bn3b_branch1"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res3b_branch1"
    top: "res3b_branch1"
    name: "scale3b_branch1"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}


layer {
  bottom: "res3a"
    top: "res3b_branch2a"
    name: "res3b_branch2a"
    type: "Convolution"
    convolution_param {
    num_output: 128
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res3b_branch2a"
    top: "res3b_branch2a"
    name: "bn3b_branch2a"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res3b_branch2a"
    top: "res3b_branch2a"
    name: "scale3b_branch2a"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res3b_branch2a"
    top: "res3b_branch2a"
    name: "res3b_branch2a_relu"
    type: "ReLU"
    }

layer {
  bottom: "res3b_branch2a"
    top: "res3b_branch2b"
    name: "res3b_branch2b"
    type: "Convolution"
    convolution_param {
    num_output: 128
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res3b_branch2b"
    top: "res3b_branch2b"
    name: "bn3b_branch2b"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res3b_branch2b"
    top: "res3b_branch2b"
    name: "scale3b_branch2b"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res3b_branch1"
    bottom: "res3b_branch2b"
    top: "res3b"
    name: "res3b"
    type: "Eltwise"
    }

layer {
  bottom: "res3b"
    top: "res3b"
    name: "res3b_relu"
    type: "ReLU"
    }

##########################
######third shortcut#####
##########################

layer {
  bottom: "res3b"
    top: "res4a_branch1"
    name: "res4a_branch1"
    type: "Convolution"
    convolution_param {
    num_output: 256
      kernel_size: 1
      pad: 0
      stride: 2
      bias_term: false
      }
}

layer {
  bottom: "res4a_branch1"
    top: "res4a_branch1"
    name: "bn4a_branch1"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res4a_branch1"
    top: "res4a_branch1"
    name: "scale4a_branch1"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res3b"
    top: "res4a_branch2a"
    name: "res4a_branch2a"
    type: "Convolution"
    convolution_param {
    num_output: 256
      kernel_size: 3
      pad: 1
      stride: 2
      bias_term: false
      }
}

layer {
  bottom: "res4a_branch2a"
    top: "res4a_branch2a"
    name: "bn4a_branch2a"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res4a_branch2a"
    top: "res4a_branch2a"
    name: "scale4a_branch2a"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res4a_branch2a"
    top: "res4a_branch2a"
    name: "res4a_branch2a_relu"
    type: "ReLU"
    }

layer {
  bottom: "res4a_branch2a"
    top: "res4a_branch2b"
    name: "res4a_branch2b"
    type: "Convolution"
    convolution_param {
    num_output: 256
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res4a_branch2b"
    top: "res4a_branch2b"
    name: "bn4a_branch2b"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res4a_branch2b"
    top: "res4a_branch2b"
    name: "scale4a_branch2b"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res4a_branch1"
    bottom: "res4a_branch2b"
    top: "res4a"
    name: "res4a"
    type: "Eltwise"
    }

layer {
  bottom: "res4a"
    top: "res4a"
    name: "res4a_relu"
    type: "ReLU"
    }



###########################
######third-2 shortcut#####
##########################

layer {
  bottom: "res4a"
    top: "res4b_branch1"
    name: "res4b_branch1"
    type: "Convolution"
    convolution_param {
    num_output: 256
      kernel_size: 1
      pad: 0
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res4b_branch1"
    top: "res4b_branch1"
    name: "bn4b_branch1"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res4b_branch1"
    top: "res4b_branch1"
    name: "scale4b_branch1"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}


layer {
  bottom: "res4a"
    top: "res4b_branch2a"
    name: "res4b_branch2a"
    type: "Convolution"
    convolution_param {
    num_output: 256
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res4b_branch2a"
    top: "res4b_branch2a"
    name: "bn4b_branch2a"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res4b_branch2a"
    top: "res4b_branch2a"
    name: "scale4b_branch2a"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res4b_branch2a"
    top: "res4b_branch2a"
    name: "res4b_branch2a_relu"
    type: "ReLU"
    }

layer {
  bottom: "res4b_branch2a"
    top: "res4b_branch2b"
    name: "res4b_branch2b"
    type: "Convolution"
    convolution_param {
    num_output: 256
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res4b_branch2b"
    top: "res4b_branch2b"
    name: "bn4b_branch2b"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res4b_branch2b"
    top: "res4b_branch2b"
    name: "scale4b_branch2b"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res4b_branch1"
    bottom: "res4b_branch2b"
    top: "res4b"
    name: "res4b"
    type: "Eltwise"
    }

layer {
  bottom: "res4b"
    top: "res4b"
    name: "res4b_relu"
    type: "ReLU"
    }
##########################
######forth shortcut#####
##########################

layer {
  bottom: "res4b"
    top: "res5a_branch1"
    name: "res5a_branch1"
    type: "Convolution"
    convolution_param {
    num_output: 512
      kernel_size: 1
      pad: 0
      stride: 2
      bias_term: false
      }
}

layer {
  bottom: "res5a_branch1"
    top: "res5a_branch1"
    name: "bn5a_branch1"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res5a_branch1"
    top: "res5a_branch1"
    name: "scale5a_branch1"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res4b"
    top: "res5a_branch2a"
    name: "res5a_branch2a"
    type: "Convolution"
    convolution_param {
    num_output: 512
      kernel_size: 3
      pad: 1
      stride: 2
      bias_term: false
      }
}

layer {
  bottom: "res5a_branch2a"
    top: "res5a_branch2a"
    name: "bn5a_branch2a"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res5a_branch2a"
    top: "res5a_branch2a"
    name: "scale5a_branch2a"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res5a_branch2a"
    top: "res5a_branch2a"
    name: "res5a_branch2a_relu"
    type: "ReLU"
    }

layer {
  bottom: "res5a_branch2a"
    top: "res5a_branch2b"
    name: "res5a_branch2b"
    type: "Convolution"
    convolution_param {
    num_output: 512
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res5a_branch2b"
    top: "res5a_branch2b"
    name: "bn5a_branch2b"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res5a_branch2b"
    top: "res5a_branch2b"
    name: "scale5a_branch2b"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}


layer {
  bottom: "res5a_branch1"
    bottom: "res5a_branch2b"
    top: "res5a"
    name: "res5a"
    type: "Eltwise"
    }

layer {
  bottom: "res5a"
    top: "res5a"
    name: "res5a_relu"
    type: "ReLU"
    }


##########################
######forth-2 shortcut#####
##########################

layer {
  bottom: "res5a"
    top: "res5b_branch1"
    name: "res5b_branch1"
    type: "Convolution"
    convolution_param {
    num_output: 512
      kernel_size: 1
      pad: 0
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res5b_branch1"
    top: "res5b_branch1"
    name: "bn5b_branch1"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res5b_branch1"
    top: "res5b_branch1"
    name: "scale5b_branch1"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}


layer {
  bottom: "res5a"
    top: "res5b_branch2a"
    name: "res5b_branch2a"
    type: "Convolution"
    convolution_param {
    num_output: 512
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res5b_branch2a"
    top: "res5b_branch2a"
    name: "bn5b_branch2a"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res5b_branch2a"
    top: "res5b_branch2a"
    name: "scale5b_branch2a"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res5b_branch2a"
    top: "res5b_branch2a"
    name: "res5b_branch2a_relu"
    type: "ReLU"
    }

layer {
  bottom: "res5b_branch2a"
    top: "res5b_branch2b"
    name: "res5b_branch2b"
    type: "Convolution"
    convolution_param {
    num_output: 512
      kernel_size: 3
      pad: 1
      stride: 1
      bias_term: false
      }
}

layer {
  bottom: "res5b_branch2b"
    top: "res5b_branch2b"
    name: "bn5b_branch2b"
    type: "BatchNorm"
    batch_norm_param {
    use_global_stats: true
      }
}

layer {
  bottom: "res5b_branch2b"
    top: "res5b_branch2b"
    name: "scale5b_branch2b"
    type: "Scale"
    scale_param {
    bias_term: true
      }
}

layer {
  bottom: "res5b_branch1"
    bottom: "res5b_branch2b"
    top: "res5b"
    name: "res5b"
    type: "Eltwise"
    }

layer {
  bottom: "res5b"
    top: "res5b"
    name: "res5b_relu"
    type: "ReLU"
    }

layer {
  bottom: "res5b"
    top: "pool5"
    name: "pool5"
    type: "Pooling"
    pooling_param {
    kernel_size: 7
      stride: 1
      pool: AVE
      }
}

layer {
  bottom: "pool5"
    top: "fc7"
    name: "fc7"
    type: "InnerProduct"
    inner_product_param {
    num_output: 7
      }
}

#layer {
#  bottom: "fc7"
#    top: "prob"
#    name: "prob"
#    type: "Softmax"
#    }

  layer {
    name: "loss"
      type: "SoftmaxWithLoss"
      bottom: "fc7"
      bottom: "label"
      top: "loss"
      }

layer {
  name: "accuracy"
    type: "Accuracy"
    bottom: "fc7"
    bottom: "label"
    top: "accuracy"
    include {
    phase: TEST
      }
}

詳細參數設置,可查看以上文件內容定義。

三、總結

ResNet及其變體網路系列,對於一般的圖像識別任務表現優異,具體場景的算法應用,可以結合實際情況,進行具體網絡結構改進,如網路裁剪,網絡加深或其它策略,可以進行實踐改進。

碼字不易,如有不對,歡迎留言交流~

您的支持,是我不斷創作的最大動力~

歡迎點贊關注留言交流~

深度學習,樂此不疲~

個人微信公衆號,歡迎關注~
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章