导航:首页 > 源码编译 > fastscnn算法

fastscnn算法

发布时间:2023-01-10 04:58:03

A. 目标检测算法的分步介绍(第 1 部分)

英文原文: https://www.analyticsvidhya.com/blog/2018/10/a-step-by-step-introction-to-the-basic-object-detection-algorithms-part-1/
对原文的表达有部分改动

在本文中,我们将更深入地研究可用于目标检测的各种算法。我们将从 RCNN 家族的算法开始,即 RCNN、Fast RCNN 和 Faster RCNN。在本系列即将发布的文章中,我们将介绍更高级的算法,如 YOLO、SSD 等。

下图是说明目标检测算法如何工作的一个流行示例。图像中的每个物体,从一个人到一只风筝,都以一定的精度被定位和识别。

让我们从最简单的深度学习方法开始,也是一种广泛使用的方法,用于检测图像中的目标——卷积神经网络( CNN)。CNN 的内部工作原理如下:

我们将图像传递给网络,然后通过各种卷积和池化层处理,发送给全连接层。最后,我们以目标类别的形式获得输出。这相当简单,不是吗?对于每个输入图像,我们得到一个相应的类作为输出。我们可以使用这种技术来检测图像中的各种目标吗?让我们看看如何使用 CNN 解决一般的目标检测问题。

使用这种方法的问题在于图像中的目标可能具有不同的纵横比和空间位置。例如,在某些情况下,目标可能覆盖图像的大部分,而在某些情况下,目标可能仅覆盖图像的一小部分。目标的形状也可能不同(在现实生活中经常发生)。由于这些因素,我们将需要大量的区域,从而导致大量的计算时间。因此,为了解决这个问题并减少区域数量,我们可以使用基于区域的 CNN,它使用提案法选择区域。让我们了解这个基于区域的 CNN 可以为我们做什么。

与在大量区域上工作不同的是,RCNN 算法是在图像中选取一堆框并检查这些框中是否有任何一个包含任何目标。 RCNN 使用 selective search 从图像中提取这些框(这些框称为 regions)。

让我们首先了解什么是 selective search 以及它如何识别不同的 regions。基本上四个模式可以构成一个物体:不同的尺度、颜色、纹理和外壳。selective search 识别图像中的这些模式,并在此基础上提出各种regions。以下是selective search 工作原理的简要概述:

举个例子:

到目前为止,我们已经看到了 RCNN 如何实现目标检测。但是这种技术有其自身的局限性。由于以下步骤,训练 RCNN 模型既昂贵又缓慢:

所有这些过程结合起来使 RCNN 非常慢。对每张新图像进行预测大约需要 40-50 秒,这实质上使得模型在面对庞大的数据集时变得笨重且几乎无法构建。

好消息是——我们有另一种目标检测技术,它修复了我们在 RCNN 中看到的大部分问题。

我们还能做些什么来减少 RCNN 算法通常需要的计算时间?我们是否可以每张图像只运行一次并获取所有感兴趣的区域(包含某个目标的区域)。

RCNN 的作者 Ross Girshick 提出了这个想法,即每张图像只运行一次 CNN,然后找到一种方法在 2,000 个区域之间共享该计算。在 Fast RCNN 中,我们将输入图像提供给 CNN,后者反过来生成卷积特征图。使用这些地图,提取提议的区域。然后我们使用 RoI 池化层将所有提议的区域重塑为固定大小,以便可以将其馈入全连接网络。

让我们将其分解为简化概念的步骤:

因此,Fast RCNN 不是使用三个不同的模型(如 RCNN),而是使用单个模型从区域中提取特征,将它们分成不同的类,并同时返回识别类的边界框。

为了进一步分解,我将对每个步骤进行可视化。

这就是 Fast RCNN 如何解决 RCNN 的两个主要问题,1. 将每个图像的一个而不是 2,000 个区域传递给 ConvNet。2. 使用一个而不是三个不同的模型来提取特征、分类和生成边界框。

但即使是 Fast RCNN 也存在某些问题。它还使用 selective search 作为寻找感兴趣区域的建议方法,这是一个缓慢且耗时的过程。每张图像检测目标大约需要 2 秒,这与 RCNN 相比要好得多。但是当我们考虑大型现实生活数据集时,即使是 Fast RCNN 看起来也不那么快了。

Faster RCNN 是 Fast RCNN 的修改版本。它们之间的主要区别在于 Fast RCNN 使用 selective search 来生成感兴趣的区域,而 Faster RCNN 使用 Region Proposal Network ,又名 RPN。 RPN 将图像特征图作为输入并生成一组目标提议,每个提议的目标以分数作为输出。

Faster RCNN 方法通常遵循以下步骤:

让我简要解释一下这个区域提议网络(RPN)实际上是如何工作的。

首先,Faster RCNN 从 CNN 获取特征图并将它们传递给区域提议网络。 RPN 在这些特征图上使用一个滑动窗口,在每个窗口,它生成 k 个不同形状和大小的 Anchor 框:

Anchor 框是固定大小的边界框,它们放置在整个图像中,具有不同的形状和大小。对于每个 Anchor,RPN 预测两件事:

我们现在有不同形状和大小的边界框,它们被传递到 RoI 池化层。在 RPN 步骤之后,有可能存在没有分配给它们的类别提议。我们可以获取每个建议并对其进行裁剪,以便每个建议都包含一个目标。这就是 RoI 池化层所做的。它为每个锚点提取固定大小的特征图:

然后将这些特征图传递到具有 softmax 和线性回归层的全连接层。它最终对目标进行分类并预测已识别目标的边界框。

到目前为止,我们讨论的所有目标检测算法都使用区域来识别目标。网络不会一次性查看完整图像,而是依次关注图像的各个部分。这会造成两个并发症:

B. R-CNN, Fast R-CNN, Faster R-CNN, YOLO:目标检测算法总结

参考链接

以下是文中涉及的算法的最原始的文章:

一个最直接的解决办法是从图中取不同的感兴趣区域,然后对这些区域用CNN进行分类,检测这些区域中是否有物体的存在。
但是待检测物体可能存在于图片的不同位置而且有不同的长宽比例。所以以上方法需要选取量非常大的区域并需要非常大的计算量。

因此,R-CNN, Fast R-CNN, Faster R-CNN, YOLO被开发去又快又准地找物体。

为了解决上述提到的有大量区域被选择的问题, Ross Girshick et al 提出了一种方法:用了选择性搜索从图片提取了2000个区域,这些区域被称为”region proposals“。

用这种办法,我们不需要去分类巨大数量的区域了,我们只需要去处理2000个区域。这2000个区域是用如下的选择性搜索算法(selective search algorithm)来找到的:

这篇文章 介绍了更多关于选择性搜索算法(selective search algorithm)的内容。

RCNN步骤:

R-CNN存在的问题:

Fast R-CNN的几个改进:
The same author of the previous paper(R-CNN) solved some of the drawbacks of R-CNN to build a faster object detection algorithm and it was called Fast R-CNN. The approach is similar to the R-CNN algorithm.

Fast R-CNN更快的原因是:

Fast R-CNN更快:
From the above graphs, you can infer that Fast R-CNN is significantly faster in training and testing sessions over R-CNN. When you look at the performance of Fast R-CNN ring testing time, including region proposals slows down the algorithm significantly when compared to not using region proposals. Therefore, region proposals become bottlenecks in Fast R-CNN algorithm affecting its performance.

上面两个算法的缺点:
selective search耗时
Both of the above algorithms(R-CNN & Fast R-CNN) uses selective search to find out the region proposals . Selective search is a slow and time-consuming process affecting the performance of the network.

Faster R-CNN的改进:
不用selective search去找region proposals;
用network去找region proposals;
Therefore, Shaoqing Ren et al . came up with an object detection algorithm that eliminates the selective search algorithm and lets the network learn the region proposals .

Faster R-CNN的步骤:

时间上的对比:
Faster R-CNN最快并且能用作实时目标检测

之前几种算法的缺点:
产生region的时候没有纵览整幅图。其实图的某些部分有更高的可能性包含物体。
All of the previous object detection algorithms use regions to localize the object within the image. The network does not look at the complete image. Instead, parts of the image which have high probabilities of containing the object .

YOLO的思想:
用一个单独的网络去预测bounding boxes和bounding boxes中存在物体的概率
YOLO or You Only Look Once is an object detection algorithm much different from the region based algorithms seen above.
In YOLO, a single convolutional network predicts (1) the bounding boxes and (2)the class probabilities for these boxes.

YOLO的具体步骤:
How YOLO works is that:

YOLO的优缺点:

