YOLOv3论文精读: An Incremental Improvement-增量式的改进

news2024/11/20 0:47:10

Abstract

我们对 YOLO 进行了一系列更新!它包含一堆小设计,可以使系统的性能得到更新。我们也训练了一个新的、比较大的神经网络。虽然比上一版更大一些,但是精度也提高了。不用担心,它的速度依然很快。YOLOv3 在 320×320 输入图像上运行时只需 22ms,并能达
到 28.2 mAP,其精度和 SSD 相当,但速度要快上 3 倍。使用之前 0.5 IOU mAP 的检测指标,YOLOv3 的效果是相当不错。YOLOv3 使用Titan X GPU,其耗时 51ms 检测精度达到 57.9 AP50,与 RetinaNet 相比,其精度只有 57.5 AP50,但却耗时 198ms,相同性能的条件下YOLOv3 速度比 RetinaNet 快 3.8 倍。与之前一样,所有代码在网址:https://pjreddie.com/yolo/

Introduction

The Deal

这节主要介绍 YOLOv3 的方案:我们主要从其他人的研究工作
里获得了一些好思路、好想法。我们还训练了一个新的、比其他网络更好的分类网络。为了方便您理解,我们将带您从头到尾贯穿整个模型系统。
在这里插入图片描述
图 1.这个图来自 Focal Loss 论文[9]。YOLOv3 的运行速度明显快于其他具有可比性能的检测方法。检测时间基于 M40 或 Titan X(这两个基本上是相同的 GPU)

按照 YOLO9000,我们的系统也使用维度聚类得到的 anchor 框来预测边界框[15]。网络要预测每个边界框的 4 个坐标: t x 、 t y 、 t w 、 t h t_x、t_y、t_w、t_h txtytwth。假设格子距离图像的左上角偏移量为 ( c x , c y ) (c_x,c_y) (cxcy),先验边界框宽度和高度分别为: p w 、 p h p_w、p_h pwph,则预测结果对应为:

在这里插入图片描述
训练时我们使用误差平方和损失。如果某个预测坐标的真值是 t ^ ∗ \hat t_* t^,那么梯度就是真值(从真值框计算而得)和预测值之差: t ^ ∗ − t ∗ \hat t_*-t_* t^t。真实值可以很容易地通过变换上述公式得到。

YOLOv3 使用逻辑回归预测每个边界框是目标的分数。如果真实标签框与某个边界框重叠的面积比与其他任何边界框都大,那么这个先验边界框得分为 1。按照[17]的做法,如果先验边界框不是最好的,但是确实与目标的真实标签框重叠的面积大于阈值,我们就会忽略这个预测。我们使用阈值为 0.5。与[17]不同,我们的系统只为每个真实目标分配一个边界框。如果先验边界框未分配到真实目标,则不会产生坐标或类别预测的损失,只会产生是否是目标的损失。


yolov1的预测框相对于grid cell是随机生长的,yolov2的预测框相对anchor的偏移也可能是随机乱窜的。

在这里插入图片描述
这时就要对偏移量进行限制。因为输出是预测框相对于anchor的偏移量,下面的 t x , t y , t w , t h t_x,t_y,t_w,t_h tx,ty,tw,th就是偏移量。
在这里插入图片描述
t x t_x tx t y t_y ty可以是从负无穷到正无穷的任何数,这就可能导致野蛮生长。

于是给他给它加了一个Sigmoid函数,这个函数的作用就是无论偏移值是多大多小,最终的输出是0到1之间的。这个 C x C_x Cx C y C_y Cy是grid cell左上角对应的坐标,这里它全部归一化为1x1了,就是说它的横坐标只可能在一个单位框范围内滑动,也就是说预测框的中心点肯定就被限制在了这个grid cell里面。

而宽和高可能比较大,也可能比较小,所以就不对其限制了。

在这里插入图片描述
最终的confidence和yolov1一样,由object的置信度乘上IOU


分类预测

