当前位置: 首页 > news >正文

《目标检测》R-CNN网络基础(RCNN,Fast-RCNN)

文章目录

  • 1.Overfeat模型
  • 2.RCNN网络
    • 2.1 算法流程
      • 2.1.1 候选区域的生成(了解,已经不再使用了)
      • 2.1.2 CNN网络提取特征
      • 2.1.3 目标分类(SVM)
      • 2.1.4 目标回归(线性回归修正坐标)
      • 2.1.5 预测过程
    • 2.2 算法总结
  • 3.Fast RCNN模型
    • 3.1 算法流程
      • 3.1.1 ROI Pooling
      • 3.1.2 ⽬标分类和回归
    • 3.2 模型训练
    • 3.3 模型预测
    • 3.4 模型总结

学习目标:

  • 了解Overfeat模型的移动窗口方法
  • 了解RCNN目标检测的思想
  • 了解fastRCNN目标检测的思想
  • 知道多任务损失

1.Overfeat模型

Overfeat⽅法使⽤滑动窗⼝进⾏⽬标检测,也就是使⽤滑动窗⼝和神经⽹络来检测⽬标。滑动窗⼝使⽤ 固定宽度和高度 的矩形区域,在图像上“滑动”,并将扫描结果送⼊到神经⽹络中进⾏分类和回归。
例如要检测汽⻋,就使⽤下图中红⾊滑动窗⼝进⾏扫描,将所有的扫描结果送⼊⽹络中进⾏分类和回归,得到最终的汽⻋的检测结果。
在这里插入图片描述
这种⽅法类似⼀种暴⼒穷举的⽅式,会消耗⼤量的计算⼒,并且由于窗⼝⼤⼩问题可能会造成效果不准确。

2.RCNN网络

2014年提出R-CNN⽹络,该⽹络不再使⽤暴⼒穷举的⽅法,⽽是使⽤候选区域方法(region proposal method)创建⽬标检测的区域来完成⽬标检测的任务,R-CNN是以深度神经⽹络为基础的⽬标检测的模型 ,以R-CNN为基点,后续的Fast R-CNN、Faster R-CNN模型都延续了这种⽬标检测思路。

2.1 算法流程

RCNN的流程如下图所示:
在这里插入图片描述
Step:

  1. 候选区域⽣成:使⽤选择性搜索(Selective Search)的⽅法找出图⽚中可能存在⽬标的侯选区域
  2. CNN⽹络提取特征:选取预训练卷积神经⽹⽹络(AlexNet或VGG)⽤于进⾏特征提取。
  3. ⽬标分类:训练⽀持向量机(SVM)来辨别⽬标物体和背景,对每个类别,都要训练⼀个⼆元SVM。
  4. ⽬标定位:训练⼀个线性回归模型,为每个辨识到的物体⽣成更精确的边界框。

2.1.1 候选区域的生成(了解,已经不再使用了)

在选择性搜索(SelectiveSearch,SS)中,使⽤语义分割的⽅法,它将颜⾊、边界、纹理等信息作为合并条件,采⽤多尺度的综合⽅法,将图像
在像素级上划分出⼀系列的区域,这些区域要远远少于传统的滑动窗⼝的穷举法产⽣的候选区域。
在这里插入图片描述
SelectiveSearch在⼀张图⽚上提取出来约2000个侯选区域,需要注意的是这些候选区域的⻓宽不固定。 ⽽使⽤CNN提取候选区域的特征向量,
需要接受固定⻓度的输⼊,所以需要对候选区域做⼀些尺⼨上的修改。

根据图像像素点的相似性,分割成不同的子区域,获取外包矩形。

2.1.2 CNN网络提取特征

