一. 两阶段算法
两阶段算法包含选择候选框和修正目标分类/位置两个阶段,对这两个阶段的不同处理方式,构成了不同的算法方案。
1. R-CNN算法
2014年,R. Girshick等人提出了R-CNN算法。R-CNN算法的思路非常简单,首先基于Selective Search方法从原始图像中筛选出若干候选框,然后将每个候选框中的图像缩放的固定尺度送入卷积网络提取特征,最后通过支持向量机方法对特征进行分类,判断候选框中的图像是背景还是我们关注的目标类型。
在VOC2007数据集上,R-CNN算法相比之前的检测算法,在性能有了显著的提升,是检测算法的一个里程碑式的突破。
虽然R-CNN在算法性能上取得了巨大的进展,但弊端也非常明显,因为需要分别从2000多个候选框中提取特征,所以效率非常低,后续各种算法正是为了解决这一问题而提出的一系列改进方案。
2. SPP-Net算法
2014年,何恺明等人提出了SPP-Net算法。
R-CNN算法要求输入卷积网络用来提取特征的子图像尺寸固定,比如Alex-Net就要求输入的图像大小为固定的224像素times;224像素,而SPP-Net算法则去掉了这一限制。SPP-Net算法基于一个空间金字塔池化层,无论输入的子图像大小如何,都会将子图像采样成固定大小的图像。
在使用SPP-Net进行检测的过程中,对原始图像只需要进行一次卷积网络计算,在得到整幅图像的特征图之后,通过空间金字塔池化层将每个候选框区域都分别采样成相同尺寸的子图像,将相同尺寸的各个子图像送入后续的网络进行特征提取,提取的特征具有相同的维数,最后送入全连接层进行分类。
SPP-Net不需要进行多次卷积网络计算,与R-CNN相比,在算法精度不变的情况下,算法的速度有了20倍的大幅提升。
3. Fast R-CNN算法
2015年,R. Girshick等人提出了Fast R-CNN算法,其本质是在R-CNN和SPP-Net的基础上进行了进一步改进。Fast R-CNN可以在网络里同时预测目标的分类概率和位置偏移。
在VOC2007数据集上,Fast R-CNN将mAP从58.5%提升至70.0%,算法速度也比R-CNN有了200倍的提升。虽然Fast R-CNN的性能和速度相比R-CNN和SPP-Net有了明显的改善,但整体速度仍然受到候选框检测算法的制约,为了解决这个问题,Faster R-CNN算法诞生了。
4. Faster R-CNN算法
2015年,S. Ren等人提出了Faster R-CNN算法,Faster R-CNN是第一个端到端算法,也是第一个接近实时深度学习的目标检测算法。使用ZF-Net网络骨架,在VOC2007数据集上,mAP达到了73.2%,算法速度达到了17fps。
Faster R-CNN最主要的贡献是使用卷积网络检测候选框。检测候选框、预测目标的类别、回归目标位置的偏移量,共享底层卷积特征,整个算法流程融合成了一个完整的端到端学习框架。Faster R-CNN突破了候选框检测的速度瓶颈,是一种十分重要的两阶段算法。
5. FPN算法
2017年,Lin等人在Faster R-CNN的基础上提出了FPN算法。
在FPN之前,绝大多数深度学习检测器都是基于卷积网络最顶层的特征图进行计算的。深层特征包含全局信息,却弱化了细节信息,使用深层特征在小目标检测,尤其是精准定位方面,有着较大的劣势。FPN采用top-down结构以及侧连方法,将深层特征和浅层特征进行融合,使得特征既包含全局信息又包含细节信息。
另外,检测计算也基于特征金字塔的多层特征图,具有更强的多尺度适应性。基于FPN的Faster R-CNN算法在COCO数据集上取得了最优的性能。当前,FPN已经成为构建检测算法的基础策略。
二. 一阶段算法
一阶段算法和两阶段算法最主要的区别,就是没有单独的候选框筛选阶段,而是直接回归目标的位置坐标和分类概率。常用的一阶段算法如下。
1. YOLO算法
2015年,R. Joseph等人提出了YOLO算法,这是首个深度学习领域的一阶段算法。
从名字就可以看出,YOLO没有两阶段算法中提取候选框和验证分类两个步骤,图像送入一个神经网络就能完成整个预测过程。YOLO算法的实现方案是,先把原始图像划分成网格,然后基于网格的每个单元格回归目标的类别概率和位置坐标。
作为一阶段算法,YOLO的一个最大优点就是速度快,在VOC2007数据集上,mAP为63.4%,检测算法速度可以达到45fps;YOLO的加速版本mAP为52.7%,速度甚至可以达到惊人的155fps。
不过,YOLO也有不尽如人意的地方,在目标位置的精度上比两阶段算法有所降低,尤其是在对一些小目标的检测方面,效果明显变差。正因为存在这些问题,后续YOLO的版本以及其他一阶段算法,都致力于更好地解决上述问题。
2. SSD算法
2015年,W. Liu等人提出了SSD算法,这是深度学习领域的第二个一阶段算法。
与仅使用最顶层特征图进行预测的方法不同,SSD最主要的贡献是引入了基于多尺度特征图的检测策略,显著提升了算法的性能,尤其是在小目标检测方面,相比YOLO有了明显的改善,在VOC2007数据集上,mAP达到了76.8%。
3. Retina-Net算法
Retina-Net算法的主要目的是解决正负样本不平衡的问题。常规的一阶段算法在提取训练样本的过程中,背景样本的比例远大于目标样本的比例。正负样本的极度不平衡会导致训练过程中模型较少关注目标样本,这也是一阶段算法的精度低于两阶段算法的主要原因。
Retina-Net算法引入了损失函数,其核心思想是在训练过程中,对传统的交叉熵损失加上权重,使得错分的样本产生的损失在最终损失中占有更大的比例。引入损失函数,使得一阶段算法在保持速度优势的前提下,保证了目标检测的精度。
4. FCOS算法
2019年,沈春华团队提出了FCOS算法。和SSD等一阶段算法不同,FCOS是一种ldquo;anchor freerdquo;方法,回归目标位置不需要预先设定anchor,在待检测目标尺度和形态变化较大的场景中有重要的应用。
另外,FCOS算法在具体实现的过程中也使用了FPN策略,对于多尺度的目标有更好的检测效果。
关于作者:涂铭,资深数据架构师和人工智能技术专家,现就职于腾讯,曾就职于阿里。对大数据、自然语言处理、图像识别、Python、Java等相关技术有深入的研究,积累了丰富的实践经验。
金智勇,计算机视觉算法专家,在计算机视觉领域深耕12年。现就职于百度,曾就职于阿里和三星等知名高新技术企业。业务领域涵盖增强现实、人脸识别、图像美化、智能交通、工业质检等多个方向,具有丰富的算法研究与落地经验。
郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。