深度学习——物体检测算法:R-CNN,SSD,YOLO(笔记)

news2024/11/8 19:40:24

一,R-CNN

1.区域卷积神经网络R-CNN

 首先从输入图像中提取若干个锚框,并标注好它们的类别和偏移量。然后用卷积神经网络对每一个锚框进行前向传播抽取特征。最后用每个提议区域的特征来预测类别和边界框。

①使用启发式搜索算法来选择锚框

②使用预训练好的模型来对每个锚框进行特征提取

③训练一个SVM对类别分类

④训练一个线性回归模型来预测边缘框的偏移

缺点:有多少个边缘框就需要多少次特征提取,计算量非常大。

2.兴趣区域(Rol)池化层:将大小不一的锚框变成统一的形状

①给定一个锚框,分割成n*m块(n*m就是Rol的大小,不一定是均分),输出每块的最大值

②不管锚框多大,总是输出n*m个值

 “因为Rol是2*2的,所以分割4块,输出每块的最大值”

3.Fast RCNN

①使用CNN对图片抽取特征

②使用Rol池化层对每个锚框生成固定长度的特征

改进:

①使用CNN对整张图片提取特征,最终得到一个7*7或14*14的feature map

②抽取完特征后,对图片进行锚框的选择。搜索到原始图片上的锚框将其映射到CNN输出上

③映射完锚框后,使用Rol池化层对CNN上的feature map进行特征提取,生成固定长度的特征。最后通过全连接层对每个锚框预测:类别和偏移

Fast R-CNN 相对于 R-CNN 更快的原因是:Fast R-CNN 中的 CNN 不再对每个锚框抽取特征,而是对整个图片进行特征的提取(这样做的好处是:不同的锚框之间可能会有重叠的部分,如果对每个锚框都进行特征提取的话,可能会重复特征提取),然后再在整张图片的feature中找出原图中锚框对应的特征,最后一起做预测。

4.Faster R-CNN

①使用一个区域提议网络来代替启发式搜索来获得更好的锚框

②Rol的输入是CNN输出的feature map和生成的锚框

③RPN的输入是CNN输出的feature map,输出是高质量的锚框

CNN的输出进入到RPN之后再做一次卷积,然后生成一些锚框。再训练一个二分类问题:预测锚框是否框住了真实物体以及锚框的偏移,最后使用NMS进行锚框去重,使得锚框数量变少

④准确率比较高,但是速度慢

5.Mask R-CNN

如果在训练集中标注了每个目标图像上像素级的位置。Mask R-CNN有效利用这些标注信息提升目标检测的精度。

 ①假设有每个像素的标号,对每个像素做预测(FCN)

