YOLOvi(i=1,2,3,4)系列

YOLOv4论文链接:https://arxiv.org/pdf/2004.10934.pdf

YOLOv4源码链接:https://github.com/AlexeyAB/darknet

YOLO 系列算法是目标检测 one-stage 类的代表算法,本文将从 问题背景,创新点等方面比较,了解它们的的发展历程。

一、任务描述

目标检测是为了解决图像里的物体是什么,在哪里的问题。输入一幅图像,输出的是图像里每个物体的类别和位置,其中位置用一个包含物体的框表示。

需要注意目标,同时也是论文中常说的感兴趣的物体,指关心的类别(行人检测只检测人,交通检测只关心交通工具等),或者数据集包含的类别,并不是图像里所有的物体都是目标,比如建筑,草坪也是物体,但他们常常是背景。

从计算机视觉的角度看,目标检测是分类+定位,从机器学习的角度看,目标检测是分类+回归

二.YOLOv4介绍

论文链接:https://arxiv.org/pdf/2004.10934.pdf

源码链接:https://github.com/AlexeyAB/darknet

有大量的特征被认为可以提高卷积神经网络(CNN)的精度。需要在大型数据集上对这些特征的组合进行实际测试,并对结果进行理论验证。某些功能只在某些模型上运行,某些问题只在某些模型上运行,或只在小规模数据集上运行;而某些功能(如批处理规范化和残差连接)适用于大多数模型、任务和数据集。

假设这些通用特征包括加权残差连接(WRC)、跨阶段部分连接(CSP)、跨小批量规范化(CmBN)、自对抗训练(SAT)和Mish激活。

新功能:WRC、CSP、CmBN、SAT、误激活、马赛克数据增强、CmBN、下降块正则化和CIoU损失,并将其中一些功能结合起来,达到以下效果:43.5%AP(65.7%AP50)的MS COCO数据集,在Tesla V100上以65 FPS的实时速度。

贡献总结如下:

1.  开发了一个高效、强大的目标检测模型。它使得每个人都可以使用1080Ti或2080Ti的GPU来训练一个超快速和精确的目标探测器。

2.  在探测器培训期间,验证了最先进的免费包和特殊包目标检测方法的影响。

3.  修改了最新的方法,使之更有效,更适合于单一GPU训练,包括CBN[89]、PAN[49]、SAM[85]等。

总之,通用的目标探测由几个部分组成:

YOLOv4主要模块:

为使得所涉及的检测器更适合于GPU,作者还进行了其他几项额外设计与改进:

  • 引入一种新的数据增广方法:Mosaic与自对抗训练;
  • 通过GA算法选择最优超参数;
  • 对现有方法进行改进以更适合高效训练和推理:改进SAM、改进PAN,CmBN。

作者在现有实时网络的基础上提出了两种观点:

  • 对于GPU而言,在组卷积中采用小数量的groups(1-8),比如CSPResNeXt50/CSPDarknet53;
  • 对于VPU而言,采用组卷积而不采用SE模块。

网路结构选择

网络结构选择是为了在输入分辨率、网络层数、参数量、输出滤波器数之间寻求折中。作者研究表明:CSPResNeXt50在分类方面优于CSPDarkNet53,而在检测方面反而表现要差。

网络主要结构确定了后,下一个目标是选择额外的模块以提升感受野、更好的特征汇聚模块(如FPN、PAN、ASFF、BiFPN)。对于分类而言最好的模型可能并不适合于检测,相反,检测模型需要具有以下特性:

更高的输入分辨率,为了更好的检测小目标;

更多的层,为了具有更大的感受野;

更多的参数,更大的模型可以同时检测不同大小的目标。

总之,选择具有更大感受野、更大参数的模型作为backbone。给出了不同backbone的上述信息对比。从中可以看到:CSPResNeXt50仅仅包含16个卷积层,其感受野为425x425,包含20.6M参数;而CSPDarkNet53包含29个卷积层,725x725的感受野,27.6M参数。这从理论与实验角度表明:CSPDarkNet53更适合作为检测模型的Backbone。

三、设计思想

目标检测架构分为两种,一种是two-stage,一种是one-stage,区别就在于 two-stage 有region proposal 过程,类似于一种海选过程,网络会根据候选区域生成位置和类别,而 one-stage 直接从图片生成位置和类别。

今天提到的 YOLO 就是一种 one-stage 方法。

YOLO 是 You Only Look Once 的缩写,意思是神经网络只需要看一次图片,就能输出结果。

YOLO 一共发布了四个版本,其中 YOLOv1 奠定了整个系列的基础,后面的系列就是在第一版基础上的改进,只为提升性能。