采⽤预训练模型(AlexNet或VGG)在⽣成的候选区域上进⾏特征提取,将提取好的特征保存在磁盘中,⽤于后续步骤的分类和回归。
在这里插入图片描述

  1. 全连接层的输⼊数据的尺⼨是固定的,因此在将候选区域送⼊CNN⽹络中时,需进⾏裁剪或变形为固定的尺⼨,在进⾏特征提取。
  2. 预训练模型在ImageNet数据集上获得,最后的全连接层是1000,在这⾥我们需要将其改为N+1(N为⽬标类别的数⽬,例如VOC数据集中N=20,coco数据集中N=80,1是加⼀个背景)后,进⾏微调即可。
    在这里插入图片描述
  3. 利⽤微调后的CNN⽹络,提取每⼀个候选区域的特征,获取⼀个4096维的特征,⼀幅图像就是2000x4096维特征存储到磁盘中。

2.1.3 目标分类(SVM)

SVM是一个二分类分类器,实现多分类时需要使用多个SVM来完成,用来判断每个候选区域的类别。

利⽤微调后的CNN⽹络,提取每⼀个候选区域的特征,获取⼀个4096维的特征,⼀幅图像就是2000x4096维特征存储到磁盘中。
在这里插入图片描述
对于N个类别的检测任务,需要训练N(⽬标类别数⽬)个SVM分类器,对候选区域的特征向量(4096维)进行二分类,判断其是某⼀类别的⽬标,还是背景来完成⽬标分类。

2.1.4 目标回归(线性回归修正坐标)

通过选择性搜索获取的⽬标位置不是⾮常的准确,实验证明,训练⼀个线性回归模型在给定的候选区域的结果上去预测⼀个新的检测窗⼝,能够获得更精确的位置。修正过程如下图所示:
在这里插入图片描述
通过训练⼀个回归器来对候选区域的范围进⾏⼀个调整,这些候选区域最开始只是⽤选择性搜索的⽅法粗略得到的,通过调整之后得到更精确的位置,如下所示:
在这里插入图片描述
红色框表示候选区域生成的结果(SS),绿色的时标注框(真实结果),蓝色框时经过线性回归模型(wx+b变换)后的框,我们的目的是修正候选区域(绿色),不断靠近真实框(绿色)。

目的:训练一个线性回归模型,用这个模型修正这个候选区域,得到一个更精确的结果。

2.1.5 预测过程

使⽤选择性搜索的⽅法从⼀张图⽚中提取2000个候选区域,将每个区域送⼊CNN⽹络中进⾏特征提取,然后送⼊到SVM中进⾏分类,并使⽤候选
框回归器,计算出每个候选区域的位置。 候选区域较多,有2000个,需要剔除掉部分检测结果。 针对每个类,通过计算IOU,采取⾮最⼤值抑制
NMS的⽅法,保留⽐较好的检测结果。

2.2 算法总结

  1. 训练阶段多,训练耗时: 微调CNN⽹络+训练SVM+训练边框回归器。
  2. 预测速度慢: 使⽤GPU, VGG16模型处理⼀张图像需要47s。
  3. 占⽤磁盘空间⼤:5000张图像产⽣⼏百G的特征⽂件。
  4. 数据的形状变化:候选区域要经过缩放来固定⼤⼩,⽆法保证⽬标的不变形

3.Fast RCNN模型

考虑到R-CNN存在的问题,2015年提出了⼀个改善模型:Fast R-CNN。相⽐于R-CNN, Fast R-CNN主要在以下三个⽅⾯进⾏了改进:

  1. 提⾼训练和预测的速度:R-CNN⾸先从测试图中提取2000个候选区域,然后将这2000个候选区域分别输⼊到预训练好的CNN中提取特征。由于候选区域有⼤量的重叠,这种提取特征的⽅法,就会重复的计算重叠区域的特征。在Fast-RCNN中,将整张图输⼊到CNN中提取特征,将候选区域映射到特征图上,这样就避免了对图像区域进⾏重复处理,提⾼效率减少时间。
  2. 不需要额外的空间保存CNN⽹络提取的特征向量:RCNN中需要将提取到的特征保存下来,⽤于为每个类训练单独的SVM分类器和边框回归器。在Fast-RCNN中,将类别判断和边框回归统⼀使⽤CNN实现,不需要在额外的空间存储特征。
  3. 不在直接对候选区域进⾏缩放:RCNN中需要对候选区域进⾏缩放送⼊CNN中进⾏特征提取,在Fast-RCNN中使⽤ROIpooling的⽅法进⾏尺⼨的调整。