C. Fast算法原理:fastica算法步骤详解

1. Fast算法原理

我们前面已经介绍过几个特征检测器,它们的效果都很好,特别是SIFT和SURF算法,但是从实时处理的角度来看,效率还是太低了。为了解决这个问题,Edward Rosten和Tom Drummond在2006年提出了FAST算法,并在2010年对其进行了修正。

FAST (全称Features from accelerated segment test)是一种用于角点检测的算法,该算法的原理是取图像中检测点,以该点为圆心的周围邻域内像素点判断检测点是否为角点,通俗的讲就是若一个像素周围有一定数量的像素与该点像素值不同,则认为其为角点。

1. 1 FAST算法的基本流程

在图像中选取一个像素点 p,来判断它是不是关键点。$$I_p$$等于像素点 p的灰度值。

以r为半径画圆,覆盖p点周围的M个像素,通常情狂下,设置 r=3,则 M=16,如下图所示:

设置一个阈值t,如果在这 16 个像素点中存在 n 个连续像素点的灰度值都高于$$I_p + t$$,或者低于$$I_p - t$$,那么像素点 p 就被认为是一个角点。如上图中的虚线所示,n 一般取值为 12。

由于在检测特征点时是需要对图像中所有的像素点进行检测,然而图像中的绝大多数点都不是特征点,如果对每个像素点都进行上述的检测过程,那显然会浪费许多时间,因此采用一种进行非特征点判别的方法:首先对候选点的周围每个 90 度的点:1,9,5,13 进行测试(先测试 1 和 19, 如果它们符合阈值要求再测试 5 和 13)。如果 p 是角点,那么这四个点中至少有 3 个要符合阈值要求,否则直接剔除。对保留下来的点再继续进行测试(是否有 12 的点符合阈值要求)。

虽然这个检测器的效率很高,但它有以下几条缺点:

·获得的候选点比较多

·特征点的选取不是最优的,因为它的效果取决与要解决的问题和角点的分布情况。

·进行非特征点判别时大量的点被丢弃

·检测到的很多特征点都是相邻的

前 3 个问题可以通过机器学习的方法解决,最后一个问题可以使用非最大值抑制的方法解决。

1. 2 机器学习的角点检测器

选择一组训练图片(最好是跟最后应用相关的图片)

使用 FAST 算法找出每幅图像的特征点,对图像中的每一个特征点,将其周围的 16 个像素存储构成一个向量P。

每一个特征点的 16 像素点都属于下列三类中的一种

根据这些像素点的分类,特征向量 P 也被分为 3 个子集:Pd ,Ps ,Pb,

定义一个新的布尔变量$$K_p$$,如果 p 是角点就设置为 Ture,如果不是就设置为 False。

利用特征值向量p,目标值是$K_p$,训练ID3 树(决策树分类器)。

将构建好的决策树运用于其他图像的快速的检测。

1. 3 非极大值抑制

在筛选出来的候选角点中有很多是紧挨在一起的,需要通过非极大值抑制来消除这种影响。

为所有的候选角点都确定一个打分函数$$V $$ , $$V $$的值可这样计算:先分别计算$$I_p$$与圆上16个点的像素值差值,取绝对值,再将这16个绝对值相加,就得到了$$V $$的值

最后比较毗邻候选角点的 V 值,把V值较小的候选角点pass掉。

FAST算法的思想与我们对角点的直观认识非常接近,化繁为简。FAST算法比其它角点的检测算法快,但是在噪声较高时不够稳定,这需要设置合适的阈值。

2.Fast实现

OpenCV中的FAST检测算法是用传统方法实现的,

1.实例化fast

参数:

·threshold:阈值t,有默认值10

·nonmaxSuppression:是否进行非极大值抑制,默认值True

返回:

Fast:创建的FastFeatureDetector对象

2.利用fast.detect检测关键点,没有对应的关键点描述

参数:

gray: 进行关键点检测的图像,注意是灰度图像

返回:

kp: 关键点信息,包括位置,尺度,方向信息

3.将关键点检测结果绘制在图像上,与在sift中是一样的

示例:

结果:

D. 计算机视觉——典型的目标检测算法(Fast R-CNN算法)(五)

【嵌牛导读】目标检测在现实中的应用很广泛,我们需要检测数字图像中的物体位置以及类别,它需要我们构建一个模型,模型的输入一张图片,模型的输出需要圈出图片中所有物体的位置以及物体所属的类别。在深度学习浪潮到来之前,目标检测精度的进步十分缓慢,靠传统依靠手工特征的方法来提高精度已是相当困难的事。而ImageNet分类大赛出现的卷积神经网络(CNN)——AlexNet所展现的强大性能,吸引着学者们将CNN迁移到了其他的任务,这也包括着目标检测任务,近年来,出现了很多目标检测算法。

【嵌牛鼻子】计算机视觉

【嵌牛提问】如何理解目标检测算法——Fast R-CNN

【嵌牛正文】

        为克服SPP-Net 存在的问题,2015 年Girshick 等提出基于边界框和多任务损失分类的Fast R-CNN[31]算法。该算法将SPP 层简化,设计出单尺度的ROI Pooling 池化层结构;将整张图像的候选区域采样成固定大小,生成特征图后作SVD分解,通过RoI Pooling层得到Softmax的分类得分和BoundingBox 外接矩形框的窗口回归两个向量;用Softmax 代替SVM 提出多任务损失函数思想,将深度网络和SVM分类两个阶段整合,即将分类问题和边框回归问题进行合并。

算法详解:

Fast R-CNN的流程图如下,网络有两个输入: 图像和对应的region proposal 。其中region proposal由selective search方法得到,没有表示在流程图中。对每个类别都训练一个回归器,且只有非背景的region proposal才需要进行回归。

ROI pooling:ROI Pooling的作用是对不同大小的region proposal,从最后卷积层输出的feature map提取大小固定的feature map。简单讲可以看做是SPPNet的简化版本,因为全连接层的输入需要尺寸大小一样,所以不能直接将不同大小的region proposal映射到feature map作为输出,需要做尺寸变换。在文章中,VGG16网络使用H=W=7的参数,即将一个h*w的region proposal分割成H*W大小的网格,然后将这个region proposal映射到最后一个卷积层输出的feature map,最后计算每个网格里的最大值作为该网格的输出,所以不管ROI pooling之前的feature map大小是多少,ROI pooling后得到的feature map大小都是H*W。

因此可以看出Fast RCNN主要有3个改进:1、卷积不再是对每个region proposal进行,而是直接对整张图像,这样减少了很多重复计算。原来RCNN是对每个region proposal分别做卷积,因为一张图像中有2000左右的region proposal,肯定相互之间的重叠率很高,因此产生重复计算。2、用ROI pooling进行特征的尺寸变换,因为全连接层的输入要求尺寸大小一样,因此不能直接把region proposal作为输入。3、将regressor放进网络一起训练,每个类别对应一个regressor,同时用softmax代替原来的SVM分类器。

在实际训练中,每个mini-batch包含2张图像和128个region proposal(或者叫ROI),也就是每张图像有64个ROI。然后从这些ROI中挑选约25%的ROI,这些ROI和ground truth的IOU值都大于0.5。另外只采用随机水平翻转的方式增加数据集。

测试的时候则每张图像大约2000个ROI。

损失函数的定义是将分类的loss和回归的loss整合在一起,其中分类采用log loss,即对真实分类(下图中的pu)的概率取负log,而回归的loss和R-CNN基本一样。分类层输出K+1维,表示K个类和1个背景类。

这是回归的loss,其中t^u表示预测的结果,u表示类别。v表示真实的结果,即bounding box regression target。

采用SVD分解改进全连接层。如果是一个普通的分类网络,那么全连接层的计算应该远不及卷积层的计算,但是针对object detection,Fast RCNN在ROI pooling后每个region proposal都要经过几个全连接层,这使得全连接层的计算占网络的计算将近一半,如下图,所以作者采用SVD来简化全连接层的计算。另一篇博客链接讲的R-FCN网络则是对这个全连接层计算优化的新的算法。

稍微总结下训练和测试的结构,如下面两个图,对算法的理解会更清晰。

test结构图在ROI Pooling层是怎么输出的画得比较容易理解。

E. fast和quick的区别

1,词性上面的区别。

fast既是形容词,也是副词。quick是形容词,它的副词形式是quickly。

2,强调重点不同。

fast强调速度快,强调的是“速度”。