YOLO的检测方法如下:

  • 将输入图像划分为 S×S 网格(grid),比如这里划分成 7×7=49 个 grid,如果目标的中心落入网格单元,则该网格单元负责检测该目标。注意不是整个物体落入单元格,只需要物体中心在即可。
  • 每个网格单元预测 B(文中 B=2) 个边界框和这些框的置信度得分。这个分数反映这个框包含物体的概率 Pr(Object) 以及预测框的位置准确性 IOU,所以置信分数也由这两部分定义:
  • 每个 bounding box 都要包含 5 个预测值,x, y, w, h, confidence。(x,y)框中心是相对于网格单元的坐标,w 和 h 是框相当于整幅图的宽和高,confidence 代表该框与 ground truth 之间的 IOU(框里没有物体分数直接为 0 )
  • 因为位置和类别需要同时预测,所以每个单元格除了输出 bounding box 也输出物体的条件概率(该物体属于某一类的概率,当然这些概率以包含对象的网格单元为条件)。每个网格单元输出一个概率集合,不考虑这个 grid 预测几个 bounding box。
  • 测试阶段,在测试时,将条件分类概率与各个框的置信度预测相乘,作为每个框特定于每个类的置信分数(这个分数编码了类别和位置两部分信息)。

与 R-CNN 系列方法相比:

  • R-CNN 及其变体采用 region proposals 而不是滑动窗口法找物体,是一种多阶段方法。调网络的时候需要分开调,运行慢。
  • YOLO 与 R-CNN 相似的地方是在网格单元找可能的边界框,用 CNN 提取特征。不同的是,加在网格单元的空间限制有助于防止同一个目标的重复检测,预测的边界框也少(98 个),还有把多个阶段结合成一个阶段。

四、各自特点和发展

1. YOLOv1

问题背景

之前 two-stage 方法如 R-CNN 把检测问题分成两部分,先生成候选区域(region proposal),再用分类器对区域分类,多阶段训练导致不易优化。

创新点

把检测当作回归问题,用一个网络输出位置和类别,实现了一个 unified system,从检测的角度是 one-stage的

训练流程

和 R-CNN 差不多

  • 首先 ImageNet 1000类 竞赛数据集上对卷积层进行预训练
  • 然后再把网络根据检测任务微调

检测流程

  • 输入一幅多目标图像
  • 将图像划分成多个网格
  • 通过网络得到每个网格的分类概率,以及各网格预测的框+置信度
  • 针对每个框,把概率与置信分数相乘,作为每个框特定于每个类的置信分数
  • 输出位置和类别信息

优点

  • 快。因为回归问题没有复杂的流程(pipeline)。
  • 可以基于整幅图像预测(看全貌而不是只看部分)。与基于滑动窗口和区域提议的技术不同,YOLO在训练和测试期间会看到整个图像,因此它隐式地编码有关类及其外观的上下文信息。因为能看到图像全貌,与 Fast R-CNN 相比,YOLO 预测背景出错的次数少了一半。
  • 学习到物体的通用表示(generalizable representations),泛化能力好。因此,当训练集和测试集类型不同时,YOLO 的表现比 DPM 和 R-CNN 好得多,应用于新领域也很少出现崩溃的情况。

缺点

  • 空间限制:一个单元格只能预测两个框和一个类别,这种空间约束必然会限制预测的数量;
  • 难扩展:模型根据数据预测边界框,很难将其推广到具有新的或不同寻常的宽高比或配置的对象。由于输出层为全连接层,因此在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率。
  • 网络损失不具体:无论边界框的大小都用损失函数近似为检测性能,物体 IOU 误差和小物体 IOU 误差对网络训练中 loss 贡献值接近,但对于大边界框来说,小损失影响不大,对于小边界框,小错误对 IOU 影响较大,从而降低了物体检测的定位准确性。

2. YOLOv2

问题背景

  • YOLOv1 检测性能低
  • 当前的检测任务受数据集标签的限制(数据集必须有标签或通过分类赋予标签)。但是,标记检测图像比标记分类图像昂贵得多,所以检测数据和分类数据不是一个规模。

创新点

  • 针对第一个问题,使用一些方法提升 YOLOv1 的性能,得到 YOLOv2。
  • 针对第二个问题,提出了 ImageNet 和 COCO 数据集的结合方法,以及联合训练方法,训练 YOLOv2 后得到的模型叫 YOLO9000。

提升性能的方法

  • Accuracy: Batch Normalization, High Resolution Classifier, Convolutional With Anchor Boxes, , Direct location prediction, Fine-Grained Features, Multi-Scale Training
  • Speed: 提出一个新网络 Darknet-19

训练流程

论文提出了一种联合训练算法,该算法可以在检测和分类数据上训练目标检测器。
利用标记的检测图像来学习精准定位,同时使用分类图像来增加其“词汇量”和健壮性。

  • 分类检测数据集结合方法:

检测数据集的标签少且普通,分类数据集的标签多且具体,如果想在两个数据集上训练,就得把它们的标签合并起来。很多分类方法都用一个 softmax layer ,但它的前提是假设所有类互斥,但的数据集类别是不都是互斥的(有可能是包含关系,例如狗和金毛犬),所以使用了一个多标签模型来组合数据集(无互斥的要求),及使用多个 softmax 。