3.1 算法流程

Fast-RCNN的流程如下图所示:
在这里插入图片描述
Step:

  1. 候选区域⽣成:使⽤选择性搜索(Selective Search)的⽅法找出图⽚中可能存在⽬标的侯选区域,只需要候选区域的位置信息
  2. CNN⽹络特征提取:将整张图像输⼊到CNN⽹络中,得到整副图的特征图,并将上⼀步获取的候选区域位置从原图映射到该特征图上
  3. ROIPooling: 对于每个特征图上候选框,RoI pooling层从特征图中提取固定⻓度的特征向量每个特征向量被送⼊⼀系列全连接(fc)层中。
  4. ⽬标检测:分两部分完成,⼀个输出各类别加上1个背景类别的Softmax概率估计,另⼀个为各类别的每⼀个类别输出四个实数值,来确定⽬标的位置信息。

第一步是一样的,不在赘述。但是第二步在CNN网络提取时,我们是把整幅图像送到预训练模型中进行特征提取的。

3.1.1 ROI Pooling

候选区域从原图映射到特征图中后,进⾏ROI Pooling的计算,如下图所示:
在这里插入图片描述
Step:

  1. 将候选框区域映射到特征图中得到对应的候选框
  2. 对每一个特征图中的候选框进行POI Pooling(将候选框划分成HW的子网格,H和W都是超参数,在每个子网格中取最大值,之后我们就获取了HW的特征图,再送入到网络中)

ROI Pooling层使⽤最⼤池化将输⼊的特征图中的任意区域(候选区域对应的区域)内的特征转化为固定的𝐻×𝑊的特征图,其中𝐻和𝑊是超参数。
对于任意输⼊的ℎ×𝑤的候选区域,将其分割为𝐻×𝑊的⼦⽹格,每个⼦⽹格的⼤⼩为:(h/H) x (w/W),取每个⼦⽹格中的最⼤值,送⼊后续⽹络中进⾏处理。
在这里插入图片描述
使⽤ROI Pooling层替换预训练⽹络中最后的池化层,并将并将超参𝐻,𝑊设置为和⽹络第⼀个全连接兼容的值,例如VGG16,设𝐻=𝑊=7。

3.1.2 ⽬标分类和回归

原⽹络的最后⼀个全连接层替换为两个同级层:K+1个类别的SoftMax分类层和边框的回归层。

3.2 模型训练

R-CNN中的特征提取和检测部分是分开进⾏的,Fast R-CNN提出⼀个⾼效的训练⽅法:多任务训练。

Fast R-CNN有两种输出:

  1. ⼀部分输出在K+1个类别上的离散概率分布(每个候选区域), p = ( p 0 , p 1 , . . . , p k ) p=(p0,p1,...,pk) p=(p0,p1,...,pk)。通常,通过全连接层的K+1个输出上的Softmax来计算概率值。
  2. 另⼀部分输出对于由K个类别中的每⼀个检测框回归偏移, t k = ( t x k , t y k , t w k , t h k ) t^{k}=(t{x}^{k},t{y}^{k},t{w}^{k},t{h}^{k}) tk=(txk,tyk,twk,thk)。其中 t k t_k tk指定相对于候选框的尺度不变转换和对数空间⾼度/宽度移位。

将上⾯的两个任务的损失函数放在⼀起:
在这里插入图片描述
p0表示的是背景,所以我们只计算u>=1的。

联合训练fast-RCNN⽹络。具体的我们在后续给⼤家进⾏介绍。

3.3 模型预测

Fast-RCNN的⼯作流程描述如下:

输入的图像
在这里插入图片描述
图像被送⼊到卷积⽹络进⾏特征提取,将通过选择性搜索获取的候选区域映射到特征图中:
在这里插入图片描述
在特征图上Rol中应⽤RoIPooling,获取尺⼨相同的特征向量
在这里插入图片描述
将这些区域传递到全连接的⽹络中进⾏分类和回归,得到⽬标检测的结果。
在这里插入图片描述

3.4 模型总结

Fast R-CNN是对R-CNN模型的⼀种改进:

  1. CNN⽹络不再对每个候选区域进⾏特征提取,⽽是直接对整张图像进⾏特征提取,这样减少了很多重复计算。
  2. ⽤ROI pooling进⾏特征的尺⼨变换,来满⾜FC全连接层对输⼊数据尺度的要求。
  3. 将⽬标的回归和分类统⼀在⼀个⽹络中,使⽤FC+softmax进⾏⽬标分类,使⽤FC Layer进⾏⽬标框的回归。

在Fast R-CNN中使⽤的⽬标检测识别⽹络,在速度和精度上都有了不错的结果。不⾜的是,其候选区域提取⽅法耗时较⻓,⽽且和⽬标检测⽹络
是分离的,并不是端到端的,在2016年⼜提出了Faster-RCNN模型⽤于⽬标检测。

相关文章:

《目标检测》R-CNN网络基础(RCNN,Fast-RCNN)

文章目录 1.Overfeat模型2.RCNN网络2.1 算法流程2.1.1 候选区域的生成(了解,已经不再使用了)2.1.2 CNN网络提取特征2.1.3 目标分类(SVM)2.1.4 目标回归(线性回归修正坐标)2.1.5 预测过程 2.2 算…...

iOS中的定位实现(逆地理编码)及Info.plist位置权限详解

引言 在现代移动应用开发中,位置服务已经成为不可或缺的一部分。无论是地图导航、社交分享,还是基于位置的个性化推荐,位置数据都为用户提供了更加丰富和智能的体验。然而,随着用户隐私保护的不断加强,iOS对位置权限的…...

【从零开始的LeetCode-算法】3270. 求出数字答案

给你三个 正 整数 num1 &#xff0c;num2 和 num3 。 数字 num1 &#xff0c;num2 和 num3 的数字答案 key 是一个四位数&#xff0c;定义如下&#xff1a; 一开始&#xff0c;如果有数字 少于 四位数&#xff0c;给它补 前导 0 。答案 key 的第 i 个数位&#xff08;1 < …...

Web认证机制 Cookie、Token、Session、JWT、OAuth2 解析

标题 一、Cookie二、Session三、Token四、JWTSSO&#xff08;单点登录&#xff09; 五、OAuth2如何设计权限系统区别总结 Cookie、Token、Session 和 JWT 都是在 Web 开发中常用的身份验证和授权技术&#xff0c;它们各有优缺点&#xff0c;适用于不同的场景。 Cookie 简单易用…...

Docker 基础命令介绍和常见报错解决

介绍一些 docker 可能用到的基础命令&#xff0c;并解决三个常见报错&#xff1a; 权限被拒绝&#xff08;Permission Denied&#xff09;无法连接到 Docker 仓库&#xff08;Timeout Exceeded&#xff09;磁盘空间不足&#xff08;No Space Left on Device&#xff09; 命令以…...

如何轻松导出所有 WordPress URL 为纯文本格式

作为一名多年的 WordPress 使用者&#xff0c;我深知管理一个网站的复杂性。从迁移网站、设置重定向到整理内容结构&#xff0c;每一步都需要精细处理。而拥有所有 URL 的清单&#xff0c;不仅能让这些工作变得更加简单&#xff0c;还能为后续的管理提供极大的便利。其实&#…...

【进程概念精讲】

Susan,在那命运月台前面&#xff0c;再上车&#xff0c;春天开始落叶.................................................................. 文章目录 前言 一、【认识进程】 1、【进程基本概念引入】 2、【进程的描述与组织——进程控制块&#xff08;PCB&#xff09;与进程…...

帽子矩阵--记录

