经典CV任务(二)目标检测
Published in:2023-12-20 | category: 经典深度神经网络

1 目标检测

目标检测的重要任务是

  1. 目标定位:目标检测的首要任务是确定图像中对象的位置,通常使用边界框(Bounding Box)来描述目标的位置。边界框由一对坐标表示,通常是左上角和右下角的坐标。
  2. 目标识别:目标检测不仅要定位目标,还要识别目标的类别或类别标签。这通常涉及将检测到的对象与已知的类别进行比较,从而确定它是什么物体。

所以目标检测可以通俗理解为分类+定位

我不仅要告诉你什么类别,还要告诉你在哪儿

在这个任务中,我们用边界框,来定位我们的物体

边界框的位置表示有两种

第一种是边框的坐上,右下的点的坐标点x1,y1 x2,y2

第二种是边框的中间点坐标,和宽高

两种方式都可以唯一确定图片上的边框,并且可以相互转换

1.1 单目标检测

即图片中只有一个要检测的物体,这个难度相对来说小一些

直观可以想到一种方式

首先拿一个卷积网络提取特征

再利用提取到的特征(假如提取到的特征是2048)一方面可以接一个全连接层做分类(比如2048到10类),另一方面可以接全连接层做坐标点的回归(比如2048到4个坐标点)

这样需要两个损失函数,一个损失函数降低分类错误率,另一个损失函数降低回归错误率,我们称这样的网络叫做多任务多损失网络

image-20230927151643757

对于这样的任务

一般可以多阶段训练

1 先训练分类分支

2 再在分类分支训练好的基础上训练坐标点回归

3 最后一步将两个合并到一起训练

1.2 多目标检测

图片中可能有多个要检测的物体,这个难度就更大了

物体的个数是未知的,我们不能像单目标检测那样只回归一个坐标点,回归的坐标点个数是未知的!!天啊该怎么呢

所以研究者们做了如下一些尝试

3.2.1 阶段一 单像素点采样目标检测

既然直接回归不行,那么我们可以先产生很多的边界框(术语叫锚框),让网络对这些边界框 锚框一个一个做分类,并预测它距离真实边框的偏移量!

最开始大伙儿尝试直接对于每个像素点给出不同尺寸的锚框

当生成足够多的锚框的时候,大力出奇迹,总会有框几乎把我们的目标框住的

这时候对于每个区域进行分类判断,一张图片可能会产生几十万上百万张图片,然后让网络进行分类

直观感受 是有点鲁莽!!!密集恐惧症颤抖

实际也证明这种方式的运算量巨大,但他是可行的方式

训练阶段

我们把每一个锚框看作一个训练样本

这个训练样本需要两个标记,一是类别(一般就分配给与它最近边框的类别即可),二是与它最近的真实边框的偏移量

模型对于每一个框需要预测它的类别,与最近的真实边框的偏移量

预测阶段

首先为图像生成多个锚框

利用模型为这些锚框一 一预测类别和偏移量

有一个可能的问题,我们生成了多个相似的具有明显重叠的锚框

采用非极大值抑制来合并属于同一目标的相似的边界框

(1)首先,根据每个候选边界框的得分(通常是模型预测的物体存在概率或置信度分数)对所有候选边界框进行降序排序,得分较高的边界框排在前面。

(2)选择得分最高的边界框,并将其添加到最终的筛选结果中。这个边界框通常被认为是最有可能包含真实目标的边界框。

(3)于剩余的候选边界框,计算它们与已选择的高分边界框的重叠区域(通常使用IoU,Intersection over Union来衡量)。IoU是两个边界框重叠区域与它们的联合区域的比例。

(4)剔除重叠边界框:如果某个候选边界框与已选择的高分边界框具有高于预定阈值的IoU值(也就意味着和我们得分最高的边界重叠过高),则将该候选边界框从列表中移除

(5)重复步骤:重复步骤2到步骤4,直到没有更多的候选边界框需要处理。

(6)输出结果:NMS会输出一组经过非极大值抑制筛选的边界框

可以做这样一个比喻来通俗理解这件事情

想象你是一名宝藏猎人,你有一块地图上标有可能埋有宝藏的若干区域。你的任务是找到最有可能埋有宝藏的区域,同时避免走重复的路线,因为这不会增加你找到宝藏的机会。

  1. 得分排序:每个区域都有一个分数,表示它有多大的可能性埋有宝藏。你首先查看地图上所有区域的分数,将得分最高的区域放在列表的最前面,就像把最有希望的区域标记在地图上。
  2. 选择高分区域:你首先前往得分最高的区域,因为那里找到宝藏的可能性最大。
  3. 计算重叠区域:当你到达一个区域后,你会注意到一些其他区域可能与你当前所在的区域有很大的重叠。这就像你走到了一个区域,但可能有其他猎人也在附近搜索。
  4. 剔除重叠区域:为了避免重复工作,你会检查其他猎人所在的区域,如果它们与你当前的区域有很大的重叠(重复搜索的可能性高),你会决定不再前往这些区域,而是继续前往下一个可能性很高的区域。
  5. 重复步骤:你会不断重复前往得分最高的区域、计算重叠区域和剔除重叠区域的步骤,直到你认为没有更值得前往的高分区域为止。
  6. 输出结果:最终,你的努力会得到一组标记为最有可能埋有宝藏的区域,而且你不会重复浪费时间去搜索高度重叠的区域。

