目标检测系列(三)yolov2的全面讲解

YOLOv2(论文原名《YOLO9000: Better, Faster, Stronger》)作为该系列的第二个版本,对原始YOLO进行了显著的改进,进一步提高了检测速度和准确度。在精度上利用一些列训练技巧,在速度上应用了新的网络模型DarkNet19,在分类任务上采用联合训练方法,结合wordtree等方法,使YOLOv2的检测种类扩充到了上千种。作者在论文中称可以检测超过9000个目标类别,所以也称YOLO9000。分几个点来详细介绍:

1、网络结构

论文下载地址:
https://openaccess.thecvf.com/content_cvpr_2017/papers/Redmon_YOLO9000_Better_Faster_CVPR_2017_paper.pdf

GitHub源码地址:https://github.com/philipperemy/yolo-9000

项目地址:YOLO: Real-Time Object Detection

YOLOv2使用Darknet-19作为其基础网络结构。Darknet-19是一个深度卷积神经网络,它包含19个卷积层和5个最大池化层。Darknet-19的设计哲学是减少计算量,同时保持足够的特征表达能力。以下是Darknet-19的关键特点:

深度可分离卷积:减少参数数量和计算量。

跨层连接:允许从深层网络直接传递梯度,缓解梯度消失问题。

批量归一化:提高训练速度,稳定学习过程。

Darknet-19顾名思义,有19个卷积层,如下图:

YOLO-V2的主框架是基于Darknet-19搭建的,我们来看下YOLO-V2的结构,如下图:

2、检测原理

从整体上来看,其核心原理是将目标检测问题视为一个单个的回归问题,通过在图像上划分网格并在每个网格上预测边界框和类别概率来实现目标检测。相比于传统的目标检测方法,YOLOv2在速度和准确性方面取得了较大的改进。

可以分为以下几个步骤:

  1. 图像划分网格: 首先,将输入图像分成固定大小的网格。每个网格负责检测图像中的物体。
  2. 预测边界框: 对于每个网格,模型预测多个边界框(bounding boxes)。每个边界框由5个值组成:边界框的中心坐标、边界框的宽度和高度以及目标的置信度。置信度表示模型认为该边界框包含物体的概率。
  3. 类别预测: 同时,模型还会对每个边界框预测所属物体的类别。这些类别包括图像中可能出现的各种物体,如人、车、狗等。
  4. 输出处理: 最后,通过筛选置信度高的边界框,并采用非极大值抑制(Non-Maximum Suppression,NMS)来移除冗余的边界框,最终得到最终的检测结果。

3、模型性能

对于YOLO-V2的性能,直接看下YOLOV2和其他常见的框架在pascal voc2007数据集上测试结果性能比对表,如下表

首先可以看到随着训练尺寸的尺寸变大,YOLOv2算法的mAP是逐渐上升的,FPS相应的逐渐下降。在554x554尺寸上的训练mAP达到78.6。

4、损失函数

YOLOv2定义了一个复合损失函数,用于同时优化定位和分类误差。

YOLOv2的损失函数主要由三部分组成,分别是边界框坐标损失、目标置信度损失和分类损失。这些损失函数共同用于衡量模型的预测与真实标签之间的差异,并通过反向传播算法来优化模型参数。下面是对每个部分的详细介绍:

  • 边界框坐标损失(Bounding Box Coordinates Loss):(YOLOv2使用平方误差损失(Mean Squared Error,MSE)来衡量预测边界框的坐标与真实边界框坐标之间的差异。具体来说,对于每个网格,模型预测边界框的中心坐标和宽高的偏移量,然后计算这些预测值与真实标签之间的平方差,并求和。这部分损失函数主要负责调整边界框的位置和大小,使其更好地与目标对齐。)

坐标损失:(负责检测物体的bbox中心点定位误差):

宽高坐标损失:(负责检测物体的bbox宽高定位误差)