帽子矩阵 H是一个重要的统计工具&#xff0c;用于评估数据点对模型拟合结果的影响。通过计算帽子矩阵的对角线元素&#xff08;杠杆值&#xff09;&#xff0c;我们可以识别出高杠杆点&#xff0c;这些点对模型的影响较大&#xff0c;可能需要特别关注。...

MySQL深入:B+树的演化、索引和索引结构

提示&#xff1a;内容是读《MySQL技术内幕&#xff1a;InnoDB存储引擎》&#xff0c;笔记摘要 文章目录 二叉查找树平衡二叉树(AVL) B树(BTree)B树(BTree)InnoDB B树索引索引结构&#xff08;InnoDB B树&#xff09;B树存放的数据量 二叉查找树 在二叉查找树中&#xff0c;左子…...

axios 实现 无感刷新方案

实现思路 首次登录前端通过接口获取到两个 token&#xff1b;分别是 accessToken、refreshToken; accessToken&#xff1a;正常请求需要传递的 token &#xff1b;refreshToken&#xff1a;当某个请求 401 &#xff0c;就可以通过 refreshToken 获取到新的 accessToken 特殊场…...

Python 三种方式实现自动化任务

在这篇文章中&#xff0c;我们将介绍一些用Python实现机器人过程自动化的包。机器人流程自动化&#xff08;Robotic process automation&#xff0c;简称RPA&#xff09;是指将鼠标点击和键盘按压自动化的过程&#xff0c;即模拟人类用户的操作。RPA用于各种应用程序&#xff0…...

新型创业模式:退休创业。没有工资,不用投资,有时间就干,不强制做,赚钱按贡献分。

这种“退休创业”的创业模式具有独特的吸引力和灵活性&#xff0c;适合那些已退休但希望继续贡献社会价值、赚取额外收入且无需承担太多责任的群体。以下是一个详细的设计思路&#xff1a; 模式概述 目标人群&#xff1a;退休人员&#xff0c;具有一定技能或经验&#xff0c;但…...

Android 项目依赖库无法找到的解决方案

目录 错误信息解析 解决方案 1. 检查依赖版本 2. 检查 Maven 仓库配置 3. 强制刷新 Gradle 缓存 4. 检查网络连接 5. 手动下载依赖 总结 相关推荐 最近&#xff0c;我在编译一个 Android 老项目时遇到了一个问题&#xff0c;错误信息显示无法找到 com.gyf.immersionba…...

在Node.js中如何使用TypeScript

第一步&#xff1a;创建一个Node.js项目的package.json文件 npm init -y第二步&#xff1a;添加TypeScript、添加node.d.ts npm install typescript -D npm install types/node -D第三步&#xff1a;初始化一个tsconfig.json文件 npx tsc --init --rootDir src --outDir lib…...

链表两数加python

一、问题描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个…...

免费的可以薅羊毛的cloudflare反向代理教程

cloudflare-reverse-proxy 项目代码: https://github.com/EASTCATV/cloudflare-reverse-proxy 本项目是cloudflare反向代理。在cloudflare网站中新建worker&#xff0c;把worker.js文件中的内容复制进去即可使用。 使用方法为在任意url前面加上https://你的域名/proxy/ 即可…...

【每日刷题】Day155

【每日刷题】Day155 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 108. 单词接龙 - 力扣&#xff08;LeetCode&#xff09; 2. 675. 为高尔夫球比赛砍树 - 力扣(…...

EXCEL延迟退休公式

如图&#xff1a; A B为手工输入 C2EOMONTH(A2,B2*12) D2EOMONTH(C2,IF(C2>DATEVALUE("2025-1-1"),INT((DATEDIF(DATEVALUE("2025-1-1"),C2,"m")4)/4),0)) E2EOMONTH(A2,B2*12IF(EOMONTH(A2,B2*12)>DATEVALUE("2025-1-1"),INT(…...

开源对象存储新选择:在Docker上部署MinIO并实现远程管理

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…...

Spring Cloud生态圈

