目标检测从零开始的学习之路--原理篇

安装相关

  • Anaconda官网下载安装下一步进行到底,相关环境那儿记得打勾,不然就自己添加下环境变量就好(另:一般进官网就找Download,再找相关想下载的版本/适配系统之类的)这里下载的是Python 3.7 version for Windows,下完后Ctrl+R,在cmd里输入python,输出>>>,且有备注Anaconda,Inc就没错了
  • Cuda9.0(NVIDIA官网)&cudnn v7.0.4 for CUDA9.0(cudnn需要注册一下,简单QQ邮箱注册下就行)【地址在这】
    Cuda9.0下载一般就local直接下个exe,但可能需要等一段时间,不然就选择network版本的,会先下个小包,相当于setup的东西,再帮你在线安装。
  • TensorFlow-gpu
    由于Anaconda的Python相关环境已帮你自动配置完好,所以直接在cmd中pip安装即可。
pip install tensorflow-gpu==1.12.0 #pip提供了对Python包的查找、下载、安装、卸载等,功能强大

关于TensorFlow

(详尽函数可参见TensorFlow基本概念及函数系列)
Tensorflow拥有多层级结构,可部署于各类服务器、PC终端和网页并支持GPU和TPU高性能数值计算,被广泛应用于谷歌内部的产品开发和各领域的科学研究。
简单一个例子

import tensorflow as tf		#导入模块
#占位符定义符号类型
a = tf.placeholder("float")		
b = tf.placeholder("float")
#进行乘法,注意是multiply而不是mul(新版本中移除了mul,而使用multiply)
y = tf.multiply(a,b)
#新建一个会话
sess=tf.Session()
#或with tf.Session() as sess: 
    print(sess.run(...))
#通过feed_dict输入placeholders等待的确定的值
#如果直接print(y),输出Tensor("Mul:0", dtype=float32)[维度和类型]
print(sess.run(y,feed_dict={a:3.8,b:7.9}))
#关闭会话
sess.close()

TensorFlow中的语句并不会立即执行,而是要等到**开启会话(session)**时,才会执行sess.run()中的语句。
Tesorflow模型中的所有的结点都是可以视为运算操作op或tensor
低阶API
张量(tf.Tensor)
变量(tf.Variable)【赋初值】
占位符(placeholder)【定义类型】
数据流图(tf.Graph)和会话(tf.Session)
模型保存和恢复(tf.train.Saver)
高阶API
Estimators
数据导入(tf.data.Dataset)
特征列(tf.feature_column)
层函数(tf.layer)
Keras
以TensorFlow作为后端,且简化了使用难度(相较于TensorFlow来说)
Keras与TensorFlow比较

Keras TensorFlow
学习难易度
使用弹性
开发生产力
执行性能
适合用户 初学 高级开发者
矩阵运算 无需自行设计 需自行设计

模型优化工具
可视化工具
神经网络(Neural Network)中相关函数
目标检测从零开始的学习之路--原理篇_第1张图片
目标检测从零开始的学习之路--原理篇_第2张图片
目标检测从零开始的学习之路--原理篇_第3张图片
目标检测从零开始的学习之路--原理篇_第4张图片
目标检测从零开始的学习之路--原理篇_第5张图片
目标检测从零开始的学习之路--原理篇_第6张图片

  • 保存及恢复

目标检测从零开始的学习之路--原理篇_第7张图片

关于目标检测(从传统检测方法到深度神经网络框架)

一、基于候选区域的目标检测器

目前主流深度学习之目标检测算法:Faster R-CNN、R-FCN、SSD、YOLO v3
1.滑动窗口检测器的系统(暴力算法):从左到右、从上到下滑动窗口,利用分类识别目标。(为了在不同观察距离处检测不同的目标类型,使用不同大小和宽高比的窗口。)根据滑动窗口从图像中剪切图像块,由于很多分类器只取固定大小的图像,因此这些图像块是经过变形转换的。但这不影响分类准确率,因为分类器可以处理变形后的图像。

变形图像块被输入 CNN 分类器中,提取出 4096 个特征。之后,我们使用 SVM 分类器识别类别和该边界框的另一个线性回归器。
目标检测从零开始的学习之路--原理篇_第8张图片
2.选择性搜索(selective search,SS)
用候选区域方法(region proposal method)创建目标检测的感兴趣区域(ROI)
首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。但为避免单个区域吞噬其他区域,首先对较小的组进行分组,然后继续合并区域,直到所有区域都结合在一起。这样就能大概找到目标。
3.R-CNN
利用候选区域方法创建了约 2000 个 ROI。这些区域被转换为固定大小的图像,并分别馈送卷积神经网络中。该网络架构后面会跟几个全连接层,以实现目标分类并提炼边界框
目标检测从零开始的学习之路--原理篇_第9张图片
R-CNN 整个系统的流程图:
目标检测从零开始的学习之路--原理篇_第10张图片
从R-CNN与滑动窗口的图中明显看出:R-CNN利用候选区法,减少了ROI的数量,从而提高了算法的效率,而且效果也更加准确。
4.边界框回归器
这是为了减少候选区方法选取出更少ROI区域而耗费过高的时间复杂度而使用的一种线性回归器(全连接层)。
5.Fast R-CNN
由于R-CNN还是需要很多的ROI来提升精确度,但实际上有许多区域是彼此重叠的,所以 R-CNN的训练和推断速度还是非常慢。(CNN 中的特征图以一种密集的方式表征空间特征)
因此,为了提升该模型的效率,Faster R-CNN出现了,它使用特征提取器(CNN)先提取整个图像的特征,而不是从头开始对每个图像块提取多次(耗时费力)。然后,将创建候选区域的方法直接应用到提取到的特征图上。【例如,Fast R-CNN 选择了 VGG16 中的卷积层 conv5 来生成 ROI,这些ROI随后会结合对应的特征图以裁剪为特征图块,并用于目标检测任务中。我们使用 ROI 池化将特征图块转换为固定的大小,并馈送到全连接层进行分类和定位。】
这样做的好处就是:Fast R-CNN不像R-CNN要重复提取特征,所以能显著提升效率。(Fast R-CNN 的训练速度是 R-CNN 的 10 倍,但推断速度是后者的 150 倍。)
目标检测从零开始的学习之路--原理篇_第11张图片
Fast R-CNN 最重要的一点就是包含特征提取器、分类器和边界框回归器在内的整个网络能通过多任务损失函数进行端到端的训练,这种多任务损失即结合了分类损失和定位损失的方法,大大提升了模型准确度。
6.Faster R-CNN
Fast R-CNN 依赖于外部候选区域方法,如选择性搜索。但这些算法在 CPU 上运行且速度很慢。在测试中,Fast R-CNN 需要 2.3 秒来进行预测,其中 2 秒用于生成 2000 个 ROI。
由于还是不满足于Fast R-CNN的效率问题,因此又出现了Faster R-CNN这种算法。
Faster R-CNN 采用与 Fast R-CNN 相同的设计,只是它用内部深层网络代替了候选区域方法。新的候选区域网络(RPN)在生成 ROI 时效率更高,并且以每幅图像 10 毫秒的速度运行。
目标检测从零开始的学习之路--原理篇_第12张图片
候选区域网络(RPN)
第一个卷积网络的输出特征图
作为输入。它在特征图上滑动卷积核,以使用卷积网络构建与类别无关的候选区域。其他深度网络(如 VGG 或 ResNet)可用于更全面的特征提取,但这需要以速度为代价。卷积网络最后会输出 256 个值,它们将馈送到两个独立的全连接层,以预测边界框两个 objectness 分数,这两个 objectness 分数度量了边界框是否包含目标。其实还可以使用回归器计算单个 objectness 分数,但为了简洁,Faster R-CNN 使用只有两个类别的分类器:即带有目标的类别和不带有目标的类别
对于特征图中的每一个位置,RPN 会做 k 次预测。因此,RPN 将输出 4×k 个坐标和每个位置上 2×k 个得分。
Faster R-CNN 不会创建随机边界框。相反,它会预测一些与左上角名为「Anchor」的参考框相关的偏移量(如x、y)。我们会限制这些偏移量的值以达到更好的效果
目标检测从零开始的学习之路--原理篇_第13张图片
要对每个位置进行 k 个预测,需要以每个位置为中心的 k 个Anchor每个预测与特定Anchor相关联,但不同位置共享相同形状的Anchor
由于Anchor是精心挑选的,因此它们是多样的,且覆盖具有不同比例和宽高比的目标
目标检测从零开始的学习之路--原理篇_第14张图片
Faster R-CNN 使用更多的Anchor。它部署 9 个Anchor框3 个不同宽高比的 3 个不同大小的Anchor框每一个位置使用 9 个Anchor,每个位置会生成 2×9 个 objectness 分数和 4×9 个坐标。
目标检测从零开始的学习之路--原理篇_第15张图片
经过一次次的改进,效率也一步步提高,如下图。
目标检测从零开始的学习之路--原理篇_第16张图片
7.基于区域的全卷积神经网络(R-FCN)
但是,由于人类是无法被轻易满足的,所以,R-FCN诞生了。
Faster R-CNN 中,检测器使用了多个全连接层进行预测。如果有 2000 个 ROI,那么成本还是非常高
R-FCN 通过减少每个 ROI 所需的工作量实现加速(去掉了全连接层)。基于区域的特征图与 ROI 是独立的,可以在每个 ROI 之外单独计算。因此 R-FCN 的速度比 Faster R-CNN更快。
假如我们有 C 个类别要检测。我们将其扩展为 C + 1 个类别,这样就为背景(非目标)增加了一个新的类别。每个类别有 3 × 3 个得分图,因此一共有 (C+1) × 3 × 3 个得分图。使用每个类别的得分图可以预测出该类别的类别得分。然后我们对这些得分应用 softmax 函数,计算出每个类别的概率。
目标检测从零开始的学习之路--原理篇_第17张图片

