R-CNN,Fast R-CNN,

R-CNN

R-CNN可以说是利用深度学习进行目标检测的开山之作

RCNN算法流程可分为4个步骤

- 一张图像生成1K~2K个候选区域(使用Selective Search方法)
- 对每个候选区域,使用深度网络提取特征
- 特征送入每一类的SVM 分类器,判别是否属于该类
- 使用回归器精细修正候选框位置

1.候选区域的生成

利用Selective Search算法通过图像 分割的方法得到一些原始区域,然后 使用一些合并策略将这些区域合并, 得到一个层次化的区域结构,而这些 结构就包含着可能需要的物体。

2.对每个候选区域,使用深度网络提取特征

将2000候选区域缩放到227x227pixel,接着 将候选区域输入事先训练好的AlexNet CNN网络 获取4096维的特征得到2000×4096维矩阵。

3.特征送入每一类的SVM分类器,判定类别

将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘, 获得2000×20维矩阵表示每个建议框是某个目标类别的得分。分别 对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重 叠建议框,得到该列即该类中得分最高的一些建议框。

将2000×4096的特征矩阵与20个SVM组成的权值矩阵4096×20 相乘,获得2000×20的概率矩阵,每一行代表一个建议框归于每个 目标类别的概率。分别对上述2000×20维矩阵中每一列即每一类进 行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一 些建议框。

此处的删去大于给定阈值的目标是删去那些跟最高得分重叠多的部分,IOU虽大,但是分数不是最高的,分数最高的留一个就够了

IIOU的值越高说明这两个候选框预测的是同一个物体的概率越大,一个物体只需要一个框就够了

IoU

IOU的值越高说明这两个候选框预测的是同一个物体的概率越大,一个物体只需要一个框就够了

此处的删去大于给定阈值的目标是删去那些跟最高得分重叠多的部分,IOU虽大,但是分数不是最高的,分数最高的留一个就够了

4.使用回归器精细修正候选框位置

依旧针对CNN 输出的特征向 量进行预测

对NMS处理后剩余的建议框进一步筛选。接着分别 用20个回归器对上述20个类别中剩余的建议框进行回 归操作,最终得到每个类别的修正后的得分最高的 bounding box。 如图,黄色框口P表示建议框Region Proposal, 绿色窗口G表示实际框Ground Truth,红色窗口 表示Region Proposal进行回归后的预测窗口,可以用 最小二乘法解决的线性回归问题。

R-CNN框架

首先通过ss算法生成一系列候选框,通过CNN将我们候选框等到一系列特征向量,再将一系列特征向量分别通过SVM进行目标的分类再通过回归器去调节我们候选框的坐标

R-CNN存在的问题:

1.测试速度慢: 测试一张图片约53s(CPU)。用Selective Search算法 提取候选框用时约2秒,一张图像内候选框之间存在大 量重叠,提取特征操作冗余。
2.训练速度慢: 过程及其繁琐
3.训练所需空间大: 对于SVM和bbox回归训练,需要从每个图像中的每个目标候选框 提取特征,并写入磁盘。对于非常深的网络,如VGG16,从VOC07 训练集上的5k图像上提取的特征需要数百GB的存储空间。

Fast R-CNN

同样使用VGG16作为网络 的backbone,与R-CNN相比训练时间快9倍,测试推理时间快213倍,准确率从 62%提升至66%(再Pascal VOC数据集上)。

Fast R-CNN算法流程可分为3个步骤

- 一张图像生成1K~2K个候选区域(使用Selective Search方法)
- 将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到 特征图上获得相应的特征矩阵
- 将每个特征矩阵通过ROI(Region of Interest) pooling层缩放到7x7大小的特征图,接着将 特征图展平通过一系列全连接层得到预测结果

将每个候选区域分别输入网络,将整个图像输入到我们网络中

把整个图放进网络训练然后SS得到的数据会映射到训练过的图上

Fast R-CNN是先对整张图片提取特征,然后对提取出的特征图生成候选框,再去crop

映射的对象变了,RCNN是图像,FastRCNN是直接映射特征图

