YOLO——基于回归的目标检测算法

2023-11-17

YOLO: You Only Look Once:Unified, Real-Time Object Detection

    这篇论文的内容并不多,核心思想也比较简单,下面相当于是对论文的翻译!

    YOLO是一个可以一次性预测多个Box位置和类别的卷积神经网络,能够实现端到端的目标检测和识别,其最大的优势就是速度快。事实上,目标检测的本质就是回归,因此一个实现回归功能的CNN并不需要复杂的设计过程。YOLO没有选择滑窗或提取proposal的方式训练网络,而是直接选用整图训练模型。这样做的好处在于可以更好的区分目标和背景区域,相比之下,采用proposal训练方式的Fast-R-CNN常常把背景区域误检为特定目标。当然,YOLO在提升检测速度的同时牺牲了一些精度。下图所示是YOLO检测系统流程:1.将图像Resize到448*448;2.运行CNN;3.非极大抑制优化检测结果。有兴趣的童鞋可以按照http://pjreddie.com/darknet/install/的说明安装测试一下YOLO的scoring流程,非常容易上手。接下来将重点介绍YOLO的原理。

 5.1 一体化检测方案

    YOLO的设计理念遵循端到端训练和实时检测。YOLO将输入图像划分为S*S个网格,如果一个物体的中心落在某网格(cell)内,则相应网格负责检测该物体。在训练和测试时,每个网络预测B个bounding boxes,每个bounding box对应5个预测参数,即bounding box的中心点坐标(x,y),宽高(w,h),和置信度评分。这里的置信度评分(Pr(Object)*IOU(pred|truth))综合反映基于当前模型bounding box内存在目标的可能性Pr(Object)和bounding box预测目标位置的准确性IOU(pred|truth)。如果bouding box内不存在物体,则Pr(Object)=0。如果存在物体,则根据预测的bounding box和真实的bounding box计算IOU,同时会预测存在物体的情况下该物体属于某一类的后验概率Pr(Class_i|Object)。假定一共有C类物体,那么每一个网格只预测一次C类物体的条件类概率Pr(Class_i|Object), i=1,2,...,C;每一个网格预测B个bounding box的位置。即这B个bounding box共享一套条件类概率Pr(Class_i|Object), i=1,2,...,C。基于计算得到的Pr(Class_i|Object),在测试时可以计算某个bounding box类相关置信度:Pr(Class_i|Object)*Pr(Object)*IOU(pred|truth)=Pr(Class_i)*IOU(pred|truth)。如果将输入图像划分为7*7网格(S=7),每个网格预测2个bounding box (B=2),有20类待检测的目标(C=20),则相当于最终预测一个长度为S*S*(B*5+C)=7*7*30的向量,从而完成检测+识别任务,整个流程可以通过下图理解。

 5.1.1 网络设计

    YOLO网络设计遵循了GoogleNet的思想,但与之有所区别。YOLO使用了24个级联的卷积(conv)层和2个全连接(fc)层,其中conv层包括3*3和1*1两种Kernel,最后一个fc层即YOLO网络的输出,长度为S*S*(B*5+C)=7*7*30.此外,作者还设计了一个简化版的YOLO-small网络,包括9个级联的conv层和2个fc层,由于conv层的数量少了很多,因此YOLO-small速度比YOLO快很多。如下图所示我们给出了YOLO网络的架构。

5.1.2 训练

    作者训练YOLO网络是分步骤进行的:首先,作者从上图网络中取出前20个conv层,然后自己添加了一个average pooling层和一个fc层,用1000类的 ImageNet数据与训练。在ImageNet2012上用224*224d的图像训练后得到的top5准确率是88%。然后,作者在20个预训练好的conv层后添加了4个新的conv层和2个fc层,并采用随即参数初始化这些新添加的层,在fine-tune新层时,作者选用448*448图像训练。最后一个fc层可以预测物体属于不同类的概率和bounding box中心点坐标x,y和宽高w,h。Boundingbox的宽高是相对于图像宽高归一化后得到的,Bounding box的中心位置坐标是相对于某一个网格的位置坐标进行过归一化,因此x,y,w,h均介于0到1之间。

    在设计Loss函数时,有两个主要的问题:1.对于最后一层长度为7*7*30长度预测结果,计算预测loss通常会选用平方和误差。然而这种Loss函数的位置误差和分类误差是1:1的关系。2.整个图有7*7个网格,大多数网格实际不包含物体(当物体的中心位于网格内才算包含物体),如果只计算Pr(Class_i),很多网格的分类概率为0,网格loss呈现出稀疏矩阵的特性,使得Loss收敛效果变差,模型不稳定。为了解决上述问题,作者采用了一系列方案:

    1.增加bounding box坐标预测的loss权重,降低bounding box分类的loss权重。坐标预测和分类预测的权重分别是λcoord=5,λnoobj=0.5.

    2.平方和误差对于大和小的bounding box的权重是相同的,作者为了降低不同大小bounding box宽高预测的方差,采用了平方根形式计算宽高预测loss,即sqrt(w)和sqrt(h)。

    训练Loss组成形式较为复杂,这里不作列举,如有兴趣可以参考作者原文慢慢理解体会。

5.1.3 测试

    作者选用PASAL VOC图像测试训练得到的YOLO网络,每幅图会预测得到98个(7*7*2)个bouding box及相应的类概率。通常一个cell可以直接预测出一个物体对应的bounding box,但是对于某些尺寸较大或靠近图像边界的物体,需要多个网格预测的结果通过非极大抑制处理生成。虽然YOLO对于非极大抑制的依赖不及R-CNN和DPM,但非极大抑制确实可以将mAP提高2到3个点。

 5.2 方法对比

    作者将YOLO目标检测与识别方法与其他几种经典方案进行比较可知:

    DPM(Deformable parts models): DPM是一种基于滑窗方式的目标检测方法,基本流程包括几个独立的环节:特征提取,区域划分,基于高分值区域预测bounding box。YOLO采用端到端的训练方式,将特征提取、候选框预测,非极大抑制及目标识别连接在一起,实现了更快更准的检测模型。

    R-CNN:R-CNN方案分需要先用SeletiveSearch方法提取proposal,然后用CNN进行特征提取,最后用SVM训练分类器。如此方案,诚繁琐也!YOLO精髓思想与其类似,但是通过共享卷积特征的方式提取proposal和目标识别。另外,YOLO用网格对proposal进行空间约束,避免在一些区域重复提取Proposal,相较于SeletiveSearch提取2000个proposal进行R-CNN训练,YOLO只需要提取98个proposal,这样训练和测试速度怎能不快?

    Fast-R-CNN、Faster-R-CNN、Fast-DPM: Fast-R-CNN和Faster-R-CNN分别替换了SVMs训练和SelectiveSeach提取proposal的方式,在一定程度上加速了训练和测试速度,但其速度依然无法和YOLO相比。同理,将DPM优化在GPU上实现也无出YOLO之右。

5.3 实验

5.3.1 实时检测识别系统对比

5.3.2 VOC2007准确率比较

5.3.3 Fast-R-CNN和YOLO错误分析

    如图所示,不同区域分别表示不同的指标:

Correct:正确检测和识别的比例,即分类正确且IOU>0.5

Localization:分类正确,但0.1<IOU<0.5

Similar:类别相似,IOU>0.1

Other:分类错误,IOU>0.1

Background: 对于任何目标IOU<0.1

    可以看出,YOLO在定位目标位置时准确度不及Fast-R-CNN。YOLO的error中,目标定位错误占据的比例最大,比Fast-R-CNN高出了10个点。但是,YOLO在定位识别背景时准确率更高,可以看出Fast-R-CNN假阳性很高(Background=13.6%,即认为某个框是目标,但是实际里面不含任何物体)。

5.3.4 VOC2012准确率比较

    由于YOLO在目标检测和识别是处理背景部分优势更明显,因此作者设计了Fast-R-CNN+YOLO检测识别模式,即先用R-CNN提取得到一组bounding box,然后用YOLO处理图像也得到一组bounding box。对比这两组bounding box是否基本一致,如果一致就用YOLO计算得到的概率对目标分类,最终的bouding box的区域选取二者的相交区域。Fast-R-CNN的最高准确率可以达到71.8%,采用Fast-R-CNN+YOLO可以将准确率提升至75.0%。这种准确率的提升是基于YOLO在测试端出错的情况不同于Fast-R-CNN。虽然Fast-R-CNN_YOLO提升了准确率,但是相应的检测识别速度大大降低,因此导致其无法实时检测。

    使用VOC2012测试不同算法的mean Average Precision,YOLO的mAP=57.9%,该数值与基于VGG16的RCNN检测算法准确率相当。对于不同大小图像的测试效果进行研究,作者发现:YOLO在检测小目标时准确率比R-CNN低大约8~10%,在检测大目标是准确率高于R-CNN。采用Fast-R-CNN+YOLO的方式准确率最高,比Fast-R-CNN的准确率高了2.3%。

5.4 总结

    YOLO是一种支持端到端训练和测试的卷积神经网络,在保证一定准确率的前提下能图像中多目标的检测与识别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YOLO——基于回归的目标检测算法 的相关文章

  • Qt将程序打包成.exe文件,并添加图标

    1 在工程中添加一个Qt Resource File 文件名任意 2 将 ico后缀的图片放到跟工程文件 pro 文件同目录下 并在Qt Resource File文件中添加该 ico文件 3 添加相关代码 设置窗口图标 4 双击打开 pr
  • CMake入门教程:使用target_include_directories指定头文件目录

    CMake入门教程 使用target include directories指定头文件目录 在进行软件开发时 我们经常需要引用一些外部库或模块的头文件以便使用其功能 CMake是一个强大的跨平台构建工具 能够帮助我们管理项目并生成相应的构建
  • WSL2 局域网访问以及hosts注意事项

    说明 WSL2用的是NAT方式 虚拟机有内部的ip 所以访问虚拟机可用代理访问方法 要点 根据微软文档 powershell 下做端口转发代理 netsh interface portproxy add v4tov4 listenport
  • 双引号后面要加句号吗_小学二年级老师容易疏忽的一个知识点:冒号和双引号...

    标点符号是特殊的文字 使用得当 会为文章增色不少 同时也是考试丢分的一个知识点 应引起师生重视 到了小学二年级 必须学会使用冒号和双引号 冒号 是常用的标点符号之一 通常表示提示语后的停顿或表示提示下文或总结上文 它用在提示语的后面 如果老
  • 用Python写一个比大小的小游戏(代码解释)

    代码解释 游戏 猜数字 玩法 程序会随机生成一个1 30的数字 玩家有无限次 机会去猜这个数字程序会告诉你是大了还是小了 在最后猜中的时候程序会告诉你猜中了 并且告诉你结束游戏以及猜中该数字所花费的次数 代码 Python import r
  • PyTorch的官方bug:torch.optim.lr_scheduler.CosineAnnealingWarmRestarts

    torch optim lr scheduler CosineAnnealingWarmRestarts 低版本 如torch1 7 1 指定last epoch参数时报错 已有人反馈指出 升级torch1 11 0可以解决该问题 升级之后
  • Python数据可视化——图型参数介绍

    前言 利用Python 绘制常见的统计图形 例如条形 图 饼图 直方图 折线图 散点图等 通过这些常用图形的展现 将 复杂的数据简单化 这些图形的绘制可以通过matplotlib 模块 pandas 模 块或者 seaborn 模块实现 饼
  • java 垃圾回收 sys_深入理解Java虚拟机学习笔记2.1-G1垃圾回收

    G1 GC是Jdk7的新特性之一 Jdk7 版本都可以自主配置G1作为JVM GC选项 作为JVM GC算法的一次重大升级 DK7u后G1已相对稳定 且未来计划替代CMS 所以有必要深入了解下 不同于其他的分代回收算法 G1将堆空间划分成了
  • springmvc中的resolveView(视图解析器)

    视图解析器接口只有一个方法 就是根据名称解析出视图信息 一个视图对象View 采用的是模板模式 抽象模板类 AbstractCachingViewResolver 主要处理缓存 如果视图对象在缓存中有 则从缓存中取 如果没有则创建 publ
  • 整理最全的图床集合——三千图床

    2021 09 25 更新 去除部分图床 添加新的图床 优化排版 引言 古有弱水三千 今有三千图床 勿埋我心 图床一般是指储存图片的服务器 有国内和国外之分 国外的图床由于有空间距离等因素决定访问速度很慢影响图片显示速度 国内也分为单线空间
  • remote: HTTP Basic: Access deniedfatal: Authentication failed for ‘xxxxx‘的问题解决

    在没有修改git密码的情况下 使用vs code推送代码 总是会报错 remote HTTP Basic Access denied fatal Authentication failed for xxxxxxxx git仓库地址 网上试了
  • YOLOV7开源代码讲解--训练参数解释

    目录 训练参数说明 weights cfg data hpy epoch batch size img size rect resume nosave notest noautoanchor evolve bucket cach image
  • 【Basis】狄利克雷分布

    初次看狄利克雷分布 比较懵 主要是它有很多先行知识 所以我先介绍狄利克雷分布用到的多项式分布 gamma 函数 beta分布 然后再介绍狄利克雷分布 参考文献见文章末 目录 一 多项式分布 multinomial distribution
  • 仅仅是一张照片就是不能刷脸支付的

    科技改变未来并不是一句口号 就拿买东西来讲 以前人们都是一手交钱一手交货 拿到大额的纸币 还要验真假 而现在移动支付成为主要付款方式 只要一部手机 扫一扫就能付款 一开始也有很多人不习惯手机支付 因为觉得没有现金实在 整天就是一堆数字转来转
  • 解决TypeError: 'function' object is not subscriptable

    一 解决问题 在tensorflow中使用零矩阵初始化变量的时候出现的该异常 TypeError function object is not subscriptable 二 解决方法 问题代码如下 bias tf Variable tf
  • 深度学习(9):Inception危险物品检测

    目标 基于Inception网络实现对危险物品检测 将危险物品图片或视频经过图像预处理后输入模型推理 最后将检测结果进行可视化输出 一 原理 Google的Inception网络介绍 Inception为Google开源的CNN模型 至今已
  • Java的变量

    1 Java 变量类型 答 在Java语言中 所有的变量在使用前必须声明 声明变量的基本格式如下 type identifier value identifier value 格式说明 type为Java数据类型 identifier是变量
  • Java实现生成csv文件并导入数据

    一 需求 下载列表 在没有过滤之前下载列表所有数据 点击过滤之后 下载过滤之后对数据 生成csv文件 二 思路 先根据条件 是否过滤了数据 筛选出数据 将数据导入csv文件 生成文件并返回 三 代码实现 1 controller层 文件下载
  • Gbase 8s存储结构简介及空间管理

    Gbase 8s实例可以创建多个dbspace 一个dbspace可以包含多个物理chunk 一个chunk分成多个连续扩展区extent 一个表或者索引占用的空间被称为一个tablespace 一个extent包含多个物理页page 其中