大多数分类方法都假定标签采用扁平结构,但是对于组合数据集需要层次化的结构。

ImageNet 标签采用有向图结构。在这里,作者把数据集的结构简化为结构树(hierarchical
tree)。

通过改造图,最后得到一个 WordTree,这样每个节点/标签都有自己的概率,解决了类别之间不互斥的问题,就能在检测集和分类集上联合训练。

  • 联合训练方法:

把检测和分类数据混合,训练过程中遇到带标签的检测图像,就基于 YOLOv2 整个损失函数进行反向传播,遇到分类图像,只反向传播网络的分类损失。

3. YOLOv3

问题背景

  • YOLOv3 的提出不是为了解决什么问题,整篇论文其实是技术报告。
  • YOLOv3 在 YOLOv2 基础上做了一些小改进,文章篇幅不长,核心思想和 YOLOv2、YOLO9000差不多。

模型改进

  • 边界框预测:定位任务采用 anchor box 预测边界框的方法,YOLOv3 使用逻辑回归为每个边界框都预测了一个分数
    objectness
    score
    ,打分依据是预测框与物体的重叠度。如果某个框的重叠度比其他框都高,它的分数就是 1,忽略那些不是最好的框且重叠度大于某一阈值(0.5)的框
  • 类别预测:和 YOLOv2 一样,YOLOv3 仍然采取多标签分类
  • 多尺度预测
  • 使用新网络
    Darknet-53 提取特征

4. YOLOv4

问题背景

  • YOLO 原作者之前宣布退出CV界,YOLOv4 的作者其实不是前三篇 YOLO 的一作
  • YOLOv4 是对 YOLOv3 的一个改进。它的改进方法就是总结了几乎所有的检测技巧,又提出一点儿技巧,然后经过筛选,排列组合,挨个实验(ablation study)哪些方法有效。
  • 值得注意的是文章第二部分相关工作,简直就是目标检测的一个简单综述,阅读该部分,你就能了解模型及方法,如果它提到的每个方法你都了解,说明你在这个方向的研究较全面深入(我没达到)。

框架方法

下面这幅论文中的图介绍了 YOLOv4 检测器的构成及使用的训练方法,这些是经过大量实验选出的性能最好的组合

五、总结

回顾 YOLO 系列的发展,可以看出 YOLO
后期没有提出新颖的想法,更重视应用落地。

YOLOvi(i=1,2,3,4)系列的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  3. Angular杂谈系列1-如何在Angular2中使用jQuery及其插件

    jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...

  4. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  5. 03.SQLServer性能优化之---存储优化系列

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概  述:http://www.cnblogs.com/dunitian/p/60413 ...

  6. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  7. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  8. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  9. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

随机推荐

  1. php isset()与empty()的使用

    PHP isset函数作用 isset函数是检测变量是否设置. 格式:bool isset( mixed var [, mixed var [, ...]] ) 返回值: 若变量不存在则返回FALSE ...

  2. Pytest自动化测试-简易入门教程(02)

    Pytest框架简介 Pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:1.简单灵活,容易上手,支持参数化2.能够支持简单的单元测试和复杂的功能测试,3.还可以用来做sel ...

  3. 死磕Spring之AOP篇 - Spring 事务详解

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  4. 如何实现一个 System Services?

    <Android 系统开发做什么?>写到 Android System Services 是专注于特定功能的模块化组件,应用框架 API 所提供的功能可与系统服务通信,以访问底层硬件.An ...

  5. Scrum Meeting 0

    Basic Info where:五号教学楼 when:2020/4/21 target: 明确每次会议基本流程 简要汇报一下已完成任务,下一步计划与遇到的问题 Progress Team Membe ...

  6. MyBatis进阶--接口代理方式实现Dao 和动态SQL

    MyBatis接口代理方式实现Dao层 接口代理方式-实现规则 传统方式实现Dao层,我们既要写接口.还要写实现类.而MyBatis框架可以帮助我们省略写Dao层接口实现类的步骤.程序员只需要编写接口 ...

  7. 无连接运输:UDP

    多路复用和解复用与校验和是UDP唯一能做的事,运输层的协议必须做点什么,什么都没有就不需要这一层了. 为什么要使用UDP 既然有了可靠传输的TCP,为什么还要在udp之上来构件应用呢? 有效载荷大,T ...

  8. AOP随笔

    AOP: Aspect-Oriented Programming 面向切面编程. 首先明确一个点:AOP是一个概念.那么对于一个概念,其实现方式多种多样,分为静态AOP.动态AOP,而对于动态AOP的 ...

  9. [bug] Maven [WARNING] 'parent.relativePath' of POM

    参考 https://blog.csdn.net/simajinxiu/article/details/86667894

  10. 分析Red Hat sosreport输出的方法

    分析Red Hat sosreport输出的方法? Modified on: Fri, 31 May 2019 20:20:02 +0800 有一段时间(自EL 4.6以来),Red Hat嵌入了sy ...