将每个特征矩阵划分成7*7的区域,每个区相当于有4个值,利用最大池化下采样就只有一个数据了,所以无论输入图片多大,最后都是7*7的矩阵

一次性计算整张图像特征

训练数据的采样 (正样本,负样本)

正样本:候选框中确实存在我们需要检测目标的样本,负样本:背景

卷积后特征图具有相对位置不变性,所以存在某种映射关系使其映射到特征图

这里如果有两个类别一个类别的特征矩阵大另一个特征矩阵小,网络通过特征矩阵去训练模型的数据越多训练效果越好,所以猫的特征矩阵大训练效果也就偏向它

这里面阈值下界设置为0.1很有意思,其目的是为了获取和真实bounding box交并比至少为0.1的ROI作为负样本,即和真实目标有一定重叠,可以让模型学习较难的负样本。

在ROI feature vector上并联两个全连接层,一个FC用于目标概率的检测,一个fc用来我们边界框回归参数的预测

RoI Pooling Layer(RoI 池化层)

不限制输入 图像的尺寸

分类器

边界框回归器

绿色的是我们真实的目标边界框,黄色的是我们通过ss算法得到的候选框,红色:预测的
真实边框值根据这个公式去反推回归参数,然后再与网络生成的回归参数做差值

这里的dx之类的应该是不确定的参数,是学习出来的,G和P都是已知的

Multi-task loss(多任务损失)

损失函数分成两块,分类损失衡量实际类别概率与预测类别概率的“误差”,回归损失衡量实际框位置和预测框位置的“误差”

Cross Entropy Loss 交叉熵损失

Fast R-CNN框架

通过ss算法获取我们的候选框,特征提取分类和边界框回归
这里的融合我是这么理解的:将经过CNN的输出分两路,一路用于计算分类概率,一路用于候选框相对偏移的计算

Faster R-CNN

同样使用VGG16作 为网络的backbone,推理速度在GPU上达到5fps(包括候选区域的生成),准确率 也有进一步的提升。

Fast R-CNN算法流程可分为3个步骤

RPN + Fast R-CNN

- 一张图像生成1K~2K个候选区域(使用Selective Search方法)
- 将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到 特征图上获得相应的特征矩阵
- 将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图,接着将 特征图展平通过一系列全连接层得到预测结果

不是一个图片4096维特征,是一个region4096维。一个图片2000个region。

产生的候选框大小它是随机的,而我们要缩放的是,这些候选框框出的不同大小的图片。而不是把这样候选框缩放到同样大小。选出候选框-拿出候选框中的图片-对这个图片进行缩放(✓)。选出候选框-把所有候选框缩放成同样大小-拿出缩放后候选框内的图片(×)

投影方法:找到候选框ROI在原始图像上的位置,然后等比例缩放到特征图的相同位置上

这里不是卷积操作,而是把3x3的特征图展品,形成一个256维的小区域向量,卷积操作只会形成一个256个数进行相加

一个通道此位置计算出一个数,有多少通道在相同位置计算出通道数量个数的数,就得到一个256的一维向量

然后再去单独训练rpn网络第二部固定参数重新训练初始化再去利用生成的目标建议狂训练fastrcnn

anchor经过RPN的回归参数调整后,才生成候选框

因为ss算法得单独花费时间生成候选框,而rpn是端到端的

全连接要把张量拉直成向量,这里多消耗时间。而全卷积和全连接作用一样但不要拉直,可以并行计算

这里是训练rpn,训练rpn是256,2k是训练预测物体类别和边界

三种尺度(面积){ } 2 2 2 128 ,256 ,512
三种比例{ 1:1, 1:2, 2:1 }
每个位置(每个滑动窗口)在原图上都对应有3x3=9 anchor

我的理解:RPN通过预设的Anchors在原始图像上进行扫描,并对每个Anchor进行分类和边框回归任务。通过分类任务,RPN可以判断每个Anchor是否为前景;通过边框回归任务,RPN可以调整前景Anchor的位置和大小,使其更准确地匹配目标物体。最后,通过非极大值抑制(NMS)来减少候选框的数量,提高检测效率和准确性。

