写点什么

深度学习应用篇 - 计算机视觉 - 语义分割综述 [6]:DeepLab 系列简介、DeepLabV3 深入解读创新点、训练策略、主要贡献

  • 2023-06-09
    浙江
  • 本文字数:10101 字

    阅读完需:约 33 分钟

深度学习应用篇-计算机视觉-语义分割综述[6]:DeepLab系列简介、DeepLabV3深入解读创新点、训练策略、主要贡献

深度学习应用篇-计算机视觉-语义分割综述[6]:DeepLab 系列简介、DeepLabV3 深入解读创新点、训练策略、主要贡献

0.DeepLabV3 深入解读

1、DeepLab 系列简介

1.1.DeepLabV1

作者发现 Deep Convolutional Neural Networks (DCNNs) 能够很好的处理的图像级别的分类问题,因为它具有很好的平移不变性(空间细节信息已高度抽象),但是 DCNNs 很难处理像素级别的分类问题,例如姿态估计和语义分割,它们需要准确的位置信息。

1.1.1 创新点:

  • 将深度神经网络 DCNN 与全连接 CRF 结合起来,提高图像分割的分割精度。

  • 提出空洞卷积的思想。

  • 应用尝试了多尺度、多层次的信息融合。

1.1.2. 动机:

DCNN 应用在语义分割任务上存在两个缺陷:


  • 重复堆叠的池化下采样操作导致分辨率大幅下降,位置信息丢失难以恢复。

  • 从分类器获得以对象为中心的决策需要空间转换的不变性,忽略对细节处的把控,这从本质上限制了 DCNN 模型的空间准确性。


分类任务具有空间不变性,图像的仿射变换不会影响最后的分类结果,而且恰恰通过仿射变换等操作(数据增广)可以增加数据量,提高模型的精度;但是像分割和检测这类问题,不具有空间不变性。

1.1.3. 应对策略:

  • 空洞卷积

  • Fully-connected Conditional Random Field (CRF)

1.2.DeepLabV2

1.2.1.创新点:

  • 空洞卷积,作为密集预测任务的强大工具。空洞卷积能够明确地控制 DCNN 内计算特征响应的分辨率。它还允许我们有效地扩大滤波器的视野以并入较大的上下文,而不增加参数的数量或计算量。

  • 提出了空洞空间卷积池化金字塔(atrous spatial pyramid pooling (ASPP)),以多尺度的信息得到更精确的分割结果。ASPP 并行的采用多个采样率的空洞卷积层来探测,以多个比例捕捉对象以及图像上下文。

  • 通过组合 DCNN 和概率图模型(CRF),改进分割边界结果。在 DCNN 中最大池化和下采样组合实现可平移不变性,但这对精度是有影响的。通过将最终的 DCNN 层响应与全连接的 CRF 结合来克服这个问题。

1.2.2.动机

DCNNs 中语义分割存在三个挑战:


  • 连续下采样和池化操作,导致最后特征图分辨率低。

  • 图像中存在多尺度的物体(相比 V1 而言提出的新的挑战

  • 空间不变性导致细节信息丢失

1.2.3. 应对策略:

  • 移除部分池化操作,使用空洞卷积。

  • 利用不同膨胀因子的空洞卷积融合多尺度信息—atrous spatial pyramid pooling(ASPP)(新的创新点

  • 全连接 CRF。

1.3.DeepLabV3

1.3.1 创新点:

  • 增加了多尺度(multiple scales)分割物体的模块

  • 设计了串行和并行的空洞卷积模块,采用多种不同的 atrous rates(采样率)来获取多尺度的内容信息

1.3.2. 动机:

DCNN 中语义分割存在三个挑战:


  • 连续下采用和重复池化,导致最后特征图分辨率低

  • 图像中存在多尺度的物体

1.3.3. 应对策略:

  • 使用空洞卷积,防止分辨率过低情况

  • 串联不同膨胀率的空洞卷积或者并行不同膨胀率的空洞卷积(v2 的 ASPP),来获取更多上下文信息

1.3.4. 主要贡献:

  • 重新讨论了空洞卷积的使用,这让我们在级联模块和空间金字塔池化的框架下,能够获取更大的感受野从而获取多尺度信息

  • 改进了 ASPP 模块:由不同采样率的空洞卷积和 BN 层组成,我们尝试以级联或并行的方式布局模块

  • 讨论了一个重要问题:使用大采样率的 3×3 的空洞卷积,因为图像边界的原因无法捕捉远距离信息,会退化为 1×1 的卷积, 作者提出将图像级特征融合到 ASPP 模块中

  • 阐述了训练细节并分享了训练经验,论文提出的"DeepLabv3"改进了以前的工作,获得了很好的结果

1.4.DeepLabV3+

1.4.1.创新点:

  • 更深的 Xception 结构,不同的地方在于不修改 entry flow network 的结构,为了快速计算和有效的使用内存

  • 所有的 max pooling 结构被 stride=2 的深度可分离卷积代替

  • 每个 3x3 的 depthwise convolution 都跟 BN 和 Relu

  • 将改进后的 Xception 作为 encodet 主干网络,替换原本 DeepLabv3 的 ResNet101

1.4.2. 动机:

语义分割主要面临两个问题:


  • 物体的多尺度问题(DeepLabV3 解决)

  • DCNN 的多次下采样会造成特征图分辨率变小,导致预测精度降低,边界信息丢失(DeepLabV3+解决目标)

1.4.3. 应对策略:

  • 改进 Xception,层数增加

  • 将所有最大值池化层替换为带步长的深度可分离卷积层

2、DeepLabV3 详解

2.1.提出问题

首先,语义分割问题存在两大挑战:


  • 第一个挑战:连续池化操作或卷积中的 stride 导致的特征分辨率降低。这使得 DCNN 能够学习更抽象的特征表示。然而,这种不变性可能会阻碍密集预测任务,因为不变性也导致了详细空间信息的不确定。为了克服这个问题,提倡使用空洞卷积。

  • 第二个挑战:多尺度物体的存在。几种方法已经被提出来处理这个问题,在本文中我们主要考虑了这些工作中的四种类型,如图 1 所示。


图 1 用于捕获多尺度上下文的代替体系结构



  • 第一种:Image Pyramid,将输入图片放缩成不同比例,分别应用在 DCNN 上,将预测结果融合得到最终输出

  • 第二种:Encoder-Decoder,将 Encoder 阶段的多尺度特征运用到 Decoder 阶段上来恢复空间分辨率

  • 第三种:在原始模型的顶端叠加额外的模块,以捕捉像素间长距离信息。例如 Dense CRF,或者叠加一些其他的卷积层

  • 第四种:Spatial Pyramid Pooling 空间金字塔池化,使用不同采样率和多种视野的卷积核,以捕捉多尺度对象


DeepLabV3 的提出是为了解决多尺度下的目标分割问题。如图 2 所示,不同目标在图中的尺寸大小不同,这也导致模型考虑不同尺寸的分割精度。



图 2 多尺度目标分割示例

2.2.提出解决方案

2.2.1.用级联的方式设计了空洞卷积模块

具体而言,DeepLabV3 取 ResNet 中最后一个 block(ResNet 的 block4),并将他们级联到了一起,如图 3 所示。



图 3 带 Atrous 和不带 Atrous 卷积的级联模块


有三个 3×3 卷积在这些块中,除了最后一个块,其余的模块中最后的一个卷积步长为 2,类似于原来的 ResNet。这么做背后的动机是,引入的 stride 使得更深的模块更容易捕获长距离的信息。如图 3(a),整个图像的特征都可以汇聚在最后一个小分辨率的特征图中。


然而,我们发现连续的 stride 对语义分割是有害的,会造成细节信息的丢失(如下表)。



表 1 使用 ResNet-50 和 block7 和不同的输出步长的更深层空洞卷积


从表中看得出,输出步长 out_stride = 8 时占用更多的内存,但同时带来了更好的性能。例如图 3(b)中,输出步长为 out_stride = 16。这样不增加参数量和计算量的同时有效的缩小了步幅。

2.2.2. 使用了 Multi-Grid 策略

受到了采用不同大小网格层次结构的多重网格方法的启发,我们提出的模型在 block4 和 block7 中采用了不同的空洞率。


特别的,我们定义为 block4 到 block7 内三个卷积层的 unit rates。卷积层的最终空洞率等于 unit rate 和 corresponding rate 的乘积。例如,当,三个卷积就会在 block4 有。

2.2.3.将 batch normalization 加入到 ASPP 模块.

Atrous Spatial Pyramid Pooling(ASPP):


图 6 Deeplab 系列 ASPP 结构


上图是 DeeplabV2 中的 ASPP,在特征顶部映射图使用了四中不同采样率的空洞卷积。我这表明以不同尺度采样时有效的,在 Deeolabv3 中向 ASPP 中添加了 BN 层。不同采样率的空洞卷积可以有效捕获多尺度信息,但会发现随着采样率的增加,滤波器有效权重(权重有效的应用在特征区域,而不是填充 0)逐渐变小。


当 output_stride=8 时,加倍了采样率。所有特征通过 1x1 级联到一起,生成最终的分数。


ASPPModule 代码:


class ASPPModule(nn.Layer):    """    Atrous Spatial Pyramid Pooling.    Args:        aspp_ratios (tuple): The dilation rate using in ASSP module.        in_channels (int): The number of input channels.        out_channels (int): The number of output channels.        align_corners (bool): An argument of F.interpolate. It should be set to False when the output size of feature            is even, e.g. 1024x512, otherwise it is True, e.g. 769x769.        use_sep_conv (bool, optional): If using separable conv in ASPP module. Default: False.        image_pooling (bool, optional): If augmented with image-level features. Default: False    """
def __init__(self, aspp_ratios, in_channels, out_channels, align_corners, use_sep_conv=False, image_pooling=False, data_format='NCHW'): super().__init__()
self.align_corners = align_corners self.data_format = data_format self.aspp_blocks = nn.LayerList()
for ratio in aspp_ratios: if use_sep_conv and ratio > 1: conv_func = layers.SeparableConvBNReLU else: conv_func = layers.ConvBNReLU
block = conv_func( in_channels=in_channels, out_channels=out_channels, kernel_size=1 if ratio == 1 else 3, dilation=ratio, padding=0 if ratio == 1 else ratio, data_format=data_format) self.aspp_blocks.append(block)
out_size = len(self.aspp_blocks)
if image_pooling: self.global_avg_pool = nn.Sequential( nn.AdaptiveAvgPool2D( output_size=(1, 1), data_format=data_format), layers.ConvBNReLU( in_channels, out_channels, kernel_size=1, bias_attr=False, data_format=data_format)) out_size += 1 self.image_pooling = image_pooling
self.conv_bn_relu = layers.ConvBNReLU( in_channels=out_channels * out_size, out_channels=out_channels, kernel_size=1, data_format=data_format)
self.dropout = nn.Dropout(p=0.1) # drop rate
def forward(self, x): outputs = [] if self.data_format == 'NCHW': interpolate_shape = paddle.shape(x)[2:] axis = 1 else: interpolate_shape = paddle.shape(x)[1:3] axis = -1 for block in self.aspp_blocks: y = block(x) y = F.interpolate( y, interpolate_shape, mode='bilinear', align_corners=self.align_corners, data_format=self.data_format) outputs.append(y)
if self.image_pooling: img_avg = self.global_avg_pool(x) img_avg = F.interpolate( img_avg, interpolate_shape, mode='bilinear', align_corners=self.align_corners, data_format=self.data_format) outputs.append(img_avg)
x = paddle.concat(outputs, axis=axis) x = self.conv_bn_relu(x) x = self.dropout(x)
return x
复制代码

2.2.4.将全局上下文信息纳入模型

具有不同 atrous rates 的 ASPP 能够有效的捕获多尺度信息。不过,论文发现,随着 sampling rate 的增加,有效 filter 特征权重(即有效特征区域,而不是补零区域的权重)的数量会变小,极端情况下,当空洞卷积的 rate 和 feature map 的大小一致时,$ 3\times 3 1\times 1 $ :



图 4 在 65x65 尺寸特征图上使用 3x3 卷积时标准化计数随空洞率的变化


为了克服这个问题,并将全局上下文信息纳入模型,采用了图像级特征。具体来说,在模型的最后一个特征图采用全局平均池化,将重新生成的图像级别的特征提供给带 256 个滤波器(和 BN)的 1×1 卷积,然后双线性插值将特征提升到所需的空间维度。


最后改进后的 ASPP 包括:


  • (a)一个 $ 1\times 1 3\times 3 rates = (6,12,18) $的空洞卷积,滤波器数量都为 256,包含 BN 层。针对 output_stride=16 的情况

  • (b)图像级特征,如图 5 所示。当 output_stride=8 时,加倍了采样率。然后将所有分支的特征图通过一个卷积(有 256 个滤波器和 BN)concatenate 起来,送入最后的 1×1 卷积以产生最终分数.



图 5 ASPP,增加了多级特征图


2.2.5.取消 DenseCRF


CRF


CRF 的全称是 Conditional Random Field.它的形式如下所示:





可以看出,条件随机场在建模的时候同样需要计算联合概率,只不过这一次参与计算的有两部分随机变量——X 和 Y。一般来说,我们把 X 称作观察变量,也就是已知的变量;Y 称作目标变量或者隐含变量,是我们想知道的变量。


比方说图像分割的问题,X 就是图像的像素,Y 就是每个像素所归属的类别。当然对于二维的图像问题还是有点复杂,那么我们用一个简单的一维问题做了例子:比方说自然语言处理中的词性标注问题,那么它的建模形式如下所示:



Dense CRF


我们看过了它的模型形式,下面直接来看看模型的能量函数表达形式:


$$E(x) = \sum\limits_i {{\varphi u}({x_i}) + } \sum\limits{i < j} {{\varphi _p}({x_i},{x_j})}$$


可以看出每一个像素都有一个 unary 的函数,也就是说在这个特征函数里 w,剩下的参数都出现在图像的像我们只考虑当前像素的类别,而暂时不考虑别的像素的类别信息。


而后面的 pairwise 函数里,每一个像素的类别都和其他像素计算一个 energy feature。于是就有了上面的公式形式。注意这里的能量函数是所有像素点的联合能量和不是某一个像素点的能量,所以后面的 pairwise 项,我们有 n(n-1)/2 组特征,总的来说,特征数量是像素数量的平方级别,如果我们有一张 100 万像素的图片,那么我们就会建立 4950 亿组 pairwise 特征。正是因为这种复杂的形式,所以这个模型被称作 Dense CRF。满满的全是 dense 啊!


关于 unary 函数的内容,我们可以尽情发挥,在 denseCRF 中我们并没有对这一部分做详细的限制。因此关于这部分我们就暂时略去不谈了,在后面的文章中我们会重新回来,挖掘 unary 函数的潜力。下面我们专注于解决 pairwise 这个大坑。


下面我们讲 piarwise 部分展开,其中


$${\varphi p}({x_i},{x_j}) = \mu ({x_i},{x_j})\sum\limits{m = 1}^K {{w^{(m)}}{k^{(m)}}({f_i},{f_j})}$$


可以看出,pairwise 函数中还是比较复杂的,我们从左往右以此介绍。


首先是,这一项被称作 label compatibility 项,简单来说这里约束了“力”传导的条件,只有相同 label 条件下,能量才可以相互传导。具体来说,“一个像素可能是飞机”的能量可以和“另一个像素可能是飞机”的能量相互传导,从而增加或者减少后者“可能是飞机”的能量,从而影响“可能是飞机”的概率,而“一个像素可能是飞机”的能量是不能影响“另一个像素是人”的概率的。


文章中也提到了,这个简单地一刀切似乎有点不人性。拿 Pascal-VOC 中的 20 类+背景类来说,有些类别之间的相似性是很强的,而另外一些类别则完全不相似,所以作者后面提到了一些学习相关的事情,这里我们就不再深入下去了。


加和项里面就是经典的权重*feature 的套路了,其中



这一项以特征的形式表示了不同像素之前的“亲密度”。前面我们提到了特征不同于 tabular 形式的 factor,我们看不到表格,只能看到公式。上面的公式中,第一项被称作 appearance kernel,第二项被称作 smooth kernel。这里面有很多变量,我们一一来看。


appearance kernel 里面的 p 表示像素的位置——position,我们的图像是 2 维的,那么 position 就有 2 维。I 表示图像的像素值——Intensity,我们的图像是彩色的,那么 Intensity 就有 3 维。分式下面的两个参数无论从位置还是长相都像高斯分布中的方差,这里的含义也差不多的。


于是乎我们可以看出,如果两个像素距离近且颜色近,那么这个 feature 特征就会很强,反之则不强。同时分母也控制了强弱性,分母越大越难强起来。其实这一项和图像处理中的 bilateral filter 很像。我们相当于在一个 5 维的空间内寻找相近的像素对并给予它们的特征加强。


DeepLabV3 取消 DenseCRF 的原因


语义分割与分类不同。分类主要是识别物体,而语义分割不但要识别物体,还要找出物体的位置信息。DCNN 卷积网络越深,其位置信息丢失的越严重。所以在 deeplab v1/v2 中用到了,全局 CRF 增强其位置信息。


但是在 deeplabv3 中,使用大采样率的 3X3 空洞卷积,图像边界响应无法捕捉远距离信息,会退化为 1×1 的卷积, 所以 deeplabv3 将图像级特征融合到 ASPP 模块中。融合图像级特征,相当于融合了其位置信息。所以就不需要最后再用 CRF 了。这就是用了 CRF,其精度也增加的不多的原因。

2.3.训练策略

2.3.1.Learning rate policy:

  • 采用 poly 策略, 在初始学习率基础上乘,其中

2.3.2.Crop size:

  • 为了大采样率的空洞卷积能够有效,需要较大的图片大小;否则,大采样率的空洞卷积权值就会主要用于 padding 区域。

  • 在 Pascal VOC 2012 数据集的训练和测试中我们采用了 513 的裁剪尺寸。

2.3.3.Batch normalization:

  • 我们在 ResNet 之上添加的模块都包括 BN 层

  • 当 output_stride=16 时,采用 batchsize=16,同时 BN 层的参数做参数衰减 0.9997。

  • 在增强的数据集上,以初始学习率 0.007 训练 30K 后,冻结 BN 层参数,然后采用 output_stride=8,再使用初始学习率 0.001 在 PASCAL 官方的数据集上训练 30K。

  • 训练 output_stride=16 比 output_stride=8 要快很多,因为其中间的特征映射在空间上小四倍。但 output_stride=16 在特征映射上相对粗糙,快是因为牺牲了精度。

2.3.4.Upsampling logits:

  • 在先前的工作上,我们是将 output_stride=8 的输出与 Ground Truth 下采样 8 倍做比较。

  • 现在我们发现保持 Ground Truth 更重要,故我们是将最终的输出上采样 8 倍与完整的 Ground Truth 比较。

2.3.5.Data augmentation:

在训练阶段,随机缩放输入图像(从 0.5 到 2.0)和随机左-右翻转

2.4.主要代码

DeepLabV3


class DeepLabV3(nn.Layer):    """    The DeepLabV3 implementation based on PaddlePaddle.    The original article refers to     Liang-Chieh Chen, et, al. "Rethinking Atrous Convolution for Semantic Image Segmentation"     (https://arxiv.org/pdf/1706.05587.pdf).    Args:        Please Refer to DeepLabV3P above.    """
def __init__(self, num_classes, #分割类别数 backbone, # 主干网络 backbone_indices=(3, ), aspp_ratios=(1, 6, 12, 18), # aspp 空洞卷积率 aspp_out_channels=256, # aspp输出通道数 align_corners=False, # 是否对齐 pretrained=None): # 是否预处理 super().__init__()
self.backbone = backbone #主干网络 backbone_channels = [ backbone.feat_channels[i] for i in backbone_indices ] #定义头模块 self.head = DeepLabV3Head(num_classes, backbone_indices, backbone_channels, aspp_ratios, aspp_out_channels, align_corners) self.align_corners = align_corners self.pretrained = pretrained self.init_weight() # 初始化权重
def forward(self, x): feat_list = self.backbone(x) logit_list = self.head(feat_list) return [ # 执行上采样,填充方式使用‘bilinear’ F.interpolate( logit, paddle.shape(x)[2:], mode='bilinear', align_corners=self.align_corners) for logit in logit_list ]
def init_weight(self): if self.pretrained is not None: utils.load_entire_model(self, self.pretrained) # 载入预处理模型
复制代码


DeepLabV3Head


class DeepLabV3Head(nn.Layer):    """    The DeepLabV3Head implementation based on PaddlePaddle.    Args:        Please Refer to DeepLabV3PHead above.    """
def __init__(self, num_classes, backbone_indices, backbone_channels, aspp_ratios, aspp_out_channels, align_corners): super().__init__() #定义ASPP模块 self.aspp = layers.ASPPModule( aspp_ratios, backbone_channels[0], aspp_out_channels, align_corners, use_sep_conv=False, image_pooling=True) #定义分类头 self.cls = nn.Conv2D( in_channels=aspp_out_channels, out_channels=num_classes, kernel_size=1)
self.backbone_indices = backbone_indices
def forward(self, feat_list): logit_list = [] x = feat_list[self.backbone_indices[0]] x = self.aspp(x) logit = self.cls(x) logit_list.append(logit)
return logit_list

复制代码

3.实验结果

我们首先实验级联更多的空洞卷积模块。


ResNet50:


使用 ResNet-50 时,我们探究 output_stride 的影响。如表 1 所示。


  • 当 output_stride 为 256 时,由于严重的信号抽取,性能相比其他 output_stride 大大的下降了。

  • 当使用不同采样率的空洞卷积时,性能上升,这说明了语义分割中使用空洞卷积的必要性。


ResNet-50 vs. ResNet-101:


用更深的模型,并改变级联模块的数量。



表 2 使用不同叠块数的 ResNet-50 和 ResNet-101 时,使用输出步长 Output_stride= 16


  • 当 block 增加,性能也随之增加。

  • 随着添加更多的 block,提升变得更小。

  • 值得注意的是,ResNet-50 使用 block7 会稍微降低性能,同时 ResNet-101 使用后仍然可以提升性能。


Multi-grid:


采用 Multi-gird 策略,在 ResNet-101 使用变体残差模块。block4 和其他添加进来的 block 中,主分支中的三个卷积都使用空洞卷积,采样率设置 Multi-gird 策略。



表 3 使用 ResNet-101 对不同叠块数采用多重网格法,Output_stride = 16。


实验观察到的:


  • 应用 Multi-gird 策略通常比单倍数 效果要好

  • 简单的提升倍数例如是无效的

  • 增加网络深度再配合 Multi-gird 可以提升性能。图中最好的模型即 block7 下


Inference strategy on val set:


模型训练阶段使用 output_stride=16,在推理过程中应用 output_stride=8 以获得更精细的特征图。



表 4 推理策略. MG:多重网络. OS: 输出步长. MS: 多尺度输入. Flip: 输入左右翻转.


  • 评估时 output_stride=8 比 output_stride=16 性能提高了 1.39%。

  • 使用多尺度输入(scales={0.5, 0.75, 1.0, 1.25, 1.5, 1.75})和左-右翻转,进行数据增强后,进一步提高了性能。

  • 最后,计算每个尺度和翻转图像的平均概率来作为最终结果。


Atrous Spatial Pyramid Pooling:


DeepLab V3 的 ASPP 模块与 DeepLab V2 的主要区别在于,增加了 BN 层,增加了图像级别的特征。表 5 记录了 ASPP 模块 block4 使用 multi-grid 策略和图像级特征后的效果。



表 5 在 Output_stide = 16 下,使用多重网格方法和图像级特征的 ASPP


Inference strategy on val set:


推断期间使用 output_stride = 8,采用多尺度输入和左-右翻转数据增强。



表 6 推理策略 MG:多重网格方法。 ASPP:空洞空间金字塔。 OS:Output_stride。 MS:多尺度输入。 Flip: 输入左右翻转。COCO: 在 MS-COCO 上预训练。

4.总结

总的来说,本文从 DeepLab 系列出发,分别介绍了各版本的 Deeplab 的动机,并给予动机进行改进的创新点和策略。然后针对 DeeplabV3 详细的解释了该模型从问题的提出到实验结果相关内容。从解决问题的角度出发,DeeplabV3 主要解决了物体的多尺度问题,在 DCNN 问题上并没有进行深入讨论。DCNN 的多次下采样会造成特征图分辨率变小,导致预测精度降低,边界信息丢失,该问题于 DeeplabV3+中进行了深入的讨论与解决。从实验结果来看,DeeplabV3 表现出相较于以前版本更好的性能。


更多文章请关注公重号:汀丶人工智能


参考文献

[1] Rethinking Atrous Convolution for Semantic Image Segmentation


发布于: 32 分钟前阅读数: 3
用户头像

本博客将不定期更新关于NLP等领域相关知识 2022-01-06 加入

本博客将不定期更新关于机器学习、强化学习、数据挖掘以及NLP等领域相关知识,以及分享自己学习到的知识技能,感谢大家关注!

评论

发布
暂无评论
深度学习应用篇-计算机视觉-语义分割综述[6]:DeepLab系列简介、DeepLabV3深入解读创新点、训练策略、主要贡献_人工智能_汀丶人工智能_InfoQ写作社区