比如:一辆汽车行驶的非常快(It's a very fast car),一个人跑的非常快(He runs very fast)。在此时,我们需要用fast来形容。

3,发音不同。

quickly

音标:英['kwɪklɪ]美['kwɪkli]

fast

音标:英[fɑːst]美[fæst]

(5)fastscnn算法扩展阅读:

fast,quick的其他释义,短语,例句:

fast的其他意思:

vi. 禁食,斋戒

n. 斋戒;绝食

短语:

as fast as和…一样快

fast growth快速生长

fast response快速响应

fast algorithm快速算法

例句:

1,These apples are maturing fast.

这些苹果正在快速成熟。

2,They fast on certain days.

他们在某些天斋戒。

3,The fast bowlers were brought on again after the interval.

在休息后快速投球手再次被要求出场投球。

quick的其他释义:无

短语:

answer quickly抢答字母组

quickly erase快速抹除

sit quickly安静地坐

例句:

1,I have done the errands quickly.

我很快干完了这些差事。

2,The dough would sour quickly in such weather.

在这种天气生面团会很快发酵。

3,If we do the work turn and turn about, we can finish it quickly.

如果我们轮换着做这个工作,我们能很快地把它完成。

F. Fast-SCNN

https://blog.csdn.net/calvinpaean/article/details/88534052

https://arxiv.org/pdf/1902.04502.pdf

https://github.com/Tramac/Fast-SCNN-pytorch

https://github.com/xiaoyufenfei/Efficient-Segmentation-Networks

摘要 :本文介绍一种适用于低内存嵌入式设备、计算高效、可用于高分辨率图像(1024×2048px)的实时语义分割模型FastSCNN。在现有的快速分割的双分支方法的基础上,我们引入“学习下采样”模块,该模块同时计算多个分辨率分支的低层级特征。然后将高分辨率的空间细节与低分辨率提取的深层特征结合起来,在Cityspaces数据集上获得68.0%mIoU的精度,123.5FPS的速度。我们还证明大规模预训练没必要。我们用ImageNet预训练和Cityspaces的粗标记数据对我们的度量进行了实验验证。最后,我们不修改网络结构,在下采样的输入上获得了速度更快、精度有可比性的结果。

1.引言

实时语义分割的研究最近获得了显着的普及[21,34,17,25,36,20]。

我们发现,文献中语义分割通常由具有编码器-解码器框架的深卷积神经网络来处理[29,2],而许多计算高效的方法使用双分支或多分支架构[21,34,17]。通常情况下:

•更大的感受野对于学习对象类之间的复杂关联(即全局上下文)很重要,

•图像中的空间细节是保持物体边界所必需的,以及

•需要具体的设计来平衡速度和准确性(而不是重定位的分类DCNNs)。

具体地说,在两个分支网络中,较深的分支在低分辨率下用于捕获全局上下文,而较浅的分支在全输入分辨率下用于学习空间细节。然后将二者合并,得到最终的语义分割结果。重要的是,较深的分支带来的计算成本的提升需要靠缩小输入尺寸来克服。而要获得全分辨率图只需要较少的层数。因而,在现代GPU上,实时性是可以实现的。与编码-解码不同的是,双分支中不同分辨率的初始卷积是不共享的。这里值得注意的是,引导上采样网络(GUN)[17]和图像级联网络(ICNet)[36]只在前几层之间共享权重。

我们提出FastSCNN,将双分支技术[21,34,17,36]与编码-解码[29,2]结合起来。FastSCNN的结构如图1。因为深度卷积网络的浅层主要提取低级特征[35,19],我们共享了双分支中初始层的计算。我们称这种技术为“学习下采样”,其效果与编码-解码中的跳连相似。我们只使用了一次跳连来保证计算效率。“学习下采样”模块层数比较浅,以保证特征共享的有效性。最后,我们还使用了深度可分离卷积[30,10]和逆残差模块[28]。

在Cityspaces数据集[6]上,FastSCNN在NvidiaTitanXp(Pascal)上处理全分辨率图像(1024×2048px),速度是123.5FPS,精度是68.0%mIoU。比现有最先进技术快两倍。(BiSeNet,71.4%mIoU,[34])。

虽然我们的参数量达到1.11M,但大多数离线分割方法(如DeepLab[4]和PSPNet[37])以及一些实时算法(如GUN[17]和ICNet[36])的参数量多得多。FastSCNN的模型容量特别低,原因是:(1)要在低内存的嵌入式设备上运行,(2)期待有更好的泛化能力。先前的很多工作都建议在ImageNet数据集[27]上预训练以提高精度和泛化能力。我们研究了预训练对低容量的FastSCNN的影响,结论是,使用预训练或者弱标签数据没有明显的提升效果,在Cityscapes数据集上只提升了0.5%mIoU,这一点和那些大容量的模型刚好相反。总结下我们的贡献:

(1) 提出了FastSCNN,在高分辨率图像(1024×2048px)上,精度有竞争力(68.0%),速度特别强(123.5fps)。

(2) 使用离线方法中常用的跳连,提出了一个浅层的“学习下采样”模块,以快速高效地多分支低层级特征提取。

(3)将FastSCNN设计为小容量,并且实验证明,对于小容量网络,多跑一些epoch,和使用预训练或额外的弱标签数据是等效的。

此外,对于下采样的输入,我们不对网络做任何修改就达到了最先进水平。

2.相关工作

我们对比分析语义分割方法,尤其是低功耗低内存的实时语义分割方法[2,20,21,36,34,17,25,18]。

2.1.语义分割的基础

最先进的语义分割结合了两个独立的模块:编码器和解码器。编码器用卷积和池化来提取特征。解码器从低分辨率特征中恢复空间细节,并预测分割结果[29,2]。通常,编码器用一个移除全连接层的分类网络,例如VGG或ResNet。

FCN[29]是大多数分割模型的基础,采样VGG为编码器,双线性上采样结合较低层的跳接来恢复空间细节。U-Net[26]使用密集的跳连进一步利用空间细节。

之后,受全局的图像上下文先验启发[13,16],PSPNet[37]使用金字塔池化模块,DeepLab[4]使用atrous空间金字塔池化(ASPP)对全局上下文进行编码和利用。

其他竞争性的基本分割结构使用条件随机场(CRF)[38,3]或递归神经网络[32,38]。然而它们不实时。

与目标检测[23,24,15]类似,速度是一个重要因素[21,34,17,25,36,20]。SegNet在FCN的基础上引入了联合编解码模型,成为最早的高效分割模型之一。继SegNet之后,ENet[20]还设计了一个具有很少几层的编码器-解码器,以降低计算成本。

最近出现了双分支和多分支方法。ICNet[36]、ContextNet[21]、BiSeNet[34]和GUN[17]通过在深度分支中减少输入的分辨率来学习全局上下文,而在浅层分支的全分辨率特征中学习边缘的细节信息。

然而,最先进的实时语义分割仍然具有局限性,并且通常需要高端GPU。受双分支方法的启发,FastSCNN使用了一个浅层的网络路径来编码细节信息,上下文信息在低分辨特征中被有效地学习,如图2所示。

2.2 DCNN中的高效设计

深度可分离卷积:  MobileNet[10]提出深度可分离卷积,减少了浮点运算和卷积参数,降低了计算量和内存需求。

高效的重新设计:  Chollet[5]使用高效的深度可分离卷积设计了Xception 网络。MobileNet-V2提出了inverted bottleneck resial block[28]来构建一个高效率的深度网络,用于分类任务。ContextNet[21]使用 inverted bottleneck resial block设计了一个双分支网络,用于实时语义分割。

网络量化:  浮点计算相较于整型和二进制操作要昂贵的多,模型运行时间可以进一步通过量化技巧来缩短。

网络压缩:  剪枝可以用于减小预训练网络的大小,使运行速度更快,参数更少,内存占用更少。

FastSCNN很依赖于深度可分离卷积和resial bottleneck blocks[28]。此外,我们还引入双分支结构,与“学习下采样”模块结合起来,允许在多级分辨率上共享特征,如图2所示。注意,尽管多个分支的初始层提取了相似的特征[35,19],但常用的双分支方法并没有使用这一点。网络量化和网络压缩可以正交应用,这个留给我们以后的工作。

2.3 辅助任务的预训练

普遍认为辅助任务的预训练可以提高精度。早期的目标检测[7]和语义分割[4,37]的研究在ImageNet上进行了预训练[27]。其他实时高效的语义分割方法也在ImageNet上进行了预训练[36,34,17]。然而,尚不清楚低容量网络是否有必要预训练。我们实验证明预训练对小网络没有明显的提升效果。数据增广和训练更多的epoch也能取得类似的效果。

3 我们提出的FastSCNN

FastSCNN灵感来自于双分支结构[21,34,17]和具有跳连的编码器网络[29,26]。因为注意到网络的前几层通常提取低级特征,我们将跳连重新解释为一个“学习下采样”模块,这样我们就能够融合两个框架的关键思想,并可以构建一个快速的语义分割模型。图1和表1是FastSCNN的结构。接下来将介绍我们的设计动机和各模块的详细设置。

3.1 动机

当前最先进的实时语义分割方法是基于双分支结构,每个分支作用在不同级别的分辨率上[21,34,17],从输入图像的低分辨特征中学习全局信息,并使用浅层网络的全分辨率来细化分割结果的精度。由于输入分辨率和网络深度是决定运行时间的主要因素,双分支结构使得模型可以是实时的。

众所周知,网络的前几层提取低级特征,例如边和角[35,19]。因此,我们不采用将两个分支完全独立的方法,而是引入学习下采样模块,让两个分支共享浅层的网络模块。

3.2 网络结构

我们的FastSCNN使用“学习下采样模块”,一个粗糙的全局特征提取模块、一个特征融合模块和一个标准的分类器。所有模块都是用深度可分离卷积来构建,深度可分离卷积已经是许多高效网络的关键[5,10,21]。

3.2.1学习下采样

为了保证低层特征共享的有效和高效,学习下采样模块只采用了三层结构。第一层是标准卷积层(Conv2D),另外两层是深度可分离卷积(DSConv)。这里要说明的是,虽然DSConv可以提升计算效率,但由于输入图像只有3个通道,深度可分离卷积放在第一层的话带来的效率的提升是微不足道的,因此第一层用标准卷积。

学习下采样的3层中的每一层的卷积滑动步长都是2,然后是批量归一化和ReLU。标准卷积和深度可分离中的深度层的卷积核尺寸都是3×3。和[5,28,21]一样,我们省略了深度可分离卷积中深度卷积和点卷积的非线性运算。

3.2.2全局特征提取器

全局特征提取模块是为了获取图像分割的全局上下文。与通常的双分支方法在原始图像上获取低分辨率特征不同,我们是取“学习下采样”模块的输出作为全局特征提取器的输入,其分辨率是原始图像的1/8。详细结构如表1所示。我们使用MobileNet-v2[28]中提出的高效的bottleneck resial block,如表2所示。

特别地,当输入输出大小相同时,我们对bottleneck resial block采用残差连接。我们的bottleneck block使用了一个高效的深度可分离卷积,这样参数量更小,浮点计算更少。此外,在末尾添加金字塔池模块(PPM)[37],以聚合基于不同区域的上下文信息。

3.2.3特征融合模块

与ICNet[36]和ContextNet[21]类似,我们更喜欢简单的特征相加,以确保效率。或者,使用更复杂的特征融合模块,例如[34],这样精度更高而计算量也更大。特征融合模块的细节如表3所示。

3.2.4分类器

分类器中使用了两个深度可分离卷积和一个点卷积。我们发现在特征融合模块后增加几层可以提高精度。分类器模块的详细信息如表1所示。

在训练过程中使用Softmax,因为使用了梯度下降。在推理过程中,我们可以用Argmax代替昂贵的Softmax计算。我们将此选项表示为Fast SCNN cls(分类)。另一方面,如果需要输出概率模型,则使用softmax,表示为FastSCNN prob(概率)。

3.3 和现有的最先进技术比较

3.3.1与双分支模型的关系

最先进的实时模型(ContextNet[21]、BiSeNet[34]和GUN[17])使用双分支结构。我们的“学习下采样”模块相当于它们的空间路径,因为它很浅,从全分辨率学习,并用于特征融合模块(图1)。

我们的全局特征提取模块相当于这种方法更深层的低分辨率分支。相反,我们的全局特征抽取器与学习下采样模块共享其前几层的计算。通过共享层,我们不仅降低了特征提取的计算复杂度,而且还降低了所需的输入大小,因为FastSCNN使用1/8分辨率而不是1/4分辨率进行全局特征提取。

3.3.2与编码-解码模型的关系

FastSCNN可以看做是诸如FCN[29]或U-Net[26]等编码-解码框架的特例。然而,与FCN中的多个跳连和U-Net中的密集跳连不同,FastSCNN只使用一个跳连来减少计算量和内存。

与[35]一致,他主张在DCNNs中只在前几层共享特征,我们将跳连放在网络的前几层。和我们相反,现有的最先进技术都是在每个分辨率下使用很深的模块之后才使用跳连。

4.实验

我们在Cityscapes数据集[6]上评估我们的方法,并且在测试集,也就是Cityscapes benchmark server上提交了它的性能。

4.1实现细节

我们用Python、Tensorflow上进行了实验。我们实验的工作站有有Nvidia Titan X(Maxwell)或Nvidia Titan Xp(Pascal)GPU、CUDA 9.0和CuDNN v7。运行时评估在单个CPU线程和一个GPU中执行,以测量前向推理时间。我们取100帧的平均耗时作为单帧耗时。

我们使用SGD(momentum=0.9),批量大小是12。受[4,37,10]的启发,我们使用“poly”学习率,其中基学习率为0.045,幂为0.9。与MobileNet-V2类似,我们发现L2正则化对深度卷积(depthwise convolution)不必要。其他的层,L2系数是0.00004。因为语义分割的训练数据有限,我们使用了多种数据增强技术:随机缩放(缩放率范围是0.5到2)、平移/裁剪、水平翻转、颜色通道噪声和亮度变化。使用交叉熵损失训练。我们发现学习结束时的辅助损失和0.4权值的全局特征提取模块是有益的。

批量归一化在每个激活函数之前使用。Dropout只在最后一层,也就是softmax之前。与MobileNet[10]和ContextNet[21]相反,我们发现使用ReLU训练得更快,而且精度比ReLU6稍高,即使整个模型都使用深度可分离卷积。

我们发现训练更多的迭代次数可以提高性能。除非另有说明,我们使用Cityescapes数据集[6]用1000个epoch训练我们的模型。值得注意的是,Fast-SCNN的容量故意非常低,只有1.11million个参数。后来我们发现有益的数据增强技术使得不太可能过度拟合。

4.2.在Cityscapes数据集上的评估

Cityscapes是最大的公开的城市道路数据集,包含从欧洲50个不同城市拍摄的高分辨率图像(1024×2048px)。它有5000个高质量标注的图像,其中训练集2975个,验证集500个,测试集1525个。训练集和验证集的标注是公开的,测试集的结果可以在评估服务器上进行评估。此外,20000个弱标注图像(粗糙标签)可用于训练。我们在这两者上都进行评估:高质量标注样本和粗糙标注样本。Cityscapes提供30个类别标签,而只有19个类别用于评估。接下来我们报告模型的mIoU和推断时间。下面报告联合上的平均交集(mIoU)和网络推理时间。

我们在Cityscapes不公开的测试集上评估总体性能。我们所提的FastSCNN与其他最先进的实时语义分割方法(ContextNet[21]、BiSeNet[34]、GUN[17]、ENet[20]和ICNet[36])和离线方法(PSPNet[37]和DeepLab-V2[4])的比较如表4所示。FastSCNN达到68.0%mIoU,略低于BiSeNet(71.5%)和GUN(70.4%)。ContextNet在这里只达到66.1%。

表5比较了不同分辨率下的推断时间。在这里,BiSeNet(57.3 fps)和GUN(33.3 fps)明显慢于FastSCNN(123.5 fps)。与ContextNet(41.9fps)相比,在Nvidia Titan X(Maxwell)上,FastSCNN的速度也明显更快。因此,我们得出结论,FastSCNN显着提高了最先进模型的速度,而只以轻微的精度降低为代价。FastSCNN为低内存嵌入设备而设计,使用1.11million个参数,比BiSeNet的5.8million个参数少5倍。

最后,我们将跳连的作用置零,来测试FastSCNN的性能。验证集上,mIoU从69.22%降低到64.30%。图3比较了定性结果。正如所料,跳连对FastSCNN是有益的,特别是在边界和小尺寸物体周围。

4.3 预训练和弱标注数据

大容量的深度卷积网络,如R-CNN[7]和PSPNet[37]已经表明,通过不同的辅助任务,预训练可以提高性能。由于我们的FastSCNN是低容量的,我们希望在使用预训练和不使用预训练的情况下分别测试性能。据我们所知,预训练和弱标注数据对低容量模型的作用的重要性,还没有被研究过。结果如表6所示。

我们在ImageNet[27]上预先训练FastSCNN,用平均池化替换特征融合模块,分类模块现在只有一个softmax层。FastSCNN在ImageNet的验证集上达到60.71%的top-1精度和83.0%的top-5精度。这一结果表明,FastSCNN的容量不足以达到ImageNet上大多数标准DCNNs的性能(>70%top-1)[10,28]。使用ImageNet预训练的Fast-SCNN在城市景观验证集上的准确率为69.15%mIoU,仅比没有预训练的FastSCNN提高0.53%。因此,我们得出结论,在FastSCNN中,使用ImageNet预训练不能获得显着的提升。

由于Cityscapes数据集和ImageNet数据集之间的重叠是有限的,因此可以合理地假设,由于两个领域的容量有限,FastSCNN可能不会受益。因此,我们现在合并了Cityscapes提供的20000张粗糙标记的附加图像,因为这些图像来自类似的领域。然而,使用粗糙标注数据训练的FastSCNN(使用或不使用ImageNet预训练)性能相似,仅在没有预训练的情况下略优于原始的FastSCNN。请注意,由于DCNNs的随机初始化,微小的性能浮动是微不足道的。

我们表明,无论是ImageNet预训练还是弱标记数据都对我们的低容量DCNN没有显着的好处。图4显示了训练曲线。使用粗糙标注数据训练的FastSCNN的迭代速度慢,因为标注的质量差。使用ImageNet预训练的两个模型在早期阶段(对不用粗标注数据的模型是前400个epoch,对使用粗标注数据的模型是前100个epoch)表现的更好。带有粗数据序列的快速SCNN迭代速度慢是标签质量差的原因。ImageNet的两个预训练版本只在早期阶段都表现得更好(单独训练集最多400个阶段,使用附加的粗略标记数据训练时为100个阶段)。这意味着,当我们从头训练模型(也就是不使用预训练)时,多训练一些epoch就能达到和使用预训练类似的精度。

4.4 更低的输入分辨率

我们评估下在1/2和1/4分辨率下模型的性能(表7)。

1/4分辨率下,模型精度51.9%,速度485.4fps,这比MiniNet(佚名)的40.7%mIoU、250fps好得多。在1/2分辨率下,可达到具有竞争力的62.8%mIoU、285.8fps。我们强调,无需修改,快速SCNN直接适用于较低的输入分辨率,使其非常适合嵌入式设备。

5 结论

我们提出了FastSCNN用于实时语义分割。多分支结构的共享计算可以节省计算量提高速度。实验表明跳连有利于恢复空间细节。如果训练的epoch数足够多,对低容量网络而言,大规模辅助任务预训练没必要。

G. OpenCV-Python教程:38.FAST角点检测算法

理论

我们看到了一些特征检测算法,他们很多都不错,但是从实时应用的角度看,他们都不够快,一个最好的例子是SLAM(同步定位与地图创建)移动机器人没有足够的计算能力。

作为解决方案,FAST(加速切片测试特征)算法被提出,Edward Rosten和Tom Drummond 2006年在他们的论文“Machine learning for high-speed corner detection”提出,并在2010年最后修订,算法的基本大意如下:

使用FAST进行特征检测

1.选择一个图像里的像素p用来识别是不是一个兴趣点,它的强度是Ip

2.选择一个合适的阈值t

3.在要测试的像素周围找16个像素的圆

4.现在如果存在一个在圆内(16像素的)的n个连续像素集合,他们都比Ip + t要亮,或者都比Ip - t 要暗(用白虚线显示),那p就是角, n取12。

5.用一个高速测试来排除大量非角。这个测试只检查1,9,5和13位置的像素(首先1和9会测试是否他们太亮或者太暗,如果是,再检查5和13)。如果p是角,那么至少3个都比Ip+t要亮或者比Ip-t要暗,如果不是这样,那么p不可能是角。这个检测器展现了高性能,但是有几个缺陷:

·当n< 12时不能拒绝很多备选点

·像素的选择不是可选的,因为它的效率依赖问题和角的分布。

·高速测试的结果被丢弃了

·会检测出多个爱挨在一起的特征

机器学习角点检测

1.选择一组图像进行训练(最好从目标应用范围内)

2.运行FAST算法来对每个图像进行特征点查找

3.对每个特征点,存下周围的16个像素作为向量。所有图像做完以后得到特征向量P。

4.这16个像素里的每个像素(设为x)可以有下面的三个状态:

5.根据这些状态,特征向量P被分成3个子集,Pd, Ps, Pb.

6.定义个新的布尔变量Kp,如果p是角就是真反之为假。

7.使用ID3算法(决策树分类)来查询每个子集,对于每个true类用变量Kp,它选择x来得出一个备选像素是否是角的信息。

8.对所有子集迭代直到为0

9.创建的决策树用来对其他图形做fast检测

非极大值抑制

在临近位置检测多个兴趣点是另一个问题,可以使用非极大值抑制来解决。

1.计算一个分数函数,V是所有检测到的特征点,V是p和16个围着的像素值得绝对差。

2.计算两个相邻关键点的V值

3.丢掉V值低的那个

总结:

它比其他存在的角点算法要快几倍

但是它对高噪点情况来说不健壮,依赖阈值

OpenCV里的FAST特征检测

它和其他OpenCV里的特征检测类似,如果你愿意,你可以指定阈值,是否使用非极大值抑制,要用的邻居等。

对于邻居,定义了三个标志位, cv2.FAST_FEATURE_DETECTOR_TYPE_5_8, cv2.FAST_FEATURE_DETECTOR_TYPE_7_12和cv2.FAST_FEATURE_DETECTOR_TYPE_9_16.

看结果,第一个图像显示了使用了非极大值抑制的FAST,第二个是没有使用非极大值抑制的。

END

H. 目标检测算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)