随机推荐

  • 利用多线程来实现一个简单的服务器,来实现处理多个用户的请求

    服务器来实现接受多个客户的请求 并且处理响应 服务器采用了多线程 代码如下服务器 package cn kgc basic tcpthread import java io IOException import java net Serve
  • BERT从零详细解读:如何微调BERT,提升BERT在下游任务中的效果

    a 是句子对的分类任务 b 是单个句子的分类任务 c 是问答任务 d 是序列标注任务 首先我自己最常用的就是 文本分类 序列标注和文本匹配 这四个都是比较简单的 我们来看d 序列标注 其实就是把所有的token输出 做了一个softmax
  • Blender学习笔记(建模#3:点操作)

    建模 3 点操作 点操作 1 点的移动 2 点的滑移 3 点的合并 4 点的倒角 5 顶点连接 点操作 1 点的移动 当要将点在斜面上移动时 直接移动很难顺着斜面移动 这时可以使用法向坐标系 2 点的滑移 基本同线的滑移 3 点的合并 两点
  • AngularJs 的compile, preLink , postlink

    AngularJs 的compile preLink postlink 主要参考文章 1 http www jb51 net article 58229 htm 文章中对这三个概念做了详细的解析 如果你只写了一个link 那么系统会默认是p
  • Burp Suit+Phpstudy+Pikachu搭建Web安全练习环境

    1 软件安全测试工具Burp Suit安装 1 1 社区版 进入官网 Download Burp Suite Community Edition PortSwigger 进行下载安装即可 1 2 专业版 搜索Burp Suit2 0 11从
  • 链表相交等相关问题java - 左神算法基础课04 - Kaiqisan

    大家好 都吃晚饭了吗 我是Kaiqisan 是一个已经走出社恐的一般生徒 今天讲讲我至今碰到的最变态的链表题 问题 单链表两个单链表可能有环 可能无环 判断两个链表是否存在相交 如果有相交 返回其中一个交点 要求 时间复杂度 O m n 空
  • 【计算机网络】湖科大微课堂笔记 p36-37 集线器与交换机的区别、以太网交换机自学习和转发帧的流程

    集线器与交换机的区别 集线器 共享型以太网 交换机 交换式以太网 早期与集线器 使用集线器HUB在物理层拓展以太网 下面是三个独立的以太网 可以用集线器把它们互联形成更大的以太网 若一系中的某主机向二系中某主机发送数据帧 则此信号会传遍整个
  • antd 4.x, 实现Table 可编辑 , Table 结合Form.List,实现单独校验Form.List、Form.Item校验

    背景 需要实现一个这种表格 思路 1 编辑表格 antd 有案例 2 Form List 嵌套Table 实现 关键点 单行校验怎么传参 单行如何获取值 单行如何重置 注意 我的form 是从外层传进来的 这个没有影响 正常在 Form L
  • gdb调试工具的基本用法

    一 基本命令 gcc g test c o test 编译时生成debug有关的程序信 gdb test 启动调试 help 查看命令帮助 具体命令查询在gdb中输入help 命令 简写h run 重新开始运行文件 run text 加载文
  • Android 解析json数据

    花了两天的时间完成了一个简单的小程序 服务器端从数据库封装json 数据 客户端解析json数据后用listview 显示 现在做一个简单的梳理 一 服务器端从数据库中获取数据后封装成json数据 服务器端编程 连接数据库的过程就不上代码了
  • 给女朋友道歉的java代码_我用开源工具给女朋友写道歉信!

    一 又是一个可乐配赘婿的晚上 我和女朋友舒服的窝在沙发里 一边看爽剧一边傻笑 其实 我并不太喜欢看这种剧 但是为了陪女朋友 我还是乐此不疲 可能因为长期996 我的脑子已经坏掉了 就在女朋友一边大笑一边大喊好甜啊磕到啦 我用地图老爷爷看手机
  • 解决邮件附件乱码问题

    参考这个博客 https blog csdn net daiqinge article details 89970382或者https blog csdn net z69183787 article details 79238735 1 如
  • 神奇的python(六)之python的串口操作(pyserial)

    简介 最近项目突然要使用python串口操作 这不 查资料 翻文档 是时候写一份串口操作的简要用法 以后有时间可以使用pyqt再写个界面 弄个串口调试终端 1 安装pyserial库 pip install pyserial 2 pyser
  • 巅峰战舰服务器维护,怎么又维护 ?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 儿子马上就要过15岁生日了 爸爸问他生日礼物想要什么 儿子想了想说 男孩子想要的东西我都有了 唯一能想到的 就是一只用塑料做的鹦鹉玩具 爸爸很纳闷 塑料做的鹦鹉 真的就只要这个玩意 儿子点头 恩
  • SSM框架-小区物业管理系统(附源码和运行视频)

    文章目录 系列文章目录 前言 一 开发框架与业务需求 1 开发框架 2 开发环境 3 整体业务 二 项目结构以及页面展示 1 注册 登录页展示 2 首页 小区管理 3 房产 业主信息管理 4 停车位 服务管理 三 ssm框架配置以及代码包级
  • c 显示ftp服务器上的图像,ftp服务器上的图片怎样预览

    ftp服务器上的图片怎样预览 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ exe 在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例
  • $route和$router的区别

    1 router是用来操作路由 route是用来获取路由信息 2 router是VueRouter的一个实例 他包含了所有的路由 包括路由的跳转方法 钩子函数等 也包含一些子对象 例如history 3 route是一个跳转的路由对象 路由
  • React中的事件处理

    原生中点击事件时onclick 在React中点击事件是onClick C是大写 1 所以事件都是被React封装了一次React封装一次 是为了更好的兼容性 2 React中的事件是通过事件委托方式处理的 委托给组件最外层的元素 例子 下
  • file not found: /usr/lib/libstdc++.dylib

    git clone https github com devdawei libstdc 进入到对应文件夹 sudo sh nstall Xcode 12 sh
  • YOLO——基于回归的目标检测算法

    YOLO You Only Look Once Unified Real Time Object Detection 这篇论文的内容并不多 核心思想也比较简单 下面相当于是对论文的翻译 YOLO是一个可以一次性预测多个Box位置和类别的卷积