详解何恺明团队4篇大作 !(附代码)| 从特征金字塔网络、Mask R-CNN到学习分割一切

简介:

特征金字塔网络(Feature Pyramid Networks)

让我们以现在著名的Feature Pyramid Networks(FPN)[1]开始,这是在CVPR 2017发表的论文,作者Tsung-Yi Lin,何恺明等人。FPN的论文真的很棒。构建一个每个人都可以在各种任务、子主题和应用领域中建立的基准模型并不容易。在详细讨论之前,我们需要了解的一点是:FPN是ResNet或DenseNet等通用特征提取网络的附加组件。你可以从你喜欢的DL库中得到想要的预训练FPN模型,然后像其他预训练模型一样使用它们。

物体是以不同的的scale和size出现的。数据集无法捕获所有这些数据。因此,可以使用图像金字塔(图像的多种缩小比例),以使CNN更易处理。但这太慢了。所以人们只使用一个单个scale的预测,也可以从中间层进行预测。这跟前一种方法有点像,但这是在特征空间上进行的。例如,在几个ResNet块之后放一个Deconv,并获得分割输出(分类也类似,可以是1x1 Conv和GlobalPool)。

FPN的作者找到了一种改进上述方法的聪明方法。不是仅仅具有横向连接,而是将自上而下的pathway也放在上面。这非常合理!他们使用一个简单的MergeLayer(mode ='addition')来组合两者。这个想法的一个关键点是,较低层(比如初始的conv层)的特征语义信息比较少,不足以用来进行分类。但是更深层的特征可以用于理解。在这里,你还可以利用所有自上而下的pathway FMaps(特征地图)来理解它,就像最深的层一样。这是由于横向连接和自上而下的连接相结合形成的。

294e2bf71bb6abdd8995689472a7c55ddb4c0d7c

FPN论文的一些细节:

8481c8f592b7f349aa84a1de5c171db681516edf金字塔(pyramid): 即属于一个stage的所有大小相同的输出图。最后一层的输出是金字塔的参考FMaps。例如:ResNet - 第2,3,4,5个block的输出。根据内存的可用性和特定任务,你可以根据需要改变金字塔。
8481c8f592b7f349aa84a1de5c171db681516edf横向连接(Lateral connection): 1x1 Conv和Top-Down pathway是2x的上采样。这个想法来自于顶部特征,同时向下产生粗糙的特征,而横向连接则增加了从下往上的路径中更精细的细节。如下图所示。
8481c8f592b7f349aa84a1de5c171db681516edf 这篇论文只描述了一个简单的demo。它只是展现了这个想法在简单的设计选择中表现非常好,你可以做得更大、更复杂。
c9d445994f90b50fb186ccbf626bd9754becf269

正如我前面所说,这是一个基础网络,可以在任何任务上使用,包括目标检测,分割,姿态估计,人脸检测等等。论文发布后几个月的时间,已经得到100多个引用!论文的标题是FPNs for Object Detection,因此作者继续将FPN用作RPN(Region Proposal Network)和Faster-RCNN网络的baseline。更多关键细节在论文中有更全面的解释,这里只列出一部分。

实验的一些要点:

8481c8f592b7f349aa84a1de5c171db681516edf用于RPN的FPN: 用FPN替换单一尺度的FMap。它们对每个级都有一个单一尺度的anchor(不需要多级作为其FPN)。它们还表明,金字塔的所有层级都有相似的语义层级。
8481c8f592b7f349aa84a1de5c171db681516edfFaster RCNN: 他们以类似于图像金字塔输出的方式观察金字塔。因此,使用下面这个公式将RoI分配到特定level。
8481c8f592b7f349aa84a1de5c171db681516edf 640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=
8481c8f592b7f349aa84a1de5c171db681516edf 其中w,h分别表示宽度和高度。k是分配RoI的level。 640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy= 是w,h=224,224时映射的level。
8481c8f592b7f349aa84a1de5c171db681516edf 他们对每个模块的工作进行消融实验,以证实论文开头的宣称。
8481c8f592b7f349aa84a1de5c171db681516edf 他们还基于DeepMask和SharpMask这两篇论文展示了如何将FPN用于segmentation proposal生成。

代码:


8481c8f592b7f349aa84a1de5c171db681516edf官方:Caffe2

https://github.com/facebookresearch/Detectron/tree/master/configs/12_2017_baselines

