【目标检测系列】YOLOV2解读

为更好理解YOLOv2模型,请先移步,了解YOLOv1后才能更好的理解YOLOv2所做的改进。

前情回顾:【目标检测系列】YOLOV1解读_怀逸%的博客-CSDN博客


背景

通用的目标检测应该具备快速、准确且能过识别各种各样的目标的特点。自从引入神经网络以来,检测框架已经变得越来越块和准确,但是受限于数据集规模的大小,检测方法仍被限制在小部分目标中。

目标检测数据集标注难度远大于分类任务,常见数据集的规模包含几千到数十万张图象,有几十到几百个标签,和分类任务数以百万计的图像及数十万的类别相比,远远不足。我们是希望检测能够达到目标分类的水平。

因此本文的主要工作就是在YOLOV1的基础上进行改进提出了YOLOv2。并提出了一种联合训练方法,在ImageNet的9000多个类别以及COCO的检测数据集上训练一个能够检测9000种类别的模型YOLO9000。

下面是具体的改进措施,从更好、更块、更强三个方向进行改进

更好

Batch Normalization——批量归一化

通过在YOLO的所有卷积层上添加BatchNorm,我们在mAP上的到了2%的改善。BatchNorm也有助于规范化模型,可以在舍弃dropout优化后依然不会过拟合。

Batch Normalization 原理解释

High Resolution Classifier——高分辨率分类器

16年的时候分类任务的发展速度远超于目标检测任务,因此在当时的背景下,所有最先进的目标检测方法都是使用在ImageNet上预训练的分类器作为预训练模型,然后迁移到目标检测任务中,使用目标检测数据集进行微调。但是,在最初的时候,像是AlexNet这样的分类器,都是在分辨率小于256*256的输入图像上进行运行的。

因此,在YOLOV1版本中,是先使用分辨率为224*224的分类器作为预训练模型,然后迁移到目标检测领域,使用448*448的完整分辨率进行微调。

YOLOv2对此的改进是,是先在ImageNet数据集中,以448*448的分辨率对分类网络进行微调,微调后的网络能够完成448*448分辨率图像的分类任务,最后将微调好的分类器迁移到目标检测任务中。

概括就是:YOLOv1使用224*224的分类器直接迁移到448*448的目标检测任务中。YOLOv2是先将分类器微调成448*448,然后再迁移到目标检测任务中。

最终效果mAP增加4%

Convolutional With Anchor Boxes——带有Anchor Boxes的卷积

Anchor: Anchor(先验框)就是一组预设的边界框,可以由横纵比和边框面积来定义,代表了开发人员凭借先验知识认为的待检测物体的形状大小。相当于,开发人员凭借先验知识,设计若干的Anchor,在可能的位置先将目标框出来,然后再在这些Anchor的基础上进行调整。

一个Anchor Box可以由边框的横纵比和边框的面积来定义,至于位置一般不需要定义,目标可能出现在图像的任意位置,因此Anchor Box通常是以CNN提取到的Feature Map的点为中心位置,按照预设大小生成边框。

下面来说一下YOLOv1中存在的问题,YOLOv1中每个cell存在B个框,只能预测一个类别,因此对小尺度的图像效果不佳;同时YOLOv1在训练过程中学习适应同一物体的不同形状是比较困难的,这也导致了YOLOv1在精确定位方面表现较差。之所以这样,是因为YOLOv1直接使用全连接层来预测边界框,要知道全连接层需要固定大小的输入,这也就导致了YOLOv1难以泛化到不同的尺度。

为此YOLOv2删掉了全连接层和最后一个Pooling层,使得最后卷积层可以有更高分辨率的特征;同时将网络的输入分辨率降为416*416

使用416*416而不是448*448的原因是因为YOLOv2下采样步长为32,对于416*416的图片,特征图为13*13,奇数给位置,确保在特征图正中间会存在一个中心单元格(大多数图像中,目标往往会占据图像中间位置)

同时YOLOv2的输出含义也发生变化

YOLOv1输出:S*S*(B*5+C)

YOLOv2输出:S*S*(B*(5+C))  不再是每个cell只能预测一个类别,而是每个box能单独预测一个类别

Dimension Clusters——维度聚类(K-means聚类确定Anchor初始值)

如果想要在YOLO中使用锚框,需要解决两个问题:第一个问题,锚框的尺寸应该如何选择,总不能每次都要开发人员去手动设计吧,这与YOLO的设计初衷不符。针对这个问题具体的结局方案就是使用K-means聚类方法,自动找到较好的训练参数。

具体来说,就是针对训练集中的真实框做K-means聚类算法,自动找到符合该训练集的锚框尺寸。同时针对K-means算法做了一点改进,使其更加符合目标检测算法的需求。具体来说,如果像标准K-means算法中一样,使用欧氏距离的话,大的锚框会比小的锚框产生更多的误差,因此,希望关于距离的度量与框的大小无关,所以采用交并比替换欧氏距离,距离度量公式改为d(box, centroid) = 1 - IOU(box, centroid)

Direct location prediction——直接的位置预测

需要解决的第二个问题:模型的不稳定。基于Anchor的方法再回归锚框时,并非直接得到最终坐标,实际上真正需要学习的是目标与预设Anchor的坐标偏移量,下面是公式  预测框中心坐标= 输出的偏移量×Anchor宽高+Anchor中心坐标,偏移量才是要学习的内容。这也就导致了一个问题,因为目标可能会出现在图像中的任意位置,在随机初始化的条件下,模型需要很长时间才能稳定的预测到合理的便宜量。

解决这个问题的办法就是,将预测边界框的偏移量由全图偏移量改成对象cell的左上角的相对偏移量,将预测框的偏移范围控制在每个cell中,做到每个Anchor只负责检测周围正负一个单位内的cell。这样可以使模型训练更加稳定。

Fine-Grained Features——细粒度的特征

YOLOv2使用13*13的特征图进行检测,虽然检测大的目标够用了,但是对于较小的对象来说,更细粒度的特性可能会使得检测效果更好。

与Faster R-CNN等使用多尺度的特征图不同,YOLOv2简单的增加了一个直通层,获得前层26*26分辨率特征。

具体操作:前层26*26分辨率特征图拆分成4块,沿通道拼接到13*13的特征图中

Multi-Scale Training——多尺度训练

YOLOv1固定448*448的分辨率作为输入,上面加入锚框操作后,我们将分辨率改成了416*416操作。在实际的应用中,我们需要先将图片放缩到416*416的固定大小,才可以保证网络正确检测到目标。但是,我们希望YOLOv2能够鲁棒的运行在不同尺寸的图像中,不要对数据进行放缩处理。

解决方案是利用YOLOv2只使用了卷积和池化层的特点,这意味着输入图像的大小并不会影响模型的正常运行。因此具体做法就是:网络训练过程中每隔10个epoch就随机一个新的尺寸的图像作为输入训练,这样整个训练流程下来,模型见到过各种尺寸的输入,自然能在不同尺寸在正常执行检测任务。由于模型的下采样采用了32倍,那么训练模型所用的图像分辨率就从{320,352,。。。,608}等中选择。

更快

除了检测更加准确之外,我们还希望能够以更快的速度运行,具体方法在本文中新提出了一个Darknet-19的网络

在YOLOv1中用的是GooLeNet(4个卷积层和2个全连接层),YOLOv2改用Darknet-19(19个卷积层和5个maxpooling层)

在YOLOv1中最后使用全连接层将7*7*1024的特征图变成7*7*30的特征图,但是这种变化完全可以通过卷积实现,从而大幅度减少参数量。

更强

作者提出了一种对分类和检测数据进行联合训练的机制。在此之前,先介绍下YOLOv2和YOLO9000的区别

YOLOv2:是在YOLOv1的基础上进行改进,特点是“更好、更快、更强”

YOLO9000:主要检测网络也是YOLOv2,同时使用联合优化技术进行训练,最终使得YOLO9000的网络结构允许实时的检测超过9000种物体分类,进一步缩小了检测数据集和分类数据集之间的大小代沟。