对于ZF感受野: 171
对于VGG感受野: 228

CNN感受野

训练数据的采样 (正样本,负样本)

刚刚讲的>0.7为正样本,<0.3为负样本,最大iou为正样本就是在为anchor分配标签GT

应该是nms采样2000多个做边框回归,随机采样256个做类别预测,两个独立的

应该是从所有正样本中随机采样128,从所有负样本采样128,正样本不够的话,从负样本中多采样,来达到总数256

RPN Multi-task loss

  • RPN负责生成推荐框(Proposals),并对每个Anchor预测其为目标(前景)的概率。
  • RPN的分类损失是针对前景和背景的识别损失,使用二分类交叉熵损失来计算。
  • Anchor的数量通过特征图位置和预设的Anchors数量来确定,最终通过筛选和NMS得到数量较少的候选框。
  • 正负样本的标注是通过计算Anchors与真实标签的IOU来实现的。
  • RPN生成的候选框作为后续检测网络的输入,而RPN的训练样本是在所有Anchor的基础上进行筛选的。
  • anchors历险记:20k->6k->2k->256
  • 在rpn网络生成的2000个候选框之后选取的正负样本应该是fast-rcnn训练的,而rpn网络用于训练的样本应该是在所有的anchor的基础上进行筛选的

分类损失

使用ce loss时,pi是预测第i个anchor属于真实标签概率,前景框就是预测前景框概率,背景框就是预测背景框概率

由于这里是预测为前景的概率,为了跟上一页PPT保持一致,这里第二个anchor的概率不是0.2,而是0.8,这样损失函数跟上一页多分类交叉熵就一样了

使用bce loss时,pi是预测第i个anchor属于前景框的概率

因为我们的负样本是背景,不是目标概率,损失是计算目标预测值和真实值的差距 这里的0.2不是我们的目标概率值 应该是0.8 标签为1 这里就是 -[1*log(0.8)+0*log(1-0.8)]

不是这个本质没区别,二值的是个特例,因为概率加起来等于1,所以算一个就行,但是直接把二分类当成多分类计算也行这里的多分类交叉熵正好就是两类

注意:使用二值交叉熵损失,cls layer只预测k scores

softmax Cross EntropyLoss(sCE)=-log(pi) ---->Loss=-target* log(pred)
target: 正样本为1,负样本为0
pred : 预测为target的概率 (注意这个与下面的BCE LOSS 的不同)
① target=1 pred=0.9   Loss=-log(0.9)
② target=0 pred=0.2   Loss=-log(0.2)
***其实这里target用热编码更好理解
① target=1--->(0,1)     pred=0.9   Loss=-log(0.9)
② target=0--->(1,0)     pred=0.2   Loss=-log(0.2)
Binary Cross EntropyLoss(BCE)=-【target * log(pred) +(1- target) * log(1-pred) 】
target:正样本为1,负样本为0
pred: 预测为正样本的概率**** (注意这里与上面Cross Entropy的不同)
① target=1 pred=0.9   Loss=- 【1 * log(0.9) + 0* log(0.1)】==>-log(0.9)
② target=0 pred=0.2(预测为正样本(target=1)的概率 )   Loss=-【0+ log(1-0.2)】==>-log(0.8)


解释:
1中②的loss和2中②的Loss为什么不一样?
因为各自Loss中pred对应的含义不同
1中,
pred :预测为target的概率2中,
pred: 预测为正样本的概率
sCE中,
②中pred=0.2 代表的是 target=0的概率
BCE中,
②中pred=0.2 代表的是 正样本(target=1)的概率
如果sCE中上述(我的上面的笔记)写的是:
target:正样本为1,负样本为0②的概率是 0.8(负样本概率),0.2(正样本概率) ,target=0 。
那么前后两个ppt所算的loss就是一样的

 

边界框回归损失

对于前景anchor,其和gt的交并比是大于0.5或0.7的,那么这几个gt回归参数取值范围都在-1到+1之间

