IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 计算机视觉之R-CNN Fast R-CNN Faster R-CNN目标检测 -> 正文阅读

[人工智能]计算机视觉之R-CNN Fast R-CNN Faster R-CNN目标检测

一、目标检测

1.1 概念

  • 定位和分类:对于仅有一个目标的图片,检测出该目标所处的位置及该目标的类别;
  • 目标检测:对于有多个目标的图片,检测出所有目标所处的位置及类别;
  • 下图左侧为定位和分类任务,右侧为目标检测任务;
    在这里插入图片描述

1.2 定位+分类

  • 对于输入图片,定位任务需要返回图片中目标的外界矩阵框,即目标的 ( x , y , w , h ) (x, y, w, h) (x,y,w,h)四元组,四元组的预测可看做回归任务;
  • 分类任务要识别目标的类别;
    在这里插入图片描述
    在这里插入图片描述
  • 定位+分类的具体步骤如下:
    1)训练或下载一个分类模型,例如Alexnet、VGGNet,Resnet;
    2)在分类网络最后一个卷积层的特征层(feature map)上添加"Regression head";
    3)同时训练"Classification head"和"Regression head",为了同事训练分类和回归问题,最终损失函数是分类和定位两个"head"产生的损失的加权和;
    4)最终使用分类和回归的两个"head"得到分类+定位的结果,分类预测的结果是 C C C个类别,回归预测结果分两种:一种与类别无关,输出4个值;一种是类别相关,输出 4 ? C 4*C 4?C个值。
    在这里插入图片描述

1.3 目标检测

  • 目标检测需要获取图片中所有目标的位置及类别,当图片中只有一个目标时,"Regression head"预测4个值,当图片中有三个目标时,"Regression head"预测12个值,当图片中有多个目标时,"Regression head"要预测较多的值;
  • 基于上述问题,提出两种解决方案:
    1)使用滑窗的方法解决,需要设计大量的不同尺度和长宽比的“滑窗”来使它们通过CNN,此方法计算量巨大,暂不采纳;
    2)使用一种从图片中选出潜在物体候选框(Region of Interest,ROI)的方法selective search,基于此方法提出了RCNN。

1.4 R-CNN(Region-CNN)

  • RCNN训练过程如图所示:
    在这里插入图片描述
  • 训练步骤如下
    1)选出潜在目标候选框ROI:基于selective search方法生成2000个潜在物体候选框ROI,然后对每个候选框Resize成固定大小;
    2)训练一个特征提取器:采用AlexNet、VGGNet、GoolgeNet、ResNet等CNN模型提取一个4096维的特征向量,得到最后一个特征向量;
    为了获得一个较好的特征提取器,一般在模型上做微调,唯一的改动就是将模型的1000个类别输出改为 ( C + 1 ) (C+1) (C+1)个输出,其中 C C C为真实预测的类别数, 1 1 1是背景的类别,新的特征训练方法采用随机梯度下降法SGD进行训练,提取训练好的模型的最后一个特征层;
    衡量正负样本的指标IOU(Intersection Over Union),就是两个矩形面积的交集除以并集,假定两个矩阵框中,1个矩形表示ROI,两一个矩形表示真实的矩形框,当 R O I ≥ 0.5 ROI\ge 0.5 ROI0.5时,认为两个矩形基本相交,认为是正样本;其余为负样本;
    在这里插入图片描述
    至此RCNN的特征提取器就开始训练了,训练过程中要对正负样本进行采样,训练中正样本太少会导致正负样本不平衡,最终提取一个4096维的特征向量;
    3)训练最终分类器:将特征向量送入SVM分类器中,预测出框选区域中多含物体属于每个类的概率值(每个类别单独训练一个SVM,判断是否属于这个类别,属于是positive,反之nagative),RCNN提出者最终选择真实值的矩阵框作为正样本;
    4)训练回归模型:对于每一个类,训练一个线性回归模型,来微调ROI与真实矩形框位置和大小的偏差;
    在这里插入图片描述
  • 计算IOU代码如下所示:
def cal_IOU(boxA, boxB):
    A_xmin = boxA[0]
    A_ymin = boxA[1]
    A_xmax = boxA[2]
    A_ymax = boxA[3]
    A_width = A_xmax - A_xmin
    A_height = A_ymax - A_ymin

    B_xmin = boxB[0]
    B_ymin = boxB[1]
    B_xmax = boxB[2]
    B_ymax = boxB[3]
    B_width = B_xmax - B_xmin
    B_height = B_ymax - B_ymin

    xmin = min(A_xmin, B_xmin)
    ymin = min(A_ymin, B_ymin)
    xmax = max(A_xmax, B_xmax)
    ymax = max(A_ymax, B_ymax)

    A_B_width_and = (A_width + B_width) - (xmax - xmin)  # 宽的交集
    A_B_height_and = (A_height + B_height) - (ymax - ymin)  # 高的交集

    if A_B_width_and <= 0.0001 or A_B_height_and <= 0.0001:
        return 0

    area_and = A_B_width_and * A_B_height_and
    area_or = A_width * A_height + B_width * B_height
    IOU = area_and / (area_or - area_and)

    return IOU

