目标检测入门

2023-11-10

目录

R-CNN

 1.1提取候选区域

1.1.1合并规则

1.1.2多样化与后处理

1.2特征提取

1.2.1预处理

2.Fast RCNN

2.1RoI Pooling Layer

Faster RCNN

结构

RPN

anchor(目标框)

分类和定位

Mask RCNN

框架

 算法

 RoIAlign

 Mask branch

SSD 

FCOS


基于深度学习的目标检测算法主要分为两类:Two stage和One stage。

1)Tow Stage:基于Region Proposal的R-CNN系算法
先进行区域生成,该区域称之为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等。

卷积神经网络CNN直接预测不同目标的类别与位置,快,准确性稍低

目标检测

(分类+定位)

R-CNN

Fast RCNN

Faster RCNN

Mask RCNN

目标候选框

Selective Search 

共享CNN

对全图提取特征

ResNeXt

获取特征

提取特征向量

CNN,

AlexNet对候选区域

特征提取

CNN

对全图特征提取

RoI Pooling Layer 摘取Roi特征

RPN生成Roi

并修正

RoI Pooling Layer 摘取Roi特征

生成Roi

RPN二值分类

BB回归

RoIAlign

分类

SVM分类

FC 分类

二次修正

N类别分类、

BB回归MASK生成

边框修正

BB回归

R-CNN

Region CNN解决目标检测中的两个关键问题:

1.速度:滑动窗法依次判断所有可能的区域->候选区域

2.训练集:提取人工设定的特征->训练深度网络进行特征提取

一个较大的识别库(ImageNet ILSVC 2012):标定每张图片中物体的类别。一千万图像,1000类。
一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置。一万图像,20类。
本文使用识别库进行预训练,而后用检测库调优参数。最后在检测库上评测。
 


目标检测有两个主要任务:物体分类和定位,

R-CNN借鉴了滑动窗口思想, 采用对区域进行识别的方案,

具体是:

1.一张图像,生成1K~2K个类别独立的候选区域(可能目标区域)
2.对于每个候选区域,利用卷积神经网络来获取一个特征向量
3.对于每个区域相应的特征向量,利用支持向量机SVM 进行分类,判别是否属于该类

4.通过一个bounding box regression回归器调整目标包围框的大小

 1.1提取候选区域

R-CNN 采用的是 Selective Search 算法。

1.将图像分成很多小尺寸区域,

2.根据其特征合并合并可能性最高的得到大尺寸区域,

3.重复直到整张图像合并成一个区域位置,

4.输出所有曾经存在过的区域,所谓候选区域

1.1.1合并规则

  • 颜色(颜色直方图)相近的
  • 纹理(梯度直方图)相近的
  • 面积,合并后小的(保证合并操作的尺度较为均匀,避免大区域“吃掉”其他小区域。)
  • 位置,总面积在其BBOX中所占比例大的(保证合并后形状规则)

合并后的区域特征可以直接由子区域特征计算而来,速度较快。

1.1.2多样化与后处理

为尽可能不遗漏候选区域,上述操作在多个颜色空间中同时进行(RGB,HSV,Lab等)。

在一个颜色空间中,使用上述四条规则的不同组合进行合并。

所有颜色空间与所有规则的全部结果,在去除重复后,都作为候选区域输出。

1.2特征提取

1.2.1预处理

用CNN提取对应的特征向量,用模型AlexNet (2012)。

(Alexnet 的输入图像大小是 227x227,而通过 Selective Search 产生的候选区域大小不一,

为了与 Alexnet 兼容,R-CNN 采用了非常暴力的手段,那就是无视候选区域的大小和形状,归一化为 227x227 的尺寸)

外扩的尺寸大小,形变时是否保持原比例,对框外区域直接截取还是补灰。会轻微影响性能。

2.Fast RCNN

1.首先还是采用selective search提取2000个候选框RoI
2.使CNN直接特征提取全图的特征图

3.使用一个RoI Pooling Layer在特征图上摘取每一个候选框RoI的特征
4.分别经过为21和84维的全连接层(并列的,前者是分类输出,后者是回归输出)

避免了R-CNN中的对每个候选框串行进行卷积(耗时较长)。


2.1RoI Pooling Layer

RoI Pooling:

1.将每个RoI映射到特征图对应位置,获取对应特征

2.将每个RoI对应的特征的维度转化成某个定值。

(每一个RoI的尺度各不相同,所以提取出来的特征向量region proposal维度也不尽相同,以满足全连接层的输入需求)

  • 将region proposal划分为目标H×W大小的分块

  • 对每一个分块中做MaxPooling(每个分块中含有多个网格,每个分块获取一个特征值)

  • 将所有输出值组合起来便形成固定大小为H×W的feature map

 pooling主要作用是减少运算量,但会降低performance 

 

Fast R-CNN的贡献可以主要分为两个方面:

取代R-CNN的串行特征提取方式,直接采用一个CNN对全图提取特征(这也是为什么需要RoI Pooling的原因)。
除了selective search,其他部分都可以合在一起训练。
Fast R-CNN也有缺点,体现在耗时的selective search还是依旧存在。
 

Faster RCNN

Faster R-CNN 取代selective search,直接通过Region Proposal Network (RPN)生成待检测区域

结构

Faster RCNN = RPN + Fast RCNN

 

 1.共享卷积层为全图提取特征feature maps
2.将feature maps送入RPN,RPN生成待检测框(指定RoI的位置),并对RoI的包围框进行第一次修正

3.RoI Pooling Layer根据RPN的输出在feature map上面选取每个RoI对应的特征,将维度置为定值
4.使用全连接层(FC Layer)对框进行分类,并且进行目标包围框的第二次修正。

Faster R-CNN真正实现了端到端的训练(end-to-end training)。

最大特色是使用了RPN取代了SS(selective search)算法来获取RoI

RPN

Region Proposal Network,Region Proposal“区域选取”,提取候选框的网络;

RCNN和Fast RCNN等物体检测架构中,用来提取候选框的方法通常是Selective Search

目标定位:

上面一条通过softmax来分类anchors获得前景foreground(检测目标)和背景background

下面一条计算anchors边框偏移量,获得精确的proposals

proposal层则负责综合foreground anchors和偏移量获取proposals,

同时剔除太小和超出边界的proposals。
 

anchor(目标框


RPN依靠一个在共享特征图上滑动的窗口,为每个位置生成9种预先设置好长宽比与面积的目标框这9种初始anchor包含三种面积(128×128,256×256,512×512),

每种面积又包含三种长宽比(1:1,1:2,2:1)

共享特征图的大小约为40×60,RPN生成的初始anchor的总数约为20000个(40×60×9)。

RPN最终就是在原图尺度上,设置了密密麻麻的候选anchor。

1.判断anchor到底是前景还是背景,就是判断这个anchor到底有没有覆盖目标

(SoftmaxLoss直接训练,在训练的时候排除掉了超越图像边界的anchor;

anchor与ground truth的IoU在0.7以上,那这个anchor就算前景(positive)

anchor与ground truth的IoU在0.3以下,那这个anchor就算背景(negative)

Intersection over Union(IoU)检测相应物体准确度的一个标准)

2.前景的anchor进行第一次坐标修正。


绿色表示的是飞机的实际框标签(ground truth),

红色的表示的其中一个候选区域(foreground anchor),即被分类器识别为飞机的区域,

对于目标框一般使用四维向量来表示(x,y,w,h)(x,y,w,h) ,分别表示目标框的中心点坐标、宽、高,

 AA 表示原始的foreground anchor,GG 表示目标的ground truth,

寻找变换FF ,使得输入原始的Anchor AA 经过映射到一个和真实框GG 更接近的回归窗口G′G′

BB回归Bounding-box regression边框回归,回归分析”是指分析因变量和自变量之间关系

平移

缩放

 

 需要学习四个参数

 两个框中心距离的偏移量

 当输入的anchor A与G相差较小时,可以认为这种变换是一种线性变换

 一个1×1的卷积层输出了18个值,每一个点对应9个anchor,

每个anchor有一个前景分数和一个背景分数,所以9×2=18

 另一个1×1的卷积层输出了36个值,每一个点对应9个anchor,

每个anchor对应了4个修正坐标的值,所以9×4=36。

分类和定位

训练分类器和RoI边框修正:

1.通过RPN生成约20000个anchor(40×60×9)。
2.对20000个anchor进行第一次边框修正,得到修订边框后的proposal。
3.对超过图像边界的proposal的边进行clip,使得该proposal不超过图像范围。
4.忽略掉长或者宽太小的proposal。
5.将所有proposal按照前景分数从高到低排序,选取前12000个proposal。
6.使用阈值为0.7的NMS算法排除掉重叠的proposal。
7.针对上一步剩下的proposal,选取前2000个proposal进行分类和第二次边框修正。
Faster R-CNN的loss分两大块,

第一大块是训练RPN的loss(包含一个SoftmaxLoss和SmoothL1Loss),

第二大块是训练Faster R-CNN中分类器的loss(包含一个SoftmaxLoss和SmoothL1Loss)
 

Mask RCNN

  •  Mask RCNN可以看做是一个通用实例分割架构。
  • Mask RCNN以Faster RCNN原型,增加了一个分支用于分割任务。
  • Mask RCNN比Faster RCNN速度慢一些,达到了5fps。
  • 可用于人的姿态估计等其他任务;

框架

模块:Faster-RCNN、RoI Align和Mask

 算法

1.将预处理好的图片输入到一个预训练好的神经网络中(ResNeXt等)获得对应的feature map;

2.对这个feature map中的每一点设定预定一个的RoI,从而获得多个候选RoI;

3.将候选RoI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的ROI;

4.对这些剩下的RoI进行RoIAlign操作

(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来);

5.对这些RoI进行分类(N类别分类)、BB回归和MASK生成(在每一个ROI里面进行FCN操作)。


Mask R-CNN可以增加不同的分支完成不同的任务,

可以完成目标分类、目标检测(object dection)、语义分割(semantic segmentation)、

实例分割(Instance Segmentation=object dection+semantic segmentation)、人体姿势识别等多种任务,如下图所示。

 RoIAlign

取代了Faster RCNN中的RoIPooling

RoI Pooling使用了两次量化操作(即取整操作)

RoIAlign使用了线性插值算法

为了得到固定大小(7X7)的feature map,需要做两次量化操作:

1)图像坐标 — feature map坐标,

2)feature map坐标 — RoI feature坐标。

1)输入的是一张800x800的图像,在图像中有两个目标(猫和狗),狗的BB大小为665x665,

经过VGG16网络后,可以获得对应的feature map,

对卷积层进行Padding操作,图片经过卷积层后保持原来的大小,

feature map经过池化层,会比原图缩小一定的比例,这和Pooling层的个数和大小有关。

在该VGG16中,我们使用了5个池化操作,每个池化操作都是2x2Pooling,

因此最终获得feature map的大小为800/32 x 800/32 = 25x25(是整数),

但是将狗的BB对应到feature map上面,我们得到的结果是665/32 x 665/32 = 20.78 x 20.78,

结果是浮点数,含有小数,但是我们的像素值可没有小数,

对其进行了量化操作(即取整操作),即其结果变为20 x 20,在这里引入了第一次的量化误差;

2)feature map中有不同大小的ROI,但是后面的网络却要求有固定的输入,

需要将不同大小的ROI转化为固定的ROI feature,在这里使用的是7x7的ROI feature,

那么需要将20 x 20的ROI映射成7 x 7的ROI feature,其结果是 20 /7 x 20/7 = 2.86 x 2.86,

在这里引入了第二次量化误差(即取整操作)

这里引入的误差会导致图像中的像素和特征中的像素的偏差,

即将feature空间的ROI对应到原图上面会出现很大的偏差。

feature空间和图像空间是有比例关系的,在这里是1:32,那么对应到原图上面的差距就是0.86 x 32 = 27.52这会大大影响整个检测算法的性能,因此是一个严重的问题。

 

双线性插值是一种比较好的图像缩放算法,

它充分的利用了原图中虚拟点(比如20.56这个浮点数,像素位置都是整数值,没有浮点值)

四周的四个真实存在的像素值来共同决定目标图中的一个像素值,

即可以将20.56这个虚拟的位置点对应的像素值估计出来。

蓝框表示卷积后获得的feature map,黑框表示ROI feature,最后需要输出的大小是2x2,

用双线性插值来估计这些蓝点(虚拟坐标点,又称双线性插值的网格点)处所对应的像素值,

蓝点是2x2Cell中的随机采样的普通点,这些采样点的个数和位置不会对性能产生很大的影响,

在每一个橘红色的区域里面进行max pooling或者average pooling操作,获得最终2x2的输出结果。

原图中的像素和feature map中的像素是完全对齐的,没有偏差,

这不仅会提高检测的精度,同时也会有利于实例分割。

 Mask branch

mask分支只做语义分割

RoI Align后有一个"head"部分,主要作用将RoI Align的输出维度扩大,在预测Mask时会更加精确。