二、单次目标检测器

1.单次检测器
和 R-FCN 类似,研究者通过减少每个 ROI 的工作量来精简流程。单次检测器会同时预测边界框和类别。在每个位置,我们有 k 个Anchor,一个Anchor对应一个特定位置。我们使用相同的Anchor形状仔细地选择锚点和每个位置。
单次检测器通常需要在准确率和实时处理速度之间进行权衡。它们在检测太近距离或太小的目标时容易出现问题
2.SSD(Single Shot MultiBox Detector)
SSD 是使用 VGG19 网络作为特征提取器(和 Faster R-CNN 中使用的 CNN 一样)的单次检测器。它同时对类别和位置执行单次预测。
同时
然而,卷积层降低了空间维度和分辨率。因此仅可以检测较大的目标。为了解决该问题,我们从多个特征图上执行独立的目标检测。采用多尺度特征图独立检测,如下图。
目标检测从零开始的学习之路--原理篇_第18张图片
由于SSD使用卷积中较深的层来检测,因此随之被显著降低的是图像的空间分辨率,且可能无法在低分辨率中定位难以检测的小目标。对于这样的问题,就需要增加输入图像的分辨率
3.YOLO(You Only Look Once)
YOLO 也是一种单次目标检测器。它 在卷积层之后使用了 DarkNet(一个源码为C的神经网络框架) 来做特征检测。然而,它并没有使用多尺度特征图来做独立的检测。相反,它将特征图部分平滑化,并将其和另一个较低分辨率的特征图拼接
YOLO算法中把物体检测问题处理成回归问题,用一个卷积神经网络结构就可以从输入图像直接预测bounding box和类别概率
YOLO算法的优点
1、YOLO的速度非常快。在Titan X GPU上的速度是45 fps(frames per second),加速版的YOLO差不多是150fps。
2、YOLO是基于图像的全局信息进行预测的。这一点和基于sliding window以及region proposal等检测算法不一样。与Fast R-CNN相比,YOLO在误检测(将背景检测为物体)方面的错误率能降低一半多
3、可以学到物体的generalizable-representations。可以理解为泛化能力强
4、准确率高
事实上,目标检测的本质就是回归,因此一个实现回归功能的CNN并不需要复杂的设计过程。YOLO没有选择滑窗或提取proposal的方式训练网络,而是直接选用整图训练模型。这样做的好处在于可以更好的区分目标和背景区域,相比之下,采用proposal训练方式的Fast-R-CNN常常把背景区域误检为特定目标。当然,YOLO在提升检测速度的同时牺牲了一些精度
YOLO算法的缺点
1、位置精确性差,对于小目标物体以及物体比较密集的也检测不好,比如一群小鸟。
2、YOLO虽然可以降低将背景检测为物体的概率,但同时导致召回率较低
YOLO(v2)做出了很多实现上的改进,将 mAP(多标签图像分类任务的评价方法) 值从第一次发布时的 63.4 提高到了 78.6。YOLO9000 可以检测 9000 种不同类别的目标。
YOLO v2 可以
处理不同分辨率的输入图像
。低分辨率的图像可以得到更高的 FPS,但 mAP 值更低。
YOLO (v3) 使用了更加复杂的骨干网络来提取特征。【DarkNet-53 主要由 3 × 3 和 1× 1 的卷积核以及类似 ResNet 中的跳过连接构成。相比 ResNet-152,DarkNet 有更低的 BFLOP(十亿次浮点数运算),但能以 2 倍的速度得到相同的分类准确率。】
YOLO v3 还添加了特征金字塔(FPN),以更好地检测小目标。以下是不同检测器的准确率和速度的权衡
目标检测从零开始的学习之路--原理篇_第19张图片
特征金字塔网络(FPN)
FPN是一种旨在提高准确率和速度的特征提取器。它取代了检测器(如 Faster R-CNN)中的特征提取器,并生成更高质量的特征图金字塔。
目标检测从零开始的学习之路--原理篇_第20张图片
FPN 由自下而上和自上而下路径组成。其中自下而上的路径是用于特征提取的常用卷积网络。空间分辨率自下而上地下降。当检测到更高层的结构,每层的语义值增加
SSD 通过多个特征图完成检测。但是,最底层不会被选择执行目标检测。它们的分辨率高但是语义值不够,导致速度显著下降而不能被使用。SSD 只使用较上层执行目标检测,因此对于小的物体的检测性能较差
对于如 SSD 和 YOLO 等大多数检测算法来说,我们做了比实际的目标数量要多得多的预测。所以错误的预测比正确的预测要更多。这产生了一个对训练不利的类别不平衡。训练更多的是在学习背景,而不是检测目标。但是,我们需要负采样来学习什么是较差的预测。所以,我们计算置信度损失来把训练样本分类。选取最好的那些来确保负样本和正样本的比例最多不超过 3:1。这使训练更加快速和稳定。

相关链接

多标签图像分类任务的评价方法——mAP - liubo187的博客 - CSDN博客
(https://blog.csdn.net/liubo187/article/details/77406654)
【深度学习】目标检测算法总结(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet) - 郭耀华 - 博客园
(https://www.cnblogs.com/guoyaohua/p/8994246.html)
介绍一个相对小众的深度学习框架Darknet,其YOLO神经网络算法对目标检测效果显著 - 云+社区 - 腾讯云
(https://cloud.tencent.com/developer/news/76803)

你可能感兴趣的:(目标检测,笔记)