损失计算中加上平方根的目的是拉大不同预测位置的得到的损失预测值差距,使小框对误差更敏感一点。这样做是为了更加重视较大的边界框的位置误差,可以使算法更加关注边界框的位置准确性,从而更好地优化它们的预测结果。

  • 目标置信度损失(Object Confidence Loss):(YOLOv2使用逻辑回归损失(Binary Cross-Entropy Loss)来衡量模型对于每个边界框是否包含目标的置信度预测与真实标签之间的差异。对于每个网格,模型会预测一个置信度分数,表示该边界框中是否包含目标。如果该网格中存在目标,则置信度损失计算预测置信度与1之间的差异;如果该网格中不存在目标,则置信度损失计算预测置信度与0之间的差异。)

通过对置信度进行损失计算,可以鼓励模型在包含目标的网格中预测高置信度。

  • 分类损失(Class Loss):(对于每个边界框,YOLOv2还会预测物体类别的概率分布。分类损失采用交叉熵损失(Cross-Entropy Loss)来衡量模型对于每个类别预测的概率分布与真实标签之间的差异。具体来说,对于每个网格,模型会预测一个包含所有类别的概率分布,然后计算预测概率分布与真实标签之间的交叉熵损失。)

5、模型改进(better、faster、stronger)

更好(better):

通过使用批归一化(Batch Normalization, BN)、基于卷积的锚点机制等一系列技术手段,使得目标检测精度较YOLO-V1有了大幅度提高。

更快(faster):

通过改进网络结构,在小幅降低精度的情况下,大幅减少浮点运算次数以提高模型速度(针对224×224尺寸图像输入的单趟前向传播,由VGG16网络的300亿次浮点运算降低至80亿次)。

更强(stronger):

基于YOLO-V2构建YOLO-9000模型,通过采用联合训练(jointly training)机制,综合发挥目标检测任务数据集和图像分类任务数据集的综合优势(目标检测数据集图像数量少、目标类别少但提供精确的目标位置信息,而分类数据集无目标位置信息,但类别数多且图像数量庞大),使得支持的检测目标类别数从原来的20类大幅扩展至9000类,大大提高了模型的适用性。

改进之处:

(1)批规范化(Batch Normalization):

Batch Normalization的作用是提高了网络模型的鲁棒性,缓解了Covariant Shift问题,有一定的正则化(regularization)作用,在这里也不例外。通过在YOLO所有的卷积层中加入Batch Normalization,可以使得mAP提高2%,并且dropout的部分也可以丢掉.

(2)高分辨率分类器(High Resolution Classifier):

从AlexNet开始,大多数的分类器都在分辨率小于的图像上执行分类。YOLO一代在训练分类网络的时候用的是分辨率,检测网络的时候用的是分辨率,这就意味着网络需要同时切换到目标检测并且适应新的分辨率。在YOLO二代中,直接使用的分辨率微调(fine tune)了网络,训练了10个epoch。可以使得mAP提高大概4%。

(3)使用全卷积网络结构并引入锚点(Anchor Boxes):

为了预测不同尺寸的目标,YOLOv2引入了锚点(Anchor Boxes)的概念。每个网格单元不再只预测一个边界框,而是预测多个与锚点尺寸相关的边界框。这些锚点是预先定义的,基于训练数据集中目标尺寸的分布。使用多个锚点可以提高对不同尺寸目标的检测能力。

原来的YOLO算法将输入图像分成的网格,每个网格预测两个bounding box,因此一共只有98个box,但是在YOLOv2通过引入anchor boxes,预测的box数量超过了1千(以输出feature map大小为为例,每个grid cell有9个anchor box的话,一共就是个,最终每个grid cell选择5个anchor box)。在Faster RCNN在输入大小为时的boxes数量大概是6000,在SSD300中boxes数量是8732。显然增加box数量是为了提高object的定位准确率。实验证明:虽然加入anchor使得MAP值下降了一点(69.5降到69.2),但是提高了recall(81%提高到88%)。

(4)维度聚类:

通过K-means来学习出anchor box。在Faster R-CNN中anchor box的大小和比例是按经验设定的,然后网络会在训练过程中调整anchor box的尺寸。但是如果一开始就能选择到合适尺寸的anchor box,那肯定可以帮助网络越好地预测detection。所以作者采用k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。如果采用标准的k-means(即用欧式距离来衡量差异),在box的尺寸比较大的时候其误差也更大,而我们希望的是误差和box的尺寸没有太大关系。所以通过IOU定义了如下的距离函数,使得误差和box的大小无关,K-means主要用与预测anchor box的长跟宽。:

聚类结果如图,左图代表Avg IOU与聚类数目K的关系,在权衡Avg IOU和模型复杂度以后,作者选择了K=5。右图代表了VOC和COCO数据集的box的聚类结果。可以看出聚类所得到的anchor box与手动选择相比,更倾向于选择高瘦的anchor box。

(5)细分类特征(Fine-Grained Features):

Faster F-CNN、SSD都使用不同尺寸的Feature Map来取得不同范围的分辨率,而YOLOv2采取了不同的方法,YOLOv2加上了一个跳跃层(Passthrough Layer)来获取之前的26*26分辨率的层的特征。这个Passthrough layer能够把高分辨率特征与低分辨率特征连结(concatenate)起来,这种方式看起来与ResNet很像,但是略有不同,因为ResNet采用的是summation,而YOLOv2的Fine-Grained Features采用的是concatenate。

(6)多尺度训练(Multi-ScaleTraining):

作者希望YOLO v2能鲁棒地运行于不同尺寸的图片之上,所以把这一想法用于训练model中。 区别于之前的补全图片尺寸的方法,YOLO v2每迭代几次都会改变网络参数。每10个Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是32,所以不同的尺寸大小也选择为32的倍数{320,352…..608},最小,最大,网络会自动改变尺寸,并继续训练的过程。 这一方法使得网络在输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,下图为YOLOv2和其他的目标检测网络的对比。

特征金字塔网络(FPN)

YOLOv2通过特征金字塔网络(FPN)来捕捉不同尺度的特征,从而提高对小目标的检测能力。FPN的核心思想是将深层网络中的高语义信息和浅层网络中的高分辨率信息结合起来。这样,YOLOv2能够在不同尺度的特征图上进行检测,从而检测到不同大小的目标。

其主要步骤如下:

  1. 自底向上构建: 首先,通过一个通用的深度卷积神经网络(如ResNet、VGG等)从输入图像中提取特征。这些特征具有不同的分辨率,随着网络的深度逐渐减小。FPN利用这些特征构建一个自底向上的特征金字塔,即从底层到顶层逐步上采样特征图。
  2. 自顶向下融合: 接下来,FPN从高级语义层次(低分辨率)开始,通过上采样(如双线性插值)将低分辨率的特征图上采样到更高的分辨率。然后,将相邻层次的特征图进行融合,以获得更丰富的语义信息。这种自顶向下的融合过程可以帮助模型在不同尺度上更好地理解图像。
  3. 特征融合: 在自顶向下的过程中,FPN还会进行特征融合,将来自不同层次的特征图进行逐元素相加,以获得更加丰富和细致的特征表示。这样可以使得最终的特征金字塔更具有表征能力。

通过自底向上和自顶向下的特征提取和融合过程,FPN能够生成具有多尺度信息的特征金字塔,从而有效地应对不同尺度目标的检测需求。这使得FPN成为了许多目标检测器(如Faster R-CNN、RetinaNet等)的核心组件,极大地提升了检测模型在多尺度场景下的性能。

(6)passthrough层的引入:

YOLOv1仅在网络输出的最后一个feature map上去检查输入图像中的所有目标:

①最后一张feature map的低分辨率就意味着网格划分的很粗糙,不够精细,这不仅对于密集物体检测的效果会较差,小物体的检测效果也不够理想。

②特征图的分辨率越高,所划分的网格也就越精细,能够更好地捕捉目标的细节信息。相较于YOLOv1只在一张7×7的过于粗糙的网格上做检测,2016年的SSD使用多种不同分辨率的特征图自然会更好。

YOLO作者借鉴了SSD的这一思想。将Backbone的第17层卷积输出的26×26×512特征图拿出来,做一次特殊的降采样操作,得到一个13×13×2048特征图。然后将二者在通道的维度上进行拼接,得到更厚的13×13×3072的特征图。最后在这张融合了更多信息的特征图上去做检测。