if __name__ == '__main__':
    rect1 = (661, 27, 679, 47)
    rect2 = (662, 27, 682, 47)
    iou = cal_IOU(rect1, rect2)
    print("IOU={:.4f}".format(iou))

#结果
IOU=0.8095
  • 预测步骤如下
    1)使用selective search方法生成2000个ROI;
    2)所有ROI调整为特征提取网络所需的输入大小并进行特征提取,得到与2000个ROI对应的2000个4096维的特征向量;
    3)将2000个特征向量分别输入到SVM中,得到每个ROI预测类别;
    4)通过回归网络微调ROI的位置;
    5)最终使用极大值抑制(Non-MaximumSuppression, NMS)方法对同一类别的ROI进行合并得到最终检测结果。NMS的原理是得到每个矩形框的分数(置信度),如果两个矩形框的IOU超过指定阈值,则仅保留分数大的那个矩形框。

1.5 Fast R-CNN

1.5.1 R-CNN缺点

  • 2000个ROI的CNN特征提取占用大量时间;
  • CNN特征不会因为SVM和回归的调整而更新;
  • R-CNN训练流程复杂,并不是端到端的训练过程(因为R-CNN首先进行2000个ROI的提取,将提取的结果再放进CNN中进行特征提取和后续训练,是2个步骤,并不是端到端的训练);

1.5.2 SPP Net (Spatial Pyramid Pooling空间金字塔池化)

  • 要解决的问题:
    1)一般CNN后接全连接层或者分类器,他们都需要固定的输入尺寸,因此不得不对输入数据进行裁剪,这些预处理会造成数据的丢失或几何的失真。SPP Net的第一个贡献就是将金字塔思想加入到CNN,在卷积层和全连接层之间加入了SPP layer。此时网络的输入可以是任意尺度的,不需要在特征提取前对图像做resize操作,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的
    在这里插入图片描述
    假设原图输入是224x224,对于conv5出来后的输出是13x13x256的,可以理解成有256个这样的filter,每个filter对应一张13x13的reponse map。如果像上图那样将reponse map分成1x1(金字塔底座),2x2(金字塔中间),4x4(金字塔顶座)三张子图,分别做max pooling后,出来的特征就是(16+4+1)x256 维度。如果原图的输入不是224x224,出来的特征依然是(16+4+1)x256维度。这样就实现了不管图像尺寸如何 池化n 的输出永远是 (16+4+1)x256 维度。
  • 单层sppnet的网络层,叫做ROI Pooling。

1.5.3 Fast R-CNN原理

在这里插入图片描述

  • 训练过程如上图所示,步骤如下:
    1)将整张图片及划分好的ROI直接输入到全卷积的CNN中,此时整张图片进行全卷积操作,不需要对ROI进行全卷积操作,卷积后得到特征层和对应在特征层上的ROI(此时ROI可以根据其集合位置加卷积公式推导得出);
    2)为了保证FCs(全连接层)输入尺寸一致,而特征层上的ROI尺寸大小不一,所以要经过ROI Pooling层处理,经过ROI Pooling层后转换为尺寸一致的特征向量(及调整为 M ? N M*N M?N);
    3)经过ROI Pooling层后,全部的2000个 M ? N M*N M?N个训练数据通过全连接层并分别经过2个head:Softmax分类及L2回归,最终损失函数是分类和回归损失函数的加权和。
  • 测试过程如下图所示。
    在这里插入图片描述
    重点:
    1)R-CNN一大缺点:由于每一个候选框都要独自经过CNN,这使得花费的时间非常多。
    解决:共享卷积层,现在不是每一个候选框都当做输入进入CNN了,而是输入一张完整的图片,在第五个卷积层再得到每个候选框的特征
    2)原来的方法:许多候选框(比如两千个)–>CNN–>得到每个候选框的特征–>分类+回归
    现在的方法:一张完整图片–>CNN–>得到每张候选框的特征–>分类+回归
    3)所以容易看见,Fast RCNN相对于RCNN的提速原因就在于:不像RCNN把每个候选区域给深度网络提特征,而是整张图提一次特征,再把候选框映射到conv5上,而SPP只需要计算一次特征,剩下的只需要在conv5层上操作就可以了。

在性能上提升也是相当明显的:
在这里插入图片描述

1.6 Faster R-CNN

1.6.1 Fast R-CNN缺点

  • 选择性搜索selective search,找出所有的候选框,这个也非常耗时。
    解决:加入一个提取边缘的神经网络,即选择候选框ROI的工作也交给神经网络来做了。做这样的任务的神经网络叫做Region Proposal Network(RPN)

1.6.2 RPN网络原理

  • RPN网络具体做法:
      ? 将RPN放在最后一个卷积层的后面;
      ? RPN直接训练得到候选区域;
  • RPN的核心思想是:构建一个小的全卷积网络,对于任意大小的图片,输出ROI的具体位置及该ROI是否为目标,RPN网络在卷积神经网络的最后一个特征上滑动。
  • 如下图a)所示,最下面灰色的网络为卷积神经网络的特征层,红框表示RPN的输入,大小是 3 ? 3 3*3 3?3,而后连接到256维的向量上。这个 3 ? 3 3*3 3?3的窗口滑动经过整个特征层,并且每次计算都经过256维的向量并最终输出2个结果: 3 ? 3 3*3 3?3滑动窗口中是否有物体,以及该滑动窗口对应物体的矩阵框位置对应的4个值
  • b)图为将网络转化为正向立面进行计算的过程表示;
    在这里插入图片描述
  • 为了适应更多形状的物体,RPN定义了 K K K种不同尺度的滑窗,统一用 3 ? 3 3*3 3?3的滑窗难以满足多种情况,此时定义一个专业名词anchor(anchor:译为锚点,位于 n ? n n*n n?n窗口的中心处),每个anchor都以特征层(feature map)上的像素点为中心并且根据其尺寸大小进行后续计算的。在Faster R-CNN论文中,滑窗在特征层的每个位置使用3种大小和3种比例,共有 3 ? 3 = 9 3*3=9 3?3=9个anchor,如上图中 n = 9 n=9 n=9
  • 针对分类任务,对于滑窗产生的每一个anchor都计算该anchor与真实标记矩阵框的IOU,当 I O U ≥ 0.7 IOU\ge0.7 IOU0.7时,便认为该anchor包含目标;当 I O U ≤ 0.3 IOU\le0.3 IOU0.3时,便认为该anchor不包含目标;当IOU介于0.3~0.7时,则不参与网络训练的迭代过程。
  • 针对回归任务,需要预测anchor中心点的横、纵坐标以及anchor的宽、高,学习目标为anchor与真实box在四个值上的偏移,RPN为一个全卷机网络,可以用随机梯度下降SGD的方式进行端到端的训练。
  • 需要注意的是,训练过程中与真实目标矩阵框相交的 I O U ≥ 0.7 IOU\ge 0.7 IOU0.7的anchor并不多,绝大多数都是负样本,因此会导致正负样本比例严重失衡。因此在RPN训练过程中,对每个batch进行随机采样(若每个batch样本数为256)并保持正负样本比例为1:1,而当正样本数量小于128时,去全部正样本,其余的则随机使用负样本进行补全。

1.6.3 Faster R-CNN原理

  • Faster R-CNN训练过程如下图所示,训练步骤为:
    1)使用对整张图片输进CNN,得到feature map;
    2)卷积特征输入到RPN,得到候选框的特征信息;
    3)对候选框中提取出的特征,输入ROI Pooling层变换为尺寸大小一致的候选特征;
    4)将变换后的特征使用分类器判别是否属于一个特定类;
    5)对于属于某一特征的候选框,用回归器进一步调整其位置。
    在这里插入图片描述

1.7 总结各大算法步骤

参考网址:https://www.cnblogs.com/skyfsm/p/6806246.html
RCNN:
  1. 在图像中确定约2000个候选框 (使用选择性搜索);
  2. 每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取 ;
  3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类;
  4. 对于属于某一特征的候选框,用回归器进一步调整其位置。

Fast RCNN:
  1. 在图像中确定约2000个候选框 (使用选择性搜索);
  2. 对整张图片输进CNN,得到feature map;
  3. 找到每个候选框在feature map(即经过conv5后的特征层称为feature map)上的映射候选框,将此候选框作为每个候选框的卷积特征输入到SPP layer和之后的层;
  4. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类;
  5. 对于属于某一特征的候选框,用回归器进一步调整其位置。

Faster RCNN:
  1. 对整张图片输进CNN,得到feature map;
  2. 卷积特征输入到RPN,得到候选框的特征信息;
  3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类;
  4. 对于属于某一特征的候选框,用回归器进一步调整其位置。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 09:57:29  更:2022-05-14 09:58:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:58:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码