语义分割是啥:
如下图所示
文章来源:
论文名:《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(

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

被折叠的 条评论
为什么被折叠?