这里需要注意的是,实际上在作者代码中,在特殊的降采样之前先做了降维由26×26×512降维至26×26×64,然后做特殊的降采样变为13×13×256,然后拼接得到13×13×1280的特征图。特殊的降采样操作(reorg)如下图所示:

特征图在经过reorg操作的处理后,特征图的宽高会减半,而通道则扩充至4倍

这种特殊降采样操作的好处就在于降低分辨率的同时,没丢掉任何细节信息,信息总量保持不变。

加上该操作后,在VOC 2007测试集上的mAP从74.4%再次涨到了75.4%。

以今天的眼光看,最终的检测还是在13×13的网格中进行检测,并不是真正的类似SSD的多级检测。

6、模型缺限

  1. 小目标检测:YOLOv2在检测小目标方面的表现不如一些其他先进的目标检测算法,如RetinaNet和YOLOv3。
  2. 类别不平衡:在处理类别不平衡的数据集时,YOLOv2的性能可能会受到影响。

参考文章:

https://blog.csdn.net/festaw/article/details/138125259

https://cloud.tencent.com/developer/article/1670582

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

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

相关文章

Vue3:自定义customRef

目录 一.性质 1.自定义性 2.工厂函数参数 3.track 和 trigger 函数 二.作用 1.防抖/节流 2.异步更新 3.条件性更新 4.精细控制依赖追踪 5.优化性能 三.使用 1.ts组件 2.vue.组件 四.代码 1.ts代码 2.vue代码 五.效果 在 Vue 3 中,customRef 是一个…

一、机器学习算法与实践_04信息论与决策树算法笔记