深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理。  目标检测可以理解为是物体识别和物体定位的综合 ,不仅仅要识别出物体属于哪个分类,更重要的是得到物体在图片中的具体位置。

2014年R-CNN算法被提出,基本奠定了two-stage方式在目标检测领域的应用。它的算法结构如下图

算法步骤如下:

R-CNN较传统的目标检测算法获得了50%的性能提升,在使用VGG-16模型作为物体识别模型情况下,在voc2007数据集上可以取得66%的准确率,已经算还不错的一个成绩了。其最大的问题是速度很慢,内存占用量很大,主要原因有两个

针对R-CNN的部分问题,2015年微软提出了Fast R-CNN算法,它主要优化了两个问题。

R-CNN和fast R-CNN均存在一个问题,那就是 由选择性搜索来生成候选框,这个算法很慢 。而且R-CNN中生成的2000个左右的候选框全部需要经过一次卷积神经网络,也就是需要经过2000次左右的CNN网络,这个是十分耗时的(fast R-CNN已经做了改进,只需要对整图经过一次CNN网络)。这也是导致这两个算法检测速度较慢的最主要原因。

faster R-CNN 针对这个问题, 提出了RPN网络来进行候选框的获取,从而摆脱了选择性搜索算法,也只需要一次卷积层操作,从而大大提高了识别速度 。这个算法十分复杂,我们会详细分析。它的基本结构如下图

