📗
deeplearning
  • 机器学习
    • LR & SVM
    • 树模型
    • 评测指标
    • 数据不平衡
  • CV基础
    • 基础模型
    • 初始化
    • 激活函数
    • 注意力机制
    • 损失函数
    • 优化器
    • 可视化
    • 轻量级网络
    • 多任务学习
  • deepfake
    • 数据集
  • 人脸
    • 数据集
    • 人脸对齐
    • 人脸检测
    • 人脸识别
  • 语义分割
    • 语义分割
  • 无监督
    • 无监督
  • 推荐系统
    • 推荐系统模型
    • 推荐系统中的偏差
    • 王喆:深度学习推荐系统
    • 特征处理
    • 重排序
    • 互联网商业化变现
  • 数学
    • bayes最大似然
    • 蒙特卡洛
  • 网站
    • css
    • html
    • js
    • jquery
    • flask
  • 基础工具
    • anaconda
    • docker
    • git
    • linux install
    • vpn
    • latex
  • python
    • numpy
    • matplotlib
    • pandas
    • multi process
    • pytorch
  • 设计模式
    • 设计模式之美
    • 图说设计模式
  • 其他
    • how to ask
    • python style
Powered by GitBook
On this page
  • 数据集
  • FCN
  • U-Net
  • FusionNet
  • DeconvNet
  • SegNet
  • DeepLab
  • GCN
  • DFN
  • ENet
  • BiSeNet
  • FANet
  • RedNet

Was this helpful?

  1. 语义分割

语义分割

数据集

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$

损失函数用交叉熵,即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. 这个损失就是对每个像素点用交叉熵。

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

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

评测指标:

  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

Previous人脸识别Next无监督

Last updated 3 years ago

Was this helpful?

Hout=(Hin−1)×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]}Hout​=(Hin​−1)×stride[0]−2×padding[0]+kernelsize[0]​+outputpadding[0]​

ℓ(x,y)={∑n=1N1∑n=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.ℓ(x,y)={∑n=1N​∑n=1N​wyn​​1​ln​,∑n=1N​ln​,​ if reduction = ’mean’  if reduction = ’sum’ ​
σ(z)j=ezj∑k=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σ(z)j​=∑k=1K​ezk​ezj​​ for j=1,…,K
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)LogSoftmax(xi​)=log(∑j​exp(xj​)exp(xi​)​)

)