最近在学习Yolo和OpenCV这些计算机视觉的相关领域,把深度学习啃了个大概,准备着手学习一下Yolov5,趁着这个机会入门一下目标检测这个领域,也算是自顶向下地学习一遍吧。
目标检测
什么是目标检测
物体识别(Object detection、又译做“物体检测”、“目标检测”)是计算机视觉及影像处理中的术语,指的是让计算机去分析一张图片或者一段影片中的物体,并标记出来,这需要给神经网络大量的物体数据去训练它,这样才能进行识别。目前人脸检测是物体识别领域中被广泛研究的题目之一。
图像识别的四大任务:
- 分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。
- 定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。
- 检测-Detection:解决“在哪里?是什么?”的问题,即定位出这个目标的位置并且知道目标物是什么。
- 分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。
也就是说,目标检测是一个分类、回归问题的叠加。
目标检测的分类
目标检测分为两大系列——RCNN系列和YOLO系列,RCNN系列是基于区域检测的代表性算法,YOLO是基于区域提取的代表性算法,另外还有著名的SSD是基于前两个系列的改进。
1.Two Stage
先进行区域生成,该区域称之为region proposal(简称RP,一个有可能包含待检物体的预选框),再通过卷积神经网络进行样本分类。
任务流程:特征提取 --> 生成RP --> 分类/定位回归。
常见tow stage目标检测算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等。
2.One Stage
不用RP,直接在网络中提取特征来预测物体分类和位置。
任务流程:特征提取–> 分类/定位回归。
常见的one stage目标检测算法有:OverFeat、YOLOv1、YOLOv2、YOLOv3、SSD和RetinaNet等。(SSD当时看D2L可把我折磨了好一段时间...)
目标检测的原理
1.Bounding Boxes
也就是画框,d2l里面对于这一部分的描述很长很长。。。看的我头晕眼花,挺吃python代码功底的,用不习惯python的话那几个锚框的代码都要看老半天。
现在常用的锚框方法大概就是,滑动窗口(和leetcode上刷的那种题很像)和选择性搜索selective search(就是一些P图软件里面那些自动抠图的功能的效果)
滑动窗口类似穷举,效果没有SS好,下面多介绍一下SS。
SS的策略:
- 我们没法事先得知物体的大小,在传统方法中需要用不同尺寸的矩形框检测物体,防止遗漏。而 Selective Search 采用了一种具备层次结构的算法来解决这个问题;
- 检测的时间复杂度可能会很高。Selective Search 遵循简单即是美的原则,只负责快速地生成可能是物体的区域,而不做具体的检测;
- 另外,结合上一节提出的,采用多种先验知识来对各个区域进行简单的判别,避免一些无用的搜索,提高速度和精度。
2.Output Formatter
输出格式,一般是一个向量,里面的信息包括:
从上到下依次为:置信度,边框坐标(点x,点y,宽度,高度),类别概率(类别1,类别2,类别3)
3.效果评估
使用IoU交并比来评估,也就是预测框和实际框的(相交面积大小)/(总框定面积大小)
4. 非极大值抑制
选最好的那个,交并比最大的那个.
目标检测模型与算法
R-CNN
即Regions with CNN features
由三部分组成:
- 提取:提取 proposals并计算CNN 特征。利用选择性搜索(Selective Search)算法提取所有proposals(大约2000幅images),调整(resize/warp)它们成固定大小,以满足 CNN输入要求(因为全连接层的限制),然后将feature map 保存到本地磁盘。
- 分类:训练SVM。利用feature map 训练SVM来对目标和背景进行分类(每个类一个二进制SVM)
- 回归:边界框回归(Bounding boxes Regression)。训练将输出一些校正因子的线性回归分类器,对NMS处理后剩余的建议框进一步筛选。接着分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。
Fast R-CNN
Fast R-CNN是基于R-CNN和SPPnets进行的改进。SPPnets,其创新点在于只进行一次图像特征提取(而不是每个候选区域计算一次),然后根据算法,将候选区域特征图映射到整张图片特征图中。
Faster R-CNN
经过R-CNN和Fast-RCNN的积淀,Ross B.Girshick在2016年提出了新的Faster RCNN,在结构上将特征抽取、region proposal提取, bbox regression,分类都整合到了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显。
所以Faster R-CNN其实就是RPN(升级版的候选区提取RP)+Fast R-CNN
YOLO
YOLO(You Only Look Once )是继RCNN,fast-RCNN和faster-RCNN之后,Ross Girshick针对DL目标检测速度问题提出的另一种框架,其核心思想是生成RoI+目标检测两阶段(two-stage)算法用一套网络的一阶段(one-stage)算法替代,直接在输出层回归bounding box的位置和所属类别。
YOLO创造性的将物体检测任务直接当作回归问题(regression problem)来处理,将候选区和检测两个阶段合二为一。只需一眼就能知道每张图像中有哪些物体以及物体的位置。
这里介绍的是YOLOv1,从YOLOv2之后的内容,篇幅过长,考虑再开一篇博客来记录。
上述各算法的神经网络架构如下: