前言
都9102年了,语义分割网络层出不穷,不过作为鼻祖,FCN还是有必要了解下,这里就不在记录其原理,直接基于原始FCN-32s精简网络,对工业缺陷数据进行训练和测试。
简化网络
相对于工业缺陷数据,sift-flow,pascal数据算是及其复杂的数据,直接用原始的FCN网络进行训练,先不说效果,效率上就过不去,因此需要对网络进行简化,原始网络有以下特点:
- 卷积层kernel size均为3,stride为1,pooling层为size2,stride2;
- 第一个卷积层pad100;
- 上采样不学习,在python代码中,用双线性插值初始化后直接固定住。
由以上第一点以及公式w' = (w + 2*pad - kernel) / stride + 1
可知,卷积层输出特征图是不会缩小的,只在每个pooling层缩小一倍,由于工业数据不用做太深的网络,因此会减少层深度,只保留3个pooling层,最后一层特征图相比与原图缩小8倍,为了在减少层深度的同时不要使感受野减小太多,将第一个卷积kernel size改为11,pad为5;
针对第二点,由于训练的图是256*256,可以缩小8倍,因此并不用pad100;
简化后的网络结构如下:
在设计上采样时,要注意:
- crop层 的参数,也是根据公式计算出来,目的是让裁剪从中间进行裁的。上采样输出图的大小,然后移动到offset进行裁剪的,裁剪是根据输入图像大小;
- 反卷积层 上采样的参数,根据公式
output = (input - 1) * s + k - 2 * p;
计算,设置步长和核大小,参照标准设置,核尺寸设64,32等,stride作为公式中乘除比例因子,设8.
layer {
name: "upscore"
type: "Deconvolution"
bottom: "conv5"
top: "upscore"
param {
lr_mult: 0
}
convolution_param {
num_output: 2
bias_term: false
kernel_size: 32
stride: 8
}
}
layer {
name: "score"
type: "Crop"
bottom: "upscore"
bottom: "data"
top: