本篇文章参考自开源大佬的文章并结合自己的思考而来,欢迎大家提出意见,论文代码同样来自开源,文中已注明
文章目录
- 图像分割
- 图像分割算法分类?
- 传统的基于CNN的分割方法缺点?
- FCN详解
- FCN改变了什么?
- FCN网络结构?
- 全卷积网络举例?
- 全连接层和卷积层如何相互转化?
- 为什么传统CNN的输入图片是固定大小?
- 把全连接层的权重W重塑成卷积层的滤波器有什么好处?
- 反卷积层理解
- 模型训练
- FCN缺点
- U-Net
- SegNet
- 空洞卷积(Dilated Convolutions)
- RefineNet
- PSPNet
- DeepLab系列
- DeepLabv1
- DeepLabv2
- DeepLabv3
- Mask-R-CNN
- Mask-RCNN 的网络结构示意图
- RCNN行人检测框架
- Mask-RCNN 技术要点
- CNN在基于弱监督学习的图像分割中的应用
- Scribble标记
- 图像级别标记
- DeepLab+bounding box+image-level labels**
- 统一的框架
- 弱监督分割最新进展(贡献者:明奇-北京理工大学)
- DenseNet(贡献者:黄钦建-华南理工大学)
- 图像分割的常用数据集
- PASCAL VOC
- MS COCO
- Cityscapes
图像分割
图像分割算法分类?
图像分割是预测图像中每一个像素所属的类别或者物体。基于深度学习的图像分割算法主要分为两类:
1.语义分割
为图像中的每个像素分配一个类别,如把画面中的所有物体都指出它们各自的类别。
2.实例分割
与语义分割不同,实例分割只对特定物体进行类别分配,这一点与目标检测有点相似,但目标检测输出的是边界框和类别,而实例分割输出的是掩膜(mask)和类别。
传统的基于CNN的分割方法缺点?
传统基于 CNN 的分割方法就好比给每个像素都安排了个 “小跟班”,让它们带着周围 15×15 的图像块小分队去 CNN 那里报到,以此来判断类别。可这种方法问题多多:
1)存储开销大得吓人。就像一群小分队不断滑动着窗口往前走,每到一处就把图像块塞进 CNN,存储空间瞬间被堆得满满当当,随着滑动窗口次数和大小的增加,那占用空间可是一路飙升,停都停不下来。
2)效率低得让人着急。相邻像素块基本长得一个样,可还得一个一个地去算卷积,这不就是明摆着做重复劳动嘛,时间全被浪费在这没完没了的重复里了。
3)像素块大小就像个 “紧箍咒”,死死地限制了感受区域。它比整幅图像小太多,只能提取点局部特征,分类性能自然就被狠狠地拖了后腿。
不过别担心,全卷积网络(FCN)闪亮登场来救场啦!它可不靠这小打小闹的像素块,而是从抽象的特征里直接把每个像素所属类别给 “揪” 出来,成功完成了从图像级别分类到像素级别分类的华丽大升级。
FCN详解
FCN改变了什么?
对于一般的分类CNN网络,如VGG和Resnet,都会在网络的最后加入一些全连接层,经过softmax后就可以获得类别概率信息。但是这个概率信息是1维的,即只能标识整个图片的类别,不能标识每个像素点的类别,所以这种全连接方法不适用于图像分割。
而FCN提出可以把后面几个全连接都换成卷积,这样就可以获得一张2维的feature map,后接softmax层获得每个像素点的分类信息,从而解决了分割问题,
FCN网络结构?
FCN堪称语义分割界的“技术大牛”,它直接对图像进行像素级分类,轻松搞定语义级别的图像分割难题。跟经典CNN死板的套路不同,经典CNN在卷积层后靠全连接层搞个固定长度的特征向量,再通过全联接层和softmax输出来分类。FCN可灵活多了,能接受各种尺寸的输入图像,完全不挑食。
它的绝招是用反卷积层,就像给最后一个卷积层的feature map施了魔法,通过上采样操作,让它神奇地恢复到和输入图像一样大小。这样一来,每个像素都能得到一个专属预测,而且原始图像里的空间信息也被完整保留下来,没有一丝浪费。最后,FCN在上采样后的特征图上大展身手,进行逐像素分类,就像给每个像素都准备了一顶专属帽子,精准地标注出它们的类别,让整个图像分割得明明白白。
全卷积网络举例?
通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务,因为它们最后都得到整个输入图像的一个概率向量。
(1)在CNN中, 猫的图片输入到AlexNet, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高, 用来做分类任务。
(2)FCN与CNN的区别在于把CNN最后的全连接层转换成卷积层,输出的是一张已经带有标签的图片, 而这个图片就可以做语义分割。
(3)CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征: 较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。高层的抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高, 所以我们常常可以将卷积层看作是特征提取器。
全连接层和卷积层如何相互转化?
两者相互转换的可能性:
全连接层和卷积层之间唯一的不同就是卷积层中的神经元只与输入数据中的一个局部区域连接,并且在卷积列中的神经元共享参数。然而在两类层中,神经元都是计算点积,所以它们的函数形式是一样的。因此,将此两者相互转化是可能的:
(1)对于任一个卷积层,都存在一个能实现和它一样的前向传播函数的全连接层。权重矩阵是一个巨大的矩阵,除了某些特定块,其余部分都是零。而在其中大部分块中,元素都是相等的。
(2)任何全连接层都可以被转化为卷积层。比如VGG16中第一个全连接层是25088 * 4096的数据尺寸,将它转化为512 * 7 * 7 * 4096的数据尺寸,即一个K=4096的全连接层,输入数据体的尺寸是7 * 7 * 512,这个全连接层可以被等效地看做一个F=7, P=0, S=1, K=4096 的卷积层。换句话说,就是将滤波器的尺寸设置为和输入数据体的尺寸一致7 * 7, 这样输出就变为1 * 1 * 4096, 本质上和全连接层的输出是一样的。
输出激活数据体深度是由卷积核的数目决定的(K=4096)。
在两种变换中,将全连接层转化为卷积层在实际运用中更加有用。假设一个卷积神经网络的输入是227x227x3的图像,一系列的卷积层和下采样层将图像数据变为尺寸为7x7x512的激活数据体, AlexNet的处理方式为使用了两个尺寸为4096的全连接层,最后一个有1000个神经元的全连接层用于计算分类评分。我们可以将这3个全连接层中的任意一个转化为卷积层:
(1)第一个连接区域是[7x7x512]的全连接层,令其滤波器尺寸为F=7,K=4096,这样输出数据体就为[1x1x4096]。
(2)第二个全连接层,令其滤波器尺寸为F=1,K=4096,这样输出数据体为[1x1x4096]。
(3)最后一个全连接层也做类似的,令其F=1,K=1000,最终输出为[1x1x1000]。
为什么传统CNN的输入图片是固定大小?
CNN的卷积层和池化层就像两个“不挑食”的小能手,不管输入图片是大是小,它们都能灵活应对。卷积层按滑窗卷积的规则办事,输出feature map的尺寸只和输入尺寸、核大小、步长有关,池化层也同理。但一进入全连接层,情况就大变样啦!
全连接层的“死板劲儿”可太明显了,它要求feature map(假设是n×n大小)拉直成一条向量,每个元素都得和下一层的结点全连接。如果下一层有4096个结点,那权值数量就是4096×n×n。但神经网络一旦确定,权值数量就固定了,所以这个n不能变来变去。再往回看,卷积层和池化层的输出尺寸都环环相扣,最终都得配合全连接层的要求。这就导致输入图片的尺寸也被固定死啦。
这就好比一个超长的“食物链”,全连接层在最顶端定死了每个环节的“规矩”,卷积层和池化层只能乖乖配合,整个CNN的灵活性就被全连接层给“拖了后腿”。
把全连接层的权重W重塑成卷积层的滤波器有什么好处?
这样的转化可以在单个向前传播的过程中, 使得卷积网络在一张更大的输入图片上滑动,从而得到多个输出(可以理解为一个label map)。
比如: 我们想让224×224尺寸的浮窗,以步长为32在384×384的图片上滑动,把每个经停的位置都带入卷积网络,最后得到6×6个位置的类别得分, 那么通过将全连接层转化为卷积层之后的运算过程为:
如果224×224的输入图片经过卷积层和下采样层之后得到了[7x7x512]的数组,那么,384×384的大图片直接经过同样的卷积层和下采样层之后会得到[12x12x512]的数组, 然后再经过上面由3个全连接层转化得到的3个卷积层,最终得到[6x6x1000]的输出((12 – 7)/1 + 1 = 6), 这个结果正是浮窗在原图经停的6×6个位置的得分。
一个确定的CNN网络结构之所以要固定输入图片大小,是因为全连接层权值数固定,而该权值数和feature map大小有关, 但是FCN在CNN的基础上把1000个结点的全连接层改为含有1000个1×1卷积核的卷积层,经过这一层,还是得到二维的feature map,同样我们也不关心这个feature map大小, 所以对于输入图片的size并没有限制。
下面来详细的解释一下:
1)全连接层变全卷积层:传统CNN有5层卷积层,后面跟着两层4096个神经元的全连接层和一层1000个神经元的全连接层(对应1000个类别概率)。而FCN把这三层全连接层“变身”成卷积层,卷积核的大小分别是 (4096,1,1)、(4096,1,1)、(1000,1,1),看上去数字差不多,但卷积和全连接是两码事,它们的计算方式不同。FCN利用了之前CNN训练好的权值和偏置,不过这些权值和偏置现在属于各自的卷积核,就像换了种“工作方式”。
(2)输入图像大小的差别:在CNN里,输入图像必须统一固定成227x227大小,经过几次pooling后,图像依次变小。而FCN更灵活,输入图像是HW大小,每层pooling后图像大小按比例缩小,第八层变为原图的1/16大小。
(3)图像变小与热图、上采样:随着多次卷积和pooling,图像分辨率越来越低,最终到H/32W/32时,得到的图像叫热图,这是非常重要的高维特征图。有了热图后,最关键的一步就是上采样,把图像放大到原图大小。
这种转化后的网络比原始CNN高效得多。以前原始CNN要对36个位置分别迭代计算优化模型,再逐个预测,费时费力。而转化后的CNN只需要一次前向传播计算,36个位置的计算共享资源,大大节省时间。这技巧很实用,通常把图像尺寸变大,用变换后的CNN对很多不同位置评价分类,再求平均值。
反卷积层理解
Upsampling的操作可以看成是反卷积(deconvolutional),卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中通过bp算法学习得到。反卷积层也是卷积层,不关心input大小,滑窗卷积后输出output。deconv并不是真正的deconvolution(卷积的逆变换),最近比较公认的叫法应该是transposed convolution,deconv的前向传播就是conv的反向传播。
反卷积参数: 利用卷积过程filter的转置(实际上就是水平和竖直方向上翻转filter)作为计算卷积前的特征图。
对CNN的结果做处理,得到了dense prediction,而作者在试验中发现,得到的分割结果比较粗糙,所以考虑加入更多前层的细节信息,也就是把倒数第几层的输出和最后的输出做一个fusion,实际上也就是加和:
实验表明,这样的分割结果更细致更准确。在逐层fusion的过程中,做到第三行再往下,结果又会变差,所以作者做到这里就停了。
模型训练
(1)用AlexNet,VGG16或者GoogleNet训练好的模型做初始化,在这个基础上做fine-tuning,全部都fine-tuning,只需在末尾加上upsampling,参数的学习还是利用CNN本身的反向传播原理。
(2)采用whole image做训练,不进行patchwise sampling。实验证明直接用全图已经很effective and efficient。
(3)对class score的卷积层做全零初始化。随机初始化在性能和收敛上没有优势。
举例:
FCN例子: 输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21,模型基于AlexNet。
蓝色:卷积层。
绿色:Max Pooling层。
黄色: 求和运算, 使用逐数据相加,把三个不同深度的预测结果进行融合:较浅的结果更为精细,较深的结果更为鲁棒。
灰色: 裁剪, 在融合之前,使用裁剪层统一两者大小, 最后裁剪成和输入相同尺寸输出。
对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变。
(1)全卷积层部分进行特征提取, 提取卷积层(3个蓝色层)的输出来作为预测21个类别的特征。
(2)图中虚线内是反卷积层的运算, 反卷积层(3个橙色层)可以把输入数据尺寸放大。和卷积层一样,升采样的具体参数经过训练确定。
FCN缺点
(1)得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。
(2)对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。
U-Net
卷积网络在分类任务里挺火的,输出整个图像的类标签。但像生物医学图像处理这种领域,可不够用。人家要的是目标位置和每个像素的类标签。这不,Ciresan等人就搞了个卷积神经网络,用滑动窗口提供像素的周围区域(patch)作为输入来预测每个像素的类标签。这个网络有两个优点:一是能定位出目标类别的位置;二是输入的是patches,相当于进行了数据增广,解决了生物医学图像数量少的问题。
但这个方法也有两个很明显缺点。第一,它很慢。为啥呢?这个网络得训练每个patch,而且patch间重叠很多,造成冗余。卷积核里面的W是提取特征的权重,两个块重叠的部分太多,这个权重就被同一些特征训练两次,资源浪费严重,训练时间和效率都受影响。虽然说冗余会增加训练集,但这是相同的图片啊,举个例子,一张图训练20次,按照这个意思也是增大了训练集,但这会导致过拟合。就是对这个图片识别很准,别的图片就不一定了。第二,定位准确性和获取上下文信息不可兼得。大的patches需要更多max-pooling层,这减小了定位准确性。为啥呢?因为你是对以这个像素为中心的点进行分类,最后经过全连接层的前一层大小肯定是不变的。如果patch大,就需要更多的pooling达到这个大小,而pooling层越多,丢失信息的信息也越多。小的patches只能看到很小的局部信息,包含的背景信息不够。
这篇论文就建立了一个更好的全卷积方法。他们定义和扩展了这个方法,它使用更少的训练图片但产生更精确的分割。
(1)使用全卷积神经网络。全卷积神经网络就是卷积取代了全连接层,全连接层必须固定图像大小,而卷积不用。所以这个策略使得你可以输入任意尺寸的图片,而且输出也是图片,所以这是一个端到端的网络。
(2)左边的网络是收缩路径:使用卷积和maxpooling。简单来说,收缩路径就是通过卷积和maxpooling不断提取特征,同时降低图像的分辨率,得到更抽象的特征。
(3)右边的网络是扩张路径:使用上采样产生的特征图和左侧收缩路径对应层产生的特征图进行concatenate操作。pooling层会丢失图像信息和降低图像分辨率,而且是不可逆的操作。对图像分割任务影响较大,所以得做上采样。上采样可以补足一些图片的信息,但信息补充不完全。所以需要与左边的分辨率比较高的图片相连接起来(直接复制过来再裁剪到与上采样图片一样大小)。这相当于在高分辨率和更抽象特征当中做一个折衷。随着卷积次数增多,提取的特征也更加有效,更加抽象。上采样的图片是经历多次卷积后的图片,比较高效和抽象,然后把它与左边不怎么抽象但更高分辨率的特征图片进行连接。
(4)最后再经过两次反卷积操作,生成特征图,再用两个1X1的卷积做分类得到最后的两张heatmap。比如第一张表示的是第一类的得分,第二张表示第二类的得分heatmap,然后作为softmax函数的输入,算出概率比较大的softmax类,选择它作为输入给交叉熵进行反向传播训练。
下面是U-Net模型的代码实现:(来自:黄钦建-华南理工大学)
def get_unet():
inputs = Input((img_rows, img_cols, 1))
conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
# pool1 = Dropout(0.25)(pool1)
# pool1 = BatchNormalization()(pool1)
conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool1)
conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
# pool2 = Dropout(0.5)(pool2)
# pool2 = BatchNormalization()(pool2)
conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool2)
conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv3)
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)
# pool3 = Dropout(0.5)(pool3)
# pool3 = BatchNormalization()(pool3)
conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool3)
conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)
# pool4 = Dropout(0.5)(pool4)
# pool4 = BatchNormalization()(pool4)
conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool4)
conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv5)
up6 = concatenate([Conv2DTranspose(256, (2, 2), strides=(
2, 2), padding='same')(conv5), conv4], axis=3)
# up6 = Dropout(0.5)(up6)
# up6 = BatchNormalization()(up6)
conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(up6)
conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv6)
up7 = concatenate([Conv2DTranspose(128, (2, 2), strides=(
2, 2), padding='same')(conv6), conv3], axis=3)
# up7 = Dropout(0.5)(up7)
# up7 = BatchNormalization()(up7)
conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(up7)
conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv7)
up8 = concatenate([Conv2DTranspose(64, (2, 2), strides=(
2, 2), padding='same')(conv7), conv2], axis=3)
# up8 = Dropout(0.5)(up8)
# up8 = BatchNormalization()(up8)
conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(up8)
conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv8)
up9 = concatenate([Conv2DTranspose(32, (2, 2), strides=(
2, 2), padding='same')(conv8), conv1], axis=3)
# up9 = Dropout(0.5)(up9)
# up9 = BatchNormalization()(up9)
conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(up9)
conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv9)
# conv9 = Dropout(0.5)(conv9)
conv10 = Conv2D(1, (1, 1), activation='sigmoid')(conv9)
model = Model(inputs=[inputs], outputs=[conv10])
model.compile(optimizer=Adam(lr=1e-5),
loss=dice_coef_loss, metrics=[dice_coef])
return model
SegNet
可训练的图像分割引擎,包含一个encoder网络,一个对应的decoder网络,衔接像素级分类层,解码网络与VGG16的13层卷积层相同。解码网络是将低分辨率的编码特征图映射到全分辨率的特征图。解码网络使用最大池化层的池化索引进行非线性上采样,上采样过程就不需要学习。上采样得到的稀疏图与可训练的滤波器卷积得到致密的特征图。
使用池化层索引进行上采样的优势:
1)提升边缘刻画度;
2)减少训练的参数;
3)这种上采样模式可以包含到任何编码-解码网络中。
输入是图像,输出是分割后的图像,不同颜色代表不同分类。语义分割不仅识别图片中的物体,还告知其位置。SegNet 是对称网络,中间绿色 pooling 层和红色 upsampling 层作为分界,左边是卷积提取高维特征并 pooling 使图片变小的 Encoder,右边是反卷积和 upsampling 使图像变大的 Decoder,最后经 Softmax 输出分类最大值。
具体过程如下:
编码网络(Encoder)
卷积 :使用 same 卷积提取特征,不改变图片大小。
BN :对卷积后的特征图进行批归一化,加速训练并稳定网络。
ReLU :引入非线性,使网络能学习复杂特征。
最大池化 :获得空间小位移的平移不变性,但会损失边缘细节,因此编码过程需保存边缘信息。因内存原因,只保存最大池化索引,即最大特征值的位置。
解码网络(Decoder)
上采样 :利用保存的最大池化索引上采样,得到稀疏特征图。
卷积 :使用 same 卷积丰富 upsampling 变大后的图像信息,与传统 CNN 卷积无区别,作用是让 pooling 过程丢失的信息通过学习在 Decoder 中得到恢复。
BN :对卷积后的特征图进行批归一化。
Softmax :高维特征图输入 Softmax 层,对每个像素分类,得到每个像素属于 K 类的概率。
与 FCN 解码技术对比
FCN :对编码特征图降维后输入解码网络,解码网络中上采样使用反卷积实现,上采样特征图与降维编码图进行 element-wise add 得到最终解码特征图,但需存储编码特征图,在嵌入式设备中内存紧张。
SegNet :只需保存最大池化索引,无需存储编码特征图,更节省内存,在嵌入式设备中更具优势。
空洞卷积(Dilated Convolutions)
在图像分割领域,图像输入到CNN(典型的网络比如FCN[3])中,FCN先像传统的CNN那样对图像做卷积再pooling,降低图像尺寸的同时增大感受野,但是由于图像分割预测是pixel-wise的输出,所以要将pooling后较小的图像尺寸upsampling到原始的图像尺寸进行预测(upsampling一般采用deconv反卷积操作,deconv可参见知乎答案如何理解深度学习中的deconvolution networks?),之前的pooling操作使得每个pixel预测都能看到较大感受野信息。因此图像分割FCN中有两个关键,一个是pooling减小图像尺寸增大感受野,另一个是upsampling扩大图像尺寸。在先减小再增大尺寸的过程中,肯定有一些信息损失掉了,那么能不能设计一种新的操作,不通过pooling也能有较大的感受野看到更多的信息呢?答案就是dilated conv。
以前的CNN主要问题总结:
(1)Up-sampling / pooling layer
(2)内部数据结构丢失;空间层级化信息丢失。
(3)小物体信息无法重建 (假设有四个pooling layer 则 任何小于 2^4 = 16 pixel 的物体信息将理论上无法重建。)
(a) 图对应3x3的1-dilated conv,和普通的卷积操作一样,(b)图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,也就是对于一个7x7的图像patch,只有9个红色的点和3x3的kernel发生卷积操作,其余的点略过。也可以理解为kernel的size为7x7,但是只有图中的9个点的权重不为0,其余都为0。 可以看到虽然kernel size只有3x3,但是这个卷积的感受野已经增大到了7x7(如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话,那么每个红点就是1-dilated的卷积输出,所以感受野为3x3,所以1-dilated和2-dilated合起来就能达到7x7的conv),©图是4-dilated conv操作,同理跟在两个1-dilated和2-dilated conv的后面,能达到15x15的感受野。对比传统的conv操作,3层3x3的卷积加起来,stride为1的话,只能达到(kernel-1) * layer+1=7的感受野,也就是和层数layer成线性关系,而dilated conv的感受野是指数级的增长。
dilated的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。在图像需要全局信息或者语音文本需要较长的sequence信息依赖的问题中,都能很好的应用dilated conv,比如图像分割、语音合成WaveNet、机器翻译ByteNet中。
RefineNet
最左边一栏就是FCN的encoder部分(文中是用的ResNet),先把pretrained ResNet按feature map的分辨率分成四个ResNet blocks,然后向右把四个blocks分别作为4个path通过RefineNet block进行融合refine,最后得到一个refined feature map(接softmax再双线性插值输出)。
注意除了RefineNet-4,所有的RefineNet block都是二输入的,用于融合不同level做refine,而单输入的RefineNet-4可以看作是先对ResNet的一个task adaptation。
RefineNet Block
接下来仔细看一下RefineNet block,可以看到主要组成部分是Residual convolution unit, Multi-resolution fusion, Chained residual pooling, Output convolutions. 切记这个block作用是融合多个level的feature map输出单个level的feature map,但具体的实现应该是和输入个数、shape无关的。
Residual convolution unit就是普通的去除了BN的residual unit;
Multi-resolution fusion是先对多输入的feature map都用一个卷积层进行adaptation(都化到最小的feature map的shape),再上采样再做element-wise的相加。注意如果是像RefineNet-4那样的单输入block这一部分就直接pass了;
Chained residual pooling中的ReLU对接下来池化的有效性很重要,还可以使模型对学习率的变化没这么敏感。这个链式结构能从很大范围区域上获取背景context。另外,这个结构中大量使用了identity mapping这样的连接,无论长距离或者短距离的,这样的结构允许梯度从一个block直接向其他任一block传播。
Output convolutions就是输出前再加一个RCU。
PSPNet
场景解析对于无限制的开放词汇和不同场景来说是具有挑战性的.本文使用文中的pyramid pooling module实现基于不同区域的上下文集成,提出了PSPNet,实现利用上下文信息的能力进行场景解析。
作者认为,FCN存在的主要问题是没有采取合适的策略来用全局的信息,本文的做法就是借鉴SPPNet来设计了PSPNet解决这个问题。
很多State-of-the-art的场景解析框架都是基于FCN的.基于CNN的方法能够增强动态物体的理解,但是在无限制词汇和不同场景中仍然面临挑战.
FCN认为右侧框中是汽车,但是实际上是船,如果参考上下文的先验知识,就会发现左边是一个船屋,进而推断是框中是船.FCN存在的主要问题就是不能利用好全局的场景线索。
对于尤其复杂的场景理解,之前都是采用空间金字塔池化来做的,和之前方法不同(为什么不同,需要参考一下经典的金字塔算法),本文提出了pyramid scene parsing network(PSPNet)。
本文的主要贡献如下:
(1) 提出了PSPNet在基于FCN的框架中集成困难的上下文特征
(2) 通过基于深度监督误差开发了针对ResNet的高效优化策略
(3) 构建了一个用于state-of-the-art的场景解析和语义分割的实践系统(具体是什么?)
通过观察FCN的结果,发现了如下问题:
(1) 关系不匹配(Mismatched Relationship)
(2) 易混淆的类别(Confusion Categories)
(3) 不显眼的类别(Inconspicuous Classes)
DeepLab系列
DeepLabv1
DeepLab 是结合了深度卷积神经网络(DCNNs)和概率图模型(DenseCRFs)的方法。
在实验中发现 DCNNs 做语义分割时精准度不够的问题,根本原因是 DCNNs 的高级特征的平移不变性,即高层次特征映射,根源于重复的池化和下采样。
针对信号下采样或池化降低分辨率,DeepLab 是采用的 atrous(带孔)算法扩展感受野,获取更多的上下文信息。
分类器获取以对象中心的决策是需要空间变换的不变性,这天然地限制了 DCNN 的定位精度,DeepLab 采用完全连接的条件随机场(CRF)提高模型捕获细节的能力。
除空洞卷积和 CRFs 之外,论文使用的 tricks 还有 Multi-Scale features。其实就是 U-Net 和 FPN 的思想,在输入图像和前四个最大池化层的输出上附加了两层的 MLP,第一层是 128 个 3×3 卷积,第二层是 128 个 1×1 卷积。最终输出的特征与主干网的最后一层特征图融合,特征图增加 5×128=640 个通道。
实验表示多尺度有助于提升预测结果,但是效果不如 CRF 明显。
论文模型基于 VGG16,在 Titan GPU 上运行速度达到了 8FPS,全连接 CRF 平均推断需要 0.5s ,在 PASCAL VOC-2012 达到 71.6% IOU accuracy。
DeepLabv2
DeepLabv2 是在 DeepLabv1 基础上的优化升级,主要针对三个关键问题进行了改进。
首先是特征分辨率降低的问题。由于 DCNN 中连续的池化和下采样操作会导致特征图分辨率不断降低,影响分割精度。DeepLabv2 在最后几个最大池化层中大胆地去掉了下采样操作,转而采用空洞卷积来计算特征映射,这样可以在不增加输入图像尺寸的情况下,以更高的采样密度提取特征,从而有效缓解特征分辨率降低的问题。
其次是对物体多尺度的问题。DeepLabv1 采用多个 MLP 结合多尺度特征来应对,但这种方式会显著增加特征计算量和存储空间。DeepLabv2 论文从 Spatial Pyramid Pooling (SPP) 中汲取灵感,提出了类似的 ASPP(Atrous Spatial Pyramid Pooling)模块。ASPP 使用不同采样率的空洞卷积并行采样,能够同时捕捉不同比例的图像上下文信息,有效应对物体的多尺度特性,且比 DeepLabv1 的方法更加高效。
最后是 DCNN 的平移不变性对空间精度的影响。DeepLabv2 采用全连接的 CRF(Conditional Random Field)来增强模型捕捉细节的能力,通过引入 CRF,可以更好地利用像素间的空间关系和上下文信息,从而提高分割结果的精度和连贯性。
DeepLabv2 的模型基于 ResNet,在性能上表现不俗。在 NVidia Titan X GPU 上运行时,速度达到了 8FPS。全连接 CRF 平均推断时间约为 0.5s,与 DeepLabv1 在耗时方面基本相当。但在实际效果上,DeepLabv2 在 PASCAL VOC-2012 数据集上达到了 79.7 mIOU,这表明它在语义分割任务上取得了显著的性能提升,能够更准确地识别和分割图像中的各个物体类别。
DeepLabv3
好的论文不止说明怎么做,还告诉为什么。DeepLab 延续到 DeepLabv3 系列,依然是在空洞卷积做文章,但是探讨不同结构的方向。
1.Image Pyramid:将输入图片放缩成不同比例,分别应用在 DCNN 上,将预测结果融合得到最终输出。
2.Encoder-Decoder:利用 Encoder 阶段的多尺度特征,运用到 Decoder 阶段上恢复空间分辨率,代表工作有 FCN、SegNet、PSPNet 等工。
3.Deeper w. Atrous Convolution:在原始模型的顶端增加额外的模块,例如 DenseCRF,捕捉像素间长距离信息。
4.Spatial Pyramid Pooling:空间金字塔池化具有不同采样率和多种视野的卷积核,能够以多尺度捕捉对象。
DeepLabv1-v2 都是使用带孔卷积提取密集特征来进行语义分割。但是为了解决分割对象的多尺度问题,DeepLabv3 设计采用多比例的带孔卷积级联或并行来捕获多尺度背景。
此外,DeepLabv3 将修改之前提出的带孔空间金字塔池化模块,该模块用于探索多尺度卷积特征,将全局背景基于图像层次进行编码获得特征,取得 state-of-art 性能,在 PASCAL VOC-2012 达到 86.9 mIOU。
Mask-R-CNN
Mask-RCNN 的网络结构示意图
其中黑色部分为原来的Faster-RCNN,红色部分为在Faster网络上的修改:
1)将ROI Pooling层替换成了ROIAlign;
2)添加并列的FCN层(Mask层);
先来概述一下Mask-RCNN的几个特点(来自于PaperMask R-CNN的Abstract):
1)在边框识别的基础上添加分支网络,用于语义Mask识别;
2)训练简单,相对于Faster仅增加一个小的Overhead,可以跑到5FPS;
3)可以方便的扩展到其他任务,比如人的姿态估计等;
4)不借助Trick,在每个任务上,效果优于目前所有的 single-model entries;包括 COCO 2016 的Winners。
RCNN行人检测框架
图中灰色部分是原来的RCNN结合ResNet or FPN的网络,下面黑色部分为新添加的并联Mask层,这个图本身与上面的图也没有什么区别,旨在说明作者所提出的Mask RCNN方法的泛化适应能力:可以和多种RCNN框架结合,表现都不错。
Mask-RCNN 技术要点
1.技术要点1 - 强化的基础网络
通过ResNeXt-101+FPN用作特征提取网络,达到state-of-the-art的效果。
2.技术要点2 - ROIAlign
采用ROIAlign替代RoiPooling(改进池化操作)。引入了一个插值过程,先通过双线性插值到1414,再pooling到77,很大程度上解决了仅通过Pooling直接采样带来的Misalignment对齐问题。
PS: 虽然 Misalignment 在分类问题上影响并不大,但在 Pixel 级别的 Mask 上会存在较大误差。
后面我们把结果对比贴出来(Table2 c & d),能够看到 ROIAlign 带来较大的改进,可以看到,Stride 越大改进越明显。
3.技术要点3 - Loss Function
每个ROIAlign对应K * m^2维度的输出。K对应类别个数,即输出K个mask,m对应池化分辨率(7 * 7)。Loss函数定义:
L
m
a
s
k
(
C
l
s
k
)
=
S
i
g
m
o
i
d
(
C
l
s
k
)
Lmask(Cls_k)=Sigmoid(Cls_k)
Lmask(Clsk)=Sigmoid(Clsk)
L
m
a
s
k
(
C
l
s
k
)
=
S
i
g
m
o
i
d
(
C
l
s
k
)
Lmask(Cls_k) = Sigmoid (Cls_k)
Lmask(Clsk)=Sigmoid(Clsk),平均二值交叉熵 (average binary cross-entropy)Loss,通过逐像素的 Sigmoid 计算得到。
Why K个mask?通过对每个 Class 对应一个Mask可以有效避免类间竞争(其他Class不贡献Loss)。
通过结果对比来看(Table2 b),也就是作者所说的 Decouple 解耦,要比多分类的Softmax效果好很多。
另外,作者给出了很多实验分割效果,就不都列了,只贴一张和FCIS的对比图(FCIS出现了Overlap的问题)
CNN在基于弱监督学习的图像分割中的应用
答案来源:CNN在基于弱监督学习的图像分割中的应用
最近基于深度学习的图像分割技术一般依赖于卷积神经网络CNN的训练,训练过程中需要非常大量的标记图像,即一般要求训练图像中都要有精确的分割结果。
对于图像分割而言,要得到大量的完整标记过的图像非常困难,比如在ImageNet数据集上,有1400万张图有类别标记,有50万张图给出了bounding box,但是只有4460张图像有像素级别的分割结果。对训练图像中的每个像素做标记非常耗时,特别是对医学图像而言,完成对一个三维的CT或者MRI图像中各组织的标记过程需要数小时。
如果学习算法能通过对一些初略标记过的数据集的学习就能完成好的分割结果,那么对训练数据的标记过程就很简单,这可以大大降低花在训练数据标记上的时间。这些初略标记可以是:
1、只给出一张图像里面包含哪些物体,
2、给出某个物体的边界框,
3、对图像中的物体区域做部分像素的标记,例如画一些线条、涂鸦等(scribbles)。
Scribble标记
论文地址:ScribbleSup: Scribble-Supervised Convolutional Networks for Semantic Segmentation (CVPR 2016)
香港中文大学的Di Lin提出了一个基于Scribble标记的弱监督学习方法。Scribble是一个很方便使用的标记方法,因此被用得比较广泛。如下图,只需要画五条线就能完成对一副图像的标记工作。
ScribbleSup分为两步,第一步将像素的类别信息从scribbles传播到其他未标记的像素,自动完成所有的训练图像的标记工作; 第二步使用这些标记图像训练CNN。在第一步中,该方法先生成super-pxels, 然后基于graph cut的方法对所有的super-pixel进行标记。
Graph Cut的能量函数为:
∑ i ψ i ( y i ∣ X , S ) + ∑ i , j ψ i j ( y i , y j , X ) \sum_{i}\psi _i\left(y_i|X,S\right)+\sum_{i,j}\psi_{ij}\left(y_i,y_j,X\right) i∑ψi(yi∣X,S)+i,j∑ψij(yi,yj,X)
在这个graph中,每个super-pixel是graph中的一个节点,相接壤的super-pixel之间有一条连接的边。这个能量函数中的一元项包括两种情况,一个是来自于scribble的,一个是来自CNN对该super-pixel预测的概率。整个最优化过程实际上是求graph cut能量函数和CNN参数联合最优值的过程:
∑ i ψ i s c r ( y i ∣ X , S ) + ∑ i − l o g P ( y i ∣ X , θ ) + ∑ i , j ψ i j ( y i , y j ∣ X ) \sum_{i}\psi _i^{scr}\left(y_i|X,S\right)+\sum _i-logP\left(y_i| X,\theta\right)+\sum_{i,j}\psi _{ij}\left(y_i,y_j|X\right) i∑ψiscr(yi∣X,S)+i∑−logP(yi∣X,θ)+i,j∑ψij(yi,yj∣X)
上式的最优化是通过交替求
Y
Y
Y 和
θ
\theta
θ 的最优值来实现的。文章中发现通过三次迭代就能得到比较好的结果。
图像级别标记
论文地址:Constrained Convolutional Neural Networks for Weakly Supervised Segmentation (ICCV 2015)
UC Berkeley的Deepak Pathak使用了一个具有图像级别标记的训练数据来做弱监督学习。训练数据中只给出图像中包含某种物体,但是没有其位置信息和所包含的像素信息。该文章的方法将image tags转化为对CNN输出的label分布的限制条件,因此称为 Constrained convolutional neural network (CCNN).
该方法把训练过程看作是有线性限制条件的最优化过程:
m
i
n
i
m
i
z
e
θ
,
P
D
(
P
(
X
)
∣
∣
Q
(
X
∣
θ
)
)
s
u
b
j
e
c
t
→
A
P
→
⩾
b
→
,
∑
X
P
(
X
)
=
1
\underset{\theta ,P}{minimize}\qquad D(P(X)||Q(X|\theta ))\\ subject\to\qquad A\overrightarrow{P} \geqslant \overrightarrow{b},\sum_{X}^{ }P(X)=1
θ,PminimizeD(P(X)∣∣Q(X∣θ))subject→AP⩾b,X∑P(X)=1
其中的线性限制条件来自于训练数据上的标记,例如一幅图像中前景类别像素个数期望值的上界或者下界(物体大小)、某个类别的像素个数在某图像中为0,或者至少为1等。该目标函数可以转化为为一个loss function,然后通过SGD进行训练。
实验中发现单纯使用Image tags作为限制条件得到的分割结果还比较差,在PASCAL VOC 2012 test数据集上得到的mIoU为35.6%,加上物体大小的限制条件后能达到45.1%,如果再使用bounding box做限制,可以达到54%。FCN-8s可以达到62.2%,可见弱监督学习要取得好的结果还是比较难。
DeepLab+bounding box+image-level labels**
论文地址:Weakly-and Semi-Supervised Learning of a DCNN for Semantic Image Segmentation
Google的George Papandreou 和UCLA的Liang-Chieh Chen等在DeepLab的基础上进一步研究了使用bounding box和image-level labels作为标记的训练数据。使用了期望值最大化算法(EM)来估计未标记的像素的类别和CNN的参数。
对于image-level标记的数据,我们可以观测到图像的像素值和图像级别的标记 ,但是不知道每个像素的标号,因此把
y
y
y当做隐变量。使用如下的概率图模式:
P
(
x
,
y
,
z
;
θ
)
=
P
(
x
)
(
∏
m
=
1
M
P
(
y
m
∣
x
;
θ
)
)
P
(
z
∣
y
)
P\left ( x,y,z;\theta \right ) = P\left ( x \right )\left (\prod_{m=1}^{M} P\left ( y_m|x;\theta \right )\right )P\left ( z|y \right )
P(x,y,z;θ)=P(x)(m=1∏MP(ym∣x;θ))P(z∣y)
这篇论文是通过EM算法来学习模型的参数
θ
\theta
θ,具体推导过程可参考原论文。
对于给出bounding box标记的训练图像,该方法先使用CRF对该训练图像做自动分割,然后在分割的基础上做全监督学习。通过实验发现,单纯使用图像级别的标记得到的分割效果较差,但是使用bounding box的训练数据可以得到较好的结果,在VOC2012 test数据集上得到mIoU 62.2%。另外如果使用少量的全标记图像和大量的弱标记图像进行结合,可以得到与全监督学习(70.3%)接近的分割结果(69.0%)。
统一的框架
论文地址:Learning to Segment Under Various Forms of Weak Supervision (CVPR 2015)
Wisconsin-Madison大学的Jia Xu提出了一个统一的框架来处理各种不同类型的弱标记:图像级别的标记、bounding box和部分像素标记如scribbles。该方法把所有的训练图像分成共计
n
n
n个super-pixel,对每个super-pixel提取一个
d
d
d维特征向量。因为不知道每个super-pixel所属的类别,相当于无监督学习,因此该方法对所有的super-pixel做聚类,使用的是最大间隔聚类方法(max-margin clustering, MMC),该过程的最优化目标函数是:
m
i
n
W
,
H
1
2
t
r
(
W
T
W
)
+
λ
∑
p
=
1
n
∑
c
=
1
C
ξ
(
w
c
;
x
p
;
h
p
c
)
\underset{W,H}{min} \qquad \frac{1}{2}tr\left ( W^TW \right ) + \lambda\sum_{p=1}^{n}\sum_{c=1}^{C}\xi \left ( w_c;x_p;h_p^c \right)
W,Hmin21tr(WTW)+λp=1∑nc=1∑Cξ(wc;xp;hpc)
在这个目标函数的基础上,根据不同的弱标记方式,可以给出不同的限制条件,因此该方法就是在相应的限制条件下求最大间隔聚类。
该方法在Siftflow数据集上得到了比较好的结果,比state-of-the-art的结果提高了10%以上。
小结:在弱标记的数据集上训练图像分割算法可以减少对大量全标记数据的依赖,在大多数应用中会更加贴合实际情况。弱标记可以是图像级别的标记、边框和部分像素的标记等。训练的方法一般看做是限制条件下的最优化方法。另外EM算法可以用于CNN参数和像素类别的联合求优。
弱监督分割最新进展(贡献者:明奇-北京理工大学)
- bbox监督
-
Learning to Segment via Cut-and-Paste(ECCV 2018)
利用GAN对抗学习的思想,在cut-paste思想指导下利用bbox弱监督进行实例分割。
采用对抗学习的思想,网络主体分为两大部分:mask生成器和合成图像判别器。具体过程为:(1)在图像上截取gt,经过特征提取后预测一个bbox内gt的mask;(2)在原图上随机cut一个背景图像,将bbox内按照生成的mask提取出物体分割结果,然后paste到原图裁剪的背景上去;(3)合成的图像经过判别器进行真假判断。
通过生成器生成更好mask来使得判别器更难判别,在对抗学习中提升两者的性能,逐渐获得更好的结果 .
- Simple Does It: Weakly Supervised Instance and Semantic Segmentation(CVPR2017)
本文做的是bbox弱监督语义/实例分割任务,能达到全监督分割效果(DeepLabv1)的95%。主要工作为:讨论了使用弱监督语义标签进行迭代训练的方法,以及其限制和不足之处;证明了通过类似GrabCut的算法能通过bbox生成分割训练标签方法的可行性,可以避免像上面的迭代方法重新调整网络训练策略;在VOC数据集上逼近监督学习的分割任务效果。
作者的启发是:将bbox level的mask送入网络训练后得到分割mask的比输入的bbox mask要好(这是很好的insight)。因此启发的操作是:将bbox level标注作为初始mask输入优化,每次得到的标注作为gt进行下一轮的迭代,从而不断获得更好的效果。
在此基础上,再加上优化的GrabCut+算法,以及部分区域的筛选,以及BSDS500的边界预测信息整合到一起,能够达到很好的弱监督迭代分割效果。
- 分类监督
- Weakly Supervised Learning of Instance Segmentation with Inter-pixel Relations (CVPR 2019)
这个方法主要是利用分类标注作为弱监督信息,来实现弱监督实例分割。它的基础是 CAM(类别激活图),在此基础上进一步设计了 IRNet 来学习额外的特征约束,从而取得更好的分割效果。
IRNet 主要有两部分构成:一是不分类别的实例响应图,二是 pairwise semantic affinitie。一方面,通过不分类别的实例响应图和 CAM 结合,对 CAM 进行约束,进而得到 instance-wise CAMS;另一方面,另一个分支则是预先预测物体的边界,从而得到 pairwise semantic affinitie(关于这一部分的相关方法在论文的 Reference 部分有提及,这里暂时先不多做深入探究)。最后,通过对这两部分进行融合和处理,就能得到最终的分割结果。 - Weakly Supervised Instance Segmentation using Class Peak Response (CVPR 2018)
这是首个使用图像级标注进行弱监督实例分割的工作。该方法基于图像级的类别标注监督信息,通过探索类别响应峰值,让分类网络能够很好地提取出实例分割 mask。
在分类监督下,CNN 网络会产生一个类别响应图,图中每个位置代表类别置信度分数,其局部极大值往往蕴含着实例很强的视觉语义线索。具体操作时,先整合类别峰值响应图的信息,再通过反向传播将其映射到物体实例信息量较大的区域,比如边界等。从类别极值响应图生成的映射图被称为 Peak Response Maps (PRMs),它可以很好地提供实例物体的详细表征,进而作为分割的监督信息。
先是将图片经过正常分类网络训练,在类别预测响应图上提取局部响应极值点,再经过增强卷积预测出 PRM,最后结合多种信息进行推断生成 mask。 - Weakly Supervised Semantic Segmentation Using Superpixel Pooling Network (AAAI 2017)
该方法通过类别标注的标签来实现弱监督语义分割。其核心是在语义分割 mask 生成以及利用生成 mask 学习分割网络之间进行反复交替。而要实现这种交替迭代学习,关键在于如何借助类别标注得到较为准确的初始分割。
为了解决这个问题,提出了 Superpixel Pooling Network (SPN),把输入图像的超像素分割结果当作低阶结构表征,以此辅助语义分割的推断。首先是 SPN 生成初始 mask,接着用另一个网络 DecoupledNet 来学习每个像素的 mask 标注。其中,该分割网络将语义分割任务分解为分类和分割两个子任务,并且能从类别标注中学习形状先验知识,从而辅助分割任务的进行。
DenseNet(贡献者:黄钦建-华南理工大学)
这篇论文是CVPR2017年的最佳论文。
卷积神经网络结构的设计主要朝着两个方向发展,一个是更宽的网络(代表:GoogleNet、VGG),一个是更深的网络(代表:ResNet)。但是随着层数的加深会出现一个问题——梯度消失,这将会导致网络停止训练。到目前为止解决这个问题的思路基本都是在前后层之间加一个identity connections(short path)。
由上图中可知Resnet是做值的相加(也就是add操作),通道数是不变的。而DenseNet是做通道的合并(也就是Concatenation操作),就像Inception那样。从这两个公式就可以看出这两个网络的本质不同。此外DensetNet的前面一层输出也是后面所有层的输入,这也不同于ResNet残差网络。
1*1卷积核的目的:减少输入的特征图数量,这样既能降维减少计算量,又能融合各个通道的特征。我们将使用BottleNeck Layers的DenseNet表示为DenseNet-B。(在论文的实验里,将1×1×n小卷积里的n设置为4k,k为每个H产生的特征图数量)
上图是DenseNet网络的整体网络结构示意图。其中1*1卷积核的目的是进一步压缩参数,并且在Transition Layer层有个参数Reduction(范围是0到1),表示将这些输出缩小到原来的多少倍,默认是0.5,这样传给下一个Dense Block的时候channel数量就会减少一半。当Reduction的值小于1的时候,我们就把带有这种层的网络称为DenseNet-C。
DenseNet网络的优点包括:
- 减轻了梯度消失
- 加强了feature的传递
- 更有效地利用了feature
- 一定程度上较少了参数数量
- 一定程度上减轻了过拟合
图像分割的常用数据集
PASCAL VOC
VOC 数据集分为20类,包括背景为21类,分别如下:
- Person: person
- Animal: bird, cat, cow, dog, horse, sheep
- Vehicle: aeroplane, bicycle, boat, bus, car, motorbike, train
- Indoor: bottle, chair, dining table, potted plant, sofa, tv/monitor
VOC 数据集中用于分割比赛的图片实例如下,包含原图以及图像分类分割和图像物体分割两种图(PNG格式)。图像分类分割是在20种物体中,ground-turth图片上每个物体的轮廓填充都有一个特定的颜色,一共20种颜色。
MS COCO
MS COCO 是最大图像分割数据集,提供的类别有 80 类,有超过 33 万张图片,其中 20 万张有标注,整个数据集中个体的数目超过 150 万个。MS COCO是目前难度最大,挑战最高的图像分割数据集。
Cityscapes
Cityscapes 是驾驶领域进行效果和性能测试的图像分割数据集,它包含了5000张精细标注的图像和20000张粗略标注的图像,这些图像包含50个城市的不同场景、不同背景、不同街景,以及30类涵盖地面、建筑、交通标志、自然、天空、人和车辆等的物体标注。Cityscapes评测集有两项任务:像素级(Pixel-level)图像场景分割(以下简称语义分割)与实例级(Instance-level)图像场景分割(以下简称实例分割)。