主要分为四个步骤:

使用VGG-16卷积模型的网络结构:

卷积层采用的VGG-16模型,先将PxQ的原始图片,缩放裁剪为MxN的图片,然后经过13个conv-relu层,其中会穿插4个max-pooling层。所有的卷积的kernel都是3x3的,padding为1,stride为1。pooling层kernel为2x2, padding为0,stride为2。

MxN的图片,经过卷积层后,变为了(M/16) x (N/16)的feature map了。

faster R-CNN抛弃了R-CNN中的选择性搜索(selective search)方法,使用RPN层来生成候选框,能极大的提升候选框的生成速度。RPN层先经过3x3的卷积运算,然后分为两路。一路用来判断候选框是前景还是背景,它先reshape成一维向量,然后softmax来判断是前景还是背景,然后reshape恢复为二维feature map。另一路用来确定候选框的位置,通过bounding box regression实现,后面再详细讲。两路计算结束后,挑选出前景候选框(因为物体在前景中),并利用计算得到的候选框位置,得到我们感兴趣的特征子图proposal。

卷积层提取原始图像信息,得到了256个feature map,经过RPN层的3x3卷积后,仍然为256个feature map。但是每个点融合了周围3x3的空间信息。对每个feature map上的一个点,生成k个anchor(k默认为9)。anchor分为前景和背景两类(我们先不去管它具体是飞机还是汽车,只用区分它是前景还是背景即可)。anchor有[x,y,w,h]四个坐标偏移量,x,y表示中心点坐标,w和h表示宽度和高度。这样,对于feature map上的每个点,就得到了k个大小形状各不相同的选区region。