1 信息论基础知识介绍 信息论是运用概率论与数理统计的方法,去研究信息、信息熵、通信系统、数据传输、密码学、数据压缩等问题的应用数学学科,熵(Entropy)是信息论中的一个重要概念,由克劳德香农(Claude …

深入理解端口、端口号及FTP的基本工作原理

FTP是TCP/IP的一种具体应用,FTP工作在OSI模型的第七层,TCP模型的第四层上,即应用层,FTP使用的是传输层的TCP传输而不是UDP,这样FTP客户在和服务器建立连接前就要经过一个被广为熟知的“三次握手”的过程,其…

制作炫酷个人网页:用 HTML 和 CSS3 展现你的风格

你是否觉得自己的网站应该看起来更炫酷?今天我将教你如何使用 HTML 和 CSS3 制作一个拥有炫酷动画和现代设计风格的个人网页,让它在任何设备上看起来都无敌酷炫! 哈哈哈哈哈哈哈哈,我感觉自己有点中二哈哈哈哈~ 目录 炫酷设计理念构建 HTML …

Unity 热更新(HybridCLR+Addressable)-设置打包路径和加载路径、打开Hosting服务、打包

四、设置打包和加载路径 五、打开Hosting服务 六、打包 打包完成后路径在Assets同级目录下的ServerData 但是目前没有资源文件对比 修改上面设置后再次打包 里面多了哈希和JSON文件,这俩个就是用于资源对比

若依生成主子表

一、准备工作 确保你已经部署了若依框架,并且熟悉基本的开发环境配置。同时,理解数据库表结构对于生成代码至关重要。 主子表代码结构如下(字表中要有一个对应主表ID的字段作为外键,如下图的customer_id) -- ------…

无线感知会议系列【4】【基于WiFi和4G/5G的非接触无线感知:挑战、理论和应用-2】

前言: 本篇重点分享一下该论文 《Human Respiration Detection with Commodity Wifi Devices: Do User Location and Body Orientation Matter》 接 2020年北京智源大会 张大庆老师的一个报告 参考: https://blog.csdn.net/chengxf2/article/detai…

2024 Redis 全部

1. 单机部署 1.1 检查环境,创建目录。 # 本地运行,不需要考虑安装的原因,可以卸载防火墙 # 关闭防火墙 systemctl stop firewalld.service# 查看防火强状态 firewall-cmd --state# redis 是基于gcc 环境的,查看是否有 gcc 环境 …

Bug:ThreadPoolTaskScheduler搭配CronTask完成定时任务,关闭scheduler后CronTask任务仍然执行?

【问题】执行下面代码后,关闭ThreadPoolTaskScheduler,CronTask仍然继续执行。 Configuration public class config {Beanpublic String getString() throws InterruptedException {Runnable runnable () -> {try {System.out.println("hello r…

科研绘图系列:R语言分组堆积图(stacked barplot)

文章目录 介绍加载R包导入数据数据预处理画图导出数据系统信息介绍 堆积图是一种数据可视化图表,它通过将不同类别的数据以堆叠的形式展现在同一个图表中,来展示各个类别之间的相对大小和它们之间的总和。堆积图可以是柱状图、条形图或面积图的形式,其中每个堆叠的块或区域…

Servlet入门:服务端小程序的初试(自己学习整理的资料)

目录 一.前言 二.建立基础结构​编辑 三.具体步骤 找到Tomcat文件并打开Tomcat。 在webapps中创建一个自己的文件夹。 在classes中新建一个Java文件。 在lib中导入需要的jar文件包。 配置环境变量 在Java文件的目录下打开cmd并输入 javac -d . HelloServlet.java进行…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第三篇-着色器光照】

在前两篇文章中,我们分别拆解描述了实现原理,并进行了基础的着色器制作。在这一篇文章中,我们将为它实现光照效果 简单的概述 当光线射入体积时,随着光线射入距离的增加,体积中的介质会对光线产生反射和吸收作用&…

【C++前缀和 状态压缩】1177. 构建回文串检测|1848

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 位运算、状态压缩、枚举子集汇总 LeetCode 1177. 构建回文串检测 难度分:1848 给你一个字符串 s,请你对 s 的子串进行检测。 每次检测&#x…

望繁信科技受邀出席ACS2023,为汽车行业数智化护航添翼

2023年5月25-26日,ACS2023第七届中国汽车数字科技峰会在上海成功举行。此次峰会汇聚了众多汽车领域的顶级专家、产业链代表及企业高管,共同探讨当今汽车产业的转型与未来发展趋势。 作为唯一受邀的流程挖掘厂商代表,望繁信科技携最新行业优势…

[Golang] Context

[Golang] Context 文章目录 [Golang] Context什么是context创建context创建根context创建context context的作用并发控制context.WithCancelcontext.WithDeadlinecontext.WithTimeoutcontext.WithValue 什么是context Golang在1.7版本中引入了一个标准库的接口context&#xf…

【Web】初识Web和Tomcat服务器

目录 前言 一、认识web 1. 软件架构模式 2. web资源 3. URL请求路径(统一资源定位符) 二、Tomcat服务器 1. 简介 2. tomcat服务器的目录结构 3.使用tomcat服务器启动失败的常见原因 3.1 端口冲突 3.2 jdk环境变量配置出错 三、使用Tomcat发布…

Python_面向对象属性与方法

Python完全采用了面向对象的思想,是真正面向对象的编程语言,完全支持面向对象的基本功能,例如:继承、多态、封装等。Python中,一切皆对象。我们在前面学习的数据类型、函数等,都是对象。 面向过程和面向对象…

Java | Leetcode Java题解之第430题扁平化多级双向链表

题目: 题解: class Solution {public Node flatten(Node head) {dfs(head);return head;}public Node dfs(Node node) {Node cur node;// 记录链表的最后一个节点Node last null;while (cur ! null) {Node next cur.next;// 如果有子节点&#xff0…

【最基础最直观的排序 —— 选择排序算法】

最基础最直观的排序 —— 选择排序算法 选择排序算法是一种简单直观的排序算法。其基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小&a…

【JS】Reflect

对象基本方法 JS语法操作对象时,本质上是调用一个内部封装好的函数,该函数中又会调用对象的基本方法,通过官方文档可以看到基本方法。在过去,这些对象的基本方法是不会对外暴露的。 如下面这段代码,使用JS语法给对象赋…