在Mask Branch的训练环节,输出了K个Mask预测图(为每一个类都输出一张),

并采用average binary cross-entropy loss训练,

训练Mask branch时,输出的K个特征图中,只对应ground truth类别的特征图对Mask loss有贡献。
 

SSD 


(SSD: Single Shot MultiBox Detector)

上面分析了YOLO存在的问题,使用整图特征在7*7的粗糙网格内回归对目标的定位并不是很精准。那是不是可以结合Region Proposal的思想实现精准一些的定位?SSD结合YOLO的回归思想以及Faster R-CNN的anchor机制做到了这点。

上图是SSD的一个框架图,首先SSD获取目标位置和类别的方法跟YOLO一样,都是使用回归,但是YOLO预测某个位置使用的是全图的特征,SSD预测某个位置使用的是这个位置周围的特征(感觉更合理一些)。

那么如何建立某个位置和其特征的对应关系呢?可能你已经想到了,使用Faster R-CNN的anchor机制。如SSD的框架图所示,假如某一层特征图(图b)大小是8*8,那么就使用3*3的滑窗提取每个位置的特征,然后这个特征回归得到目标的坐标信息和类别信息(图c)。

不同于Faster R-CNN,这个anchor是在多个feature map上,这样可以利用多层的特征并且自然的达到多尺度(不同层的feature map 3*3滑窗感受野不同)。
 

小结:SSD结合了YOLO中的回归思想和Faster R-CNN中的anchor机制,使用全图各个位置的多尺度区域特征进行回归,既保持了YOLO速度快的特性,也保证了窗口预测的跟Faster R-CNN一样比较精准。SSD在VOC2007上mAP可以达到72.1%,速度在GPU上达到58帧每秒。

FCOS

论文名称:FCOS: Fully Convolutional One-Stage Object Detection
论文下载地址:

https://arxiv.org/abs/1904.01355
https://arxiv.org/abs/2006.09214 (注:2020年更新后的版本,比如center-ness分支有些小改动)
在bilibili上的视频讲解:https://www.bilibili.com/video/BV1G5411X7jw


单阶段的anchor-free

参考链接:目标检测综述_计算机视觉life的博客-CSDN博客_目标检测

 【目标检测】RCNN算法详解_shenxiaolu1984的博客-CSDN博客_rcnn算法

Faster RCNN详解_小白的深度学习之路的博客-CSDN博客_faster r-cnn

RPN 解析_懒人元的博客-CSDN博客_rpn

【Mask RCNN】论文详解(真的很详细)_咖啡味儿的咖啡的博客-CSDN博客_mask rcnn论文

目标检测(Object Detection)_图像算法AI的博客-CSDN博客_目标检测

一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD_v_JULY_v的博客-CSDN博客_r-ssdFCOS网络解析_太阳花的小绿豆的博客-CSDN博客_fcos网络

FCOS算法详解_技术挖掘者的博客-CSDN博客_fcos算法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

目标检测入门 的相关文章