对于生成的anchors,我们首先要判断它是前景还是背景。由于感兴趣的物体位于前景中,故经过这一步之后,我们就可以舍弃背景anchors了。大部分的anchors都是属于背景,故这一步可以筛选掉很多无用的anchor,从而减少全连接层的计算量。

对于经过了3x3的卷积后得到的256个feature map,先经过1x1的卷积,变换为18个feature map。然后reshape为一维向量,经过softmax判断是前景还是背景。此处reshape的唯一作用就是让数据可以进行softmax计算。然后输出识别得到的前景anchors。

另一路用来确定候选框的位置,也就是anchors的[x,y,w,h]坐标值。如下图所示,红色代表我们当前的选区,绿色代表真实的选区。虽然我们当前的选取能够大概框选出飞机,但离绿色的真实位置和形状还是有很大差别,故需要对生成的anchors进行调整。这个过程我们称为bounding box regression。

假设红色框的坐标为[x,y,w,h], 绿色框,也就是目标框的坐标为[Gx, Gy,Gw,Gh], 我们要建立一个变换,使得[x,y,w,h]能够变为[Gx, Gy,Gw,Gh]。最简单的思路是,先做平移,使得中心点接近,然后进行缩放,使得w和h接近。如下:

我们要学习的就是dx dy dw dh这四个变换。由于是线性变换,我们可以用线性回归来建模。设定loss和优化方法后,就可以利用深度学习进行训练,并得到模型了。对于空间位置loss,我们一般采用均方差算法,而不是交叉熵(交叉熵使用在分类预测中)。优化方法可以采用自适应梯度下降算法Adam。

得到了前景anchors,并确定了他们的位置和形状后,我们就可以输出前景的特征子图proposal了。步骤如下:

1,得到前景anchors和他们的[x y w h]坐标。

2,按照anchors为前景的不同概率,从大到小排序,选取前pre_nms_topN个anchors,比如前6000个

3,剔除非常小的anchors。

4,通过NMS非极大值抑制,从anchors中找出置信度较高的。这个主要是为了解决选取交叠问题。首先计算每一个选区面积,然后根据他们在softmax中的score(也就是是否为前景的概率)进行排序,将score最大的选区放入队列中。接下来,计算其余选区与当前最大score选区的IOU(IOU为两box交集面积除以两box并集面积,它衡量了两个box之间重叠程度)。去除IOU大于设定阈值的选区。这样就解决了选区重叠问题。

5,选取前post_nms_topN个结果作为最终选区proposal进行输出,比如300个。

经过这一步之后,物体定位应该就基本结束了,剩下的就是物体识别了。

和fast R-CNN中类似,这一层主要解决之前得到的proposal大小形状各不相同,导致没法做全连接。全连接计算只能对确定的shape进行运算,故必须使proposal大小形状变为相同。通过裁剪和缩放的手段,可以解决这个问题,但会带来信息丢失和图片形变问题。我们使用ROI pooling可以有效的解决这个问题。

ROI pooling中,如果目标输出为MxN,则在水平和竖直方向上,将输入proposal划分为MxN份,每一份取最大值,从而得到MxN的输出特征图。

ROI Pooling层后的特征图,通过全连接层与softmax,就可以计算属于哪个具体类别,比如人,狗,飞机,并可以得到cls_prob概率向量。同时再次利用bounding box regression精细调整proposal位置,得到bbox_pred,用于回归更加精确的目标检测框。

这样就完成了faster R-CNN的整个过程了。算法还是相当复杂的,对于每个细节需要反复理解。faster R-CNN使用resNet101模型作为卷积层,在voc2012数据集上可以达到83.8%的准确率,超过yolo ssd和yoloV2。其最大的问题是速度偏慢,每秒只能处理5帧,达不到实时性要求。

针对于two-stage目标检测算法普遍存在的运算速度慢的缺点, yolo创造性的提出了one-stage。也就是将物体分类和物体定位在一个步骤中完成。 yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式, yolo可实现45帧每秒的运算速度,完全能满足实时性要求 (达到24帧每秒,人眼就认为是连续的)。它的网络结构如下图:

主要分为三个部分:卷积层,目标检测层,NMS筛选层。

采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception mole结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception mole中的一个分支,应该是为了简化网络结构)

先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7个网格,每个网格要预测两个bounding box的坐标(x,y,w,h)和box内包含物体的置信度confidence,以及物体属于20类别中每一类的概率(yolo的训练数据为voc2012,它是一个20分类的数据集)。所以一个网格对应的参数为(4x2+2+20) = 30。如下图

其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的重合度。它等于两个box面积交集,除以面积并集。值越大则box越接近真实位置。

分类信息: yolo的目标训练集为voc2012,它是一个20分类的目标检测数据集 。常用目标检测数据集如下表:

| Name | # Images (trainval) | # Classes | Last updated |

| --------------- | ------------------- | --------- | ------------ |

| ImageNet | 450k | 200 | 2015 |

| COCO | 120K | 90 | 2014 |

| Pascal VOC | 12k | 20 | 2012 |

| Oxford-IIIT Pet | 7K | 37 | 2012 |

| KITTI Vision | 7K | 3 | |

每个网格还需要预测它属于20分类中每一个类别的概率。分类信息是针对每个网格的,而不是bounding box。故只需要20个,而不是40个。而confidence则是针对bounding box的,它只表示box内是否有物体,而不需要预测物体是20分类中的哪一个,故只需要2个参数。虽然分类信息和confidence都是概率,但表达含义完全不同。

筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box(NMS具体算法可以回顾上面faster R-CNN小节)。这样就得到了最终的最合适的几个box和他们的类别。

yolo的损失函数包含三部分,位置误差,confidence误差,分类误差。具体公式如下:

误差均采用了均方差算法,其实我认为,位置误差应该采用均方差算法,而分类误差应该采用交叉熵。由于物体位置只有4个参数,而类别有20个参数,他们的累加和不同。如果赋予相同的权重,显然不合理。故yolo中位置误差权重为5,类别误差权重为1。由于我们不是特别关心不包含物体的bounding box,故赋予不包含物体的box的置信度confidence误差的权重为0.5,包含物体的权重则为1。

Faster R-CNN准确率mAP较高,漏检率recall较低,但速度较慢。而yolo则相反,速度快,但准确率和漏检率不尽人意。SSD综合了他们的优缺点,对输入300x300的图像,在voc2007数据集上test,能够达到58 帧每秒( Titan X 的 GPU ),72.1%的mAP。

SSD网络结构如下图:

和yolo一样,也分为三部分:卷积层,目标检测层和NMS筛选层

SSD论文采用了VGG16的基础网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。

这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。SSD认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。SSD的特点如下。

每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到 多尺度检测 的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。而yolo中,只在最后一个卷积层上做目标位置和类别的训练和预测。这是SSD相对于yolo能提高准确率的一个关键所在。

如上所示,在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。

和faster R-CNN相似,SSD也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点。以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(SSD中称为default box)。每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。如下图所示:

另外,在训练阶段,SSD将正负样本比例定位1:3。训练集给定了输入图像以及每个物体的真实区域(ground true box),将default box和真实box最接近的选为正样本。然后在剩下的default box中选择任意一个与真实box IOU大于0.5的,作为正样本。而其他的则作为负样本。由于绝大部分的box为负样本,会导致正负失衡,故根据每个box类别概率排序,使正负比例保持在1:3。SSD认为这个策略提高了4%的准确率

另外,SSD采用了数据增强。生成与目标物体真实box间IOU为0.1 0.3 0.5 0.7 0.9的patch,随机选取这些patch参与训练,并对他们进行随机水平翻转等操作。SSD认为这个策略提高了8.8%的准确率。

和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用NMS非极大值抑制,筛掉重叠度较高的。只不过SSD综合了各个不同feature map上的目标检测输出的default box。

SSD基本已经可以满足我们手机端上实时物体检测需求了,TensorFlow在android上的目标检测官方模型ssd_mobilenet_v1_android_export.pb,就是通过SSD算法实现的。它的基础卷积网络采用的是mobileNet,适合在终端上部署和运行。

针对yolo准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD的特点,提出了yoloV2。它主要还是采用了yolo的网络结构,在其基础上做了一些优化和改进,如下

网络采用DarkNet-19:19层,里面包含了大量3x3卷积,同时借鉴inceptionV1,加入1x1卷积核全局平均池化层。结构如下

yolo和yoloV2只能识别20类物体,为了优化这个问题,提出了yolo9000,可以识别9000类物体。它在yoloV2基础上,进行了imageNet和coco的联合训练。这种方式充分利用imageNet可以识别1000类物体和coco可以进行目标位置检测的优点。当使用imageNet训练时,只更新物体分类相关的参数。而使用coco时,则更新全部所有参数。