每个边界框都会使用多标签分类来预测框中可能包含的类。我们不用 softmax,而是用单独的逻辑分类器,因为我们发现前者对于提升网络性能没什么作用。在训练过程中,我们用 binary cross-entropy(二元交叉熵)损失来预测类别。
当我们转向更复杂的领域,例如 Open Images Dataset [7],上面的这种改变将变得很有用。这个数据集中有许多重叠的标签(例如女性和人)。使用 softmax 会强加这样一个假设——即每个框恰好只有一个类别,但通常情况并非如此。多标签的方式可以更好地模拟数据。

跨尺度预测

YOLOv3 预测 3 种不同尺度的框。我们的系统使用类似特征金字塔网络的相似概念,并从这些尺度中提取特征[8]。在我们的基础特征提取器上添加了几个卷积层。其中最后一个卷积层预测了一个编码边界框、是否是目标和类别预测结果的三维张量。在我们的 COCO 实验[8]中,我们为每个尺度预测 3 个框,所以对于每个边界框的 4 个偏移量、1 个目标预测和 80 个类别预测,最终的张量大小为 N × N × [ 3 × ( 4 + 1 + 80 ) ] N×N×[3×(4+1+80)] N×N×[3×(4+1+80)]

接下来,我们从前面的2 个层中取得特征图,并将其上采样2倍。我们还从网络中的较前的层中获取特征图,并将其与我们的上采样特征图进行拼接。这种方法使我们能够从上采样的特征图中获得更有意义的语义信息,同时可以从更前的层中获取更细粒度的信息。然后,我们添加几个卷积层来处理这个特征映射组合,并最终预测出一个相似的、大小是原先两倍的张量。我们再次使用相同的设计来预测最终尺寸的边界框。因此,第三个尺寸的预测将既能从所有先前的计算,又能从网络前面的层中的细粒度的特征中获益。

我们仍然使用 k-means 聚类来确定我们的先验边界框。我们只是
选择了 9 个类和 3 个尺度,然后在所有尺度上将聚类均匀地分开。在
COCO 数据集上,9 个聚类分别为 ( 10 × 13 ) 、 ( 16 × 30 ) 、 ( 33 × 23 ) 、 ( 30 × 61 ) 、 ( 62 × 45 ) 、 ( 59 × 119 ) 、 ( 116 × 90 ) 、 ( 156 × 198 ) 、 ( 373 × 326 ) (10×13)、(16×30)、(33×23)、(30×61)、(62×45)、(59×119)、(116 × 90)、(156 × 198)、(373 × 326) (10×13)(16×30)(33×23)(30×61)(62×45)(59×119)(116×90)(156×198)(373×326)

特征提取器

我们使用一个新的网络来进行特征提取。我们的新网络融合了YOLOv2、Darknet-19 和新发明的残差网络的思想。我们的网络使用连续的 3×3 和 1×1 卷积层,而且现在多了一些快捷连接(shortcut connetction),而且规模更大。它有 53 个卷积层,所以我们称之为Darknet-53!
在这里插入图片描述

这个新网络比 Darknet-19 功能强大很多,并且仍然比 ResNet-101或 ResNet-152 更高效。以下是一些 ImageNet 上的结果:

在这里插入图片描述
每个网络都使用相同的设置进行训练,并在 256×256 的图像上进行单精度测试。运行时间是在Titan X上用256×256图像进行测量的。因此,Darknet-53 可与最先进的分类器相媲美,但浮点运算更少,速度更快。Darknet-53 比 ResNet-101 更好,且速度快 1.5 倍。Darknet-53 与 ResNet-152 相比性能差不多,但速度快比其 2 倍。

Darknet-53 也实现了最高的每秒浮点运算测量。这意味着网络结构可以更好地利用 GPU,使它的评测更加高效、更快。这主要是因为ResNets 的层数太多,效率不高。

训练

我们仍然在完整的图像上进行训练,没有使用难负样本挖掘(hard negative mining)或其他类似的方法。我们使用多尺度训练,使用大量的数据增强、批量标准化等标准的操作。我们使用 Darknet 神经网络框架进行训练和测试[12]。

How We Do