8481c8f592b7f349aa84a1de5c171db681516edfCaffe

https://github.com/unsky/FPN

8481c8f592b7f349aa84a1de5c171db681516edfPyTorch

https://github.com/kuangliu/pytorch-fpn (just the network)

8481c8f592b7f349aa84a1de5c171db681516edfMXNet

https://github.com/unsky/FPN-mxnet

8481c8f592b7f349aa84a1de5c171db681516edfTensorflow

https://github.com/yangxue0827/FPN_Tensorflow

RetinaNet——密集对象检测的Focal Loss函数

RetinaNet跟上面的FPN来自同一团队,第一作者也都是Tsung-Yi Lin。这篇论文发表于ICCV 2017,并且获得当年的最佳学生论文。

这篇论文有两个关键想法——称为焦点损失(Focal Loss,FL)的损失函数和称为RetinaNet的single stage物体检测网络。该网络在COCO物体检测任务上表现非常出色,同时也击败了前面的FPN benchmark。

Focal Loss:

Focal Loss是很聪明的想法,而且很简单!如果你已经熟悉加权损失,这个与加权损失基本相同,但具有更聪明的权重,将更多的注意力集中在对困难的样本进行分类。公式如下:

ad4e2924301b8d36354c950e81bf8672140907de

其中γ是一个可以改变的超参数。640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=是来自分类器的样本的概率。如果设γ比0大,将减小分类号的样本的权重。640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=是正常加权损失函数中类的权重。在论文中它被表示为α-balanced loss。需要注意的是,这是分类损失,并与RetinaNet中物体检测任务的平滑L1损失相结合。

RetinaNet:

FAIR发布这个single stage的检测网络,很是令人惊讶。直到现在,在 single stage 的目标检测中,占据主导地位的仍是YOLOv2和SSD。但正如作者指出的那样,这两个网络都没有能够非常接近SOTA方法。RetinaNet做到了这一点,同时它是one stage而且快速的。作者认为,最好的结果是由于新的损失,而不是由于一个简单的网络(它后端是一个FPN)。 one stage的检测器将在背景与positive classes之间存在很多不平衡(而非positive classes内部的不平衡)。他们认为,加权损失函数只是针对平衡,但FL则针对简单/困难的样本,同时也表明两者可以结合起来。

代码:

8481c8f592b7f349aa84a1de5c171db681516edfOfficial Caffe2
https://github.com/facebookresearch/Detectron/tree/master/configs/12_2017_baselines
8481c8f592b7f349aa84a1de5c171db681516edfPyTorch
https://github.com/kuangliu/pytorch-retinanet
8481c8f592b7f349aa84a1de5c171db681516edfKeras
https://github.com/fizyr/keras-retinanet
8481c8f592b7f349aa84a1de5c171db681516edfMXNet
https://github.com/unsky/RetinaNet

Mask R-CNN

再次,Mask R-CNN也来自FAIR何恺明团队,论文发表在ICCV 2017。Mask R-CNN用于目标实例分割。简单来说,目标实例分割基本上就是对象检测,但不是使用边界框,它的任务是给出对象的精确分割图!

TL;DR : 如果你已经了解Faster R-CNN,那么Mask R-CNN就很好理解了,就是为分割增加另一个head(branch)。所以它有3个branch,分别用于分类、bounding box regression和分割。

下面的解释假设你已经对Faster R-CNN有一定了解:

8481c8f592b7f349aa84a1de5c171db681516edf Mask R-CNN与Faster R-CNN相似,Faster R-CNN是two-stage的,其中第一个stage是RPN。
8481c8f592b7f349aa84a1de5c171db681516edf 添加一个预测分割mask的并行分支——这是一个FCN。
8481c8f592b7f349aa84a1de5c171db681516edf Loss是 640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy= 640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy= 640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy= 的和。
8481c8f592b7f349aa84a1de5c171db681516edf ROIlign Layer而不是ROIPool。这就不会像ROIPool那样将(x / spatial_scale)分数舍入为整数,相反,它执行双线性插值来找出那些浮点值处的像素。
8481c8f592b7f349aa84a1de5c171db681516edf 例如:想象一下,ROI的高度和宽度分别为54,167。空间尺度基本上是图像大学/ FMap大学(H / h),在这种情况下它也被称为步幅(stride)。通常224/14 = 16(H = 224,h = 14)。

◦ ROIPool: 54/16, 167/16 = 3,10

