经典论文--FCN

FCN是语义分割领域的里程碑工作,解决了早期图像块分割技术的效率和信息丢失问题。该文详述了FCN的模型结构、训练过程和其在自动驾驶等领域的应用。通过全卷积网络实现端到端学习,结合浅层和深层信息,提升了分割效果。此外,文章还探讨了评估指标、常用数据集和模型创新点,包括跳跃连接和反卷积层的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语义分割是啥:

如下图所示在这里插入图片描述

文章来源:

论文名:《Fully Convolutional Networks for Semantic Segmentation》
论文下载地址:https://arxiv.org/abs/1411.4038
Git地址:https://github.com/shelhamer/fcn.berkeleyvision.org

文章意义:

  • 在FCN之前基于图像块分割技术面临两大难题:效率较低,同时需要前期/后期处理;语义信息和位置信息不可兼得
  • 语义分割的开山之作,后面的语义分割模型都是以此为基础进行魔改, 传统方法到(相对成熟)神经网络的分水岭;传统方法:Normalized
    Cut/Sturctured Random Forests/SVM
  • 通过实践证明了端到端/像素到像素的网络为语义分割技术方向
    在这里插入图片描述
    在这里插入图片描述

常用评价指标

Pixel Accuracy(PA):像素精度是标记正确的像素占总像素的百分比
在这里插入图片描述

Mean Pixel Accuracy (MPA):对每个类别,计算该类别下预测正确的数量与该类别像素总数的比例,对所有类别的计算结果求平均
在这里插入图片描述
Mean Intersection over Union(MIOU):对每个类别,计算的是一个交集与并集的比例。这个比例的分子和MPA一样,是该类别下预测正确的数量;分母的范围更大,是指该类别预测为其他类别和其他类别预测为该类别的总和。
对所有类别的计算结果求平均
在这里插入图片描述
一般以MIOU为评价指标

常用数据集

在这里插入图片描述
Camvid比较规范,方便读进模型中,不需要做相关的预处理,适合新手上手SunRGBD/NYUDv2 是RGBD的图片,4通道的

相关概念:

  • 浅层信息:网络中较浅层次特征提取的信息,物体的集合信息比较丰富,但感受野较小;有助于分割较小的目标
  • 深层信息:网络中较深层次特征提取的信息,物体的空间信息系比较丰富,感受野较大;有助于分割较大的目标
    在这里插入图片描述
  • 感受野(Receptive Field):卷积神经网络每一层输出的特征图(feature
    map)上的像素点在输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点对应输入图上的区域,如图下所示:

在这里插入图片描述
关于感受野大小的计算方式是采用从最后一层往下计算的方法,即先计算最深层在前一层上的感受野,然后逐层传递到第一层,使用的公式可以表示如下:在这里插入图片描述

  • 平移不变性:图像中的目标无论移动到图像的哪个位置分类结果都应该是相同的,如下图: 在这里插入图片描述

2019 年该论文以证实卷积神经网络是不具备平移不变性的《Why do deep convolutional networks generailize so poorly to small image transformations?》按照论文说法过多的二次采样导致了平移不变被破坏

  • patch-wise training/ Shift-and-stich等技术不介绍,现在不用了

指标计算

  • 交叉熵:期望->熵->相对熵(KL散度)->交叉熵

    • 期望,随机变量的均值 在这里插入图片描述

    • 熵,信息量的期望

      信息量(香农提出),概率越小,信息量越大
      在这里插入图片描述
      熵,对信息量的期望
      在这里插入图片描述

    • 相对熵(KL散度),衡量两个变量随机变量的相似性
      随机样本x来自于两个独立分布P(x)/Q(x), KL散度越小越相似
      在这里插入图片描述

    • 交叉熵
      在这里插入图片描述
      在训练中我们可以认为P/Q分别是预测和标签

  • Softmax与交叉熵
    在这里插入图片描述
    我们可以看最:yi是标签值(后面的One-hot编码),ai是模型最后一层的输出(概率)

  • One-hot编码, 分类值到二进制向量的映射
    又称一位有效编码,使用N位状态寄存器来对N个状态进行编码,每个状态都有独立的寄存器位,且任时刻只有一位有效
    在这里插入图片描述
    在这里插入图片描述

  • 交叉熵与NLLoss
    NLLoss: Negative Log Likehood 负对数似然损失函数,跟交叉熵数学上是一样的
    只是在Pytorch中,NLLoss没有计算softmax需要手工补上

  • 混淆矩阵(Confusion Matrix)
    如下,一个6分类问题,L是标签值,P是预测值,bin就像个大计数器
    在这里插入图片描述
    由bin转成一个二维矩阵(由行依次排开),即为混淆矩阵,用于计算PA/MPA/MIOU等指标
    在这里插入图片描述
    混淆矩阵实现代码:

    def calc_semantic_segmentation_confusion(pred_labels, gt_labels):
        """Collect a confusion matrix. 计算 混淆矩阵
        The number of classes `n_class` is `max(pred_labels, gt_labels) + 1`, which is
        the maximum class id of the inputs added by one.
        Args:
            pred_labels(iterable of numpy.ndarray): A collection of predicted
                labels. The shape of a label array
                is `(H, W)`. `H` and `W`
                are height and width of the label.
            gt_labels(iterable of numpy.ndarray): A collection of ground
                truth labels. The shape of a ground truth label array is
                `(H, W)`, and its corresponding prediction label should
                have the same shape.
                A pixel with value `-1` will be ignored during evaluation.
        Returns:
            numpy.ndarray:
            A confusion matrix. Its shape is `(n_class, n_class)`.
            The `(i, j)` th element corresponds to the number of pixels
            that are labeled as class `i` by the ground truth and
            class `j` by the prediction.
        """
        pred_labels = iter(pred_labels)
    
        gt_labels = iter(gt_labels)
    
        n_class = 12
        # 定义一个数值容器 shape(12,12)
        confusion = np.zeros((n_class, n_class), dtype=np.int64)
        
        for pred_label, gt_label in six.moves.zip(pred_labels, gt_labels):  # six.moves.zip in python2
            if pred_label.ndim != 2 or gt_label.ndim != 2:
                raise ValueError('ndim of labels should be two.')
            if pred_label.shape != gt_label.shape:
                raise ValueError(
                    'Shape of ground truth and prediction should be same.')
            pred_label = pred_label.flatten()
            gt_label = gt_label.flatten()
    
            # Dynamically expand the confusion matrix if necessary.
            lb_max = np.max(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值