百度分割学习(一)

语义分割算法的基本概念

语义分割算法的基本流程

  1. 输入:图像(RGB)
  2. 算法:深度学习模型
  3. 输出:分类结果(与输入大小一致的单通道图)
  4. 训练过程
    1. 输入:image+label
    2. 前向:out = model(image)
    3. 计算损失:loss = loss_func(out,label)
    4. 反向:loss.backward()
    5. 更新权重:optimizer.minimize(loss)

分割网络的性能指标mAcc

将pred矩阵和GT矩阵打平然后比较每一个数字是否相同,这里的数字表示的这个位置的像素点应该是什么标签,这里的数字就是标签,两个标签相同才正确

img

语义分割性能指标mIoU

分割每一个类别的交并比

mean主要体现在求了每一个类别的交并比后取均值表示为最终结果

img

全卷积FCN网络

FCN全称是Fully Convolusional Networks,通俗地讲就是全卷积,没有FC层

Feature map尺寸变大:

卷积:卷积越卷越小

upsample(上采样):越变越大

  1. Up-sample

    1. 上采样方法:Bilinear Interpolation(双线性插值法)
    
    1. 在paddle中的函数是
    2. fluid.layers.interpolate(data,out_shape=(),align_corners=True)
    3. out_shape输入的是图片的长宽,最后一个参数是默认True
  2. Transpose conv

img

  1. padding值的确定,是根据他的卷积核决定的,就是说你的pooling之后,还原左上角的数字时,要求padding后的feature map的左上角与卷积核重叠后,正好只有padding前的左上角

  2. 这个反卷积的函数是:fluid.dygraph.Conv2DTranspose(num_channels,num_filters,filter_size,stride)

    • num_channels是输入的通道数

    • num_filters是输出的通道数(卷积核的个数)

    • filter_size是卷积核的大小

    • stride是步长

  3. Un-pooling

  4. 池化层函数使用:paddle.fluid.dygraph.Pool2D(pool_size=2,pool_stride=2,ceil_model=True)

    • 参数pool_size是要池化的倍数
    • pool_stride是移动的步长
    • ceil_model是面对不同尺寸的输入时的一个取整
  5. Conv2D中加入一个参数act = 'relu'可以在卷积层结束后执行relu激活

  6. 创新点分析:在FCN中使用的是传统的VGG结构,但是在最后的两个全连接层中,使用1x1卷积的方式进行替换,提高了计算的效率,同时使用上采样额方式将feature map还原图尺寸,然后实现像素级分类

UNet网络结构

视频上的图太糊了,我换一个

img

从图中可以看出Unet的网络结构就是一个U字形的架构

他分为左中右三个部分

网络结构解读

  • 先看左边的部分,在第一行中先使用两次卷积提取出特征,存储这次卷积后的feature map我们称这个feature map为pool1

  • 进行一个最大池化的操作,获得新的结果

  • 在第二行中,将新的结果再进行两次卷积提取出特征,再存储这次卷积后得到的feature map我们称这个feature map为pool2

  • 再进行一个最大池化的操作,获得新的结果

  • 在第三行中,将新的结果进行两次卷积提取出特征,再存储这次卷积得到的feature map,我们称这个feature map为pool3

  • 再进行一个最大池化的操作,获得新的结果

  • 在第四行中,将新的结果进行两次卷积提取出特征,再存储这次卷积得到的feature map,我们称这个feature map为pool4

  • 这样网络的左边部分解结束了,左边部分的实际结果是增加了通道数,缩小了尺寸

  • 在中间部分,仍然是两个卷积,但是卷积只增加了通道数没有进行尺寸的改变,使用的是1x1的卷积,获得结果mid

  • 然后到右边部分第四行,经过前两个过程的mid会进行一个上采样的工作,接着就是将mid和pool4进行一个堆叠的操作,这时候mid的通道数就会变成原来的两倍,然后使用两个卷积层对这个mid进行通道缩小

  • 到右边第三行也是一样的操作,直到右边第一行,我们的feature map在与pool1融合后,继续进行一个卷积的降维的操作,使其通道数,变成我们分类数目,在使用softmax对这些进行分类就结束了

创新点分析:采用了各层特征堆叠的方式,增加获取到的图片特征信息

PSP分割网络

psp分割网络:Pyramid Scene Parsing Network

FCN的缺点:

  1. 分割结果不够精细
  2. 没有考虑上下文信息

PSP网络能通过扩大感受野(Receptive Field)来获取上下文信息

什么是感受野(RF):

  1. 感受野 = 用于产生特征的输入图像中的区域大小
  2. 只针对于局部操作:比如conv,pooling

