| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> SSD系列、Retinanet、Efficientdet、RCNN系列知识点整理 -> 正文阅读 |
|
[人工智能]SSD系列、Retinanet、Efficientdet、RCNN系列知识点整理 |
接着前面的YOLO系列继续做一些简单的关键点整理,便于博主快速回忆起来。 1.SSD(2016) https://arxiv.org/pdf/1512.02325.pdf ?类似前面整理YOLO系列,先放上结构框图,有框图就很容易明白了 ?主要创过程: (1)主干网络是VGG16网络,将VGG16的FC6和FC7层转化为卷积层,如图1上的Conv6和Conv7,去掉所有的Dropout层和FC8层;添加了Atrous算法(hole算法),将Pool5从2x2-S2变换到3x3-S1。带孔卷积示意图如下: (2)抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2层的feature map,然后分别在这些feature map层上面的每一个点构造不同尺度大小的BB,然后分别进行检测和分类,生成多个BB (3)将不同feature map获得的BB结合起来,经过NMS(非极大值抑制)方法来抑制掉一部分重叠或者不正确的BB,生成最终的BB集合(即检测结果) SSD算法中使用到了conv4_3,conv_7,conv8_2,conv7_2,conv8_2,conv9_2,conv10_2,conv11_2这些大小不同的feature maps,其目的是为了能够准确的检测到不同尺度的物体,因为在低层的feature map,感受野比较小,高层的感受野比较大,在不同的feature map进行卷积,可以达到多尺度的目的。 特征图的每个位置预测K个BB,对于每一个BB,预测C个类别得分,以及相对于Default box的4个偏移量值,这样总共需要(C+4)* K个预测器,则在m*n的特征图上面将会产生(C+4)* K * m * n个预测值。 2.DSSD(2017) https://arxiv.org/pdf/1701.06659v1.pdf 该模型在原 SSD 的基础上更改了基础网络,并添加了预测模块和反卷积模块以增加特征图的分辨率,从而改善对图像中较小目标的检测效果。SSD 对小目标的检测效果不好,主要原因就是用于预测小目标的是网络的浅层语义信息,缺乏深层表征能力比较强的语义信息,如何让网络学习关于小目标的深层语义信息就是 DSSD 的核心问题。 结构框图 ?可以看到上面主要改进了2点,提出基于top down的网络结构,增加反卷积层(反卷积模块DM)实现深层特征和浅层特征的融合,在预测阶段添加基于残差块构建的预测模块(PM),优化用于 分类+边界框任务的特征图。 DSSD 选择使用 Eltw Product 将浅层和深层的特征图在对应的通道上做乘法运算,实现了高层特征和低层特征的融合,本质思想即 Top Down融合。结构如下: ?在每个卷积层后都有一个 BN 层,这里的反卷积是指可以进行学习的卷积的逆过程,而非双线性上采样。 3.FSSD(2018) https://arxiv.org/pdf/1712.00960v3.pdf ?重点是改进了特征融合算法,框架如下 ?将不同的特征图合并在一起主要有两种方法——串联和按元素求和。按元素进行求和要求特征映射应该具有相同的大小,这意味将特征映射得转换到相同的通道,这限制了融合特性映射的灵活性,所以使用串联,文中实验表明串联的结果要比按元素求和的结果更好。最后结尾时候,论文里提到的展望工作也是一个比较好的思路。 4.FPN(2017) https://arxiv.org/pdf/1612.03144.pdf 论文中的截图 ?完整的一个框架如下: 5.RetinaNet(2018) https://arxiv.org/pdf/1708.02002.pdf backbone部分和FPN基本类似,FPN会使用C2,RetinaNet没有,C2生成的P2会占用更多的计算资源。 预测部分的结构如下图: ?由于 RetinaNet 是一个 one-stage 的网络,所以不用 ROI pooling,直接使用如下图所示的权重共享的基于卷积操作的预测器。预测器分为两个分支,分别预测每个 anchor 所属的类别,以及目标边界框回归参数。最后的 kA 中 k 是检测目标的类别个数,注意这里的 k 不包含背景类别,对于 PASCAL VOC 数据集的话就是 20。这里的 A 是预测特征层在每一个位置生成的 anchor 的个数,在这里就是 9。(现在基本都是这样的类别不可知 anchor 回归参数预测,也可以理解为每一类共享了同一个 anchor 回归参数预测器) 本文一个核心的贡献点就是 focal loss。总损失依然分为两部分,一部分是分类损失,一部分是回归损失。Focal loss 比较独特的一个点就是正负样本都会来计算分类损失,然后仅对正样本进行回归损失的计算。 为了实现正负样本的比例均衡,不至于整个训练过程被负样本“淹没”,一般采取抽样的方法,将正负样本比例控制在1:3,从而在正负样本间保持合理的比例。因为 one-stage 只有一个阶段,产生的候选框相比 two-stage 要多太多。通常需要大约100K个位置(例如 SSD 的 8700+ 个位置),且这里面正样本几个十几个,少之又少。即使你抽样了,最后在训练过程中,还是会惊奇的发现,整个过程还是被大量容易区分的负样本,也就是背景所主导。Focal loss 则是一个动态缩放的交叉熵损失,一言以蔽之,通过一个动态缩放因子,可以动态降低训练过程中易区分样本的权重,从而将 loss 的重心快速聚焦在那些难区分的样本上 6.Efficientdet D0~D7(2020) https://arxiv.org/pdf/1911.09070.pdf Google Brain团队的力作,众所周知,神经网络的速度和精度之间存在权衡,而Efficientdet是一个总称,可以分为 EfficientDet D0~ EfficientDet D7,速度逐渐变慢,但是精度也逐渐提高。从下图中可以看出,EfficientDet-D7 的性能非常的惊人:在 326B FLOPS,参数量 52 M的情下,COCO 2017 validation 数据集上取得了 51.0 的 mAP,state-of-the-art 的结果。和 AmoebaNet + NAS-FPN 相比,FLOPS 仅为其十分之一的情况下取得了更好的结果。 ?这篇文章的主要贡献点是 BiFPN,Compound Scaling 两部分。 作者在相同 level 的输入和输出节点之间连了一条边,假设是能融合更多特征,有点 skip-connection 的意味。BiFPN 部分,是在PANet的基础上,根据一些主观的假设,做了针对性的化简,得到了参数量更少,效果更好的连接方式。 ?可以看到,人真是活的动物,各种奇思妙想,跳跃式的融合了浅层和深层特征图 ?Cross-Scale Connections 此外,作者还提出,之前从FPN开始普遍采用的,一个特征先 Resize ,再和另一层的特征相加的方式不合理。因为这样假设这两层的特征有了相同的权重。从更复杂的建模角度出发,应该每一个 feature 在相加的时候都要乘一个自己的权重。 对于Compound Scaling 部分,Model Scaling 指的是人们经常根据资源的限制,对模型进行调整。比如说为了把 backbone 部分 scale up,得到更大的模型,就会考虑把层数加深, Res50 -> Res101这种,或者说比如把输入图的分辨率拉大。EfficientNet在 Model Scaling 的时候考虑了网络的 width, depth, and resolution 三要素。而EfficientDet进一步扩展,把 EfficientNet拿来做 backbone,这样从 EfficientNet B0 ~ B6,就可以控制 Backbone 的规模;neck 部分,BiFPN 的 channel 数量、重复的 layer 数量也可以控制;此外还有 head 部分的层数,以及 输入图片的分辨率,这些组成了EfficientDet的 scaling config 。 7.CornerNet(2018) 这边需要知道下Anchor-Based和Anchor free方法,前面博客中除了yolo v1是Anchor free外,其它方法都是基于Anchor的,以及此篇博客前面介绍的方法也是Anchor-Based方法。弊端总结为:依赖过多的手动设计,训练和预测过程低效,正负样本不均问题。框架如下: 主干网络- Hourglass Network Hourglass先由卷积和池化将feature maps下采样到一个很小的尺度,之后再用nearest neighbor upsampling的方法进行上采样,将feature maps还原到最开始的尺度。不难看出,下采样和上采样是对称的,并且在每个upsampling层都有一个skip connection,skip connection上是一个residual modules。使用这种沙漏结构的目的是为了反复获取不同尺度下图片所包含的信息。例如一些局部信息,包括脸部和手部信息。 CornerNet 主干网络通过串联多个hourglass module组成。 ?个hourglass module都是先通过一系列的降采样操作缩小输入的大小,然后通过上采样恢复到输入图像大小,因此该部分的输出特征图大小还是128×128,整个hourglass network的深度是104层。hourglass module后会有两个输出分支模块,分别表示左上角点预测分支和右下角点预测分支,每个分支模块包含一个corner pooling层和3个输出:heatmaps、embeddings和offsets。heatmaps是输出预测角点信息,可以用维度为CHW的特征图表示,其中C表示目标的类别。Heatmaps预测哪些点最有可能是Corners点,Embeddings用于表征属于相同对象的corner的相似度。它们的通道数都为C,C是object的类别数 (不包括background) 。最后的Offsets用于对corner的位置进行修正。 博主这边觉得heatmaps有点类似语义分割网络,只是这里的对象是左上角点和右下角点。 网络预测部分结构如下: 上面两条支路经过33的卷积后,进行corner pooling,相加汇集成1路,随后再进行3x3的卷积和batch normalization;最下面的支路进行11的卷积和batch normalization 后,与上路相加后送入到Relu函数中。随后,再对feature maps进行33的卷积,接着分三路33的卷积+Relu后产生了Heatmaps, Embeddings, Offsets三组feature maps。 Corner-poolling结构如下: 作者采用了一种高效的方法,即分别从右至左、从下至上处理特征,将沿着当前处理方向上遇到的最大值作为替换值即可快速实现corner pooling。这样每行或者每列只需要进行少量的判断即可,不需要每个点都要判断所沿方向上的所处行、列的最大值,加速了处理效率。 8.CenterNet(2019) https://arxiv.org/pdf/1904.08189.pdf 模型结构如下: 本文主要分析2D目标检测这一块,其网络结构就是基网络加三个预测头(中心点,偏置和尺寸),基网络给出了ResNet,DLA,Hourglass三种选择。 P代表中心点在原图的位置,R代表输出下采样率,也是输入输出特征图大小的比率。预处理:将原图通过仿射变换变成512x512,除以255,减均值,除方差。C: 类别的个数。keypoint:以热力图的形式出现,预测目标框的中心点,代表该位置是目标中心点的置信度。 缺点:同一个类别的两个物体的中心点相同,模型只能给出一个物体检测框,原因是因为输出特征图同一个位置只设置一个样本,可以用类似fpn的结构来解决这个问题。 解析目标框(后处理) 1.heatmap的峰值的位置就是目标的中心点。将模型heatmap的输出进行通过3x3的卷积核进行最大池化处理,保留局部最大值,然后选择每个类别的topk(100)个像素点,然后通过每个类的topk中(topk x C)选出所有类的topk。 9.TTFNet(2019) https://arxiv.org/pdf/1909.00700.pdf 首先回顾一下CenterNet这个方法,它将目标检测视为两部分:中心定位和尺寸回归。对于定位问题,它采用和CornerNet一样的高斯核来产生热力图,这种方式可以保证网络在目标的中心附近产生更强力的激活值。对于回归问题,它定义处于目标中心的像素作为训练样本并且直接预测目标的宽高,同时也预测一个偏移(offset)来恢复由于下采样造成的离散化误差。由于网络推理时可以在目标中心点附近产生更强的激活值,因此NMS不是必须的,后处理步骤的计算开销可以忽略不计。 为了消除NMS的需求,因此TTFNet这篇文章的中心定位和CenterNet是类似的,只不过进一步考虑了高斯核中边框的宽高比,这是CenterNet没有考虑的,因此CenterNet的策略是次优的。 而对于尺寸回归,主流的方法是及那个整个标注框内的像素点或者标注框内子框区域内的像素点作为训练样本。作者则认为,应当将整个高斯区域内的所有像素点作为训练样本。此外,基于目标尺寸和高斯概率计算的权重被应用到这些样本上以便于更好的特征提取,整个框架如下图所示,并不需要其他的预测分支来辅助纠错,因此是简单且有效的检测框架。 结构如下: 10. RCNN(2014年) ? 其实也算是一种在已有思维基础上考虑出来的算法,并不是天马行空,从无到有。RCNN说白了分类3个阶段,第一个阶段是通过Selective Search方法来产生候选区域,第二阶段是对每个候选区域提取固定长度的特征向量,第三阶段是使用SVM分类器进行分类。这里可以看到对比传统算法,还是有很大传统算法的身影,传统放大的想发一般就是遍历图像,运用搜索策略,将提取到的纹理或者几何特征向量输入到SVM进行分类,然后用相似性准则去看在哪个位置区域和我的目标最为接近。只不过这里特征提取是用的CNN。所以有图像处理算法的知识基础,理解这些并不难。相关特点说明再补充如下:R-CNN 采用 AlexNet,采用 Selective Search 技术生成 Region Proposal,在 ImageNet 上先进行预训练,然后利用成熟的权重参数在 PASCAL VOC 数据集上进行 fine-tune,用 CNN 抽取特征,然后用一系列的的 SVM 做类别预测,R-CNN 的 bbox 位置回归基于 DPM 的灵感,自己训练了一个线性回归模型。从ILSVRC 2012、2013表现结果来看,CNN在计算机视觉的特征表示能力要远高于传统的HOG、SIFT特征等,而且这种层次的、多阶段、逐步细化的特征计算方式也更加符合人类的认知习惯。目标检测区别于目标识别很重要的一点是其需要目标的具体位置,也就是BoundingBox。而产生BoundingBox最简单的方法就是滑窗,可以在卷积特征上滑窗。 算法缺点:时间代价太高了,网络训练是分阶段的,太麻烦。 主干网络AlexNet 11.SPPNet(2015) https://arxiv.org/pdf/1406.4729.pdf ?主要是提出了一种网络结构,能够产生固定大小的表示(fixed-length representation),而不关心输入图像的尺寸或比例,SPP-net可普遍改进各种基于CNN的图像分类方法。在ImageNet-2012数据集上,SPP-net可将各种不同设计的CNN架构的精度都大幅提升。这也可以作为一个结合的创新点,一些网络结构中还没有用此思想的都可以去改进(之前流行的CNNs都需要输入的图像尺寸是固定的(比如224×224),这限制了输入图像的长宽比和缩放尺度。当遇到任意尺寸的图像时,都是先将图像适应成固定尺寸,方法包括裁剪(crop)和变形(wrap))。区别RCNN, SPPNet把整张待检测的图片,输入CNN中,进行一次性特征提取,得到特征图,然后在特征图中找到各个候选框的区域,再对各个候选框采用空间金字塔池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后在进入使用多尺寸训练,为了在训练时解决不同图像尺寸的问题,考虑一些预设好的尺寸。现在考虑这两个尺寸:180×180,224×224。论文中选择了ZF-5、Convnet-5、Overfeat-5/7作为基础模型 贴上经典的多尺度特征计算图: 在最后的卷积层和全连接层之间加入SPP层。具体做法是,在conv层得到的特征图是256层,每层都做一次spatial pyramid pooling。先把每个特征图分割成多个不同尺寸的网格,比如网格分别为44、22、11,然后每个网格做max pooling,这样256层特征图就形成了16256,4256,1256维特征,他们连起来就形成了一个固定长度的特征向量,将这个向量输入到后面的全连接层。 此外,记住除了在特征图上使用了不同尺度的,其在输入图像方面也应用了多尺度 单尺寸或多尺寸方法只用于训练阶段。在测试阶段,是直接对各种尺寸的图像应用SPP-net的。 12.Fast RCNN(2015) ?综合了RCNN和SPPNet, 并在此基础上做了优化,做了创新工作。 区域提取还是在特征图上使用selective search去找到候选区域,类似SPPNet, 其提出了ROI Pooling层,其把图片上selective seach选出的候选框映射到特征图上对应的位置,这个映射是根据输入图片缩小的尺寸来的。将映射到feature map上面的roi region输出成统一大小的特征,因为这些框的特征区域大小不一样。该层输出N*5的矩阵,N表示ROI的数目,5中的第一列表示第几个ROI,其它四个参数(x,y,w,h)表征坐标,不再使用SVM分类器,将分类和回归放在一个网络中训练。将最后一个卷积层的SSP Layer改为RoI Pooling Layer;另外提出了多任务损失函数(Multi-task Loss),将边框回归直接加入到CNN网络中训练,同时包含了候选区域分类损失和位置回归损失。将提取到的特征输入全连接层,然后用Softmax进行分类,对候选区域的位置进行回归。 RoI Pooling Layer:实际上是SPP Layer的简化版,SPP Layer对每个候选区域使用了不同大小的金字塔映射,即SPP Layer采用多个尺度的池化层进行池化操作;而RoI Pooling Layer只需将不同尺度的特征图下采样到一个固定的尺度(例如7*7)。例如对于VGG16网络conv5_3有512个特征图,虽然输入图像的尺寸是任意的,但是通过RoI Pooling Layer后,均会产生一个7*7*512维度的特征向量作为全连接层的输入,即RoI Pooling Layer只采用单一尺度进行池化。两者对比如下图所示: 主干网络是vgg16 13.Faster RCNN(2016) https://arxiv.org/pdf/1506.01497.pdf 相对于Fast RCNN, 其使用了Region Proposal Networks(RPN网络)生成region proposals, 同时产生建议窗口的CNN和目标检测的CNN共享,其它的和Fast RCNN差不多。重点是RPN。 主要内容是:首先缩放至固定大小MxN,然后将MxN图像送入网络;而Conv layers中包含了13个conv层+13个relu层+4个pooling层;RPN网络首先经过3x3卷积,再分别生成positive anchors和对应bounding box regression偏移量,然后计算出proposals;而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。 技巧1:在Faster RCNN Conv layers中对所有的卷积都做了扩边处理( pad=1,即填充一圈0),导致原图变为 (M+2)x(N+2)大小,再做3x3卷积后输出MxN 。正是这种设置,导致Conv layers中的conv层不改变输入和输出矩阵大小 其实RPN最终就是在原图尺度上,每个像素都设置多个候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已! 那么Anchor一共有多少个?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,所以: ceil(800/16) * ceil(600/16) *9 = 50*38*9=17100 其中ceil()表示向上取整,是因为VGG输出的feature map size= 50*38。这9个anchors相关操作可以看如下图: 在原文中使用的是ZF model中,其Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions 在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息(猜测这样做也许更鲁棒?反正我没测试),同时256-d不变(如图4和图7中的红框) 假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分positive和negative,所以每个点由256d feature转化为cls=2k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4k coordinates 补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练(什么是合适的anchors下文5.1有解释) 同时验证2k的设置,可以参见对应的caffe prototx
可以看到其num_output=18,也就是经过该卷积的输出图像为WxHx18大小(注意第二章开头提到的卷积计算方式)。这也就刚好对应了feature maps每一个点都有9个anchors,同时每个anchors又有可能是positive和negative,所有这些信息都保存WxHx(9*2)大小的矩阵。为何这样做?后面接softmax分类获得positive anchors,也就相当于初步提取了检测目标候选区域box(一般认为目标在positive anchors中)。 假设VGG的选用的特征图为50*38*512,则对应设置的anchors个数则为50*38*k, 而RPN输出50*38*2k的分类特征矩阵和50*38*4k的坐标回归特征矩阵 多尺度样本方面,上面可以看到有三种: 图像金字塔:通过将图像放缩到不同的尺寸,然后提取特征去做。有点类似于RCNN中的实现方式,显然这样需要为每一个尺寸重复提取卷积特征,成本很高。 卷积特征金字塔:先对于图像提取卷积特征,然后将卷积特征放缩到不同的尺寸。类似于SPP的实现方式。在SPP中我们也看到,这里面的图像也需要放缩到几种尺寸,产生多尺度结果。 anchor金字塔:通过不同尺度的anchor在卷积特征上滑窗相当于是anchor金字塔,不需要图像有多个尺寸,仅需要有多个尺寸的anchor就好了。文章使用了3种尺度以及3种比例。 14.OverFeat 附分类和语义分割方面的整理 ?一.各框架下常用的集成好的模型 列举下keras、tensorflow hub和pytorch自带的模型,这些模型对应的理论知识需要重点了解下。 1.keras 上面是keras自带的预训练分类模型,想要看看如何看keras训练预测,可以在官网这里看的到 里面有很多例子可以去参考,且也有关于3D Points训练预测的例子 ?2.tensorflow hub 里面关于图像分类、目标检测、语义分割的都有 3.Pytorch Models and pre-trained weights — Torchvision 0.12 documentation 里面关于图像分类、目标检测、语义分割的也都有 二.分类网络 1. MobileNetV1~V3可以参考下面博客 Mobile Net 系列【V1—V3】_何如千泷的博客-CSDN博客 2. DenseNet可以参考下面博客 3.Efficient可以参考下面博客 令人拍案叫绝的EfficientNet和EfficientDet - 知乎4 4. GooleNet 深度解读与思考——GoogLeNet核心Inception模块 - 知乎 三.语义分割 Mask-RCNN 算法及其实现详解_remanented的博客-CSDN博客_maskrcnn 其它参考博主之前的博客: 深度学习之检测、分类及分割(一)_竹叶青lvye的博客-CSDN博客_检测与分割 深度学习之检测、分类及分割(二)_竹叶青lvye的博客-CSDN博客 目标分类、语义分割、目标检测中的深度学习算法阶段性总结_竹叶青lvye的博客-CSDN博客_vgg语义分割 参考博客如下: 目标检测(三):SSD_犬冢紬希的博客-CSDN博客_ssd300和ssd512 目标检测(六):DSSD_犬冢紬希的博客-CSDN博客_dssd目标检测 【目标检测】FSSD论文理解_不断进步的咸鱼的博客-CSDN博客_fssd模型深度学习之目标检测(五)-- RetinaNet网络结构详解_木卯_THU的博客-CSDN博客_retinanet【目标检测】FSSD论文理解_不断进步的咸鱼的博客-CSDN博客_fssd模型 深度学习之目标检测(三)-- FPN结构详解_木卯_THU的博客-CSDN博客_fpn 深度学习 AnchorFree系列算法详解_荪荪的博客-CSDN博客_anchor free CornerNet详解_maxruan的博客-CSDN博客_cornernet |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 8:59:43- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |