04目标检测-Two-stage的目标检测算法

news2024/12/28 20:59:43

目录

一、 深度学习目标检测算法介绍

二、 基于Two-stage的目标检测算法

 三、Two-stage基本流程

四、Two-stage常见算法

五、Two-stage核心组件 

1、Two-stage的两个核心组件

2、主干CNN网络设计原则

3、RPN网络

3.1 Faster R-CNN 网络结构

3.2 RPN(Region Proposal Networks)网络结构

3.2.1 整体理解:

3.2.2 详细介绍 :

A、利用区域推荐生成anchor

B、分类和边框回归

C、生成Proposal

D、ROI Pooling(可以理解为抠图+resize的操作)


一、 深度学习目标检测算法介绍

       在目标检测-传统检测方法中,我们介绍了目标检测中传统的算法和目标检测的方式,在目标检测-传统方法与深度学习算法对比中,我们对传统的目标检测算法和深度学习目标检测算法简单做了比较,此篇记录了深度学习目标检测算法内容,深入讲述一下深度学习算法在目标检测的原理和效果。而目标检测深度学习算法分为类两个阶段: 

  • One-stage(YOLO和SSD系列):直接回归目标位置。
  • Two-stage(Faster RCNN系列):利用RPN网络对候选区域进行推荐,即通过一个完整的卷积神经网完成检测过程。

       我们首先对Two-stage进行介绍。

二、 基于Two-stage的目标检测算法

       Two-stage的目标检测算法主要是通过一个完整的卷积神经网络
来完成目标检测的过程,进行目标检测时用到的特征就是CNN的特征,也就是通过一个CNN卷积神经网来提取对候选区域目标的特征的描述。

        对于Two-stage的目标检测算法最典型的代表就是2014年提出的提出R-CNN到faster RCNN的一系列算法。

       在训练过程中需要两个步骤:训练RPN网络、目标区域的网络训练。相对于传统的目标检测算法,不需要再进行训练分类器,不需要再做特征表示这个过程。整个过程都是从A到B的一个完整的卷积神经网络完成,同时精度得到提升。不过相比于one-stage慢些。

        上述描述可以总结为以下几点:

  • CNN卷积特征
  • R. Girshick et al., 2014提出R-CNN到faster RCNN
  • 端到端的目标检测(RPN网络)
  • 准确度高、速度相对one-stage慢

 三、Two-stage基本流程

       输入图片------对图片进行深度特征的提取(主干神经网络)------RPN网络完成滑动窗口所完成的任务,也就是产生候选区域,完成候选区域分类(背景和目标)对目标的位置进行初步定位-------为了不重复的计算CNN特征,通过roi_pooling完成抠图操作-----fc全连接层对候选区域进行表示----分类和回归对候选目标的类别判定和位置精修(得到物体的真实类别)
 