②将兴趣区域汇聚层替换了兴趣区域对齐层(Rol pooling->Rol align),使用双线性插值保留特征图上的空间信息,适合像素级预测。Rol pooling对像素级有极大的误差。Rol align不能整除时,会直接将像素切开,切开后的每一部分是原像素的加权(它的值是原像素的一部分

③兴趣区域对齐层的输出包含了所有兴趣区域形状相同的特征图,它们不仅被用于预测每个兴趣区域的类别和边界框,还通过额外的全卷积网络预测目标的像素级位置。

 

X轴表示模型运行速度,y轴表示精度,Faster RCNN 相对来说精度比较高,速度慢。

【总结】

①R-CNN是最早,也是最有名的一类基于锚框和CNN的目标检测算法

②Fast/Faster R-CNN持续提升性能

③Faster R-CNN 和 Mask R-CNN高精度算法

二。单发多框检测(SSD)

对每个像素生成多个以它为中心的多个锚框

 SSD模型:

①一个基础网络来抽取特征,然后多个卷积层来减半高宽

②在每段都生成锚框,底部来拟合小物体,顶部来拟合大物体

③对每个锚框预测类别和真实边缘框

 

①输入图像后,首先进入一个基础网格抽取特征,抽取完特质之后对每个像素生成大量的锚框(每个锚框就是一个样本,然后预测锚框的类别和偏移)

②SSD给定锚框之后直接对锚框将进行预测,不需要两阶段。SSD 通过做不同分辨率下的预测来提升最终的效果,越到底层的 feature map,就越大,越往上,feature map 越少,因此底层更加有利于小物体的检测,而上层图像小 更有利于大物体的检测

③SSD不再使用RPN网络,而是直接生成大量样本(锚框)上做预测。看是否包含目标物体。如果包含目标物体,再预测该样本到真实边缘框的偏移。

 

上图中绿色的点表示 SSD

从图中可以看出,SSD 相对于Faster RCNN 来讲速度快很多,但是精度不是太好

SSD 的实现相对来讲比较简单,R-CNN 系列代码的实现非常困难

总结

①SSD通过单神经网络来检测模型

②以每个像素为中心产生多个锚框

③在多个段的输出上进行多尺度的检测

三。YOLO

 

①SSD中大量锚框重叠,浪费了很多计算

②YOLO将图片均分分成S*S个锚框

③每个锚框预测B个边缘框

补充:

①yolo 也是一个 single-stage 的算法,只有一个单神经网络来做预测

②yolo 也需要锚框,这点和 SSD 相同,但是 SSD 是对每个像素点生成多个锚框,所以在绝大部分情况下两个相邻像素的所生成的锚框的重叠率是相当高的,这样就会导致很大的重复计算量

③yolo 的想法是尽量让锚框不重叠:首先将图片均匀地分成 S * S 块,每一块就是一个锚框,每一个锚框预测 B 个边缘框(考虑到一个锚框中可能包含多个物体),所以最终就会产生 S ^ 2 * B 个样本,因此速度会远远快于 SSD

④yolo 在后续的版本(V2,V3,V4...)中有持续的改进,但是核心思想没有变,真实的边缘框不会随机的出现,真实的边缘框的比例、大小在每个数据集上的出现是有一定的规律的,在知道有一定的规律的时候就可以使用聚类算法将这个规律找出来(给定一个数据集,先分析数据集中的统计信息,然后找出边缘框出现的规律,这样之后在生成锚框的时候就会有先验知识,从而进一步做出优化)

上图中表示 yolo v3 的直线底端表示论文中的原始精度,顶端表示通过改进之后所能达到的最大精度

 

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

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

相关文章

【第一周学习——认识 O(N*logN) 的排序[ 归并排序 、堆排序、快速排序 ]

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:《数据结构与算法》 📧如果文章知识点有错误的地方&a…

力扣(LeetCode)187. 重复的DNA序列(C++)

哈希表 直观思考,由于限定了答案长度 101010 ,只需要一次遍历字符串,统计所有长度为 101010 的子串的出现次数(哈希表) ,最后遍历哈希表,维护答案,记录出现 222 次(及以上)的字符串 。 class Solution { …

【BBuf的CUDA笔记】二,解析 OneFlow BatchNorm 相关算子实现

0x1. 前言 在ResNet中(https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py),关于BatchNorm的调用一共有两种模式,第一种是ReLU接在BN之后: out self.bn1(out) out self.relu(out)另外一种…

MicFunPred——最新16S rRNA扩增子数据功能预测数据库

近年来,基于扩增子测序进行物种的功能预测是研究微生物群落功能的主要方面,目前最常用的软件包括Tax4Fun以及PICRUSt2。关于这两款软件的使用方法详可参见凌波微课|扩增子研究第十六讲:扩增子测序结果中的物种功能预测。 Tax4Fun使用最近邻匹…

2022年终总结-两年Androider的成长之路

金句分享 生活金句 1.可难道我们生命中做的每一件事不都是为了被爱得更多一点吗 2.这不只是一种对承诺的恐惧,也不是我缺乏关心和爱的能力,因为我做得到,只不过,老老实实讲。我想 我宁愿为了某件我擅长的事,我能表现…

一个select死锁问题

以下代码的输出结果&#xff1a; func main() {var wg sync.WaitGroupfoo : make(chan int)bar : make(chan int)wg.Add(1)go func() {defer wg.Done()select {case foo <- <-bar:default:println("default")}}()wg.Wait() }结果 解析 对于 select 语句&#…

【Linux】进程信号

目录 一、什么是信号 二、信号产生的条件 1、键盘产生 2、进程异常 3、命令产生 4、软件条件 三、信号保存的方式 四、信号处理的方式 1、信号处理接口 2、信号处理时机 3、进程为什么要切换成为用户态才进行信号的捕获方法&#xff1f; 4、sigaction 五、可重入函…

Java+MySQL基于ssm的会议交接平台

随着社会竞争压力的不断加强,企事业单位内部的会议都在不断的增加,有效的会议可以提高企事业内部的沟通,更好的做出符合战略目标的决策,但是传统的会议交接有一定的问题存在,首先就是必须面对面进行传达,其次就是对任务的安排和执行没有很好的记录,为了改变这些情况,于是我们提…

信贷产品年终总结之贷后逾期分析

自本月月初疫情全面放开后&#xff0c;身边的朋友基本都阳了一遍&#xff0c;希望正在浏览本篇文章的读者您是还没阳过的幸运儿。另外&#xff0c;今天也是冬至了&#xff0c;祝各位读者身边健康&#xff0c;远离羊群&#xff01; 最近我们分享了信贷业务年终总结系列的前2篇文…

Python中转义字符是个啥

文章目录前言一、转义字符是什么&#xff1f;二、常见的转义字符有哪些&#xff1f;总结前言 昨天有粉丝问了我这个代码问题&#xff0c;如下图&#xff1a; 他很好奇代码都没有错误&#xff0c;怎么运行就报错&#xff0c;不知道有咩有小伙伴能看出问题在哪呢&#xff1f; 其…

Cookie 和 Session 的工作流程

文章目录1.Cookie1.什么是Cookie2.Cookie可以干嘛3.Cookie实现登陆逻辑的流程2.session1.session是什么2.session有什么用3.session的工作流程3.Cookie 和 session的区别(重点)1.Cookie 1.什么是Cookie Cookie中存储的是字符串,是浏览器在本地持久化保存数据的一种方案 通过点…

2023春招:Javaweb面试锦囊

cookie 和 session 的区别&#xff1f;&#xff08;必会&#xff09; 存储位置不同 cookie 存放在客户端电脑&#xff0c;是一个磁盘文件。Ie 浏览器是可以从文件夹中找到。session 是存放在服务器内存中的一个对象。 chrome 浏览器进行安全处理&#xff0c;只能通过浏览器找…

圣诞 HTML 代码汇总

文章目录Part.I 音效圣诞树Part.II 圣诞树小球Part.III 简笔圣诞树圣诞节快到了&#xff0c;在网上找了一些 html 代码&#xff0c;觉得挺有意思的&#xff0c;顺带分享一下~ Part.I 音效圣诞树 来源&#xff1a;https://blog.csdn.net/m0_73309780/article/details/128176149…

面临项目失控?四个维度应对项目进度优化【洞见2】

常见的对进度的管理的流程是制定进度目标&#xff0c;WBS工作任务拆解&#xff0c;任务的时间估算&#xff0c;然后执行监督。 有时候这样的过程就会出现的进度延迟&#xff0c;而针对进度的延迟&#xff0c;往往企业多选择是通过加班赶工来完成。 项目进度优化方案 但是如…

【第一章 Linux特点,结构,网路连接模式,Linux目录结构】

第一章 Linux特点&#xff0c;结构&#xff0c;网路连接模式&#xff0c;Linux目录结构 1.操作系统&#xff1a; 用于管理和控制计算机所有软、硬件资源的一组程序。 2. Linux特点总结&#xff1a; ① 开放性&#xff1b; ② 多用户&#xff1b; ③ 多任务&#xff1b; ④ 良好…

喇叭天线设计

电磁喇叭天线是最简单而常用的微波天线。它的主要优点是结构简单&#xff0c;馈电简便&#xff0c;便于控制主面波束宽度和增益&#xff0c;频率特性好且损耗较小。它由波导逐渐张开来形成&#xff0c;其作用是加强方向性&#xff0c;这与声学喇叭的原理相似。若主模TE10的矩形…

python爬虫爬取网页上的图片

目录 一&#xff1a;爬虫基础 二&#xff1a;安装html解析的python工具 三&#xff1a;爬取网页图片 一&#xff1a;爬虫基础 爬虫基本过程&#xff1a; 1.请求标头 headers 2.创建一个会话 requests.Session 3.确定请求的路径 4.根据路径获取网页资源(HTML文件) 5.解析html…

UG/NX二次开发Siemens官方NXOPEN实例解析—2.6 CreateNote

列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer UG/NX二次开发Siemens官方NXOPEN实例解析—2.2 Selection UG/NX二次开发Siemens官方NXOPEN实例解析—2.3 Selection_UIStyler UG/NX二次开发Siemens官方NXOPEN实例解析—2.4 File2Points UG/NX二次…

【java随笔】面向对象思维

1.怎么建立面向对象的思维方式 &#xff08;1&#xff09;先整体&#xff0c;再局部 &#xff08;2&#xff09;先抽象&#xff0c;再具体 &#xff08;3&#xff09;能做什么&#xff0c;再怎么做 2.如何学习面向对象 &#xff08;1&#xff09;语法 &#xff08;2&#xff09…

执行docker restart [CONTAINER ID]命令时会把之前的参数都带上吗

我在搭建rocketmq时候&#xff0c;运行了好几个容器命令也比较长如下&#xff1a; # 启动 namesrv docker run -d -p 9876:9876 -v "D:/Program Files/rocketmq/namesrv/logs:/root/logs" -v "D:/Program Files/rocketmq/namesrv/store:/root/store" …