具体方法:

  • 输入的图片若为目标检测标签的,则在模型中反向传播目标检测的损失函数
  • 输入的图片若为分类标签的,则反向传播分类的损失函数

这样做的原理是因为虽然目标检测的数据集规模相对较小,但其实已经能够覆盖大多数物体的形状,例如:猫科动物中,狮子、老虎、豹子等体型类似,检测模型能够检测出这些物体所在的位置,缺乏的只是进一步分类的能力。而分类数据集要丰富得多,关于类别的标准要远远超过检测数据集。

综上,检测数据集可以为绝大多数物体提供位置信息,但缺少细分类的能力;分类数据集为更多物体提供最准确的类别信息,但缺少位置信息,二者结合则得到了YOLO9000


论文链接:https://arxiv.org/abs/1612.08242

源码地址:mirrors / alexeyab / darknet · GitCode

参考内容:【YOLO系列】YOLOv2论文超详细解读(翻译 +学习笔记)_路人贾'ω'的博客-CSDN博客

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

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

相关文章

【go语言学习笔记】04 Go 语言工程管理

文章目录 一、质量保证1. 单元测试1.1 定义1.2 Go 语言的单元测试1.3 单元测试覆盖率 2. 基准测试2.1 定义2.2 Go 语言的基准测试2.3 计时方法2.4 内存统计2.5 并发基准测试2.6 基准测试实战 3. 特别注意 二、性能优化1. 代码规范检查1.1 定义1.2 golangci-lint1.2.1 安装1.2.2…

【C# 基础精讲】循环语句:for、while、do-while

循环语句是C#编程中用于重复执行一段代码块的关键结构。C#支持for、while和do-while三种常见的循环语句,它们允许根据条件来控制代码块的重复执行。在本文中,我们将详细介绍这三种循环语句的语法和使用方法。 for循环 for循环是一种常见的循环结构&…

MySQL8是什么-MySQL8知识详解

从今天起,开始更新MySQL8的教程,今天更新MySQL8的第一篇文章,主要讲了MySQL8是什么、MySQL数据库的概念、MySQL的优势和MySQL的发展历史。 1、MySQL8是什么 MySQL 8是一个开源的关系型数据库管理系统。它是MySQL数据库的最新版本&#xff0c…

【RTT驱动框架分析06】-pwn驱动框架分析+pwm驱动实现

pwm pwm应用程序开发 访问 PWM 设备API 应用程序通过 RT-Thread 提供的 PWM 设备管理接口来访问 PWM 设备硬件,相关接口如下所示: 函数描述rt_device_find()根据 PWM 设备名称查找设备获取设备句柄rt_pwm_set()设置 PWM 周期和脉冲宽度rt_pwm_enable…

Tomcat 部署及优化

Tomcat概述 Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件基金会的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。在中小型系统和并发访问用户不是很…

【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio构建React完成点餐H5页面

前言 【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio 构建React完成点餐H5页面一、Cloud Studio介绍1.1 Cloud Studio 是什么1.2 相关链接1.3 登录注册 二、实战练习2.1 初始化工作空间2.2 开发一个简版的点餐系统页面1. 安装 antd-mobile2. 安装 less 和 less-loader3. …

opencv基础-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。 例如,在图 8-17 中,通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔(内部闭合的…

剑指offer39.数组中出现次数超过一半的数字

这个题非常简单&#xff0c;解法有很多种&#xff0c;我用的是HashMap记录每个元素出现的次数&#xff0c;只要次数大于数组长度的一半就返回。下面是我的代码&#xff1a; class Solution {public int majorityElement(int[] nums) {int len nums.length/2;HashMap<Integ…

为生成式AI提速,亚马逊云科技Amazon EC2 P5满足GPU需求

生成式AI&#xff08;Generative AI&#xff09;已经成为全球范围内的一个重要趋势&#xff0c;得到越来越多企业和研究机构的关注和应用。纽约时间7月26日&#xff0c;亚马逊云科技数据库、数据分析和机器学习全球副总裁Swami Sivasubramanian在亚马逊云科技举办的纽约峰会上更…

剑指 Offer 15. 二进制中1的个数

题目描述 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为 汉明重量).&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如…

