目标检测和实例分割(OBJECT_DETECTION AND INSTANCE SEGMENTATION)
文章目录
- 目标检测和实例分割(OBJECT_DETECTION AND INSTANCE SEGMENTATION)
- 一. 计算机视觉(AI VISION)
- 1. 图像分类
- 2. 目标检测与定位
- 3. 语义分割和实例分割
- 目标检测算法可以分为两大类:
- R-CNN
- 生成候选区域(Region Proposal)
- 对每个区域进行CNN特征提取
- 使用SVM分类器,判断是否属于该类
- 使用回归器修正候选框位置
- SPPNET
- Fast R-CNN
- R-CNN缺点:
- SPPNet缺点:
- 从上图我们可以知道Fast R-CNN相较于R-CNN和SPPNet的优点:
- Fast R-CNN的架构:
- 端到端 (END TO END)
- 在介绍FASTER R-CNN之前,我们首先介绍一个概念端到端(end to end).
- Faster R-CNN
- RPN网络
- RPN网络的工作流程就是
- anchor
- Loss Funtion
- 总结
在本篇开始之前我推荐一个很好的图片The Modern History of Object Recognition — Infographic
强力推荐大家看一下,这里因为csdn原因无法将图片贴上来。
本篇文章将介绍目标检测和实例分割的经典网络模型
(从R-CNN,SPPNet,Fast R-CNN,Faster R-CNN)
!让我们来一起探索这些伟大的模型是如何一步步改进完善的!
一. 计算机视觉(AI VISION)
在介绍目标检测和实例分割之前我们先介绍一下计算机视觉的任务分类以及最新的神经网络模型(来源讯飞星火AI):
-
1. 图像分类
图像分类是指将图像分到预定义类别中的任务。例如,给定一张图片,算法需要判断这张图片中是否包含某种物体,如猫或狗。这个我们就太熟悉了在之前的文章中以及介绍过了经典网络模型和精读了它们的论文。
- ConvNeXt和CrossViT是当前在图像分类任务上表现突出的最新模型。ConvNeXt通过改进卷积网络结构来优化性能,而CrossViT结合了CNN和Transformer的优势,提高了分类准确性
-
2. 目标检测与定位
目标检测不仅要识别图像中的物体,还要精确地标定其位置,通常通过边界框来实现。传统的目标检测方法依赖于滑动窗口和手工设计的特征,但这种方法在计算量和准确性上存在限制。随着深度学习的发展,基于CNN的方法显著改善了检测效果。
- Yolov7和Swin Transformer是两种最新的目标检测模型。Yolov7通过新的网络结构和增强算法提升了检测速度和精度,而Swin Transformer利用分层建模能力处理不同尺寸的对象。
-
3. 语义分割和实例分割
语义分割任务将图像中的每个像素分类到特定类别,这适用于场景理解等应用。实例分割则更进一步,需要区分同一类别的不同个体。
- SETR和Mask2Former是最新的分割模型。SETR利用Transformer的全局信息来提升分割精度,而Mask2Former则在同一个Transformer框架内同时解决目标检测和实例分割任务。
下面我们将用一张图充分的理解分类(Image classification),检测(Object localization),语义分割(Semantic segmentation)和实例分割(Instance Segmentation)之间的区别
从图中我们可以看到分类,检测,分割的区别很明显不明显的是语义分割和实例分割。
-
图像分类(classification):
- 就是对图像判断出所属的分类,比如在学习分类中数据集有人(person)、羊(sheep)、狗(dog)和猫(cat)四种,图像分类要求给定一个图片输出图片里含有哪些分类,比如上图的例子是含有person、sheep和dog三种。
-
目标检测(object detection):
- 有什么,在哪里。比分类多了一个定位,需要确定目标的位置用矩形框将目标框出。
-
语义分割(semantic segmentation):
- 就是需要区分到图中每一点像素点,而不仅仅是矩形框框住了。但是同一物体的不同实例不需要单独分割出来。对下图左,标注为人,羊,狗,草地。而不需要羊1,羊2,羊3,羊4,羊5等。
-
实例分割(instance segmentation):
- 实例分割其实就是目标检测和语义分割的结合。相对目标检测的边界框,实例分割可精确到物体的边缘;相对语义分割,实例分割需要标注出图上同一物体的不同个体(羊1,羊2,羊3…)
-
全景分割(Panoramic segmentation):
- 全景分割是语义分割和实例分割的结合。跟实例分割不同的是:实例分割只对图像中的object进行检测,并对检测到的object进行分割,而全景分割是对图中的所有物体包括背景都要进行检测和分割。
目标检测算法可以分为两大类:
- 一类是基于Region Proposal(区域推荐)的R-CNN系算法(R-CNN,FAST R-CNN,Faster R-CNN等),这些算法需要two-stage,即需要先算法产生目标候选框,也就是目标位置,然后对候选框做分类与回归。
- 另一类是Yolo,SSD这类one-stage算法,仅仅使用一个卷积神经网络CNN直接预测不同目标的类别与位置。
接下来我们开始本篇重点基于Region Proposal(区域推荐)的R-CNN系算法。两阶段(two-stage)
R-CNN
论文地址Rich feature hierarchies for accurate object detection and semantic segmentation
-
生成候选区域(Region Proposal)
通过SS(Selective Search)算法生成2000个候选框,之后对候选框进行归一化,缩放到固定大小(227*227).这里我们简单介绍一下选择性搜索算法(Selective Search)
输入图像通过类似聚类的方法找到初始的(颜色,纹理,大小,形状相似度比较一致的)分割区域,然后对区域进行加权合并得到不同层次的2000个候选框!
-
对每个区域进行CNN特征提取
-
使用SVM分类器,判断是否属于该类
- 使用非极大值抑制剔除重叠建议框:
- 非极大值抑制: 定义IoU指数,即 ( A ∩ B ) / ( A ∪ B ) (A \cap B) / (A \cup B) (A∩B)/(A∪B),如下图所示,A是向日葵类对应的所有候选框中概率最大的区域,B是另一个区域,计算AB的IoU,其结果大于阈值,那么就认为AB属于同一类(即都是向日葵),所以应该保留A,删除B,这就是非极大值抑制。:
- 使用非极大值抑制剔除重叠建议框:
黄色框表示候选区域 Region Proposal,绿色窗口表示实际区域Ground Truth(人工标注的),红色窗口表示 Region Proposal 进行回归后的预测区域,这里就跟机器学习中的回归预测房价类似。
缺点:
- (1) R-CNN将所有输入图片缩放至(227*227)大小会影响原图的比例,导致模型检测精度下降。尺寸归一化导致物体变形,纵横比特征丢失。
- (2) 步骤繁琐,需要对每一张候选区域提取特征。
提出问题:
- (1) 能否改进从而可以使喂入全连接层的图片大小不固定?
- (2) 能否只提取一次特征,然后找到候选区域对应的特征图?
SPPNET
论文地址Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
从上图我们可以知道
R-CNN:image–>裁剪,变换(crop/warp)–>卷积–>全连接层–>输出结果。
SPPNET:image–>卷积–>空间金字塔池化(spatial pyramid pooling)–>全连接层–>结果。
改进了最主要的两个点:
- 直接将整幅图片喂入CNN,然后在特征图上找到大约2000个候选区域。
- 使用空间金字塔池化。
下面我们将介绍这两点:
作者发现,卷积后对应的位置并不会发生改变,每个卷积层会匹配响应的区域。如上图所示(a)图为输入的照片,(b)为第5层卷积层之后提取的特征图,©为测试集中能使该特征图激活最大的一些图片:
车轮在原图中的位置在特征图上也会出现在响应的位置
。
这样在目标检测使可以根据特征图画出该物体的位置,也就可以画出具体的框了。
上图就是SPPNET最核心的部分:空间金字塔池化层。
分别将特征图划分1×1、2×2、4×4大小的子块(显然,在不同的划分模式下子块大小是不一致的,输入特征图尺寸不一致时子块大小也不一样),然后对每个子块进行最大池化,即将不同大小的子块都转化为一个值,将池化之后的结果进行拼接即可得到一个大小固定为21维的输出。如此一来,无论输入特征图的尺寸发生如何变化,Spatial Pyramid Pooling均可将其转化为固定大小的尺寸进行输出。
特点:
空间金字塔池化的池化核的步长和大小是动态变化的过程,上边提到的1 * 1,2 * 2,4 * 4都是输出的大小,例如(对于44的输出,输入1313的图像, s i z e = 13 / 4 向上取整 = 4 , s t r i d e = 13 / 4 向下取整 = 3 size = 13/4 向上取整=4,stride = 13/4 向下取整=3 size=13/4向上取整=4,stride=13/4向下取整=3)。
总结:
- 空间金字塔池化(spatial pyramid pooling layer),解决了R-CNN输入图片大小固定的问题
- 只提取一次特征,直接在特征图上找到候选区域,避免了裁剪,变形,提高了检测精度。
- 使用共享卷积运算(所有候选框共享这一次卷积的feature map),大大提高了计算效率。
缺点:
- 无法通过反向传播来进行微调,离端到端的的检测还差很多
- 分类和回归是分开进行的,需要分别训练
提出问题:
- 能否把SVM和边界框去掉,由CNN直接得到类别和边框可不可以?
Fast R-CNN
论文地址Fast R-CNN
在介绍Fast R-CNN之前,我们先介绍以下RCNN和SPPNet的缺点,如下图所示:
R-CNN缺点:
- 训练是一个多阶段的(training is a multi-stage pipeline)
R-CNN首先需要通过CNN网络提取特征,再通过SVM网络对提取到的特征进行分类,最后需要通过bounding-box回归修正预选框。
- 训练消耗大量的空间和时间(training is expensive in space and time)
SVM需要每一张图片上的每一个候选框区域的特征,所以CNN提取到的特征需要存储到磁盘中,所以将耗费大量的空间去存储,大量的时间去提取特征。
- 目标检测速度非常慢(object detection is slow)
因为R-CNN每一张照片都要生成2000个候选框,这就导致在测试阶段使用VGG16处理一张图片将消耗47秒。
所以SPPNet使用共享计算来解决R-CNN对一张图片生成2000候选框再喂入网络造成计算效率低下的问题。
SPPNet缺点:
- 同R-CNN一样,同R-CNN一样是多阶段的训练
- 无法更新金字塔池化之前的卷积层,这就限制了非常深网络的准确性。
是由于 SPP做fine-tuning时输入是多个不同的图片,这样对于每一个图片都要重新产出新的feature map,效率很低,而Fast-RCNN对其进行了改进。
从上图我们可以知道Fast R-CNN相较于R-CNN和SPPNet的优点:
- 有更高的检测精度
- 训练是单阶段,使用多任务损失函数
把不同模型整合为一个网络:损失函数使用多任务损失函数 multi-task loss,将边框回归bounding box regression 直接加入CNN网络中训练。
- 训练可以更新所有层的网络参数
用反向传播训练所有网络权重是Fast R-CNN的重要能力。首先,让我们阐明为什么SPPnet无法更新低于空间金字塔池化层的权重。
根本原因是当每个训练样本(即RoI)来自不同的图像时,通过SPP层的反向传播是非常低效的,这正是训练R-CNN和SPPnet网络的方法。低效的部分是因为每个RoI可能具有非常大的感受野,通常跨越整个输入图像。由于正向传播必须处理整个感受野,训练输入很大(通常是整个图像)。
我们提出了一种更有效的训练方法,利用训练期间的特征共享。在Fast RCNN网络训练中,随机梯度下降(SGD)的小批量是被分层采样的,首先采样N个图像,然后从每个图像采样R/N个 RoI。关键的是,来自同一图像的RoI在向前和向后传播中共享计算和内存。减小N,就减少了小批量的计算。例如,当N=2和R=128时,得到的训练方案比从128幅不同的图采样一个RoI(即R-CNN和SPPnet的策略)快64倍。
这个策略的一个令人担心的问题是它可能导致训练收敛变慢,因为来自相同图像的RoI是相关的。这个问题似乎在实际情况下并不存在,当N=2和R=128时,我们使用比R-CNN更少的SGD迭代就获得了良好的结果。
上面是论文中的翻译,个人理解:采用类似于批标准化,不再是1张1张的喂入图片而是将N张图片喂入网络中,然后从每个图像采样R/N个,利用权重共享来加快训练。个人感觉这个微调思路很费看看Faster R-CNN论文。
- 特征缓存不需要磁盘存储
- 使用简化的空间金字塔池化,ROI池化
什么是ROI池化就是简化的空间金字塔池化,空间金字塔池化是固定池化输出为1 * 1,2 * 2,4 * 4(在CNN中说到过,不同大小的子块感受野不同)的聚合,而ROI就是固定池化输出为一个大小例如(7 * 7).
这种固定大小的映射可能导致信息的损失或扭曲,特别是对于较小或较大的目标区域
。
Fast R-CNN的架构:
Fast R-CNN流程是:
输入一张图片–> 通过CNN提取特征图 --> 通过ROI projection(依旧采用SS提取2000个候选框)得到候选区域 --> 通过ROI Pooling将候选区域映射到固定大小的特征图 --> 通过全连接层 --> 在最后并行两个全连接层用于进行softmax分类和bounding-box回归。
端到端 (END TO END)
在介绍FASTER R-CNN之前,我们首先介绍一个概念端到端(end to end).
什么是端到端呢?
在目标检测领域,端到端指的是
能否直接从输入的图像数据获得最终的检测结果
,而不需要人为的特征选择或其他手动设计的功能
。这类模型的训练和推理过程更加直接和高效。
例如: 相对于深度学习,传统机器学习的流程往往由多个独立的模块组成,比如在一个典型的自然语言处理(Natural Language Processing)问题中,包括分词、词性标注、句法分析、语义分析等多个独立步骤,每个步骤是一个独立的任务,其结果的好坏会影响到下一步骤,从而影响整个训练的结果,这是非端到端的。
首先我们关注的是在目标检测领域满足那点的为端到端:
- 能否
直接(不需要人为的特征选择或其他手动设计的功能)
从输入的图像数据获得最终的检测结果。
接下来我们就分析R-CNN,SPPENT,FAST R-CNN:
R-CNN:
它通过选择性搜索算法生成区域建议,然后对每个区域建议独立提取CNN特征,最后利用SVM分类器进行分类和回归器精修边界框。显然,R-CNN是一个多阶段的处理流程
,需要人为的特征选择和多个分离的步骤才能得到结果,因此它不是端到端的。SPPNET:
针对R-CNN重复计算卷积图的问题进行了改进,引入了空间金字塔池化层,允许不同大小的区域建议在特征图上直接映射并池化为固定尺寸的输出,从而一次性完成特征提取。尽管SPPNet减少了重复计算,但依然保留了R-CNN的多阶段
特点,即先提取特征后进行分类和回归
,所以也不是端到端系统。FAST R-CNN:
在R-CNN和SPPNet的基础上进行了进一步优化,提出了RoI池化层,并将分类和回归合并为一个多任务目标,使得整个网络可以联合训练。虽然Fast R-CNN实现了多任务学习,但它仍然依赖于外部的区域建议生成方法如选择性搜索算法,因此整体流程并非完全端到端。
FASTER R-CNN:
引入了区域建议网络(RPN),使得区域建议的生成可以直接在网络内部完成,从而实现了端到端的检测流程。
Faster R-CNN
论文地址Faster R-CNN: Towards Real-Time Object
Detection with Region Proposal Networks
在前面我们已经讲过了,Fast R-CNN在最后并行两个全连接层用于进行softmax分类和bounding-box回归,较大的提升了计算效率但是FAST R-CNN依旧依赖于SS提取候选框(依赖于CPU)并不能像CNN一样使用GPU这种高效的计算,这就导致处理一张图片需要2秒钟。于是FASTER R-CNN提出RPN网络用于提取候选框,将一部分也用GPU运行。这就可以实时检测图片!增加实用性。
从上图我们可以看到FASTER R-CNN的流程图
- 输入一张图片–> 通过CNN提取特征图 --> 通过RPN网络对特征图提取候选框 --> 通过ROI Pooling将候选区域映射到固定大小的特征图 --> 通过全连接层 --> 在最后并行两个全连接层用于进行softmax分类和bounding-box回归。
我们可以看到FASTER R-CNN跟FAST R-CNN的区别就是用RPN网络替换掉了SS直接在特征图上提取候选框。 接下来我们详细介绍一下RPN网络!
RPN网络
RPN网络的工作流程就是
通过(3 * 3)小网络扫描特征图,产生256维的一个低维特征,然后分别喂入分类层(cls layer)和回归层(reg layer)这里解释以下图中为什么是4kcoordinate,2kscores这里4:中心点加上宽和奥就能确定一个矩形框的位置,但是预测出的候选框跟实际框会有差距,这时候就需要判断框中是否含有目标值所以为2kscores。k:anchor。
anchor
当你利用特征图并不是凭空产生候选框的并且凭空产生的候选框也不准确所以会事先定义参考框,最后输出的是每个参考框的偏移量。
我们在特征图中找一个点,就可以在原图中找到对应的一个像素点,以该像素点为中心,画出9个不同大小和长宽比的框,称为anchor 。如下图所示,这些anchor里面可能包含目标,也可能没有目标。因为我们在一张图中想找的的目标的大小和长宽比并不是固定的,所以这里用9个不同大小和长宽比的anchor来进行预测。
本文使用的Anchor的大小和比例是事先预定好的。大小为 ( 12 8 2 , 25 6 2 , 51 2 2 ) (128^2,256^2,512^2) (1282,2562,5122),比例是 ( 1 : 2 , 1 : 1 , 2 : 1 ) ( 这里的指定策略:矮胖的用于检测车,马之类的,瘦高的可以表示人,之类的等等 ) (1:2,1:1,2:1) (这里的指定策略:矮胖的用于检测车,马之类的,瘦高的可以表示人,之类的等等) (1:2,1:1,2:1)(这里的指定策略:矮胖的用于检测车,马之类的,瘦高的可以表示人,之类的等等)。
在之后的YOLO和SSD中是自适应的候选框,提升了检测精度和泛化能力。
Loss Funtion
预测值和实际值的偏差,对于每一个anchor,RPN网络输出的2 4就是预测值那么作者是如何定义anchor的真实值的呢??
将正标签分配给两种anchor:
- 具有最大IOU重叠的anchor
- 具有大于0.7的IOU重叠的anchor
这样就可以保证至少有一个anchor被分配为正标签,
而负标签分配给具有IOU重叠小于0.3的anchor。
总结
参考同济子豪兄
Faster R-CNN最全讲解
CV之DL之FastR-CNN:Fast R-CNN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略