机器学习是实现人工智能的一种方法:
深度学习使用更深层的数学函数解决问题,它属于机器学习的一种方法,类似一个水流系统:
他们的关系如下图所示:
以图像识别为例。我们人为地给机器写一段程序,然后像教学生一样地告诉机器,这张图片是猫,另一张图片是狗等等,机器“学习”完成以后,你再给他看一张新的图片,假设给它看一张它完全没见过的猫的图片,此时,我希望机器能回答出:“这是猫”,如果机器就是这么回答的,那么,我们可以认为机器已经学会了图像识别任务。
其实机器是在一个假设空间中寻找最优解的,哪一个函数能尽可能地拟合输入数据,那么机器就认为那个函数效果较好:
这里的假设空间是非常重要的,如果实际关系是非线性的(比如圆的周长与半径之间的关系C=πR2),却让机器使用“线性假设”去学习,最优结果只能找到一条与该非线性曲线最贴近的直线,而不能突破“直线关系”的表达范畴。
以刚刚的图像识别为例,看看机器的在线性回归问题上的“解题思路”。
机器学习(监督模型)遵照“假设空间+优化目标+寻解算法”的流程,从数据中学到知识并预测未来。
这就类似于“将大象装进冰箱需要几步?”:
图像识别做的是分类任务;
而目标检测中,不光要分类,还要把物体的位置给标注出来:
two-stage是目标检测算法的一种。主要通过一个完整的卷积神经网络来完成目标检测过程,所以会用到的是CNN特征,通过卷积神经网络提取对候选区域目标的特征的描述。典型的代表:R-CNN、fasterRCNN。如果不考虑two-stage方法需要单独训练RPN网络这一过程,可以简单的广义的理解为端到端的过程。但不是完全的端到端,因为训练的整个网络过程中需要两个步骤:
相对于传统的检测算法,two-stage不需要额外的训练分类器,特征表示的过程,整个目标检测的过程都通过一个完整的CNN完成。相对于传统的算法,准确度得到了非常大的提升,速度相对与onestage的方法慢一点,但精度高。
首先输入图片,然后对图片进行深度特征提取(经过卷积神经网络,称之为主干网络),然后通过RPN网络完成传统目标检测算法中滑动窗口所完成的任务(也就是产生候选区域)同时完成对候选框的分类(这个分类过程就将后选区分为背景和目标两个类别)并且RPN网络会对目标的位置进行初步的预测。
然后需要一个roi_pooling层将候选区域进行进一步的位置的精确的回归和修正。(实际上可以将roi_pooling层理解为“抠图”,对于多个featuremap想要不去重复的计算CNN特征,往往通过roi_pooling进行一个抠图的操作。)接下来得到候选目标对应到featuremap上它的那一段区域(特征)之后,会通过一个全连接层来进一步的对候选区域的特征进行表示。然后通过分类和回归的两个分支,来分别完成对候选目标类别的判断和位置的精修。(这里的类别不同于RPN网路的类别,这里通常会得到物体真实的类别)
one-stage检测算法,其不需要regionproposal阶段,直接产生物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结果,因此有着更快的检测速度,比较典型的算法如YOLO,SSD,Retina-Net。
其主要思路是均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归,整个过程只需要一步,所以其优势是速度快,但是均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡,导致模型准确度稍低。
SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。SSD的网络结构如图所示:
SingleShotMultiBoxDetector(SSD)是一种单阶段的目标检测器。与两阶段的检测方法不同,单阶段目标检测并不进行区域推荐,而是直接从特征图回归出目标的边界框和分类概率。SSD运用了这种单阶段检测的思想,并且对其进行改进:在不同尺度的特征图上检测对应尺度的目标。如下图所示,SSD在六个尺度的特征图上进行了不同层级的预测。每个层级由两个3x3卷积分别对目标类别和边界框偏移进行回归。因此对于每个类别,SSD的六个层级一共会产生38x38x4+19x19x6+10x10x6+5x5x6+3x3x4+1x1x4=8732个检测结果。
目前主流的目标检测算法,包括多阶段的各种RCNN和单阶段的SSD、RetinaNet上都是基于Anchor来做的。Anchor的本质是候选框,在设计了不同尺度和比例的候选框后,DNN学习如何将这些候选框进行分类:是否包含object和包含什么类别的object,对于postive的anchor会学习如何将其回归到正确的位置。它扮演的角色和传统检测算法中的滑动窗口等机制比较类似。但是,这种设计思路有很多问题:
基于上述原因,很多人做出了改进,提出了AnchorFree的方法
CenterNet提出了一种简单和高效的方法:使用边界框的中心点表示物体。将图像输入到一个全卷积网络得到一个热图,这个热图的峰值对应于目标的中心点,峰值周围的图像特征用于预测边界框的高和宽。在推理阶段,CenterNet使用单个网络进行前向传播,无需NMS等后处理。
目标检测主要用于人脸检测,车辆检测,行人计数,自动驾驶,安全系统等
通俗的讲,YOLO-v4算法是在原有YOLO目标检测架构的基础上,采用了近些年CNN领域中最优秀的优化策略,从数据处理、主干网络、网络训练、激活函数、损失函数等各个方面都有着不同程度的优化,虽没有理论上的创新,但是会受到许许多多的工程师的欢迎,各种优化算法的尝试。
采用卷积神经的目标检测算法大致可以分为两个流派,一类是以R-CNN为代表的two-stage,另一类是以YOLO为代表的one-stage。
R-CNN系列的原理:通过ROI提取出大约2000个候选框,然后每个候选框通过一个独立的CNN通道进行预测输出。
R-CNN特点:准确度高,速度慢,所以速度成为它优化的主要方向。
YOLO系列的原理:将输入图片作为一个整体,通过CNN通道进行预测输出。
YOLO特点:速度快,准确度低,所以准确度成为它优化的主要方向。
经过一系列的优化与改进,特别是2020年4月份推出的YOLOV4,使得它在准确度方面得到了大幅度的提升,另外,它还能达到实时检测(在GPU加持的情况下)。
在输入上采用Mosaic实现数据增强:
Mosaic算法在输入图片集中随机选取4张图片进行随机缩放,随机裁剪,随机扭曲,然后将他们拼接起来,其目的就是丰富样本数据集。
YOLOV4的骨干网络采用CSPNet(CrossStagePartialNetwork)网络结构,它其实是在残差网络的基础上发展起来的。
一方面,用Concat代替Add,提取更丰富的特征。Concat操作后,特征图的尺寸不变,深度会增加,而Add操作后尺寸和深度都不改变,从这个意义上说,用Concat代替Add,就能够提取更丰富的特征。
另一方面,引入transitionlayer(1*1conv+2*2pooling),提取特征,降低计算量,提升速度。(举一个实例来说明,输入图片大小是56*56*256,要求得到输出大小是28*28*512,这里就有两种实现方式:一次卷积方式,它的卷积核参数个数是117万;另一种是二次卷积方式,引入了1*1卷积,它的卷积核参数个数是62万,相比于一次卷积方式,它的卷积核参数个数降低了一倍。)
还有一点是将Baselayer分为两部分进行融合,提取更丰富的特征。将Baselayer一分为二,一部分通过类似残差网络得到的输出与另一部分进行Concat操作,将操作后的结果通过TransitionLayer。
FPN(Featurepyramidnetworks)+PANet(PathAggregationNetwork)
它其实是在YOLOV3的基础上增加了一个自底向上的PANet结构,特征图的尺寸是通过下采样得到的,而下采样是通过卷积的方式实现的(改变滑动窗口的步长)。
用CIoULoss取代IouLoss
IoUloss中IoU交并比,两个框的交集/并集,有两个缺点:
1.无法反应两个的距离
例如状态1,两个框不相交,无论怎样移动两个框,IoU=0。
2.无法区分两者相交的情况
例如状态2和3,两个框相交的情况完全不一样,但是IoU相同。