基于FCN训练-测试自己的数据集

本文介绍如何基于FCN-32s网络简化版,针对工业缺陷数据进行训练和测试。通过减少网络层深度,调整卷积核大小,适应256*256的图像输入。样本制作涉及图像和标签转换,使用labelme工具生成标注,并创建train、val列表。训练完成后,使用C++动态库进行测试,注意图像预处理和通道顺序。
摘要由CSDN通过智能技术生成

前言

都9102年了,语义分割网络层出不穷,不过作为鼻祖,FCN还是有必要了解下,这里就不在记录其原理,直接基于原始FCN-32s精简网络,对工业缺陷数据进行训练和测试。

简化网络

相对于工业缺陷数据,sift-flow,pascal数据算是及其复杂的数据,直接用原始的FCN网络进行训练,先不说效果,效率上就过不去,因此需要对网络进行简化,原始网络有以下特点:

  1. 卷积层kernel size均为3,stride为1,pooling层为size2,stride2;
  2. 第一个卷积层pad100;
  3. 上采样不学习,在python代码中,用双线性插值初始化后直接固定住。

由以上第一点以及公式w' = (w + 2*pad - kernel) / stride + 1可知,卷积层输出特征图是不会缩小的,只在每个pooling层缩小一倍,由于工业数据不用做太深的网络,因此会减少层深度,只保留3个pooling层,最后一层特征图相比与原图缩小8倍,为了在减少层深度的同时不要使感受野减小太多,将第一个卷积kernel size改为11,pad为5;
针对第二点,由于训练的图是256*256,可以缩小8倍,因此并不用pad100;
简化后的网络结构如下:
简化的FCN

在设计上采样时,要注意:

  • 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: 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值