目录 Spring Cloud生态圈 核心组件 其他组件 总结 Spring Cloud Alibaba生态圈 核心组件 其他特性 Spring Cloud生态圈 Spring Cloud生态圈是一个为微服务架构提供全方位支持的解决方案集合。它涵盖了多个关键组件和服务&#xff0c;旨在帮助开发者快速构建、部署和管理…...

AI视觉小车基础--4.舵机控制(云台控制)

一、实验准备 控制连接在扩展板上的舵机。如下图所示&#xff0c;按键KEY1为板载元器件&#xff0c;所以不需要外接其他设备。 二、运行代码 # Import the Raspbot library import time from Raspbot_Lib import Raspbot from ipywidgets import interact import ipywidgets a…...

【Rust中的项目管理】

Rust中的项目管理 前言Package&#xff0c;Crate&#xff0c;Module &use &#xff0c;Path通过代码示例解释 Crate&#xff0c;Module &#xff0c;use&#xff0c;Path创建一个package&#xff1a;代码组织化skin.rs 中的代码struct & enum 相对路径和绝对路径引用同…...

【原创】如何备份和还原Ubuntu系统,非常详细!!

前言 我在虚拟机装了一个xfce4的Ubuntu桌面版&#xff0c;外加输入法、IDEA等&#xff0c;我想将这个虚拟机里的系统直接搬到物理机中&#xff0c;那我可以省的再重新装一遍、配置xfce4桌面、修改一堆快捷键还有配置idea了&#xff0c;那直接说干就干。 本教程基于Ubuntu24.0…...

成都栩熙酷网络科技抖音小店是真的

近年来&#xff0c;随着短视频平台的崛起&#xff0c;抖音小店作为一种新兴的购物模式&#xff0c;迅速吸引了大量消费者和商家的关注。在这一潮流中&#xff0c;成都栩熙酷网络科技有限公司&#xff08;以下简称“栩熙酷”&#xff09;凭借其敏锐的市场洞察力和强大的技术实力…...

Python 爬虫数据清洗与存储:基础教程

Python 爬虫数据清洗与存储&#xff1a;基础教程 在爬虫数据获取完成后&#xff0c;数据往往是“原始”的&#xff0c;不适合直接使用。清洗和存储是将爬取到的原始数据转化为有用信息的关键步骤。本文将系统地介绍 Python 中进行数据清洗与存储的基本方法&#xff0c;帮助新手…...

ssm122基于Java的高校教学业绩信息管理系统+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;高校教学业绩信息管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本高校教学…...

Java 基础知识

一.泛型编程 1. 泛型的概念和作用是什么&#xff1f; 概念&#xff1a;泛型&#xff08;Generics&#xff09;是在 JDK 5.0 引入的新特性&#xff0c;允许在定义类、接口和方法时使用类型参数。类型参数在使用时被具体的类型替换。作用&#xff1a; 类型安全性&#xff1a;避…...

深入探索 React Hooks:原理、用法与性能优化全解

一、引言 在现代 React 开发领域,Hooks 已成为不可或缺的一部分,赋予函数组件强大功能,使其能胜任复杂任务。本文将全面剖析 React Hooks,助您深入理解并熟练运用。 二、React Hooks 是什么 (一)Hooks 出现的背景 早期 React 主要依赖类组件,其通过this.state管理状…...

python中父类和子类继承学习

python为啥要使用继承 1. **代码复用**&#xff1a;子类可以继承父类的方法和属性&#xff0c;避免了重复编写相同的代码&#xff0c;提高了代码的复用性。 2. **建立层次结构**&#xff1a;通过继承可以清晰地表示类之间的层次关系&#xff0c;使代码结构更有条理。 3. **扩展…...

Linux——GPIO输入输出裸机实验

学习了正点原子Linux环境下的GPIO的输入输出的裸机实验学习&#xff0c;现在进行一下小结&#xff1a; 启动文件start.S的编写 .global _start .global _bss_start _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:/*设置处理器进入SVC模式*/m…...