◦ ROIAlign: 54/16, 167/16 = 3.375, 10.4375

◦ 现在我们可以使用双线性插值来进行上采样。

◦ 根据ROIAlign输出形状(例如7x7),类似的逻辑将相应的区域分成适当的bins。

◦ 感兴趣的话可以看看Chainer的ROIPooling的python实现,并尝试自己实现ROIAlign

◦ ROIAlign代码可以在不同的库中使用,请查看下面提供的代码库。

8481c8f592b7f349aa84a1de5c171db681516edf 它的主干是ResNet-FPN

代码:

8481c8f592b7f349aa84a1de5c171db681516edf官方 Caffe2

https://github.com/facebookresearch/Detectron/tree/master/configs/12_2017_baselines

8481c8f592b7f349aa84a1de5c171db681516edfKeras

https://github.com/matterport/Mask_RCNN/

8481c8f592b7f349aa84a1de5c171db681516edfPyTorch

https://github.com/soeaver/Pytorch_Mask_RCNN/

8481c8f592b7f349aa84a1de5c171db681516edfMXNet

https://github.com/TuSimple/mx-maskrcnn

学习分割一切(Learning to Segment Everything)

文如其名,这篇论文是关于分割的。更具体的说,是关于实例分割的。计算机视觉中用于分割的标准数据集非常小,对现实世界的问题不足以有效。即便到了2018年,创建于2015年的COCO数据集仍然是最流行、最丰富的数据集,尽管它只有80个物体类别。

相比之下,对象识别和检测的数据集(例如OpenImages [8])具有用于分类任务的6000个类别和用于检测的545个类别。话虽如此,斯坦福大学还有另一个名为Visual Genome的数据集,其中包含3000个物体类别!那么,为什么不使用这个数据集呢?因为每个类别中的图像数量太少,因此DNN在这个数据集上并不会真正起作用,所以即使它更丰富,人们也不会使用这个数据集。而且,这个数据集没有任何分割注释,只有3000个类别的对象检测的边界框(bounding boxes)标签可用。

让我们回到Learning to Segment Everything这篇论文。实际上,边界框(bounding box)和分割注释(segmentation annotation)对于域来说并没有太大的区别,仅仅是后者比前者更精确。因此,因为Visual Genome数据集有3000个类,为什么不利用这个数据集来做实例分割呢?FAIR何恺明团队正是这样做的。这可以被称为弱监督(或弱半监督?)学习,也就是说你没法完全监督你想要实现的任务。它还可以与半监督相关联,因为它们都使用COCO + Visual Genome数据集。这篇论文是迄今为止最酷的。

8481c8f592b7f349aa84a1de5c171db681516edf 它是建立在 Mask-RCNN 之上的
8481c8f592b7f349aa84a1de5c171db681516edf 同时在有mask标注和无mask标注的输入上训练
8481c8f592b7f349aa84a1de5c171db681516edf 在mask和bbox mask之间添加一个 weight transfer函数
8481c8f592b7f349aa84a1de5c171db681516edf 当无mask标注的输入通过时,wseg 预测将于马萨卡 features相乘的权重;当有mask标注的输入通过时,不使用这个函数,代而使用一个简单的MLP。
8481c8f592b7f349aa84a1de5c171db681516edf 如下图所示。A是COCO数据集,B是VG。注意不同输入的两个不同路径。
6ba54edbf5fa9482331d066b6714ad3487f89118

由于没有注释可用,作者无法在VG数据集上显示精确度,因此他们把这个想法应用到可以证明结果的数据集上。PASCAL-VOC有20个类别,而且这些类别在COCO中都很常见。因此,他们使用VOC分类标签进行训练,并且只使用来自COCO的bbox标签对这20个类别进行训练。结果显示在COCO数据集中20个类的实例分割任务上。反之亦然,因为这两个数据集都有ground-truth。结果如下表所示:

a953f8d55084692225996fd3b2b70a6b3e0de01a


原文发布时间为:2018-03-20

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”微信公众号