YOLOv3可以说出来直接吊打一切图像检测算法。比同期的DSSD(反卷积SSD), FPN(feature pyramid networks)准确率更高或相仿,速度是其1/3.。

YOLOv3的改动主要有如下几点:

不过如果要求更精准的预测边框,采用COCO AP做评估标准的话,YOLO3在精确率上的表现就弱了一些。如下图所示。

当前目标检测模型算法也是层出不穷。在two-stage领域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 算法,将对抗学习引入到目标检测领域。Face++也提出了Light-Head R-CNN,主要探讨了 R-CNN 如何在物体检测中平衡精确度和速度。

one-stage领域也是百花齐放,2017年首尔大学提出 R-SSD 算法,主要解决小尺寸物体检测效果差的问题。清华大学提出了 RON 算法,结合 two stage 名的方法和 one stage 方法的优势,更加关注多尺度对象定位和负空间样本挖掘问题。

目标检测领域的深度学习算法,需要进行目标定位和物体识别,算法相对来说还是很复杂的。当前各种新算法也是层不出穷,但模型之间有很强的延续性,大部分模型算法都是借鉴了前人的思想,站在巨人的肩膀上。我们需要知道经典模型的特点,这些tricks是为了解决什么问题,以及为什么解决了这些问题。这样才能举一反三,万变不离其宗。综合下来,目标检测领域主要的难点如下:

一文读懂目标检测AI算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2

从YOLOv1到v3的进化之路

SSD-Tensorflow超详细解析【一】:加载模型对图片进行测试  https://blog.csdn.net/k87974/article/details/80606407

YOLO    https://pjreddie.com/darknet/yolo/      https://github.com/pjreddie/darknet   

C#项目参考:https://github.com/AlturosDestinations/Alturos.Yolo

项目实践贴个图。

I. Sparse R-CNN: 稀疏的目标检测,武装Fast RCNN | 新文分析

论文: Sparse R-CNN: End-to-End Object Detection with Learnable Proposals

  论文认为,目前的目标检测算法可以按预设框的多少分为两种:

  上述两种方法都会预测大量的结果,需要进行NMS后处理,而在训练的时候会存在many-to-one的问题,并且anchor的设置对性能的影响很大。
  于是,很多研究开始探讨稀疏(sparse)检测,比如近期的DETR算法。该算法不需要预设anchor,并且预测的结果可直接输出,不需要后处理。但论文认为DETR并不是真正的稀疏检测,因为DETR在各位置提取特征时,需要与全图的上下文进行交互,而真正的稀疏检测应该满足sparse boxes和sparse features,即较少的初始框设定以及框之间不需要过多的特征互动。
  为此,论文提出了Sparse R-CNN,如图1c所示,仅需设定少量anchor即可进行检测,而且能够进行set prediction,免去NMS等后处理,其核心主要包含以下几点:

  Sparse R-CNN的推理流程如图3所示,输入图片、可学习的proposal boxes以及可学习的proposal features,根据proposal boxes提取对应的RoIAlign特征,dynamic head将proposal features转换为卷积核参数,对RoIAlign特征进一步提取特征,再进行后续的分类和回归。整体的思想和Fast RCNN很像,将selective search替换为proposal boxes,再增加其它更强的模块。

  论文采用FPN-ResNet作为主干网络,输出多层特征,每层特征的维度都是256。采用更复杂的主干网络可以获得更好的性能,但论文与Faster R-CNN对齐,采用标准的实现。

  Sparse R-CNN的核心是采用数目固定的小批量可学习proposal boxes( )作为region proposal,而非RPN。每个box为4-d参数,在0~1范围内,值为归一化的中心点坐标、宽度和高度。这些参数在训练过程中通过反向传播进行更新,包含了训练集目标位置的统计信息,可用于推理时的初步目标位置猜测。

  尽管4维的proposal box能够直观地表示目标的定位,但缺少了目标的信息,比如目标的姿态和形状,所以论文引入proposal feature( )进行补充。proposal features是高维的可学习向量,与proposal boxes一一对应,用于丰富目标的RoIAlign特征。

  Dynamic instance interactive head的结构如图4所示,每个proposal box都有一个专属的预测head。给定 个proposal boxes和 个proposal features,先通过RoIAlign提取每个box的 维特征,Dynamic instance interactive head将其对应的 维proposal feature转换为卷积参数,使用这个卷积参数对RoIAlign特征进行提取,得到目标的 维特征,最后经过简单的3层感知机进行分类与回归。
  Dynamic instance interactive head也可以使用类似Cascade R-CNN那样的级联模式进一步的提升性能,将输出的新回归框和 维特征作为下一次迭代的proposal box和proposal feature即可。

  Sparse R-CNN的训练采用set prediction的形式,将固定数量的预测结果与GT之间进行二分图最优的匹配,然后计算损失值,完整的损失函数为:

  各模块对比实验。

  性能与收敛性。

  在COCO上进行对比。

  Sparse R-CNN贯彻了稀疏的思想,只提供少量初始框,可进行Set prediction,颠覆了当前密集预测的检测思路,整体框架十分简洁,跟Fast RCNN有点像,十分值得大家阅读。



J. 经典目标检测算法介绍

姓名:牛晓银;学号:20181213993;学院:计算机科学与技术

转自:https://zhuanlan.hu.com/p/34142321

【嵌牛导读】:目标检测,也叫目标提取,是一种基于目标几何和统计特征的图像分割。随着计算机技术的发展和计算机视觉原理的广泛应用,利用计算机图像处理技术对目标进行实时跟踪研究越来越热门,对目标进行动态实时跟踪定位在智能化交通系统、军事目标检测及医学导航手术中手术器械定位等方面具有广泛的应用价值。

【嵌牛鼻子】:目标检测、检测模型、计算机视觉

【嵌牛提问】:你知道或者用过哪些目标检测算法?

【嵌牛正文】:

(一)目标检测经典工作回顾

本文结构

两阶段模型因其对图片的两阶段处理得名,也称为基于区域(Region-based)的方法,我们选取R-CNN系列工作作为这一类型的代表。

R-CNN: R-CNN系列的开山之作

论文链接:  Rich feature hierarchies for accurate object detection and semantic segmentation

本文的两大贡献:1)CNN可用于基于区域的定位和分割物体;2)监督训练样本数紧缺时,在额外的数据上预训练的模型经过fine-tuning可以取得很好的效果。第一个贡献影响了之后几乎所有2-stage方法,而第二个贡献中用分类任务(Imagenet)中训练好的模型作为基网络,在检测问题上fine-tuning的做法也在之后的工作中一直沿用。

传统的计算机视觉方法常用精心设计的手工特征(如SIFT, HOG)描述图像,而深度学习的方法则倡导习得特征,从图像分类任务的经验来看,CNN网络自动习得的特征取得的效果已经超出了手工设计的特征。本篇在局部区域应用卷积网络,以发挥卷积网络学习高质量特征的能力。

R-CNN将检测抽象为两个过程,一是基于图片提出若干可能包含物体的区域(即图片的局部裁剪,被称为Region Proposal),文中使用的是Selective Search算法;二是在提出的这些区域上运行当时表现最好的分类网络(AlexNet),得到每个区域内物体的类别。

另外,文章中的两个做法值得注意。

一是数据的准备。输入CNN前,我们需要根据Ground Truth对提出的Region Proposal进行标记,这里使用的指标是IoU(Intersection over Union,交并比)。IoU计算了两个区域之交的面积跟它们之并的比,描述了两个区域的重合程度。

文章中特别提到,IoU阈值的选择对结果影响显着,这里要谈两个threshold,一个用来识别正样本(如跟ground truth的IoU大于0.5),另一个用来标记负样本(即背景类,如IoU小于0.1),而介于两者之间的则为难例(Hard Negatives),若标为正类,则包含了过多的背景信息,反之又包含了要检测物体的特征,因而这些Proposal便被忽略掉。

另一点是位置坐标的回归(Bounding-Box Regression),这一过程是Region Proposal向Ground Truth调整,实现时加入了log/exp变换来使损失保持在合理的量级上,可以看做一种标准化(Normalization)操作。

小结

R-CNN的想法直接明了,即将检测任务转化为区域上的分类任务,是深度学习方法在检测任务上的试水。模型本身存在的问题也很多,如需要训练三个不同的模型(proposal, classification, regression)、重复计算过多导致的性能问题等。尽管如此,这篇论文的很多做法仍然广泛地影响着检测任务上的深度模型革命,后续的很多工作也都是针对改进这一工作而展开,此篇可以称得上"The First Paper"。