YOLOv3 表现非常好!请看表 3。就 COCO 的平均 AP 指标而言,它与 SSD 类的模型相当,但速度提高了 3 倍。尽管如此,它仍然在这个指标上比像 RetinaNet 这样的其他模型差些。

在这里插入图片描述
然而,当我们使用“旧的”检测指标——在 IOU=0.5 的 mAP(或图表中的 AP50)时,YOLOv3 非常强大。其性能几乎与 RetinaNet 相当,并且远强于 SSD。这表明 YOLOv3 是一个非常强大的检测器,擅长为目标生成恰当的框。然而,随着 IOU 阈值增加,性能显著下降,这表明 YOLOv3 预测的边界框与目标不能完美对齐。之前的 YOLO 不擅长检测小物体。但是,现在我们看到了这种趋势的逆转。随着新的多尺度预测,我们看到 YOLOv3 具有相对较高的 APS 性能。但是,它在中等和更大尺寸的物体上的表现相对较差。需要更多的研究来深入了解这一点。

当我们在 AP50指标上绘制准确度和速度关系图时(见图 3),我们看到 YOLOv3 与其他检测系统相比具有显着的优势。也就是说,速度更快、性能更好。

在这里插入图片描述

Things We Tried That Didn’t Work

我们在研究 YOLOv3 时尝试了很多东西,但很多都不起作用。下面是我们要记住的血的教训。

Anchor 框的 x、y 偏移预测。我们尝试使用常规的 Anchor 框预测机制,比如利用线性激活将坐标 x、y 的偏移程度预测为边界框宽度或高度的倍数。但我们发现这种方法降低了模型的稳定性,并且效果不佳。

用线性激活代替逻辑激活函数进行 x、y 预测。我们尝试使用线性激活代替逻辑激活来直接预测 x、y 偏移。这个改变导致 MAP 下降了几个点

focal loss。我们尝试使用 focal loss。它使得 mAP 下降 2 个点。YOLOv3 可能已经对 focal loss 试图解决的问题具有鲁棒性,因为它具有单独的目标预测和条件类别预测。因此,对于大多数样本来说,类别预测没有损失?或者有一些?我们并不完全确定。

双 IOU 阈值和真值分配。Faster R-CNN 在训练期间使用两个 IOU阈值。如果一个预测与真实标签框重叠超过 0.7,它就是一个正样本,若重叠为[0.3,0.7]之间,那么它会被忽略,若它与所有的真实标签框的 IOU 小于 0.3,那么一个负样本。我们尝试了类似的策略,但无法取得好的结果。

我们非常喜欢目前的更新,它似乎至少在局部达到了最佳。有些方法可能最终会产生好的结果,也许他们只是需要一些调整来稳定训练。

What This All Means

YOLOv3 是一个很好的检测器。速度很快、很准确。它在 COCO平均 AP 介于 0.5 和 0.95 IOU 之间的指标的上并不理想。但是,对于旧的 0.5 IOU 检测指标上效果非常好。

为什么我们要改变指标?COCO 的原论文只是有这样一句含糊不清的句子:“一旦评估服务器完成,就会生成全面评测指标”。

Russakovsky 等人的报告说,人们很难区分 0.3 和 0.5 的 IOU。“训练人类用视觉检查 0.3 IOU 的边界框,并且与 0.5 IOU 的框区别开来是非常困难的。“[16]如果人类很难说出差异,那么它也没有多重要吧?但是也许更好的问题是:“现在我们有了这些检测器,我们要做什么?”很多做关于这方面的研究的人都受聘于 Google 和 Facebook。

我想至少我们知道这项技术在好人的手中,绝对不会被用来收集您的个人信息并将其出售给…等等,您是说这正是它的用途?oh。其他花大钱资助视觉研究的人还有军方,他们从来没有做过任何可怕的事情,例如用新技术杀死很多人,等等…