3.2.2 阶段二 多像素点采样目标检测

单像素点采样直接对于所有像素点为中心给出不同尺寸的锚框,运算量巨大

那么我们可不可以降低一下这个运输量呢?

当然可以啦

我们以一小部分像素为中心生成不同锚框

比如2×2像素,比如4×4像素

这样就可以降低我们的锚框量啦

3.2.3 阶段三 RNN

但是即便如此,锚框量依然巨大

那么我们可不可以进一步减少锚框量呢,可以的

我们可以采用某些算法,给出建议区域,即找出所有潜在可能包含目标的区域

这便是R-CNN系列

R-CNN

1 利用区域建议方法selective search产生的感兴趣区域,大约2000个候选区域(或称为候选框),这些区域被认为可能包含目标物体。

2 对于每个候选区域,R-CNN将其缩放裁剪出来,并通过一个预训练的卷积神经网络(通常是AlexNet)提取特征。这些候选区域在CNN中前向传播,生成固定长度的特征向量。

3 特征向量被送入一个独立的支持向量机(SVM)分类器,每个SVM分类器用于识别特定类别的目标物体。这意味着为每个可能的目标类别都训练一个二元分类器,以判断特定候选区域是否包含属于该类别的物体。

4 此外,R-CNN还包括一个边界框回归器,用于微调候选区域的边界框,以更准确地定位目标物体。

5 最后,为了去除重叠和冗余的检测结果,使用非极大值抑制(NMS)来选择最终的检测边界框。

R-CNN可以有着更高的精度,处理的锚框也少了,但是它产生感兴趣区域也很耗时

总结来看他的缺点

  • 训练和推理速度慢,因为每个候选区域都要进行独立的前向传播和分类。
  • 需要大量的存储空间,因为要保存每个候选区域的特征向量和分类器参数。
  • 不够端到端,训练过程相对复杂。

Fast R-CNN

Fast R-CNN看名字就可以知道哈哈哈哈是R-CNN的改进,让他变得更快,同时变得端到端

1 首先利用卷积网络进行特征提取

2 提取到的特征图再做感兴趣区域建议!而特征图的区域是可以和原图一一映射的

3 再对取出来的区域做裁剪缩放(Rol Align 双线性插值),然后利用全连接层输出每个感兴趣区域的特征进行分类或回归

4 使用非极大值抑制(NMS)来选择最终的检测边界框。

Faster R-CNN

与R-CNN不同,Fast R-CNN不再使用选择性搜索等传统方法生成大量候选区域。相反,它引入了一种叫做”候选区域提取网络(Region Proposal Network,RPN)”的网络模块,用于生成高质量的候选区域。提高了效率

1 首先利用卷积网络进行特征提取

2 提取到的特征图利用候选区域提取网络获得感兴趣区域!而特征图的区域是可以和原图一一映射的

候选区域提取网络需要进行二分类 是目标还是背景

3 再对取出来的区域做裁剪缩放(Rol Align 双线性插值),然后利用全连接层输出每个感兴趣区域的特征进行分类或回归

4 使用非极大值抑制(NMS)来选择最终的检测边界框。

image-20230927201110244

3.2.4 阶段四 一阶段的目标检测 Yolo/SSD

Yolo

YOLO采用单一的卷积神经网络来同时处理目标检测和分类任务。与传统的两阶段目标检测方法不同(如R-CNN系列),YOLO将目标检测任务转化为回归问题,一次性输出所有检测框的位置和类别信息。

​ 不用区域建议网络了,直接把图片分成7×7,每个网格单元负责检测图像中的物体,产生一个或多个候选框。

每个网格单元预测多个候选框(通常是B个,如2或3个)。每个候选框由5个参数定义:中心坐标(x, y)、宽度(w)、高度(h)以及物体存在概率(objectness score)。这些参数用于定义每个候选框的位置和是否包含物体。

每个网格单元还预测C个类别的概率分数,用于表示物体属于每个类别的可能性。这些类别概率分数与每个候选框关联。

SSD

SSD和之前工作主要区别是

SSD引入了一组称为Anchor框的预定义边界框。每个Anchor框与特定位置和尺度的特征图单元相对应。这些Anchor框用于尝试捕获不同尺寸和比例的物体。

结论

​ Faster R-CNN速度偏慢,但精度高

​ SSD速度快,精度高

​ 主干网络越宽,深度越深对性能帮助越大

Prev:
经典网络(七)ResNet全解析
Next:
经典网络(六)GoogleNet全解析