voc-fcn-alexnet网络结构理解

一、写在前面

fcn是首次使用cnn来实现语义分割的,论文地址:fully convolutional networks for semantic segmentation

实现代码地址:https://github.com/shelhamer/fcn.berkeleyvision.org

全卷积神经网络主要使用了三种技术:

1. 卷积化(Convolutional)

2. 上采样(Upsample)

3. 跳跃结构(Skip Layer)

为了便于理解,我拿最简单的结构voc-fcn-alexnet进行说明,该网络结构主要用到了前面两个技术,不包含跳跃结构。

二、voc-fcn-alexnet 的train.prototxt文件

layer {
  name: "data"
  type: "Python"
  top: "data"
  top: "label"
  python_param {
    module: "voc_layers"
    layer: "SBDDSegDataLayer"
    param_str: "{\‘sbdd_dir\‘: \‘../data/sbdd/dataset\‘, \‘seed\‘: 1337, \‘split\‘: \‘train\‘, \‘mean\‘: (104.00699, 116.66877, 122.67892)}"
  }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  convolution_param {
    num_output: 96
    pad: 100
    kernel_size: 11
    group: 1
    stride: 4
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}
layer {
  name: "norm1"
  type: "LRN"
  bottom: "pool1"
  top: "norm1"
  lrn_param {
    local_size: 5
    alpha: 0.0001
    beta: 0.75
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "norm1"
  top: "conv2"
  convolution_param {
    num_output: 256
    pad: 2
    kernel_size: 5
    group: 2
    stride: 1
  }
}
layer {
  name: "relu2"
  type: "ReLU"
  bottom: "conv2"
  top: "conv2"
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}
layer {
  name: "norm2"
  type: "LRN"
  bottom: "pool2"
  top: "norm2"
  lrn_param {
    local_size: 5
    alpha: 0.0001
    beta: 0.75
  }
}
layer {
  name: "conv3"
  type: "Convolution"
  bottom: "norm2"
  top: "conv3"
  convolution_param {
    num_output: 384
    pad: 1
    kernel_size: 3
    group: 1
    stride: 1
  }
}
layer {
  name: "relu3"
  type: "ReLU"
  bottom: "conv3"
  top: "conv3"
}
layer {
  name: "conv4"
  type: "Convolution"
  bottom: "conv3"
  top: "conv4"
  convolution_param {
    num_output: 384
    pad: 1
    kernel_size: 3
    group: 2
    stride: 1
  }
}
layer {
  name: "relu4"
  type: "ReLU"
  bottom: "conv4"
  top: "conv4"
}
layer {
  name: "conv5"
  type: "Convolution"
  bottom: "conv4"
  top: "conv5"
  convolution_param {
    num_output: 256
    pad: 1
    kernel_size: 3
    group: 2
    stride: 1
  }
}
layer {
  name: "relu5"
  type: "ReLU"
  bottom: "conv5"
  top: "conv5"
}
layer {
  name: "pool5"
  type: "Pooling"
  bottom: "conv5"
  top: "pool5"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}
layer {
  name: "fc6"
  type: "Convolution"
  bottom: "pool5"
  top: "fc6"
  convolution_param {
    num_output: 4096
    pad: 0
    kernel_size: 6
    group: 1
    stride: 1
  }
}
layer {
  name: "relu6"
  type: "ReLU"
  bottom: "fc6"
  top: "fc6"
}
layer {
  name: "drop6"
  type: "Dropout"
  bottom: "fc6"
  top: "fc6"
  dropout_param {
    dropout_ratio: 0.5
  }
}
layer {
  name: "fc7"
  type: "Convolution"
  bottom: "fc6"
  top: "fc7"
  convolution_param {
    num_output: 4096
    pad: 0
    kernel_size: 1
    group: 1
    stride: 1
  }
}
layer {
  name: "relu7"
  type: "ReLU"
  bottom: "fc7"
  top: "fc7"
}
layer {
  name: "drop7"
  type: "Dropout"
  bottom: "fc7"
  top: "fc7"
  dropout_param {
    dropout_ratio: 0.5
  }
}
layer {
  name: "score_fr"
  type: "Convolution"
  bottom: "fc7"
  top: "score_fr"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 21
    pad: 0
    kernel_size: 1
  }
}
layer {
  name: "upscore"
  type: "Deconvolution"
  bottom: "score_fr"
  top: "upscore"
  param {
    lr_mult: 0
  }
  convolution_param {
    num_output: 21
    bias_term: false
    kernel_size: 63
    stride: 32
  }
}
layer {
  name: "score"
  type: "Crop"
  bottom: "upscore"
  bottom: "data"
  top: "score"
  crop_param {
    axis: 2
    offset: 18
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "score"
  bottom: "label"
  top: "loss"
  loss_param {
    ignore_label: 255
    normalize: true
  }
}

三、网络结构

假设输入的图片为500x500,

根据train.prototxt文件,可以得到上图的网络结构,该网络结构除了前五层的卷积层,也把后面的三层也该为了卷积层,score_fr是卷积层的最后一层,也叫heatmap热图,热图就是我们最重要的高维特诊图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling(即反卷积),把图像进行放大,得到原图像的大小。

四、损失函数

该网络的损失函数为SoftmaxWithLoss。首先进行softmax求解,求出每个像素点属于不同类别的概率,因为总共是分为21类,所以输出的通道数为21,即每个像素点对应21个概率值。然后求解每个像素点所属实际类别概率的log值之和的平均,再取负数,可得到损失函数,参考如下:

end

原文地址:https://www.cnblogs.com/smbx-ztbz/p/10505289.html

时间: 2024-07-31 22:51:54

voc-fcn-alexnet网络结构理解的相关文章

caffe AlexNet模型理解

之前看了CaffeNet,现在再看看这AlexNet,主要是为了帮助理解论文. 这里主要是记录一些和CaffeNet的不同的地方. 第一层:主要是先归一化再池化 第二层:偏差为0.1.先归一化后池化 第三层:一模一样 第四层:偏差为0.1. 第五层:偏差为0.1. 第六层:偏差为0.1 第七层:偏差为0.1 从上图,也可以看出,跟caffenet,就是卷积和归一化的顺序,以及偏差大小不同的差距.

Xception网络结构理解

Xception网络是由inception结构加上depthwise separable convlution,再加上残差网络结构改进而来/ 常规卷积是直接通过一个卷积核把空间信息和通道信息直接提取出来,结合了spatial dimensions和channels dimensions:xception这种是分开做的. 它最初的想法是从Incetpion来的,总体思想是把corss-channel correlations和spatial correlations充分解耦合: 将Inceptio

卷积网络之-----AlexNet网络结构

AlexNet网络是由5个卷积层和3个全连接层构成 下面这个是一个平面图,可能会更好看一些: 1                                  2                           3                           4                               5 6                              7                          8                   

【深度学习系列】用PaddlePaddle和Tensorflow实现AlexNet

上周我们用PaddlePaddle和Tensorflow实现了图像分类,分别用自己手写的一个简单的CNN网络simple_cnn和LeNet-5的CNN网络识别cifar-10数据集.在上周的实验表现中,经过200次迭代后的LeNet-5的准确率为60%左右,这个结果差强人意,毕竟是二十年前写的网络结构,结果简单,层数也很少,这一节中我们讲讲在2012年的Image比赛中大放异彩的AlexNet,并用AlexNet对cifar-10数据进行分类,对比上周的LeNet-5的效果. 什么是AlexN

LeNet,AlexNet,GoogleLeNet,VggNet等网络对比

CNN的发展史 上一篇回顾讲的是2006年Hinton他们的Science Paper,当时提到,2006年虽然Deep Learning的概念被提出来了,但是学术界的大家还是表示不服.当时有流传的段子是Hinton的学生在台上讲paper时,台下的机器学习大牛们不屑一顾,质问你们的东西有理论推导吗?有数学基础吗?搞得过SVM之类吗?回头来看,就算是真的,大牛们也确实不算无理取闹,是骡子是马拉出来遛遛,不要光提个概念. 时间终于到了2012年,Hinton的学生Alex Krizhevsky在寝

#Deep Learning回顾#之LeNet、AlexNet、GoogLeNet、VGG、ResNet

CNN的发展史 上一篇回顾讲的是2006年Hinton他们的Science Paper,当时提到,2006年虽然Deep Learning的概念被提出来了,但是学术界的大家还是表示不服.当时有流传的段子是Hinton的学生在台上讲paper时,台下的机器学习大牛们不屑一顾,质问你们的东西有理论推导吗?有数学基础吗?搞得过SVM之类吗?回头来看,就算是真的,大牛们也确实不算无理取闹,是骡子是马拉出来遛遛,不要光提个概念. 时间终于到了2012年,Hinton的学生Alex Krizhevsky在寝

TensorFlow实战之实现AlexNet经典卷积神经网络

本文已同步本人另外一个博客(http://blog.csdn.net/qq_37608890/article/details/79371347) 本文根据最近学习TensorFlow书籍网络文章的情况,特将一些学习心得做了总结,详情如下.如有不当之处,请各位大拿多多指点,在此谢过. 一.AlexNet模型及其基本原理阐述 1.关于AlexNet 2012年,AlexKrizhevsky提出了深度卷积神经网络模型AlexNet,可以看作LeNet的一种更深更宽的版本.该模型包含了6亿3000万个连

从特斯拉到计算机视觉之「图像语义分割」

作者:魏秀参链接:https://zhuanlan.zhihu.com/p/21824299来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 说起特斯拉,大家可能立马会想到今年5月份发生在特斯拉Model S自动驾驶上的一宗夺命车祸.初步的调查表明,在强烈的日照条件下,驾驶员和自动驾驶系统都未能注意到牵引式挂车的白色车身,因此未能及时启动刹车系统.而由于牵引式挂车正在横穿公路,且车身较高,这一特殊情况导致Model S从挂车底部通过时,其前挡风玻璃与挂车底部发生撞击

来自中科院计算所博士师兄的建议

作者简介:刘昕,中科视拓CEO,工学博士,毕业于中国科学院计算技术研究所,师从山世光研究员.主要从事计算机视觉技术和深度学习技术的研究与工业化应用. 编程语言与DL框架的选择 当然,作为开发者,想要去实现一个模型,绕不开的问题便是: 应该选择什么语言?应该选择什么框架? 对于开发人员而言,语言的选择其实不是问题.但作为入门,最为理所当然的建议则是Python,原因也非常简单:Python最好学. 对于机器学习的学习,使用Python就意味着你不必分心去学习那些复杂的数据类型约束以及转化.指针.内