详细流程:

       首先输入一张图片,然后图片进行深度特征提取,也就是一幅图作为输入经过一个卷积神经网络,通常将其称为主干网络,典型的主干网络包括VGG、ResNet等一些经典的卷积神经网络,再然后通过一个RPN网络来完成传统目标检测算法中滑动窗口所完成的任务,也就是产生候选区域。在进行候选框区域提取的同时对候选框区域分类(分类过程中将候选框区域分类为背景和目标两种不同类别。在RPN网络产生候选区域的时候也会对目标的位置进行初步的预测,意味着RPN网络同时完成区域分类和位置精修两个环节。在得到候选区域之后,通过roi_pooling层对候选区域进一步精确进行位置回归和修正,可以将roi_pooling理解为抠图,接下来得到候选目标对应到feature map上的特征后,会通过一个fc层,来进一步对候选区域的特征进行表示,接下来通过分类和回归来分别完成对候选目标的类别的判定以及候选目标位置的精修,这里的类别不同于RPN网络的类别,这里通常会得到物体真实的类别,回归主要得到当前目标具体的坐标位置,通常表示为一个矩形框,即四个值(x,y,w,h)。

四、Two-stage常见算法

  • RCNN
  • Fast RCNN
  • Faster RCNN
  • Faster RCNN变种

五、Two-stage核心组件 

1、Two-stage的两个核心组件

       Two-stage有两个重要的核心组件是:

  • CNN网络(主干网络)
  • RPN网络

2、主干CNN网络设计原则

  • 从简单到复杂,再从复杂到简单的卷积神经网络

        简单的网络结构:比较经典的就是LeNet(具有一个输入层,两个卷积层,两个池化层,3个全连接层,但LeNet在大规模的任务中网络表达能力和抽象能力就相对弱一些)

       复杂的网络结构:经过LeNet又出现了LSNet、Resnet、Vgg等复杂的网络结构,这些网路结构往往是用来增加网络的深度,因为网络越深,非线性表达能力越强,得到物体更加抽象的表达,对于图像的变化敏感度越不敏感,鲁棒性越强,解决非线性任务能力越强,同时也会导致梯度消失或梯度弥散。其中最典型的是Resnet可是达到100多层的深度,再经典的就是GoogleNet。

  • 多尺度特征融合的网络
  • 更轻量级的CNN网络

       在设计时候考虑性能和模型大小,此时就需要用到轻量级的CNN网络,如经典的ShuffleNet、MobileNet等。

3、RPN网络

       在了解RPN网络前我们先了解一些相关概念区域推荐(Anchor机制)

       在了解了上述的Anchor机制后,我们详解讲解一下RPN网络。

       SPPnet、Fast R-CNN等目标检测算法已经大幅降低了目标检测网络的运行时间。可是尽管如此,仍然不能在工程上做到实时检测,这主要是因为region proposal computation耗时在整个网络用时中的占比较高。比如,Fast R-CNN如果忽略提取region proposals所花费的时间,就几乎可以做到实时性。为此,本文介绍了Region Proposal Network(RPN)用以解决该问题。经实验证实,应用该算法的系统在GPU上的处理速度可以达到5fps的帧率。

3.1 Faster R-CNN 网络结构

     

      上图展示了网络的大致结构。可以发现,Fast R-CNN网络分为两部分,一部分是Region Proposal Network(RPN),另一部分是Fast R-CNN。其中RPN包括图中proposals和conv layers,而detection network包括conv layers、ROI pooling及后面全连接层等部分。另外,conv layers被RPN和Fast R-CNN object detection network两部分共享。

3.2 RPN(Region Proposal Networks)网络结构

      RPN,从字面上理解区域候选网络,是用来生成候选区域的网络。

3.2.1 整体理解:

  • 区域推荐(Anchor机制)
  • 分类和回归
  • ROI Pooling

        图中原始图像(600*1000)经过主干网络(如ResNet、VGG16:它有13层可共享的卷积层、ZF:Zeiler and Fergus model 它有5层可共享的卷积层)共享卷积层后生成通道数为256的40x60的feature maps(也称共享Feature Maps)。这些feature maps被RPN网络和Fast R-CNN detector共享

        RPN网络的输入是对主干网络输出的通道数为256的40x60的feature maps,在这个特征参数的基础上,使用一个size为nxn(二维,一般是3x3)的空间滑动窗口feature maps(40x60x256)进行非标准的卷积运算strides=1,padding=(n-1)/2,单通道卷积核,运算和标准池化类似,运算前后通道数不变,计算结果仍然是40x60x256,即仍然是256个40x60的特征图。可以发现,每个位置通过卷积求得的特征是256-d(256维度),这就将每个滑动窗口都映射到一个256-d的低维特征。

       假如通过一个3×3的滑动窗口,在40x60的区域上进行滑动,可以产生40×60个3×3个可能含有目标的建议区域窗口,每个3×3的窗口的中心点都对应原始图片中一个目标区域的中心点,即滑动窗口的中心在image上对应一片区域(相当于中心位置的神经元在image上的感受野),计算出该区域的中心位置后以该位置为中心,以Faster R-CNN为例,设置了三种尺寸为(128x128,256x256,512x512)面积的box,每一个面积取三种不同的长宽比例(1:1,1:2,2:1),也就是每一个点会有9个anchor box。此时每个滑动窗口的中心点都对应9个anchor box,所以 40x60个3x3的滑动窗口的中心点对应的 anchor box 有 40x60x9 个anchor box。

        然后对每个特征向量做两次全连接操作,一个分支得到2个分数(前景和背景的置信度),
另一个分支得到4个坐标(目标的坐标框信息),4个坐标是指针对原图坐标的偏移。由于要对每个向量做同样的全连接操作,等同于对整个特征图做两次1 × 1的卷积,得到一个2 × 40 × 60和一个4 × 40 × 60大小的特征图。最终再结合预先定义的Anchors,完成后处理操作,得到候选框。 

3.2.2 详细介绍 :

      RPN网络可以分为这么几部分:

  • 利用区域推荐生成anchor
  • 对anchor进行二分类
  • 边框回归
  • 生成最终的Proposal
  • ROI pooling
A、利用区域推荐生成anchor

       anchor可以翻译为锚,这个anchor指的是输入图像上的点,是生成候选框的基础,有了anchor后就可以为每个anchor即每个锚点生成不同大小和长宽比的box,这些box就是anchor box,用这些box来覆盖输入图片中要检测的物体(当然,会生成很多很多的box, 在图片上密密麻麻的,需要后续的操作进行筛选)。筛选过后剩下的就是最终的Proposal。Proposal会给ROIPooling然后进行分类和回归(后面介绍)

       生成anchor box分为两步:

  • 第一先从Feature map的点对应回输入图像感受野的中心点;
  • 第二以该点为中心点创建不同面积和长宽比的box,这个也是输入图像上的box。
     

       从Feature map到图像中的anchor:FPN会用一个大小为3x3,padding=2,stride=1的卷积核遍历特征图(只取一个维度为例),这样就会将backbone输出的特征图中每一个点(也就是每一个值)都作为3x3的中心点遍历了一遍。

       遍历过程中会找到3x3窗口的中心点对应到输入图片的感受野的中心点,该点就是anchor。

       为什么可以对应会输入图片中的点呢?因为backbone中都是卷积和池化的操作。所以是可以将特征图中的点对应到原图的,也就是该点的感受野,感受野的计算这里就不再描述了。

       有了anchor点后就可以为每个点生成anchor box了,Faster R-CNN中设置了三种尺寸为(128^2,256^2,51^2)面积的box,每一个面积取三种不同的长宽比例(1:1,1:2,2:1),也就是每一个点会有9个anchor box。

B、分类和边框回归

       在第一步生成了很多很多的anchor box,后面就是要对这些anchor box进行分类和边框回归的操作。

       分类操作就是上图中上面的那个分支,首先通过一个1x1的卷积,将维度降为18(因为是9个框,每个框进行二分类),通过softmax进行二分类(框中有没有目标,也就是前景和背景),来生成后面的正负样本。

       边框回归的目的是使anchor box更接近ground truth。首先也会通过一个1x1的卷积,维度降为36(和之前的类似每个框四个值来确定)。

C、生成Proposal

       有了前面生成的anchor box后,下一步就是利用各种方法剔除我们不需要的那些box,主要分一下几步:

  • 第一步:先将anchor box利用feat_stride和im_info(这个里面保存了原始图像的大小,注意这个不是网络输入的图像,是原始图像)将box映射会原始图像,将严重超出边界的box剔除;
  • 第二步:按照上面说的二分类的分支得到的score得分进行排序,提取前2000个;
  • 第三步:对得到的2000个box执行NMS(非极大值抑制);
  • 第四步:将得到的结果再进行排序,取前300个作为最终的Proposal,给后面进行分类和回归。

D、ROI Pooling(可以理解为抠图+resize的操作)
  1. 根据输入image,将 ROI 映射到 feature map 对应位置;
  2. 将映射后的区域划分为相同大小的 sections(sections数量与输出的维度相同);
  3. 对每个 sections 进行 max pooling 操作;

       ROI Pooling是RPN网络中的一个层,对于这个层它的输入包括:特征图、rois(1×5×1×1)区域的坐标 以及 ROI参数(尺度标识,比如当前图像下采样了8倍,需要设置为1/8表示为原始的1/8,计算时就会按照这个比例从原始的feature map中进行抠图),rois这个坐标区域为什么是5个值呢?正常表示一个矩形四个值就够了(x,y,w,h)。第5个值放在第一个位置,表示当前的roi的信息所对应到的当前的batchsize中的哪一个图片,实际它是一个索引,这个索引表示了当前这个roi所对应到的特征图这个一整个的batchsize数据的第几个图片。因为对网络训练时通常会处理n张图,对于这样一个batchsize的数据,每一个roi需要知道对应的特征图是哪一张。  在经过了ROIPooling后会输出一个固定尺寸的feature map,这个固定尺寸具体是多大也由ROI参数来决定,比如将ROI参数设置为8*8,最终输出的feature map就为 m*c*8*8.     为什么要固定到同样的大小呢?因为如果后面要使用fc的话,如果特征图的大小是不一致的,在使用fc时会出错,因为fc的参数量是定的。

上一篇:03目标检测-传统方法与深度学习算法对比

下一篇:06目标检测-One-stage的目标检测算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1012325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装rsa依赖库出现ERROR: No matching distribution found for rsa

通过安装离线包的方式安装python-rsa依赖包,出现错误 执行命令(require 文件夹中是rsa-4.9.tar.gz文件,加粗,后面会用到)pip install --no-index --find-link./require -r ./requirements.txt,出现以下错误…

Linux(CentOS)安装msf

目录 一、安装MSF 1.1 在线安装 1.2 离线安装 二、安装Postgresql数据库 一、安装MSF 1.1 在线安装 需要挂梯子!挂完梯子需要reboot重启,多试几次就可以,国内网络我试了很久都不行。没条件没梯子的看1.2离线安装 cd /opt curl https://ra…

java springboot 如何实现小程序支付

今天给大家分享java小程序支付 首先我们学习任何东西要先看官网 下面是支付业务流程 我们具体用代码去实现上面的业务流程 功能截图 代码截图 pay(){//调用后台生成订单var orderNumber "20210101123456";var amount 0.01;WxPay.wxpay(app, amount, orderNumber…

Vue中的图像压缩与图片优化

Vue中的图像压缩与图片优化 在现代Web应用程序中,图像占据了大量的带宽和存储空间。因此,图像压缩和图片优化成为了开发者们不可或缺的任务之一。Vue.js作为一种流行的前端框架,提供了丰富的工具和生态系统,使图像处理变得更加简…

常用的管理方法论分享

在多年的软件研发团队管理过程中,我积累了一些方法,跟大家分享。 软件研发团队非常注重成本和效率,大多数管理者是从一线开发者升上去的。往往非常善于解决技术问题,但不知道如何管理下属,如何对待上级,如…

uniapp项目-HBuilderx打包问题

在项目中,有时候会有需求说要加一个文件前缀之类的, 比如:有些h5做映射时需要加一个项目名,那我们打包的时候就要在喷织文件做设置。 在manifest.json文件,把运行的基础路径改掉你所需要的就行了,默认d的是./

go开发之个人微信的二次开发

简要描述: 设置群公告 请求URL: http://域名地址/setChatRoomAnnouncement 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必…

短视频seo矩阵系统源码开发搭建--代用户发布视频能力

短视频SEO矩阵系统源码开发搭建的代用户发布视频能力,主要是指在系统平台上,允许用户将其创作的内容发布到指定的账号或平台,并设置好相关的标题、话题、锚点等信息。 一、搭建步骤及注意事项 确定使用场景。根据业务需求,确定该…

精品基于NET实现的课堂学分管理系统

《[含文档PPT源码等]精品基于NET实现的课堂学分管理系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具: 开发软件:VS 2017 (版本2017以上即可,不能低于2017) 数…

[qt]vs2022+qt5.13.2代码报错QChartView不明确

报错类似下面&#xff1a; 鼠标指上去错误代码显示QChartView不明确,解决方法 在xxx.ui对应的头文件包含”ui_xxx.h“的前方添加如下代码&#xff1a; #include <qchart.h> QT_CHARTS_USE_NAMESPACE

人力资源服务升级正当时,法大大助力佩信集团加速数字化

人力资源服务业是现代服务业的一个重要门类&#xff0c;在促进就业创业、提供人才服务方面发挥重要作用。同时面对产业转型升级、平台经济快速发展、企业用工成本提高等新形势&#xff0c;发展人力资源服务业对于促进社会化就业、更好发挥我国人力资源优势、服务经济社会发展具…

制定有效的开发规范:提升团队协作和代码质量的关键策略

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 引言 在现代软件开发中…

python基础复习-基本语法元素

目录 基础语法元素列表元组字典集合 变量名规范赋值方式输入输出程序格式注释 基础语法元素 列表 序列类型a[1,2,3,4,5]元素有位置顺序&#xff0c;通过位置访问&#xff1a;a[0] 元组 序列类型元素不支持修改&#xff08;元组&#xff1a;不可变的列表&#xff09;a(1,2,3…

SpringBoot-插件化以及springboot扩展接口

插件化常用的实现思路 spi机制&#xff0c;Service Provider Interface &#xff0c;是JDK内置的一种服务发现机制&#xff0c;SPI是一种动态替换扩展机制约定配置和目录&#xff0c;利用反射配合实现springboot中的Factories机制Java agent&#xff08;探针&#xff09;技术S…

深度对话|Sui在商业技术堆栈中的地位

近日&#xff0c;我们采访了Mysten Labs的商业产品总监Lola Oyelayo-Pearson&#xff0c;共同探讨了区块链技术如何为企业提供商业服务&#xff0c;以及为什么Sui特别适合这些用例。 1.请您简要介绍一下自己、您的角色以及您是如何开始涉足Web3领域的&#xff1f; 目前&#…

进程属性/进程状态

task_struct-PCB的一种 在Linux中描述进程的结构体叫做task_struct。进程也叫任务 task_struct是Linux内核的一种数据结构&#xff0c;它会被装载到RAM(内存)里并且包含着进程的信息。 task_ struct内容分类 标示符: 描述本进程的唯一标示符&#xff0c;用来区别其他进程。 …

通过篡改cred结构体实现提权利用

前言 在之前的HeapOverflow文章中&#xff0c;作者还构造了任意地址读写的操作&#xff0c;使用了任意地址读写去进行提权&#xff0c;还挺有意思的&#xff0c;记录一下如何利用任意地址读写进行提权。 作者利用任意地址读写分别改写modprobe_path以及cred结构体去实现提权的…

JavaEE初阶(5)多线程案例(定时器、标准库中的定时器、实现定时器、线程池、标准库中的线程池、实现线程池)

接上次博客&#xff1a;JavaEE初阶&#xff08;4&#xff09;&#xff08;线程的状态、线程安全、synchronized、volatile、wait 和 notify、多线程的代码案例&#xff1a;单例模式——饿汉懒汉、阻塞队列&#xff09;_di-Dora的博客-CSDN博客 目录 多线程案例 定时器 标准…

Go语言在人工智能时代的崭露头角:为何越来越多公司选择使用Go语言?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to Golang Language.✨✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1…

ABB机器人常用指令功能说明

ABB机器人常用指令功能说明 一、 程序控制 程序的调用 例行程序内的逻辑控制 停止程序执行 二、 变量指令 变量指令主要用于以下方面:  对数据进行赋值  等待指令  注释指令  程序模块控制指令 赋值指令 等待指令