PSP网络的Pyramid Pooling模块

img

这个psp模型Pyamid pooling模块在YOLOv4中也有应用过

PSP的整体结构

image-20220407093904038

创新点分析:通过卷积的方式将feature map转化成各个尺寸的feature map,再通过上采样还原成原图尺寸,再将这些feature map与原feature map进行堆叠,从而达到扩大感受野的目的

空洞卷积(Dilated Convolution)

  1. Dilated conv:
    1. 理解1:将卷积核扩大,扩大的部分填0
    2. 理解2:feature map 间隔计算conv
    3. 空洞卷积模式图:

img
从图中可以看出,我们原本的3x3的卷积核变成5x5的卷积核,3x3卷积核的数值分散到上下左右。四个角和中间部分,其他部分用0来填充,完成新的空洞卷积核

虽然用新的方式构造了这样一个东西,但是本质还是一个卷积核,执行的仍然是卷积操作

  1. 空洞卷积的输出计算公式:

Hout=Hin+2P(D(K1)+1)S+1\mathrm{H}_{o u t}=\frac{H_{i n}+2 P-(D *(K-1)+1)}{S}+1

p是padding
D是卷积核中两个像素点的距离+1
k是原来卷积核的大小
S是卷积核移动的步长

  1. PSP分割网络的-Backbone(主干提取网络):
    • 在传统的ResNet使用的是Dilation为1的卷积即无空洞的卷积
    • 在Dilated ResNet(空洞的ResNet)中第四层和第五层使用的是Dilation为2和4的卷积核
      image-20220407093952741

从图中可以看出,空洞的ResNet(下)的变宽都是和原本的feature map的宽高是相同的,同时他的channel也是有一定的增加。对比与·传统的ResNet(上),从结果上看,扩大后的感受野就会增大。

个人看法:
这个空洞卷积使得,在进行卷积操作时将像素点离散化,获取更多的上下文信息,这个就是说,将使用一个较大的卷积核,去提取图片的特征,但是,并不是提取出全部的内容,只采采取几个部分的点,使得新的feature map获得是离散化的信息,而不是连续性的信息。

这个空洞卷积的使用仍然是,Conv2D,只是多添加了一个Dilation的参数,不另外多加一个API

DeepLab系列网络

  1. v1~v3+的论文名称
    • V1: Semantic image segmentation with deep convolutional nets andfully connected CRFs (ICLR 2015)
    • V2: DeepLab: Semantic lmage Segmentation with Deep Convolutional Nets,Atrous Convolution, and Fully Connected CRFs(TPAMI 2018)
    • V3: Rethinking Atrous Convolution for Semantic lmage Segmentation
    • V3+: Encoder-Decoder with Atrous Separable Convolution for Semantic lmage Segmentation (ECCV 2018)
  2. 四个版本的结构对比
    多尺度训练和CRF中的使用从V3开始就不使用了,应该是发现了后面这两个东西的影响不大。
    img
  3. DeepLab V1 网络结构的解析:
    img
  • 在VGG的结构中,下采样基本是使用pooling的方式,而不是直接使用conv,这会致使classfication1~6的feature map宽高可能会不相同,因此在classification中有一个Conv(stride)这个的目的是通过控制步长来让卷积后的feature map变成我们希望的尺寸大小

  • 同时还应该注意的是Layer5和Layer4,以为从Layer5的时候使用的是空洞卷积的方式来扩大感受野,因此Layer5和Layer4中需要设置pooling的参数(k=3,s=1,p=1)使得我们再下采样后保持原来的尺寸

  • 创新点应该是嵌入了空洞卷积的提取网络和对指定层分类结果的融合

  1. DeepLabV2网络结构解析
    img

    • 这里的stem结构课上没有讲到,论文里应该有,我先百度了一下,据说是通过这个结构获得尺寸缩小n倍的特征图
    • ASPP的结构
      img
    • 在进行空洞卷积的过程中,dilation的值作为padding的值就能保证feature map的尺寸相同
    • 举个例子(输入的宽高为64x64,s为1,卷积核为3x3):按照之前说的空洞卷积公式

    Hout=Hin+2P(D(K1)+1)S+1 \mathrm{H}_{o u t}=\frac{H_{i n}+2 P-(D *(K-1)+1)}{S}+1

    • 对于普通的卷积他的dnation是1:那么他是的padding也是1,计算一下

    Hout=64+21(1(31)+1)1+1=64+231+1=64 \mathrm{H}_{o u t} = \frac {64 + 2 * 1-(1*(3-1)+1)}{1}+1=\frac {64+2-3}{1}+1=64

    • 对于空洞卷积,假设dination是6,那么他的padding也是6,计算一下:

    Hout=64+26(6(31)+1)1+1=64+12131+1=64 \mathrm{H}_{o u t} = \frac {64 + 2*6 -(6*(3-1)+1)}{1}+1=\frac {64+12-13}{1}+1=64

  2. deeplabV3

    • ASPP加强版:
      img
    • 整体网络结构
      img
    • 后面几层使用的Dilation值:
      img