我强烈地希望,大多数使用计算机视觉的人都用它来做一些快乐且有益的事情,比如计算一个国家公园里斑马的数量[11],或者追踪在附近徘徊的猫[17]。但是计算机视觉已经有很多可疑的用途,作为研究人员,我们有责任考虑我们的工作可能造成的损害,并思考如何减轻它的影响。我们欠这个世界太多。

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

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

相关文章

【Django项目开发】部门管理模块的开发(九)

文章目录一、模型类设计二、视图设计1.都有哪些接口三、序列化器类设计四.分页操作1.utils工具中定义pagination.py2.视图类中使用五.路由配置一、模型类设计 一个部门下面可能会有很多子部门,一个子部门上面可能会有父部门;即部门内部之间进行关联&…

Grapecity DataViewsJS JavaScript Crack

Grapecity DataViewsJS一个完整的 React 数据展示和数据网格平台 通过从各种不同的演示视图中进行选择,包括树、卡片、砖石、网格、时间线、甘特图、日历和网格,超越传统的表格显示。采集 by Ω578867473 免费无限开发者许可!只为部署付费 快…

Hexo博客搭建(简化版)

Hexo博客搭建(简化版) 一、环境搭建 1.1 Git Git官网-下载界面 > git --version1.2 Node.js 1.2.1 下载安装Node.js Node.js官网下载界面 > node --version1.2.2 Hexo与Node.js Hexo versionMinimum (Node.js version)Less than (Node.js …

2023年我花费数小时整理的Java常用类文档,建议收藏学习

推荐学习专栏:【Java 编程基础教程系列】,从入门到就业精通,买不了吃亏,买不了上当!! 文章目录1. 基本类型的包装类1.1 概念1.2 常用的属性1.3 常用的方法1.4 自动装箱和自动拆箱2. 字符串类2.1 String 类2…

二分模板:查找数的范围、数的三次方根

内容摘自ACWING&#xff0c;一个很好的算法学习平台。 二分模板 判断左边界 当q[mid]>x时&#xff0c;待查找元素只会在mid左边&#xff0c;令rmid。 while( l < r ) {mid l r >> 1;if(q[mid] > x) r mid;else l mid 1; }判断右边界 当q[mid]<x&…

Spring项目中自动打印执行SQL和耗时,这款神级插件你值得拥有

这里写自定义目录标题参考简介集成方式如何使用步骤一&#xff0c;引入P6Spy。步骤二&#xff0c;修改数据源的配置。步骤三&#xff0c;新建spy.properties文件&#xff0c;放在resources目录下。步骤四&#xff0c;新建一个类实现MessageFormattingStrategy&#xff0c;并重写…

spring cache @Cacheable的使用

Cacheable的使用1.Cacheable1.1 cacheNames value1.2 关联多个缓存名1.3 key 和 keygenerator1.4 CacheManager CacheResolver1.5 sync1.6 condition1.7 unless2.CachePut 放置缓存3.CacheEvict 删除缓存4.测试代码5.默认缓存和redis缓存6.过程中的问题1.Cacheable 注解在方法…

剩余系,欧拉定理,扩展欧拉定理

剩余类&#xff08;同余类&#xff09; 给定一个正整数n&#xff0c;以 r ∈[0, n -1]表示所有形如的整数组成的集合称为模n的剩余类。例n 5,r 3,则C3 5x &#xff0b;3为模5的一个剩余类。 完全剩余系&#xff08;完系&#xff09; 给定一个正整数n&#xff0c;在模n的剩…

kafka生产者API

生产者工作流程 首先生产者调用send方法发送消息后&#xff0c;会先经过拦截器&#xff0c;接着进入序列化器。序列化器主要用于对消息的Key和Value进行序列化。接着进入分区器选择消息的分区。 上面这几步完成之后&#xff0c;消息会进入到一个名为RecordAccumulator的缓冲队…

javaWeb servlet

使用案例&#xff1a; <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> 导了包之…

五指山[《信息学奥赛一本通》](扩展欧几里得算法)

题目如下&#xff1a; 题解 or 思路 我们可以将题目 抽象 成数学模型 xkd≡y(modn)x kd \equiv y\ (mod\ n)xkd≡y (mod n) xkdya∗nx kd y a * nxkdya∗n k∗d−a∗ny−xk*d - a*n y - xk∗d−a∗ny−x 式子 在这里 kkk, aaa 是变量&#xff0c;其余是常数 我们可以扩展…

Java 快速开发几 MB 独立 EXE,写图形界面很方便

Java 写的桌面软件带上运行时只有 6 MB&#xff0c;而且还是独立 EXE 文 件&#xff0c;是不是难以置信&#xff1f; 想一想 Electron 没写多少功能就可能超过百 MB 的体积&#xff0c;Java 写的桌面软件算不算得上小、轻、快呢&#xff1f; aardio 可以支持很多编程语言&…

什么是 智慧行业 App?

智慧行业 是帮助大家将智能设备和边缘网关设备添加到云开发项目的移动端 App。App 提供 iOS 和安卓版本&#xff0c;您可以在对应系统的应用商店下载。 应用场景 智慧行业 能帮助用户将不同网络协议的设备&#xff08;包含边缘网关子设备&#xff09;配置到相关项目中。开发者…

对于TP, TN, FP, FN, Pre, Recall的举例

对于以上参数的概念以及理解&#xff0c;请参考我的文章&#xff1a; 机器学习中TP&#xff0c;TN&#xff0c;FP&#xff0c;FN&#xff0c;Acc&#xff0c;Pre&#xff0c;Sen, Rec的含义_汤宪宇的博客-CSDN博客_机器学习accz 这里我们在将上面概念的定义重新梳理一遍&#…

深入源码剖析 Mybatis 缓存机制

深入源码剖析 Mybatis 缓存机制 Mybatis 为了减轻数据库压力&#xff0c;提高数据库性能。提供了两级缓存机制 一级缓存 sqlSession 级别缓存&#xff0c;缓存的数据只在 sqlSession 内有效&#xff0c;一级缓存默认为我们开起来&#xff0c;不需要我们手动操作&#xff0c;而…

【Dash搭建可视化网站】项目14:美国机场交通数据可视化看板制作步骤详解

美国机场交通数据可视化看板制作步骤详解1 项目效果图2 项目架构3 文件介绍和功能完善3.1 assets文件夹介绍3.2 app.py和index.py文件完善3.3 sider.py文件完善3.4 mapchart.py文件完善3.5 barchart.py文件完善3.6 api.py和api.ipynb文件完善4 样式修改4.1 整体样式修改4.2 sid…

联合证券|A股汽车板块爆发,北向资金半日净买入43亿

今日上午&#xff0c;A股商场震动胶着&#xff0c;轿车、电力设备、通信、机械设备等板块领涨。房地产、美容护理、商贸零售等板块领跌。 北向资金再度成为商场重要亮点之一&#xff0c;半个交易日净买入约43亿元。至此&#xff0c;2023年1月以来&#xff0c;北向资金累计净买入…

Jmeter常用函数

1、生成随机数函数 ${__Random(m,n)}&#xff0c;其中m,n参数是必填 2、 生成随机日期函数${__RandomDate(dateTimeFormat,from,end,locale,var)}&#xff0c;其中end是必选的&#xff0c;代表最大的日期&#xff1b; 3、 随机生成字符串函数${__RandomString(length,chars,)}…

Linux---vim编辑器

目录 1. vim的基本概念 2. vim正常/命令模式命令集 3. vim底行模式命令集 1. vim的基本概念 vim是Linux下一款常用编辑器&#xff0c;vim的三种模式(其实有好多模式&#xff0c;主要掌握这3种即可),分别是命令模式&#xff08;command mode&#xff09;、插入模式&#xff0…

Synchronized锁原理及 ConcurrentHashMap

文章目录一、Synchronized原理加锁过程锁消除锁粗化二、线程安全的集合类多线程环境使用ArrayList多线程环境使用队列多线程环境下使用哈希表一、Synchronized原理 我们表面看到的&#xff0c;两个线程针对同一对象加锁&#xff0c;就会产生阻塞等待&#xff0c;但实际我们的S…