**前言:****Hello大家好,我是小哥谈。**目标检测算法是一种计算机视觉算法,用于在图像或视频中识别和定位特定的目标物体。常见的目标检测算法包括传统的基于特征的方法(如Haar特征和HOG特征)以及基于深度学习的方法(如Faster R-CNN、YOLO和SSD)。本节课就给大家重点介绍下基于深度学习的目标检测算法,希望大家学习之后能够有所收获!🌈
前期回顾:
目录
[💥💥2.1 R-CNN](#💥💥2.1 R-CNN)
[💥💥2.2 Fast R-CNN](#💥💥2.2 Fast R-CNN)
[💥💥2.3 Faster R-CNN](#💥💥2.3 Faster R-CNN)
[💥💥2.4 Mask R-CNN](#💥💥2.4 Mask R-CNN)
[💥💥3.1 SSD](#💥💥3.1 SSD)
[💥💥3.2 YOLO算法](#💥💥3.2 YOLO算法)
🚀1.目标检测算法介绍
目标检测算法是一种计算机视觉算法,用于在图像或视频中识别和定位特定的目标物体。常见的目标检测算法包括传统的基于特征的方法(如Haar特征和HOG特征)以及基于深度学习的方法(如Faster R-CNN、YOLO和SSD)。
**传统的基于特征的目标检测算法通常是基于手工设计的特征和机器学习分类器的组合。这些算法通常包括以下步骤:提取图像特征、选择目标检测窗口、应用分类器进行目标判别和定位。**而基于深度学习的目标检测算法则使用深度神经网络来自动学习图像特征和目标位置。这些算法通常由两个主要部分组成:卷积神经网络(如VGG、ResNet等)用于提取图像特征,以及用于目标检测的后处理步骤(如边界框回归和非极大值抑制)。
近几年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN、Fast R-CNN、Faster R-CNN等),它们是two-stage的。而另一类是YOLO、SSD这类one-stage算法。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。✅
计算机视觉中关于图像识别有四大类任务:
📗**分类-Classification:**解决"是什么?"的问题,即给定⼀张图⽚或⼀段视频判断里面包含什么类别的目标。
📗**定位-Location:**解决"在哪里?"的问题,即定位出这个目标的的位置。
📗**检测-Detection:**解决"是什么?在哪里?"的问题,即定位出这个⽬标的的位置并且知道目标物是什么。
📗**分割-Segmentation:**分为实例的分割(Instance-level)和场景分割(Scene-level),解决"每⼀个像素属于哪个目标物或场景"的问题。
🚀2.两阶段目标检测算法
💥💥2.1 R-CNN
R-CNN(Region-based Convolutional Neural Network)是一种目标检测算法,它在2014年由Girshick等人提出。****R-CNN的主要思想是首先生成一组候选区域,然后对每个候选区域进行特征提取和分类,最后对分类结果进行边界框回归,以获得最终的目标检测结果。✅
具体流程如下:
- 输入图像被划分为多个候选区域,这些候选区域可以通过选择性搜索(Selective Search)等算法生成。
- 对每个候选区域,使用预训练的卷积神经网络(如AlexNet、VGG等)提取特征。
- 将提取的特征输入到一个支持向量机(SVM)进行分类,判断该区域是否包含目标物体。
- 对于被分类为包含目标物体的区域,使用线性回归模型进行边界框回归,以获得更准确的目标位置。
R-CNN算法虽然能够取得较好的检测结果,但其缺点也比较明显,如候选区域生成速度慢、训练和测试过程繁琐等。后续的改进算法(如Fast R-CNN、Faster R-CNN等)都是在R-CNN的基础上进行优化和改进。
**R-CNN作为R-CNN系列的第⼀代算法,其实没有过多的使⽤"深度学习"思想,⽽是将"深度学习"和传统的"计算机视觉"的知识相结合。⽐如R-CNN pipeline中的第⼆步和第四步其实就属于传统的"计算机视觉"技术。使⽤ selective search提取region proposals,使⽤SVM实现分类。**📚
比如对于猫的检测,如下图所示:
在原论⽂中,R-CNN pipeline只有4个步骤,光看下图⽆法深刻理解R-CNN处理机制,下⾯结合图⽰补充相应⽂字。
🍀**(1)预训练模型。**选择⼀个预训练 (pre-trained)神经⽹络(如AlexNet、VGG)。
🍀**(2)重新训练全连接层。**使⽤需要检测的⽬标重新训练(re-train)最后全连接层(connected layer)。
🍀**(3)提取proposals并计算CNN 特征。**利⽤选择性搜索(Selective Search)算法提取所有proposals(⼤约 2000幅images),调整(resize/warp)它们成固定⼤⼩,以满⾜CNN输⼊要求(因为全连接层的限制),然后将feature map保存到本地磁盘。
🍀**(4)训练SVM。**利⽤feature map 训练SVM来对⽬标和背景进⾏分类(每个类⼀个⼆进制SVM)
🍀**(5)边界框回归(Bounding boxes Regression)。**训练将输出⼀些校正因⼦的线性回归分类器。
R-CNN创新点:
🍀**(1)使⽤CNN(ConvNet)对 region proposals 计算 feature vectors。从经验驱动特征(SIFT、HOG)到数据驱动特征(CNN feature map),提⾼特征对样本的表⽰能⼒。**
🍀**(2)采⽤⼤样本下(ILSVRC)有监督预训练和⼩样本(PASCAL)微调(fine-tuning)的⽅法解决⼩样本难以训练甚⾄过拟合等问题。**
说明:♨️♨️♨️
ILSVRC其实就是众所周知的ImageNet的挑战赛,数据量极⼤;PASCAL数据集(包含⽬标检测和图像分割等),相对较⼩。
R-CNN 实验结果:
R-CNN在VOC 2007测试集上mAP达到58.5%,打败当时所有的⽬标检测算法。
说明:♨️♨️♨️
论文题目:《Rich feature hierarchies for accurate object detection and semantic segmentation》
💥💥2.2 Fast R-CNN
Fast R-CNN是一种目标检测算法,它在深度学习中被广泛应用。****它是R-CNN系列算法中的一员,相比于前几个版本,Fast R-CNN在速度和准确性上都有明显的提升。✅
Fast R-CNN的工作流程如下:
- 输入一张图片和它对应的ground truth边界框。
- 使用预训练的卷积神经网络(CNN)提取图片的特征。
- 将特征图和ground truth边界框送入RoI (Region of Interest)池化层,将不同尺寸的RoIs映射到固定大小的特征图上。
- 把RoIs映射后的特征通过全连接层进行分类和回归,得到每个RoI的类别概率和边界框坐标调整值。
- 使用非最大抑制(NMS)来排除重叠的边界框,最终输出检测结果。
这种算法的优点是能够共享卷积特征提取过程,因此在处理多个RoIs时可以节省计算时间。此外,Fast R-CNN还引入了RoI池化层,解决了原始R-CNN中不同大小的RoI输入固定大小CNN的问题,提高了模型的准确性。
**Fast R-CNN是基于R-CNN和SPPnets进⾏的改进。SPPnets,其创新点在于计算整幅图像的the shared feature map,然后根据object proposal在shared feature map上映射到对应的feature vector(就是不⽤重复计算 feature map了)。当然,SPPnets也有缺点:和R-CNN⼀样,训练是多阶段(multiple-stage pipeline)的,速度还是不够"快",特征还要保存到本地磁盘中。**📚
以下是Fast R-CNN的流程图:
❓解析1:RoI Pooling层详解:
因为Fast R-CNN使⽤全连接层,所以应⽤RoI Pooling将不同⼤⼩的ROI转换为固定⼤⼩。RoI Pooling 是Pooling层的⼀种,⽽且是针对RoI的Pooling,其特点是输⼊特征图尺⼨不固定,但是输出特征图尺⼨固定(如7x7)。
❓解析2:什么是RoI呢?
RoI是Region of Interest的简写,⼀般是指图像上的区域框,但这⾥指的是由Selective Search提取的候选框。
RoI的具体操作:
- 根据输⼊image,将ROI映射到feature map对应位置 。注:映射规则⽐较简单,就是把各个坐标除以"输⼊图⽚与feature map的⼤⼩的⽐值",得到了feature map上的box坐标。
- 将映射后的区域划分为相同⼤⼩的sections(sections数量与输出的维度相同)。
- 对每个sections进⾏max pooling操作。
这样我们就可以从不同⼤⼩的⽅框得到固定⼤⼩的相应的feature maps。值得⼀提的是,输出的feature maps的⼤⼩不取决于ROI和卷积feature maps⼤⼩。RoI Pooling 最⼤的好处就在于极⼤地提⾼了处理速度。✅
Fast R-CNN创新点:
🍀**(1)只对整幅图像进⾏⼀次特征提取,避免R-CNN中的冗余特征提取。**
🍀**(2)⽤RoI pooling层替换最后⼀层的max pooling层,同时引⼊建议框数据,提取相应建议框特征。**
🍀**(3)Fast R-CNN⽹络末尾采⽤并⾏的不同的全连接层,可同时输出分类结果和窗⼝回归结果,实现了end-to-end的多任务训练(建议框提取除外),也不需要额外的特征存储空间(R-CNN中的特征需要保持到本地,来供SVM和Bounding-box regression进⾏训练)。**
🍀**(4)采⽤SVD对Fast R-CNN⽹络末尾并⾏的全连接层进⾏分解,减少计算复杂度,加快检测速度。**
说明:♨️♨️♨️
论文题目:《Fast R-CNN》
💥💥2.3 Faster R-CNN
Faster R-CNN是一种目标检测算法,它是在R-CNN(Region-based Convolutional Neural Networks)的基础上进行改进而来的。****它的主要创新点是引入了候选区域生成网络(Region Proposal Network,简称RPN),将候选区域的生成和目标检测两个任务合并在一个网络中,从而实现了端到端的目标检测。✅
Faster R-CNN的工作流程如下:
- 输入图像经过卷积神经网络(CNN)提取特征。
- RPN网络在特征图上滑动窗口,并输出一系列候选区域和对应的边界框偏移信息。
- 对于每个候选区域,通过RoI池化层将其转化为固定大小的特征图。
- 将特征图输入全连接层进行分类和回归,得到目标的类别和位置信息。
以下是Faster R-CNN的网络结构图:
Faster R-CNN的优点是:
🍀**(1)相较于R-CNN,它引入了共享卷积特征提取部分,从而大大减少了计算量。**
🍀**(2)候选区域生成和目标检测任务在同一个网络中进行,使得整个模型可以端到端地训练,提高了效率和准确性。**
说明:♨️♨️♨️
论文题目:《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》
💥💥2.4 Mask R-CNN
**Mask R-CNN是一种用于物体检测和语义分割的深度学习模型。****它是基于Faster R-CNN模型的扩展,通过添加一个额外的分支来生成每个检测到的物体的精确掩码。****Mask R-CNN模型通常由两个主要组件组成:区域建议网络(Region Proposal Network,RPN)和掩码预测分支。****RPN负责生成候选目标区域,它会从输入图像中提取特征,并预测每个区域是前景还是背景。然后,这些候选区域会传递给掩码预测分支。**掩码预测分支负责为每个检测到的物体生成精确的掩码。它会在每个候选区域上进行卷积操作,并输出一个与输入区域大小相匹配的二进制掩码图像。
通过结合目标检测和语义分割,Mask R-CNN可以准确地识别图像中的每个物体,并为它们生成精确的掩码。这使得Mask R-CNN成为许多计算机视觉任务(如实例分割、姿态估计等)的重要基础。✅
Mask R-CNN算法步骤:
- 输⼊⼀幅你想处理的图⽚,然后进⾏对应的预处理操作,或者预处理后的图⽚;
- 将其输⼊到⼀个预训练好的神经⽹络中(ResNeXt等)获得对应的feature map;
- 对这个feature map中的每⼀点设定预定个的RoI,从⽽获得多个候选RoI;
- 将这些候选的RoI送⼊RPN⽹络进⾏⼆值分类(前景或背景)和BB回归,过滤掉⼀部分候选的RoI;
- 对这些剩下的RoI进⾏RoI Align操作(即先将原图和feature map的pixel对应起来,然后将feature map和 固定的feature对应起来);
- 对这些RoI进⾏分类(N类别分类)、BB回归和MASK⽣成(在每⼀个RoI⾥⾯进⾏FCN操作)。
说明:♨️♨️♨️
论文题目:《Mask R-CNN》
🚀3.一阶段目标检测算法
💥💥3.1 SSD
**SSD(Single Shot MultiBox Detector)是一种基于深度学习的目标检测算法,它能够同时进行目标的位置定位和类别预测。****相比于其他目标检测算法,SSD具有快速、准确和端到端的优势。**它采用了多层特征图来检测不同尺度的目标,并且通过预定义的一系列锚框(anchor boxes)来进行目标定位和分类。
**SSD主要由两个部分组成:**基础网络和特征提取网络。**常用的基础网络包括VGG16、ResNet等,用于提取原始图像的特征。**特征提取网络由多个卷积层和池化层组成,用于生成一系列特征图。每个特征图都负责检测不同大小的目标。
在SSD中,每个锚框都与一个特定的尺度和长宽比相关联。对于每个锚框,SSD会计算其与真实目标框之间的IoU(Intersection over Union),并将其分为正样本和负样本。然后,SSD通过卷积操作对每个锚框进行类别预测和边界框调整,得到最终的检测结果。
不同于前⾯的R-CNN系列,SSD属于one-stage⽅法。SSD使⽤ VGG16 ⽹络作为特征提取器(和 Faster R-CNN 中使⽤的 CNN ⼀样),将后⾯的全连接层替换成卷积层,并在之后添加⾃定义卷积层,并在最后直接采⽤卷 积进⾏检测。在多个特征图上设置不同缩放⽐例和不同宽⾼⽐的先验框以融合多尺度特征图进⾏检测,靠前的⼤尺度特征图可以捕捉到⼩物体的信息,⽽靠后的⼩尺度特征图能捕捉到⼤物体的信息,从⽽提⾼检测的准确 性和定位的准确性。✅
下图是SSD的⽹络结构图。
SSD创新点:
🍀**(1)基于Faster R-CNN中的Anchor,提出了相似的先验框(Prior box)**
🍀**(2)从不同⽐例的特征图(多尺度特征)中产⽣不同⽐例的预测,并明确地按长宽⽐分离预测。**
说明:♨️♨️♨️
论文题目:《SSD single shot multibox detector》
💥💥3.2 YOLO算法
**YOLO(you only look once),将物体检测任务当做回归问题(regression problem)来处理,直接通过整张图片的所有像素得到bounding box的坐标、box中包含物体的置信度和 class probabilities。**通过YOLO,每张图像只需要看一眼就能得出图像中都有哪些物体和这些物体的位置。
YOLO划分网格:
具体来说,YOLO的CNN网络将输入的图片分割成S×S网格,然后每个单元格负责去检测那些中心点落在该格子内的目标,如图所示,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元格会预测B个边界框(bounding box)以及边界框的置信度(confidence score)。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为,当该边界框是背景时(即不包含目标),此时Pr(object)=0。而当该边界框包含目标时,Pr(object)=1。边界框的准确度可以用预测框与实际框(ground truth)的IoU(intersection over union,交并比)来表征。✅
使用YOLO来检测物体,其流程是非常简单明了的:
- 将图像resize到448 * 448作为神经网络的输入;
- 运行神经网络,得到一些bounding box坐标、box中包含物体的置信度和class probabilities;
- 进行非极大值抑制,筛选Boxes。
YOLO对每个bounding box有5个predictions:x, y, w, h, confidence:
🍀**(1)坐标x,y代表了预测的bounding box的中心与栅格边界的相对值。**
🍀**(2)坐标w,h代表了预测的bounding box的width、height相对于整幅图像width,height的比例。**
🍀**(3)confidence就是预测的bounding box和ground truth box的IoU值。**
Yolo算法开创了one-stage检测的先河,它将物体分类和物体检测网络合二为一, 都在全连接层完成。故它大大降低了目标检测的耗时,提高了实时性;但是,它的缺点也十分明显:
🍀**(1)每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果很差。**
🍀**(2)原始图片只划分为7x7的网格,当两个物体靠的很近时,效果很差。**
🍀**(3)最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。**
🍀**(4)对于图片中比较小的物体,效果很差。这其实是所有目标检测算法的通病,SSD对它有些优化。**
参考文献名:
【1】Rich feature hierarchies for accurate object detection and semantic segmentation;
【2】Fast R-CNN;
【3】Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks;
【4】You Only Look Once: Unfied,Real-Time Object Detection;
【5】SSD:Single Shot MultiBox Detector;
【6】Selective Search for Object Recognition;