语义分割

数据集

cityscapes:共2975张图片。 https://www.cityscapes-dataset.com/

FCN

动机和创新点:

  • 将CNN用在semantic segmentation中, trained end-to-end, pixelsto-pixels。

  • 用全卷积网络代替全连接,可以处理任意的不同size的输入和输出

  • 将当前分类网络改编成全卷积网络(AlexNet、 VGGNet和GoogLeNet) 并进行微调,设计了跳跃连接将全局信息和局部信息连接起来, 相互补偿

  • 全局信息解决是什么的问题(分类),局部信息解决在哪里的问题。

实验证明FCN-8s是最佳网络。

模型:跳层连接用的是crop and sum.

上采样:转置卷积。

转置卷积分为三步

  • 第一步:对输入的特征图进行差值,插入0,新的长度是 $H' = H + (stride-1)*(H-1)$,即相当于每两个像素点之间,插入(stride-1)个0

  • 第二步:新的卷积核的stride为1,kernel size不变,padding'为kernal size - padding - 1

  • 第三步:利用新的卷积核和新的特征图,得到最终的逆卷积结果

  • 综合前三步的结果,可以得到输入输出的对应关系

  • 当kernal_size=2,stride=2,padding=0时,$H_{out}=2*H_{in}$

  • 当kernal_size=4,stride=2,padding=0时,$H_{out}=2*H_{in}+2$

  • 当kernal_size=16,stride=8,padding=0时,$H_{out}=8*H_{in}+8$

Hout=(Hin1)×stride[0]2×padding[0]+kernelsize[0]+outputpadding[0]H_{out}=(H_{in}−1)×stride[0]−2×padding[0]+kernel_{size[0]}+output_{padding[0]}

损失函数用交叉熵,即pixel-wise的多分类,每个pixel都贡献损失。

在pytorch中,损失函数用nll_loss=nn.NLLLoss2d(weight, size_average, ignore_index)nll_loss(F.log_softmax(inputs), targets), NLL的含义是The negative log likelihood loss. 这个损失就是对每个像素点用交叉熵。

(x,y)={n=1N1n=1Nwynln, if reduction = ’mean’ n=1Nln, if reduction = ’sum’ \ell(x, y)=\left\{\begin{array}{ll} \sum_{n=1}^{N} \frac{1}{\sum_{n=1}^{N} w_{y_{n}}} l_{n}, & \text { if reduction }=\text { 'mean' } \\ \sum_{n=1}^{N} l_{n}, & \text { if reduction }=\text { 'sum' } \end{array}\right.

Softmax函数,或称归一化指数函数,公式是

σ(z)j=ezjk=1Kezk for j=1,,K\sigma(\mathbf{z})_{j}=\frac{e^{z_{j}}}{\sum_{k=1}^{K} e^{z_{k}}} \quad \text { for } j=1, \ldots, K

logsoftmax函数,即在softmax之后加log,即

LogSoftmax(xi)=log(exp(xi)jexp(xj))\operatorname{LogSoftmax}\left(x_{i}\right)=\log \left(\frac{\exp \left(x_{i}\right)}{\sum_{j} \exp \left(x_{j}\right)}\right)

评测指标:

  1. 首先计算混淆矩阵,这个方法十分巧妙,得出(n_class, n_class)的一个矩阵,即为混淆矩阵

  2. 评测指标有:acc、acc_cls、iu、mean_iu、fw_iu.

    1. iu指的是Intersection_over_Union

    2. fw_iu指的是Frequency_Weighted_Intersection_over_Union

def _fast_hist(label_true, label_pred, n_class):
    mask = (label_true >= 0) & (label_true < n_class)
    hist = np.bincount(
        n_class * label_true[mask].astype(int) +
        label_pred[mask], minlength=n_class ** 2).reshape(n_class, n_class)
    return hist

# 上述方法可以用以下代码验证:
import numpy as np
num_classes = 3
gts = np.random.randint(0,num_classes,(4,8,8))
preds = np.random.randint(0,num_classes,(4,8,8))
hist = np.bincount((num_classes*gts.astype(int) + preds).flatten(),minlength=num_classes ** 2).reshape(num_classes, num_classes)

# 计算方法如下
# axis 0: gt, axis 1: prediction
acc = np.diag(hist).sum() / hist.sum()
acc_cls = np.diag(hist) / hist.sum(axis=1)
acc_cls = np.nanmean(acc_cls)
iu = np.diag(hist) / (hist.sum(axis=1) + hist.sum(axis=0) - np.diag(hist))
mean_iu = np.nanmean(iu)
freq = hist.sum(axis=1) / hist.sum()
fw_iu = (freq[freq > 0] * iu[freq > 0]).sum()

U-Net

用于医学图像分割。

医学图像分割的难点:

  1. 数据量少。 一些挑战赛只提供不到100例的数据

  2. 图片尺寸大。 单张图片尺寸大、分辨率高, 对模型的处理速度有一定的要求

  3. 要求高。 医学图像边界模糊、梯度复杂, 对算法的分割准确度要求极高

  4. 多模态。 以ISLES脑梗竞赛为例, 其官方提供了CBF,MTT,CBV,TMAX,CTP等多种模 态的数据

本文共享:

  1. 赢得了ISBI cell tracking challenge 2015

  2. 速度快,对一个512*512的图像,使用一块GPU只需要不到一秒的时间

  3. 成为大多做医疗影像语义分割任务的baseline,也启发了大量研究者去思考U型语义分割网络

  4. UNet结合了低分辨率信息(提供物体类别识别依据)和高分辨率信息(提供精准分割定位依据),完美适用于医学图像分割。

模型:增加了很多跨层连接,用的是crop and concat.

上采样:转置卷积。

损失:给不同pixel加了不同的权重(权重和该像素点离最近的细胞的距离有关,将注意力放在两个细胞的分界位置)。

Unet和FCN区别: U-Net和FCN非常的相似,U-Net比FCN稍晚提出来,但都发表在2015年,和FCN相比,U-Net的第一个特点是完全对称,也就是左边和右边是很类似的,而FCN的decoder相对简单,只用了一个deconvolution的操作,之后并没有跟上卷积结构。第二个区别就是skip connection,FCN用的是加操作(summation),U-Net用的是叠操作(concatenation)。这些都是细节,重点是它们的结构用了一个比较经典的思路,也就是编码和解码(encoder-decoder)结构,早在2006年就被Hinton大神提出来发表在了nature上.

FusionNet

  • 模型基本和U-Net一致,但是加入padding,使得跨层连接的分辨率保持不变。

  • 跨层连接用的是求和方式,引入残差。

DeconvNet

上采样:反卷积+反池化

该论文最大优点,结构合理,在每部分的文字叙述中逻辑好,可以借鉴。

SegNet

FCN弊端:忽略了高分辨率的特征图,导致边缘信息的丢失(最好的模型是8s的,没有结合的高分辨率信息);FCN编码器中有大量参数,但解码器非常的小。

上采样:和fcn不同,利用了pooling中的index信息,不再index的位置补0,之后增加的卷积层也起到了将这些0填充的作用,和转置卷积的差别不是很大,torch.nn有利用upmaxpool函数。如下图所示:

提出完全对称的编码器解码器结构

DeepLab

GCN

DFN

ENet

BiSeNet

FANet

RedNet

Last updated

Was this helpful?