Fast R-CNN: 共享卷积运算

论文链接: Fast R-CNN

文章指出R-CNN耗时的原因是CNN是在每一个Proposal上单独进行的,没有共享计算,便提出将基础网络在图片整体上运行完毕后,再传入R-CNN子网络,共享了大部分计算,故有Fast之名。

上图是Fast R-CNN的架构。图片经过feature extractor得到feature map, 同时在原图上运行Selective Search算法并将RoI(Region of Interset,实为坐标组,可与Region Proposal混用)映射到到feature map上,再对每个RoI进行RoI Pooling操作便得到等长的feature vector,将这些得到的feature vector进行正负样本的整理(保持一定的正负样本比例),分batch传入并行的R-CNN子网络,同时进行分类和回归,并将两者的损失统一起来。

RoI Pooling 是对输入R-CNN子网络的数据进行准备的关键操作。我们得到的区域常常有不同的大小,在映射到feature map上之后,会得到不同大小的特征张量。RoI Pooling先将RoI等分成目标个数的网格,再在每个网格上进行max pooling,就得到等长的RoI feature vector。

文章最后的讨论也有一定的借鉴意义:

multi-loss traing相比单独训练classification确有提升

multi-scale相比single-scale精度略有提升,但带来的时间开销更大。一定程度上说明CNN结构可以内在地学习尺度不变性

在更多的数据(VOC)上训练后,精度是有进一步提升的

Softmax分类器比"one vs rest"型的SVM表现略好,引入了类间的竞争

更多的Proposal并不一定带来精度的提升

小结

Fast R-CNN的这一结构正是检测任务主流2-stage方法所采用的元结构的雏形。文章将Proposal, Feature Extractor, Object Classification&Localization统一在一个整体的结构中,并通过共享卷积计算提高特征利用效率,是最有贡献的地方。

Faster R-CNN: 两阶段模型的深度化

论文链接: Faster R-CNN: Towards Real Time Object Detection with Region Proposal Networks

Faster R-CNN是2-stage方法的奠基性工作,提出的RPN网络取代Selective Search算法使得检测任务可以由神经网络端到端地完成。粗略的讲,Faster R-CNN = RPN + Fast R-CNN,跟RCNN共享卷积计算的特性使得RPN引入的计算量很小,使得Faster R-CNN可以在单个GPU上以5fps的速度运行,而在精度方面达到SOTA(State of the Art,当前最佳)。

本文的主要贡献是提出Regional Proposal Networks,替代之前的SS算法。RPN网络将Proposal这一任务建模为二分类(是否为物体)的问题。

第一步是在一个滑动窗口上生成不同大小和长宽比例的anchor box(如上图右边部分),取定IoU的阈值,按Ground Truth标定这些anchor box的正负。于是,传入RPN网络的样本数据被整理为anchor box(坐标)和每个anchor box是否有物体(二分类标签)。RPN网络将每个样本映射为一个概率值和四个坐标值,概率值反应这个anchor box有物体的概率,四个坐标值用于回归定义物体的位置。最后将二分类和坐标回归的损失统一起来,作为RPN网络的目标训练。

由RPN得到Region Proposal在根据概率值筛选后经过类似的标记过程,被传入R-CNN子网络,进行多分类和坐标回归,同样用多任务损失将二者的损失联合。

小结

Faster R-CNN的成功之处在于用RPN网络完成了检测任务的"深度化"。使用滑动窗口生成anchor box的思想也在后来的工作中越来越多地被采用(YOLO v2等)。这项工作奠定了"RPN+RCNN"的两阶段方法元结构,影响了大部分后续工作。

单阶段(1-stage)检测模型

单阶段模型没有中间的区域检出过程,直接从图片获得预测结果,也被成为Region-free方法。

YOLO

论文链接: You Only Look Once: Unified, Real-Time Object Detection

YOLO是单阶段方法的开山之作。它将检测任务表述成一个统一的、端到端的回归问题,并且以只处理一次图片同时得到位置和分类而得名。

YOLO的主要优点:

快。

全局处理使得背景错误相对少,相比基于局部(区域)的方法, 如Fast RCNN。

泛化性能好,在艺术作品上做检测时,YOLO表现比Fast R-CNN好。

YOLO的工作流程如下:

1.准备数据:将图片缩放,划分为等分的网格,每个网格按跟Ground Truth的IoU分配到所要预测的样本。

2.卷积网络:由GoogLeNet更改而来,每个网格对每个类别预测一个条件概率值,并在网格基础上生成B个box,每个box预测五个回归值,四个表征位置,第五个表征这个box含有物体(注意不是某一类物体)的概率和位置的准确程度(由IoU表示)。测试时,分数如下计算:

等式左边第一项由网格预测,后两项由每个box预测,以条件概率的方式得到每个box含有不同类别物体的分数。 因而,卷积网络共输出的预测值个数为S×S×(B×5+C),其中S为网格数,B为每个网格生成box个数,C为类别数。

3.后处理:使用NMS(Non-Maximum Suppression,非极大抑制)过滤得到最后的预测框

损失函数的设计

损失函数被分为三部分:坐标误差、物体误差、类别误差。为了平衡类别不均衡和大小物体等带来的影响,损失函数中添加了权重并将长宽取根号。

小结

YOLO提出了单阶段的新思路,相比两阶段方法,其速度优势明显,实时的特性令人印象深刻。但YOLO本身也存在一些问题,如划分网格较为粗糙,每个网格生成的box个数等限制了对小尺度物体和相近物体的检测。

SSD: Single Shot Multibox Detector

论文链接: SSD: Single Shot Multibox Detector

SSD相比YOLO有以下突出的特点:

多尺度的feature map:基于VGG的不同卷积段,输出feature map到回归器中。这一点试图提升小物体的检测精度。

更多的anchor box,每个网格点生成不同大小和长宽比例的box,并将类别预测概率基于box预测(YOLO是在网格上),得到的输出值个数为(C+4)×k×m×n,其中C为类别数,k为box个数,m×n为feature map的大小。

小结

SSD是单阶段模型早期的集大成者,达到跟接近两阶段模型精度的同时,拥有比两阶段模型快一个数量级的速度。后续的单阶段模型工作大多基于SSD改进展开。

检测模型基本特点

最后,我们对检测模型的基本特征做一个简单的归纳。

检测模型整体上由基础网络(Backbone Network)和检测头部(Detection Head)构成。前者作为特征提取器,给出图像不同大小、不同抽象层次的表示;后者则依据这些表示和监督信息学习类别和位置关联。检测头部负责的类别预测和位置回归两个任务常常是并行进行的,构成多任务的损失进行联合训练。

相比单阶段,两阶段检测模型通常含有一个串行的头部结构,即完成前背景分类和回归后,把中间结果作为RCNN头部的输入再进行一次多分类和位置回归。这种设计带来了一些优点:

对检测任务的解构,先进行前背景的分类,再进行物体的分类,这种解构使得监督信息在不同阶段对网络参数的学习进行指导

RPN网络为RCNN网络提供良好的先验,并有机会整理样本的比例,减轻RCNN网络的学习负担

这种设计的缺点也很明显:中间结果常常带来空间开销,而串行的方式也使得推断速度无法跟单阶段相比;级联的位置回归则会导致RCNN部分的重复计算(如两个RoI有重叠)。

另一方面,单阶段模型只有一次类别预测和位置回归,卷积运算的共享程度更高,拥有更快的速度和更小的内存占用。读者将会在接下来的文章中看到,两种类型的模型也在互相吸收彼此的优点,这也使得两者的界限更为模糊。

阅读全文

与fastscnn算法相关的资料

热点内容
java获取当前系统时间 浏览:368
武汉有python培训吗 浏览:657
为什么无法与服务器建立数据链接 浏览:190
友价源码2017 浏览:596
体温侦测系统python 浏览:118
为什么安卓系统占用百分比 浏览:418
浪潮云服务器的组成部分 浏览:409
php100教程目录 浏览:579
查看文件夹大小的命令 浏览:664
unixset命令 浏览:194
东北证券融e通app有什么用 浏览:515
科大讯飞linux 浏览:466
三浪三副图指标源码 浏览:56
python中四舍五入355 浏览:357
如何建立一个coap服务器 浏览:803
线性代数加密方式 浏览:449
单片机ad采样芯片 浏览:925
程序员第一个问答 浏览:576
我的世界怎么做命令方块 浏览:283
安卓手机内存占用高如何解决 浏览:884