随机推荐

  • Java中String类的isEmpty方法、null以及""的区别

    一直以来对String的这三个空挺晕的 刚好同事问我 我也学习下 从别人博客上看到的是这样的 isEmpty 分配了内存空间 值为空 是绝对的空 是一种有值 值 空 分配了内存空间 值为空字符串 是相对的空 是一种有值 值 空字串 null
  • 交换两个变量的值+int*[]与int(*)[]的辨析

    交换两个变量的值 不使用第三个变量 即 a 3 b 5 交换之后 a 5 b 3 有两种解法 一种用算术算法 一种用 异或 a a b b a b a a b or a a b 只能对 int char b a b a a b or a b
  • 这个效果是怎么做的?

    http higkoo i sohu com blog view 81445953 htm 想要那个红狐狸效果
  • 【论文阅读】MPViT : Multi-Path Vision Transformer for Dense Prediction

    发表年份 2021 12 发表单位 Electronics and Telecommunications Research Institute ETRI South Korea 期刊 会议 CVPR 论文链接 https arxiv org
  • Servlet_01_介绍

    Servlet的作用是处理请求 服务器会把接收到的请求交给Servlet来处理 在Servlet中通常需要 1 接收请求数据 2 处理请求 3 完成响应 例如客户端发出登录请求 或者输出注册请求 这些请求都应该由Servlet来完成处理 S
  • ubuntu下学习c++(输出定义变量)

    2022 6 11 学习cout cin的使用方法以及变量的定义 include
  • 接口和类有啥区别:

    接口和类有啥区别 接口是一系列抽象方法的集合 接口中只有抽象方法 只有的意思就是 没有成员变量 除了静态常量 没有构造方法 因此不能被实例化 类只是一种抽象的数据类型 接口没有构造方法 一个类只能继承一个类 但是可以实现多个接口 接口中不能
  • 远处是风景,近处是人生

    常听到有人说 最近好累 想出去走走 换个地方透透气 如果去到大理 心情一定如花儿一般灿烂 如果去到内蒙 心情一定如草原一般辽阔 如果去到三亚 心情一定如大海一般坦荡 但实际上 改变你心情的从不是新的城市或者美丽的景色 是你愿意与生活和解的态
  • 网络常考题

    45 当数据接收者不能处理更多数据时 哪一层发出停止信息给发送者 A 网络层 B 传输层 C 会话层 D 表示层 B 49 在传输层采用了以下哪些方法来保证接收缓冲区不溢出 多选 A 数据分段 B 确认机制 C 流量控制 D 滑动窗口 E
  • Spring中@JsonFormat与@DateTimeFormat注解使用简介说明

    转自 Spring中 JsonFormat与 DateTimeFormat注解使用简介说明 下文笔者讲述Spring中JsonFormat和DateTimeFormat注解的简介说明 如下所示 JsonFormat和DateTimeForm
  • C语言编译执行的全过程

    编译 编译程序读取源程序 字符流 对之进行词法和语法的分析 将高级语言指令转换为功能等效的汇编代码 再由汇编程序转换为机器语言 并且按照操作系统对可执行文件格式的要求链接生成可执行程序 C源程序头文件 gt 预编译处理 cpp gt 编译程
  • 高光谱遥感数值建模技术及在植被、水体、土壤信息提取领域应用

    在高光谱影像中 结合纹理 表面粒度 风化程度 作物密度等辅助信息 能估计出多种地物及其上覆作物的状态参量 提高遥感高定量分析的精度和可靠性 如何通过构建遥感光谱反射信号与地表参数之间的关系模型来实现数值计算 是举办本次培训班的主要目的 针对
  • 校园网络系统服务器配置摘要,校园网网络应用服务器配置

    浅谈校园网网络应用服务器配置 摘要 以某校园网为例 在网络应用服务器设计这个环节中 我们分别用到了web服务器 ftp服务器 dns服务器 dhcp服务器 mail服务器 并且在一台已经安装了windows 2003 server的计算机上
  • 前端框架——React 学习总结,这篇7000字全解决

    React组件复用 React组件复用 把多个组件中部分功能相似或者相同的状态或者逻辑进行复用 复用 state和操作state的方法 复用的方式 render props模式 高阶组件 HOC render props模式 用childr
  • Mysql 时间转换 && 时间函数

    1 时间转换 涉及的函数 DATE FORMAT date format MySQL日期格式化函数 STR TO DATE str format MySQL字符串格式化为日期 UNIX TIMESTAMP MySQL其他数据转换为时间戳 F
  • Vue的antd多选下拉框增加全选操作

    因为antd的多选下拉框没有提供全选操作 我做了一个简易的全选操作 data return categoryList 存放获取到的分选数据 category 已选分类数据
  • QT信号槽的5种连接方式

    在面试中 这是一个经常被问到的问题点 也是刚刚上qt的工程师不会去注意的一个点 qt源代码定义的连接方式如下 1 Qt AutoConnection 一般信号槽不会写第五个参数 其实使用的默认值 使用这个值则连接类型会在信号发送时决定 如果
  • markdown编辑数学公式

    在输入数学公式的时候 需要在数学公式的前后加入 符号 将需要输入的公式加入到 中间 上下标 上标 下标 名称 数学表达式 markdown公式 上标 ab a b a b 下标 ab a b a b 分数 frac 第一个 写分子 第二个
  • React Native(RN)-组件生命周期

    生命周期简介 像 Android 开发一样 React Native RN 中的组件也有生命周期 Lifecycle 借用大神流程图 这张图很简洁直观地告诉我们 生命周期的整个流程以及阶段划分 第一阶段 getDefaultProps gt
  • 目标检测入门

    目录 R CNN 1 1提取候选区域 1 1 1合并规则 1 1 2多样化与后处理 1 2特征提取 1 2 1预处理 2 Fast RCNN 2 1RoI Pooling Layer Faster RCNN 结构 RPN anchor 目标