相关文章
|
23天前
|
机器学习/深度学习 算法 计算机视觉
基于CNN卷积神经网络的金融数据预测matlab仿真,带GUI界面,对比BP,RBF,LSTM
这是一个基于MATLAB2022A的金融数据预测仿真项目,采用GUI界面,比较了CNN、BP、RBF和LSTM四种模型。CNN和LSTM作为深度学习技术,擅长序列数据预测,其中LSTM能有效处理长序列。BP网络通过多层非线性变换处理非线性关系,而RBF网络利用径向基函数进行函数拟合和分类。项目展示了不同模型在金融预测领域的应用和优势。
|
28天前
|
计算机视觉
【YOLOv8改进】 AFPN :渐进特征金字塔网络 (论文笔记+引入代码).md
YOLO目标检测专栏介绍了YOLO的有效改进和实战案例,包括AFPN——一种解决特征金字塔网络信息丢失问题的新方法。AFPN通过非相邻层直接融合和自适应空间融合处理多尺度特征,提高检测性能。此外,还展示了YOLOv8中引入的MPDIoU和ASFF模块的代码实现。详情可参考提供的专栏链接。
|
28天前
|
机器学习/深度学习 存储 算法
基于CNN+LSTM深度学习网络的时间序列预测matlab仿真,并对比CNN+GRU网络
该文介绍了使用MATLAB2022A进行时间序列预测的算法,结合CNN和RNN(LSTM或GRU)处理数据。CNN提取局部特征,RNN处理序列依赖。LSTM通过门控机制擅长长序列,GRU则更为简洁、高效。程序展示了训练损失、精度随epoch变化的曲线,并对训练及测试数据进行预测,评估预测误差。
|
28天前
|
机器学习/深度学习 存储 测试技术
【YOLOv8改进】 YOLOv8 更换骨干网络之 GhostNet :通过低成本操作获得更多特征 (论文笔记+引入代码).md
YOLO目标检测专栏探讨了卷积神经网络的创新改进,如Ghost模块,它通过低成本运算生成更多特征图,降低资源消耗,适用于嵌入式设备。GhostNet利用Ghost模块实现轻量级架构,性能超越MobileNetV3。此外,文章还介绍了SegNeXt,一个高效卷积注意力网络,提升语义分割性能,参数少但效果优于EfficientNet-L2。专栏提供YOLO相关基础解析、改进方法和实战案例。
|
1月前
|
算法
MATLAB|【免费】融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型
这段内容介绍了一个使用改进的麻雀搜索算法优化CNN-BiLSTM模型进行多输入单输出预测的程序。程序通过融合正余弦和柯西变异提升算法性能,主要优化学习率、正则化参数及BiLSTM的隐层神经元数量。它利用一段简单的风速数据进行演示,对比了改进算法与粒子群、灰狼算法的优化效果。代码包括数据导入、预处理和模型构建部分,并展示了优化前后的效果。建议使用高版本MATLAB运行。
|
28天前
|
编解码 计算机视觉 网络架构
【YOLOv8改进】BiFPN:加权双向特征金字塔网络 (论文笔记+引入代码)
该专栏深入研究了YOLO目标检测的神经网络架构优化,提出了加权双向特征金字塔网络(BiFPN)和复合缩放方法,以提升模型效率。BiFPN通过双向跨尺度连接和加权融合增强信息传递,同时具有自适应的网络拓扑结构。结合EfficientNet,构建了EfficientDet系列检测器,在效率和准确性上超越先前技术。此外,介绍了YOLOv8如何引入MPDIoU并应用BiFPN进行可学习权重的特征融合。更多详情可参考提供的专栏链接。
|
1月前
|
编解码 算法 计算机视觉
yolo3的特征金字塔网络具体是指?
yolo3的特征金字塔网络具体是指?
|
1月前
|
机器学习/深度学习 数据可视化 数据挖掘
【视频】少样本图像分类?迁移学习、自监督学习理论和R语言CNN深度学习卷积神经网络实例
【视频】少样本图像分类?迁移学习、自监督学习理论和R语言CNN深度学习卷积神经网络实例
|
1月前
|
机器学习/深度学习 数据采集 算法
Python对中国电信消费者特征预测:随机森林、朴素贝叶斯、神经网络、最近邻分类、逻辑回归、支持向量回归(SVR)
Python对中国电信消费者特征预测:随机森林、朴素贝叶斯、神经网络、最近邻分类、逻辑回归、支持向量回归(SVR)
|
1月前
|
机器学习/深度学习 算法 TensorFlow
TensorFlow 2keras开发深度学习模型实例:多层感知器(MLP),卷积神经网络(CNN)和递归神经网络(RNN)
TensorFlow 2keras开发深度学习模型实例:多层感知器(MLP),卷积神经网络(CNN)和递归神经网络(RNN)

热门文章

最新文章