图卷积

令人迷惑的图卷积

  1. 图卷积公式

    Z=D12(A+I)D12XWZ = D^{-\frac 12}(A+I)D^{-\frac 12 }XW

    提出图卷积的论文:
    Thomas N.Kipf and Max Welling, Semi-Supervised Classification with Graph Convolutional Networks,ICLR 2017
    可以将图卷积公式变形为Z=LXWZ = LXW
    L是消息传递网络(Message Aggregation Network)

    L=D12(A+I)D12 L =D^{-\frac 12}(A+I)D^{-\frac 12 }

    W是状态更新网络,可以通过不断学习从而进行优化

  2. 上下文的基本概念:

    1. 什么是上下文:
      1. 物体的空间依赖(人类的眼睛在眉毛的下面)
      2. 语义类别依赖(水上的交通工具是船而不是车)
      3. 场景先验(厨房中会出现常用的厨具而不会是电子产品)
    2. 如何建模?
      1. 全局特征统计(BoW,VLAD,Fisher Vector)
      2. 条件随机场,非局部神经网络
      3. 基于区域的图推理

Beyond Grids: Learning Graph Representations for Visual Recognition(超越网格:学习图表示的视觉识别)

img

  1. 堆叠卷积核池化操作的深度模型存在的问题:
    1. 有效感受野非常有限
    2. 不能很好地进行上下文建模
  2. Graph Convolutional Unit(GCU)学习图的组成
    1. Graph Pojection GprojG_{proj}:投影2维的特征图X成图g=(v,ϵ)g = (v,\epsilon),通过聚类的方式将相似的特征进行聚类,聚类中金就是节点表征ZRd×VZ \in R^{\mathrm{d} \times|V|}
    2. Graph Convolution GconvG_{conv}:在图g上执行图卷积(沿着图上的边进行特征传播,建模全局上下文),得到新的图表特征
    3. Graph Re-projection GreprojG_{reproj}:将新的图表征反投影到2维空间,使得整个GCU能够即插即用
  3. 计算方式:
    1. 图投影(Graph Pojection):首先是将一个(W,H,C)的一个feature map,reshape成(WxH,C)的一个二维矩阵,
      1. 接着计算他的分配矩阵QRHW×VQ \in R^{\mathrm{HW} \times|V|},V指的是图的节点数目
      2. 计算方式为qijk=exp(xyωkσk2/2)kexp(xijωkσk2/2)q_{i j}^{k}=\frac{\exp \left(-\left\|\frac{x_{y}-\omega_{k}}{\sigma_{k}}\right\|^{2} / 2\right)}{\sum_{k} \exp \left(-\left\|\frac{x_{i j}-\omega_{k}}{\sigma_{k}}\right\|^{2} / 2\right)}
      3. 先计算像素与第k个节点(聚类中心)的距离,然后再对其进行归一化处理
      4. 这里的ωk\omega_{k}σk\sigma_{k}都是可学习的参数,
      5. 这里的qijkq_{ij}^k指的是我们feature map上的像素在第k个节点上的权重有多大
      6. 计算图表征ZRd×νZ \in R^{d \times|\nu|}
      7. zk=zkzk,zk=1iqijkqijk(xijωk)/σkz_{k}=\frac{z_{k}^{\prime}}{\left\|z_{k}^{\prime}\right\|}, \quad z_{k}^{\prime}=\frac{1}{\sum_{i} q_{i j}^{k}} q_{i j}^{k}\left(x_{i j}-\omega_{k}\right) / \sigma_{k}
      8. 先计算出像素与聚类中心的距离,然后乘上权重做归一化处理,从而构成图表征
      9. 计算邻接矩阵A=ZTZ\mathcal{A}=Z^{T} \mathrm{Z},计算的是两个节点间的相似程度,和图论中的邻接矩阵不太一样
    2. 图卷积(Graph Convolution):Z=AZTWg\mathrm{Z}^{\prime}=\mathcal{A} Z^{T} W_{g}
      1. 图卷积就是用我们的邻接矩阵乘A\mathcal{A}上我们的图表征的转置ZTZ^{T},再乘以一个可学习的参数WgW_{g}
    3. 图反投影(Graph Reprojection):X=QZTX^{\prime}=Q \mathrm{Z}^{\prime T}

