一、回顾人工智能的基本概念
人工智能通过「归纳法」总结知识,它只关注“现象”,而不关心“为什么”
机器学习与人工智能
机器学习是实现人工智能的一种方法:
深度学习使用更深层的数学函数解决问题,它属于机器学习的一种方法,类似一个水流系统:
他们的关系如下图所示:
人工智能如何“学习”?
以图像识别为例。我们人为地给机器写一段程序,然后像教学生一样地告诉机器,这张图片是猫,另一张图片是狗等等,机器“学习”完成以后,你再给他看一张新的图片,假设给它看一张它完全没见过的猫的图片,此时,我希望机器能回答出:“这是猫”,如果机器就是这么回答的,那么,我们可以认为机器已经学会了图像识别任务。
其实机器是在一个假设空间中寻找最优解的,哪一个函数能尽可能地拟合输入数据,那么机器就认为那个函数效果较好:
这里的假设空间是非常重要的,如果实际关系是非线性的(比如圆的周长与半径之间的关系 C=πR2),却让机器使用“线性假设”去学习,最优结果只能找到一条与该非线性曲线最贴近的直线,而不能突破“直线关系”的表达范畴。
寻解步骤
以刚刚的图像识别为例,看看机器的在线性回归问题上的“解题思路”。
机器学习(监督模型)遵照“假设空间+优化目标+寻解算法”的流程,从数据中学到知识并预测未来。
- 第一步,机器需确定预测的基本假设,即输入和输出之间的关系。“预测值Y与特征X之间关系”的基本假设的称为“假设空间”,它圈定了预测模型能够表示的关系范围。
- 第二步,有了“假设空间”,机器仍需要一个可计算的评价标准,告诉它什么样的预测值是好的,什么样的预测值是坏的。从直观感觉上讲,预测值与实际值完全一样是最好的,相差不大是次好的,相差很大是不好的。基于此,设计最直接的评价指标Loss“在已知的样本集合上,计算每个样本的预测值与实际值的误差,加和全部误差得到的指标”
- 第三步,在假设空间中寻找使得优化目标最小的参数取值,称为“寻解算法”或“优化过程”。
这就类似于“将大象装进冰箱需要几步?”:
二、初识目标检测
从图像分类看目标检测
图像识别做的是分类任务;
而目标检测中,不光要分类,还要把物体的位置给标注出来:
目标检测算法概览
三大算法流派
- 二刀斩(Two Stages):R-CNN, Fast RCNN, Faster RCNN, Mask RCNN...
- 一刀流(One Stage ):SSD, Yolo v3...
- 空手道 (Anchor Free):ConerNet-Lite, CenterNet...
双阶段目标检测Two Stages
two-stage是目标检测算法的一种。主要通过一个完整的卷积神经网络来完成目标检测过程,所以会用到的是CNN特征,通过卷积神经网络提取对候选区域目标的特征的描述。
典型的代表:R-CNN、faster RCNN。如果不考虑two-stage方法需要单独训练RPN网络这一过程,可以简单的广义的理解为端到端的过程。但不是完全的端到端,因为训练的整个网络过程中需要两个步骤:
- 训练RPN网络
- 训练最关键的目标区域检测网络。
相对于传统的检测算法,two-stage不需要额外的训练分类器,特征表示的过程,整个目标检测的过程都通过一个完整的CNN完成。相对于传统的算法,准确度得到了非常大的提升,速度相对与one stage的方法慢一点,但精度高。
faster RCNN
首先输入图片,然后对图片进行深度特征提取(经过卷积神经网络,称之为主干网络),然后通过RPN网络完成传统目标检测算法中滑动窗口所完成的任务(也就是产生候选区域)同时完成对候选框的分类(这个分类过程就将后选区分为 背景 和 目标 两个类别)并且RPN网络会对目标的位置进行初步的预测。
然后需要一个roi_pooling层 将候选区域进行进一步的位置的精确的回归和修正。(实际上可以将roi_pooling层理解为“抠图”,对于多个featuremap想要不去重复的计算CNN特征,往往通过roi_pooling进行一个抠图的操作。)接下来得到候选目标对应到feature map上它的那一段区域(特征)之后,会通过一个全连接层来进一步的对候选区域的特征进行表示。然后通过分类和回归的两个分支,来分别完成对候选目标类别的判断和位置的精修。(这里的类别不同于RPN网路的类别,这里通常会得到物体真实的类别)
单阶段目标检测One Stage
one-stage检测算法,其不需要region proposal阶段,直接产生物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结果,因此有着更快的检测速度,比较典型的算法如YOLO,SSD,Retina-Net。
其主要思路是均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归,整个过程只需要一步,所以其优势是速度快,但是均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡,导致模型准确度稍低。
SSD
SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。SSD的网络结构如图所示:
Single Shot MultiBox Detector (SSD) 是一种单阶段的目标检测器。与两阶段的检测方法不同,单阶段目标检测并不进行区域推荐,而是直接从特征图回归出目标的边界框和分类概率。SSD 运用了这种单阶段检测的思想,并且对其进行改进:在不同尺度的特征图上检测对应尺度的目标。如下图所示,SSD 在六个尺度的特征图上进行了不同层级的预测。每个层级由两个3x3卷积分别对目标类别和边界框偏移进行回归。因此对于每个类别,SSD 的六个层级一共会产生 38x38x4 + 19x19x6 + 10x10x6 + 5x5x6 + 3x3x4 + 1x1x4 = 8732 个检测结果。
无锚框检测Anchor Free
目前主流的目标检测算法,包括多阶段的各种RCNN和单阶段的SSD、RetinaNet上都是基于Anchor来做的。Anchor的本质是候选框,在设计了不同尺度和比例的候选框后,DNN学习如何将这些候选框进行分类:是否包含object和包含什么类别的object,对于postive的anchor会学习如何将其回归到正确的位置。它扮演的角色和传统检测算法中的滑动窗口等机制比较类似。但是,这种设计思路有很多问题:
- 大部分object是不规则的,所以Bounding Box涵盖了大量非object的区域,从而引入比较多的干扰
- Anchor的设置需要手动去设计,对不同数据集也需要不同的设计,相当麻烦,也不符合DNN的设计思想
- Anchor的匹配机制使得极端尺度(特别大和特别小的object)被匹配到的频率相对于大小适中的object被匹配到的频率更低,DNN在学习的时候不太容易学习好这些极端样本
- Anchor的庞大数量使得存在严重的不平衡问题,这里就涉及到一个采样的过程,实际上,类似于Focal loss的策略并不稳定,而且采样中有很多坑,例如不同的类别、尺度等等,有着很多隐藏问题
基于上述原因,很多人做出了改进,提出了Anchor Free的方法
CenterNet
CenterNet提出了一种简单和高效的方法:使用边界框的中心点表示物体。将图像输入到一个全卷积网络得到一个热图,这个热图的峰值对应于目标的中心点,峰值周围的图像特征用于预测边界框的高和宽。在推理阶段,CenterNet使用单个网络进行前向传播,无需NMS等后处理。
目标检测的应用
目标检测主要用于人脸检测,车辆检测,行人计数,自动驾驶,安全系统等
三、YOLO V4详解
通俗的讲,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 加持的情况下)。
网络结构
- Input部分:Image,Patches,Images Pyramid(图像金字塔)
- Backbone部分:VGG16,ResNet-50,SpineNet,EfficientNet-B0 / B7,CSPResNeXt50,CSPDarknet53
- neck部分: Additional blocks:SPP,ASPP,RFB,SAM Path-aggregation blocks:FPN,PAN,NAS-FPN,Fully-connected FPN,BiFPN,ASFF,SFAM
- Heads部分: Dense Predictions(one-stage): RPN,SSD,YOLO,RetinaNet (基于anchor) CornerNet,CenterNet,MatrixNet,FCOS(无anchor) Sparse Predictions(two-stages): Faster R-CNN,R-FCN,Mask R-CNN(基于anchor) RepPoints(无anchor)
算法原理
Input
在输入上采用 Mosaic 实现数据增强:
Mosaic算法在输入图片集中随机选取 4 张图片进行随机缩放,随机裁剪,随机扭曲,然后将他们拼接起来,其目的就是丰富样本数据集。
Backbone
YOLO V4的骨干网络采用 CSPNet(Cross Stage Partial Network)网络结构,它其实是在残差网络的基础上发展起来的。
一方面,用Concat代替Add,提取更丰富的特征。Concat 操作后,特征图的尺寸不变,深度会增加,而 Add 操作后尺寸和深度都不改变,从这个意义上说,用 Concat 代替 Add,就能够提取更丰富的特征。
另一方面,引入 transition layer (1 * 1conv + 2 * 2pooling),提取特征,降低计算量,提升速度。(举一个实例来说明,输入图片大小是 56 * 56 * 256,要求得到输出大小是 28 * 28 * 512,这里就有两种实现方式:一次卷积方式,它的卷积核参数个数是 117 万;另一种是二次卷积方式,引入了 1 * 1 卷积,它的卷积核参数个数是 62 万,相比于一次卷积方式,它的卷积核参数个数降低了一倍。)
还有一点是将 Base layer 分为两部分进行融合,提取更丰富的特征。将 Base layer 一分为二,一部分通过类似残差网络得到的输出与另一部分进行 Concat 操作,将操作后的结果通过 Transition Layer。
Neck
FPN(Feature pyramid networks) + PANet(Path Aggregation Network)
它其实是在 YOLOV3 的基础上增加了一个自底向上的 PANet 结构,特征图的尺寸是通过下采样得到的,而下采样是通过卷积的方式实现的(改变滑动窗口的步长)。
Head
用 CIoU Loss 取代 Iou Loss
IoU loss 中 IoU 交并比,两个框的交集/并集,有两个缺点:
1.无法反应两个的距离
例如 状态 1,两个框不相交,无论怎样移动两个框,IoU = 0。
2.无法区分两者相交的情况
例如 状态 2 和 3,两个框相交的情况完全不一样,但是 IoU 相同。
CIoU Loss 的思想:
- 第一步,在两个框最外层再画一个最小的矩形框,求出这个框的对角线的距离,这个距离就能衡量两个框的距离;
- 第二步,求出两个框中心点的欧式距离,这欧式距离就能衡量两者的相交情况。
CIoU Loss能有效的解决 IoU Loss 存在的问题。