当前位置: 首页 > news >正文

【目标检测系列】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博客

相关文章:

【目标检测系列】YOLOV2解读

为更好理解YOLOv2模型,请先移步,了解YOLOv1后才能更好的理解YOLOv2所做的改进。 前情回顾:【目标检测系列】YOLOV1解读_怀逸%的博客-CSDN博客 背景 通用的目标检测应该具备快速、准确且能过识别各种各样的目标的特点。自从引入神经网络以来&a…...

【深入浅出程序设计竞赛(基础篇)第一章 算法小白从0开始】

深入浅出程序设计竞赛&#xff08;基础篇&#xff09;第一章 算法小白从0开始 第一章 例题例1-1例1-2例1-3例1-4例1-5例1-6例1-7例1-8例1-9例1-10例1-11 第一章 课后习题1-11-21-31-4 第一章 例题 例1-1 #include<iostream> using namespace std;int main(){cout <&…...

openGauss学习笔记-36 openGauss 高级数据管理-TRUNCATE TABLE语句

文章目录 openGauss学习笔记-36 openGauss 高级数据管理-TRUNCATE TABLE语句36.1 语法格式36.2 参数说明36.3 示例 openGauss学习笔记-36 openGauss 高级数据管理-TRUNCATE TABLE语句 清理表数据&#xff0c;TRUNCATE TABLE用于删除表的数据&#xff0c;但不删除表结构。也可以…...

ChatGPT生成文本检测器算法挑战大赛

ChatGPT生成文本检测器算法挑战大 比赛链接&#xff1a;2023 iFLYTEK A.I.开发者大赛-讯飞开放平台 (xfyun.cn) 1、数据加载和预处理 import numpy as np import pandas as pd from sklearn.model_selection import train_test_split, cross_val_predict from sklearn.linea…...

O2OA开发平台实施入门指南

O2OA&#xff08;翱途&#xff09;开发平台&#xff0c;是一款适用于协同办公系统开发与实施的基础平台&#xff0c;说到底&#xff0c;它也是一款快速开发平台。开发者可以基于平台提供的能力完成门户、流程、信息相关的业务功能开发。 既然定位为开发平台&#xff0c;那么开…...

服装行业多模态算法个性化产品定制方案 | 京东云技术团队

一、项目背景 AI赋能服装设计师&#xff0c;设计好看、好穿、好卖的服装 传统服装行业痛点 • 设计师无法准确捕捉市场趋势&#xff0c;抓住中国潮流 • 上新周期长&#xff0c;高库存滞销风险大 • 基本款居多&#xff0c;难以满足消费者个性化需求 解决方案 • GPT数据…...

MySQL表空间结构与页、区、段的定义

文章目录 一、概念引入1、页2、区3、段 二、页的结构1、File Header2、FIle Trailer 三、区的结构1、分类2、XDES Entry3、XDES Entry链表 四、段的结构五、独立表空间1、FSP_HDR页2、XDES页3、IBUF_BITMAP页4、INODE页5、INDEX页 六、系统表空间 一、概念引入 1、页 InnoDB是…...

RaabitMQ(三) - RabbitMQ队列类型、死信消息与死信队列、懒队列、集群模式、MQ常见消息问题

RabbitMQ队列类型 Classic经典队列 这是RabbitMQ最为经典的队列类型。在单机环境中&#xff0c;拥有比较高的消息可靠性。 经典队列可以选择是否持久化(Durability)以及是否自动删除(Auto delete)两个属性。 Durability有两个选项&#xff0c;Durable和Transient。 Durable表…...

Unity3D GPU Selector/Picker

Unity3D GPU Selector/Picker 一、概述 1.动机 Unity3D中通常情况下使用物理系统进行物体点击选择的基础&#xff0c;对于含大量对象的场景&#xff0c;添加Collider组件会增加内容占用&#xff0c;因此使用基于GPU的点击选择方案 2.实现思路 对于场景的每个物体&#xff0c;…...

灰度非线性变换之c++实现(qt + 不调包)

本章介绍灰度非线性变换&#xff0c;具体内容包括&#xff1a;对数变换、幂次变换、指数变换。他们的共同特点是使用非线性变换关系式进行图像变换。 1.灰度对数变换 变换公式&#xff1a;y a log(1x) / b&#xff0c;其中&#xff0c;a控制曲线的垂直移量&#xff1b;b为正…...

轻量级Web框架Flask

Flask-SQLAlchemy MySQL是免费开源软件&#xff0c;大家可以自行搜索其官网&#xff08;https://www.MySQL.com/downloads/&#xff09; 测试MySQL是否安装成功 在所有程序中&#xff0c;找到MySQL→MySQL Server 5.6下面的命令行工具&#xff0c;然后单击输入密码后回车&am…...

【gridsample】地平线如何支持gridsample算子

文章目录 1. grid_sample算子功能解析1.1 理论介绍1.2 代码分析1.2.1 x,y取值范围[-1,1]1.2.2 x,y取值范围超出[-1,1] 2. 使用grid_sample算子构建一个网络3. 走PTQ进行模型转换与编译 实操以J5 OE1.1.60对应的docker为例 1. grid_sample算子功能解析 该段主要参考&#xff1a;…...

JPA实现存储实体类型信息

本文已收录于专栏 《Java》 目录 背景介绍概念说明DiscriminatorValue 注解&#xff1a;DiscriminatorColumn 注解&#xff1a;Inheritance(strategy InheritanceType.SINGLE_TABLE) 注解&#xff1a; 实现方式父类子类执行效果 总结提升 背景介绍 在我们项目开发的过程中经常…...

阿里云快速部署开发环境 (Apache + Mysql8.0+Redis7.0.x)

本文章的内容截取于云服务器管理控制台提供的安装步骤&#xff0c;再整合前人思路而成&#xff0c;文章末端会提供原文连接 ApacheMysql 8.0部署MySQL数据库&#xff08;Linux&#xff09;步骤一&#xff1a;安装MySQL步骤二&#xff1a;配置MySQL步骤三&#xff1a;远程访问My…...

语音秘书:让录音转文字识别软件成为你的智能工作助手

每当在需要写文章的深夜&#xff0c;我的思绪经常跟不上我的笔&#xff0c;即便是说出来用录音机录下&#xff0c;再书写出来&#xff0c;也需要耗费大量时间。这个困扰了我很久的问题终于有了解决的办法&#xff0c;那就是录音转文字软件。它像个语言魔术师&#xff0c;将我所…...

【腾讯云 Cloud Studio 实战训练营】用于编写、运行和调试代码的云 IDE泰裤辣

文章目录 一、引言✉️二、什么是腾讯云 Cloud Studio&#x1f50d;三、Cloud Studio优点和功能&#x1f308;四、Cloud Studio初体验&#xff08;注册篇&#xff09;&#x1f386;五、Cloud Studio实战演练&#xff08;实战篇&#xff09;&#x1f52c;1. 初始化工作空间2. 安…...

[C#] 简单的俄罗斯方块实现

一个控制台俄罗斯方块游戏的简单实现. 已在 github.com/SlimeNull/Tetris 开源. 思路 很简单, 一个二维数组存储当前游戏的方块地图, 用 bool 即可, true 表示当前块被填充, false 表示没有. 然后, 抽一个 “形状” 类, 形状表示当前玩家正在操作的一个形状, 例如方块, 直线…...

postman官网下载安装登录详细教程

目录 一、介绍 二、官网下载 三、安装 四、注册登录postman账号&#xff08;不注册也可以&#xff09; postman注册登录和不注册登录的使用区别 五、关于汉化的说明 一、介绍 简单来说&#xff1a;是一款前后端都用来测试接口的工具。 展开来说&#xff1a;Postman 是一个…...

(贪心) 剑指 Offer 14- I. 剪绳子 ——【Leetcode每日一题】

❓剑指 Offer 14- I. 剪绳子 难度&#xff1a;中等 给你一根长度为 n 的绳子&#xff0c;请把绳子剪成整数长度的 m 段&#xff08;m、n都是整数&#xff0c;n > 1 并且 m > 1&#xff09;&#xff0c;每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m…...

如何将Linux上的cpolar内网穿透设置成 - > 开机自启动

如何将Linux上的cpolar内网穿透设置成 - > 开机自启动 文章目录 如何将Linux上的cpolar内网穿透设置成 - > 开机自启动前言一、进入命令行模式二、输入token码三、输入内网穿透命令 前言 我们将cpolar安装到了Ubuntu系统上&#xff0c;并通过web-UI界面对cpolar的功能有…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...