Graph-Based Global Reasoning Networks(基于图的全局推理网络)

  1. 研究动机:
    1. 当前卷积神经网络不能够有效建模相距较远的区域之间的全局关系
  2. 解决思路
    1. 提出一种新的全局推理方法,将坐标空间(Coordinate Space)的像素级特征聚合投影到交互的空间(Interation Space),然后进行有效的关系推理,最后将具有关系属性的特征反投影回原始的坐标空间
  3. 将一个图像中的信息进行聚类,然后将聚类后的的特征聚类中心作为图的一个节点,然后投影到交互空间中进行推理,经过推理后的内容信息,经过反投影回到原来的二维图像,实现堆内容特征的信息增强,图中节点数确认方式不是说有多少个类别就选择多少个戒节点,而是说他们节点数的确认方式是经过一些机构多次试验后得出的结论。
  4. 具体方式
    img
    1. 提出Global Reasonling(GloRe) unit,其通过加权全局池化来实现coordinate-interaction space的映射,并且通过图卷积在交互空间进行关系推理
    2. 从坐标空间到交互空间(建图):
      1. 将输入的feature map转化成维度为[HxW,C]的这样一个空间矩阵,然后将其映射为交互空间的表征V = f(X)RNxC\in R^{NxC}
      2. f函数的设计,通过网络去生成这样一个f函数,其实这个函数也不难就是,生成一个矩阵与我们的X进行相乘,这个矩阵是一个可学习的矩阵
      3. vi=biX=ΣjbijXjR1×Cv_{i}=b_{i} X=\Sigma_{\forall j} b_{i j} X_{j} \in R^{1 \times C}
      4. 用B矩阵的一行,对X中的每一行进行相乘然后相加,作为V的一个值
      5. 可学习矩阵B=[b1,,bN]RN×LB=\left[b_{1}, \ldots, b_{N}\right] \in R^{N \times L}
    3. 图卷积进行推理:建模任意区域之间的关系转化为学习交互空间中节点的交互
      1. Z=(1Ag)VWgZ = (1-A_g)VW_g
      2. AgA_g表示的是邻接矩阵,V表示我们特征图的投影信息(图表征),WgW_g是一个可学习的参数
      3. 图卷积是每一个节点之间的信息交互,在这里采用的是用1x1卷积的方式来模拟这个过程
      4. Z=GCN(V)=Conv1D(Conv1D(V)T)TZ = GCN(V) = Conv1D(Conv1D(V)^T)^T
    4. 从交互空间到坐标空间(反投影):将新的图表征反投影到坐标空间,使得整个GloRe能够即插即用
      1. Y=BTZ+XY=B^TZ+X

GINet: Graph Ilnteraction Network for Scene Parsing

img

  1. 主体构造与结构解析
    img
  2. 具体方法:
    1. 图的构建:
      • 视觉图构建方法:P = ZXW
      • P是视觉图,PRN×DP \in \mathbb{R}^{N \times D},N是样本数,D是视觉图中节点个数
      • 映射视觉特征XR(WxH)×CX \in \mathbb{R}^{(WxH) \times C}
      • ZRN×(WxH)Z \in \mathbb{R}^{N \times (WxH)}是投影矩阵
      • WRC×DW \in \mathbb{R}^{C \times D}是特征维度变换矩阵
      • 语义图S构建方法:si=MLP(li)\mathrm{s}_{i}=\mathrm{MLP}\left(l_{i}\right)
      • lil_i是每个类别的语义特征
    2. 语义到数据推理:每个数据图的节点表征提取对应语义表示为:

      P0=P+βs2vGs2vSWs2vP_0 = P + \beta_{s2v}G_{s2v}SW_{s2v}

      • βs2vRN\beta_{s2v} \in \mathbb{R}^{N}是可学习向量
      • Gs2vG_{s2v}是分配矩阵
      • Ws2vRD×DW_{s2v} \in \mathbb{R}^{\mathrm{D} \times \mathrm{D}}是可训练参数
    3. 视觉到语义推理:给每个输入样本生成基于样本的语义图表征

      So=S+βv2sGv2sPWs2vS_{o}= S + \beta_{v2s}G_{v2s}PW_{s2v}

      • βv2sRN\beta_{v2s} \in R^N是可学习变量
      • Gv2sG_{v2s}是分配矩阵
      • Wv2sRD×DW_{v2s} \in \mathbb{R}^{\mathrm{D} \times \mathrm{D}}是可训练参数
    4. 单元输出:将新的视觉图表征p0p_0投影回二维的像素级特征:Xo=X+ZTPoWoX_{o}=X+Z T P_{o} W_{o}