Fast R-CNN Multi-task loss

Faster R-CNN训练

直接采用RPN Loss+ Fast R-CNN Loss的联合训练方法

原论文中采用分别训练RPN以及Fast R-CNN的方法

rpn生成的是候选框,并不是最后的预测框,fast对框回归训练是生成预测框
GT Box是人工标注的。
rpn已经把框计算出来了,后面为啥还要计算因为RPN的分类只有背景和前景两种,RCNN里是多类别

(1)利用ImageNet预训练分类模型初始化前置卷积网络层参数,并 开始单独训练RPN网络参数; (2)固定RPN网络独有的卷积层以及全连接层参数,再利用 ImageNet预训练分类模型初始化前置卷积网络参数,并利用RPN 网络生成的目标建议框去训练Fast RCNN网络参数。
(3)固定利用Fast RCNN训练好的前置卷积网络层参数,去微调RPN 网络独有的卷积层以及全连接层参数。
(4)同样保持固定前置卷积网络层参数,去微调Fast RCNN网络的全 连接层参数。最后RPN网络与Fast RCNN网络共享前置卷积网络层 参数,构成一个统一网络。

(3)(4)步是换成了自己的数据集进行微调,而不是再用imageNet

Faster R-CNN模型

四个部分全部融合在我们cnn网络中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++/list

目录 1.list的介绍 2.list的使用 2.1list的构造 2.2list iterator的使用 2.3list capacity 2.4list element access 2.5list modifers 2.6list的迭代器失效 3.list的模拟实现 4.list与vector的对比 欢迎 1.list的介绍 list的文档介绍 cplusplus.com/reference/list/li…

人工智能证书合集

本文将对目前市面上主流官方机构颁发的人工智能证书进行整理和介绍,由于整理的证书较多,本文共一万八千多字,请根据自己的考证需求阅读对应部分的内容,希望本文对人工智能行业的从业人员和计划从事人工智能相关岗位工作的人员有所…

TongWeb7.0.E.6_P11嵌入式版本使用指引(by lqw)

文章目录 声明相关概念手册的使用示范工程安装工程介质 安装前准备示范工程参考(spring-boot-helloWorld-2.x)示范参考 声明 1.本文参考001_TongWeb_V7.0嵌入式版_JavaEE标准容器用户指南_70E6_P11A01.pdf,实际以最新更新的手册为准。 2.本文…

鸿蒙开发融云demo发送图片消息

鸿蒙开发融云demo发送图片消息 融云鸿蒙版是不带UI的,得自己一步步搭建。 这次讲如何发送图片消息,选择图片,显示图片消息。 还是有点难度的,好好看,好好学。 一、思路: 选择图片用:photoVie…

开源OCR免费助力法律文档数字化,提升文档管理效率

一、在法律行业,每天需要处理大量纸质文件,从合同到判决书,手动录入不仅费时,还容易出错。为解决这一问题推出了一款免费开源的OCR智能识别平台,通过先进的光学字符识别(OCR)技术,将…

详解ReentrantLock--三种加锁方式

目录 介绍AQS: 直观方式解释加锁的流程: Node是什么:它里面有什么属性呢 图解队列的排队过程: 源码分析三种加锁流程: 我们先讲解一下非公平锁的加锁流程: Lock()方式加锁: 在源码里对于Lock()的解…

【教程】Git 标准工作流

目录 前言建仓,拉仓,关联仓库修改代码更新本地仓库,并解决冲突提交代码,合入代码其他常用 Git 工作流删除本地仓库和远程仓库中的文件日志打印commit 相关 前言 Git 是日常开发中常用的版本控制工具,配合代码托管仓库…

Postman断言与依赖接口测试详解!

在接口测试中,断言是不可或缺的一环。它不仅能够自动判断业务逻辑的正确性,还能确保接口的实际功能实现符合预期。Postman作为一款强大的接口测试工具,不仅支持发送HTTP请求和接收响应,还提供了丰富的断言功能,帮助测试…

百度SEO与SEM到底有什么区别?福建企业老板们需要了解的关键点【百度SEO专家】

大家好,我是林汉文,一名百度SEO专家。最近在与一些企业Boss沟通时,我发现很多人对SEO与SEM的区别并不清楚,有时甚至会混为一谈。SEO和SEM确实都是搜索引擎营销的重要手段,但它们在实现方式、效果和适用场景上都有着明显…

JavaFX WebView + Vue初始化加载数据解决方案

一般WebView加载Vue时,我们需要注入一些数据,而我发现当WebView加载完毕再注入脚本,Vue是无法正确识别注入的脚本函数,也无法正确获取所要注入的数据,因此可以采用以下方法解决Vue无法正确加载数据问题 1、配置WebView…

Ubuntu 安装CUDA, cuDNN, TensorRT(草稿)

文章目录 写在前面一、CUDA, cuDNN, TensorRT 三个库的版本的确定二、解决方法参考链接 写在前面 自己的测试环境: Ubuntu20.04, 本文安装的版本: cuda_11.1.0;cuDNN-8.2.1;TensorRT-8.2.4.2 一、CUDA, cuDNN, TensorRT 三个库…

传输层协议TCP详解(上篇)

目录 一. TCP协议 1.1 什么是TCP协议 1.2 TCP为什么叫传输控制协议 二. TCP协议段格式 三. 确认应答(ACK)机制 3.1 什么是确认应答机制 3.2 推导确认应答机制 四. 超时重传机制 五. 连接管理机制 5.1 六位标志位 5.2 如何…

wps宏代码学习

推荐学习视频:https://space.bilibili.com/363834767/channel/collectiondetail?sid1139008&spm_id_from333.788.0.0 打开宏编辑器和JS代码调试 工具-》开发工具-》WPS宏编辑器 左边是工程区,当打开多个excel时会有多个,要注意不要把…

ffmpeg视频滤镜:膨胀操作-dilation

滤镜介绍 dilation 官网链接 > FFmpeg Filters Documentation 膨胀滤镜会使图片变的更亮,会让细节别的更明显。膨胀也是形态学中的一种操作,在opencv中也有响应的算子。此外膨胀结合此前腐蚀操作,可以构成开闭操作。 开操作是先腐蚀…

【补补漏洞吧 | 02】等保测评ZooKeeperElasticsearch未授权访问漏洞补漏方法

一、项目背景 客户新系统上线,因为行业网络安全要求,需要做等保测评, 通过第三方漏扫工具扫描系统,漏扫报告显示ZooKeeper和 Elasticsearch 服务各拥有一个漏洞,具体结果如下: 1、ZooKeeper 未授权访问【…

C语言进阶之我与指针的爱恨情仇(1)

一.前言 我们在初阶《指针》初阶C语言-指针-CSDN博客已经讲过了一些基础知识,知道了关于指针的一些概念-> 1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间 2.指针的大小是固定的4/8个字节(32位平台/64位平台&#xf…

对象池的作用以及简单示例

在游戏当中,有很多时候需要重复地创建或删除某些游戏对象,此时会耗费系统资源,从而影响性能,利用对象池可以解决这个问题。对象池能够节省内存,优化程序流畅程度。 把对象放在一个集合里,通过集合来管理对象…

java并发编程-volatile的作用

文章目录 volatile的作用1.改变线程间的变量可见性2.禁止指令重排序 参考的学习视频 volatile的作用 1.改变线程间的变量可见性 每个线程都有一个专用的工作集内存,下图里面粉色的表示专用工作集内存,黄色的是共享内存工作区,如果加入了vol…

Netty 组件介绍 - EventLoop

概要 把 channel 理解为数据的通道把 msg 理解为流动的数据,最开始输入是 ByteBuf,但经过pipeline 的加工,会变成其它类型对象,最后输出又变成 ByteBuf把 handler 理解为数据的处理工序 工序有多道,合在一起就是 pi…

oracle 对应的JDBC驱动 版本

下载网址:JDBC and UCP Downloads page