电动汽车设计、制造、研发的学科、技术和前沿科技综述

引言&#xff1a;电动汽车作为替代传统燃油汽车的一种先进交通工具&#xff0c;不仅具有环保、低噪音等优势&#xff0c;而且对于能源消耗和气候变化等全球性问题也具有重要意义。本文将综述与电动汽车设计、制造、研发相关的学科、技术和前沿科技&#xff0c;以期对电动汽车领…

PHP8的程序结构-PHP8知识详解

在做任何事情之前&#xff0c;都需要遵循一定的规则。在PHP8中&#xff0c;程序能够安照人们的意愿执行程序&#xff0c;主要依靠程序的流程控制语句。 不管多复杂的程序&#xff0c;都是由这些基本的语句组成的。语句是构造程序的基本单位。程序执行的过程就是执行程序语句的…

你不了解的Dictionary和ConcurrentDictionary

最近在做项目时&#xff0c;多线程中使用Dictionary的全局变量时&#xff0c;发现数据并没有存入到Dictionary中&#xff0c;但是程序也没有报错&#xff0c;经过自己的一番排查&#xff0c;发现Dictionary为非线程安全类型&#xff0c;因此我感觉数据没有写进去的原因是多线程…

基于Python 简易实现接口测试自动化

目录 实现思路 统筹脚本 请求封装 日志封装 结果比对 结果邮件 用例获取及数据格式化 请求url转换 测试用例excel结构 测试报告 邮件接收结果 资料获取方法 实现思路 使用excel管理用例用例信息&#xff0c;requests模块发送http请求&#xff0c;实现了记录日志&…

使用vue模拟通讯录列表,对中文名拼音首字母提取并排序

一个功能需求,做一个类似联系人列表的功能,点击名称获取对应的id,样式简陋,只是一个模板,原来是uniapp项目,根据需要改成了vue,需要的自行设计css&#xff08;万是有一个mo的音&#xff09; 流程 获取数据提取首个字的拼音的首个字母排序并分组 上代码&#xff1a; <temp…

SpringBoot自动装配及run方法原理探究

自动装配 1、pom.xml spring-boot-dependencies&#xff1a;核心依赖在父工程中&#xff01;我们在写或者引入一些SpringBoot依赖的时候&#xff0c;不需要指定版本&#xff0c;就因为有这些版本仓库 1.1 其中它主要是依赖一个父工程&#xff0c;作用是管理项目的资源过滤及…

实验室如何选择适合的LIMS实验室管理系统

实验室信息管理系统(LIMS)是从20世纪70年代末开始发展起来的&#xff0c;距今在国外已发展40多年。国内发展历史约20多年&#xff0c;且前十几年国内市场上主要是国外进口的LIMS产品&#xff0c;存在价格高、产品重&#xff0c;实施周期长等水土不服的情况。近十年开始&#xf…

ctf中linux内核态的漏洞挖掘与利用系列(一)

说明 该系列文章主要是从ctf比赛入手&#xff0c;针对linux内核上的漏洞分析、挖掘与利用做讲解&#xff0c;本篇文章主要介绍内核漏洞利用所需的前置知识以及准备工作。 linux内核态与用户态的区别 以 Intel CPU 为例&#xff0c;按照权限级别划分&#xff0c;Intel把 CPU指…

深入浅出对话系统——检索式对话系统进阶方法

引言 本文介绍检索式对话系统进阶方法&#xff0c;主要介绍两篇论文工作。 Fine-grained Post-training for Improving Retrieval-based Dialogue Systems 这里的post-training是定义在pre-training和fine-turning中间的阶段&#xff0c;具体的思想是用一些特定领域的数据去…

Springboot中创建拦截器

目录 目的 实现过程 1、创建拦截器 2、注册拦截器 完整代码 目的 在Springboot项目中创建拦截器&#xff0c;在进入Controller层之前拦截请求&#xff0c;可对拦截到的请求内容做响应处理&#xff0c;如&#xff1a;校验请求参数、验证证书等操作&#xff1b; 实现过程 1、创…