YOLO系列笔记(十八)—— YOLOv1和YOLOv2总结与对比

YOLOv1和的v2总结与对比

  • YOLOv1
    • 主要思想
    • 算法架构
      • 主干网络
      • 损失函数
    • 训练过程
    • 网络预测
    • 主要成果
    • 优化方向
  • YOLOv2
    • 算法架构
      • 主干网络
      • 损失函数
    • 相较之前的优化
      • 添加Batch Normalization
      • 引入锚框(Anchor Boxes)机制
      • 引入DarkNet-9
      • 多尺度输入训练
    • 网络训练
      • 第一阶段:在ImageNet上预训练Darknet-19
      • 第二阶段:在ImageNet上调整输入尺寸并finetune
      • 第三阶段:将分类模型转换为检测模型,并在检测数据集上fine tune
      • 具体的输出矩阵解释
      • 总结
    • 优化方向

YOLOv1

YOLOv1是YOLO系列第一个版本,它是单阶段算法的最初实时目标检测系统,对一张图片进行检测只需要进行一次前向传播来同时预测多个物体的类别和位置。

主要思想

  1. 将图片分成7*7的网格,当物体中心落在某个网格中心,那么该网格就负责预测该物体,这是YOLO系列网络的核心思想(即用网格坐标预测目标位置)。
  2. 每个网格都会预先生成两个预测框,这样就会有772=98个预测框,框的数目比起Faster R-CNN成百上千的预测框数目要少得多,这是YOLO快速的一个原因。
  3. 当预测种类数目为20时,每个预测框对应一个30维的向量,具体分析如下。

算法架构

主干网络

  1. 输入层:输入图像要被调整为输入尺寸大小(448*448像素)。
  2. 卷积块:基于GoogLeNet结构做了一些调整,共24个卷积层:
    • 前20层用于特征提取,每个卷积层后面跟着一个批量归一化层和ReLu激活函数。
    • 最后4个卷积层与全连接层组合,进行检测。
  3. 全连接层:
    • 第一个全连接层有4096个神经元,即将卷积输出展开摊平,并通过全连接层处理。
    • 第二个全连接层输出检测结果,即S*S(B*5+C),S是网格单元的数量,这里为7。B是每个网格预测的边界框数量,这里是2。C是检测类别的数量。5代表每个边界框预测5个值(x,y,w,h,confidence),其中 x 和 y 是边界框中心相对于网格单元的位置(即相对于每个单元格左上角坐标点的偏移值),w 和 h 是边界框的宽和高(相对于整个图片的宽与高的比例),confidence 是该边界框包含物体的置信度。当预测种类数目C为20时,最后计算出S*S*(B*5+C) = 7*7*30,这也就是为什么一个网格会生成一个30维的向量。
      在这里插入图片描述
  • 所谓置信度其实两方面内容,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为 Pr(object),当该边界框是背景时(即不包含目标),此时 Pr(object) = 0 。而当该边界框包含目标时,Pr(object) = 1 。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征,记为 I O U p r e d t r u t h IOU^{truth}_{pred} IOUpredtruth 。因此置信度可以定义为 P r ( o b j e c t ) × I O U p r e d t r u t h Pr(object)\times IOU^{truth}_{pred} Pr(object)×IOUpredtruth 。很多人可能将Yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面。

损失函数

YOLOv1的损失函数主要包括坐标误差,置信度误差,分类误差,公式如下图所示。

  • 其中坐标损失中为了减少因为物体尺寸大小对损失的影响,对w和h先取根号再用来计算损失。
  • 置信度损失氛围含有目标和不含有目标两种,其中因为不含有目标的背景可能会占据图像的大部分区域影响误差计算,所以需要加上权重参数 λ n o o b j \lambda_{noobj} λnoobj
    在这里插入图片描述

训练过程

在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用图8中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。

网络预测

这里再介绍一下非极大值抑制算法(non maximum suppression, NMS),这个算法主要解决的是一个目标被多次检测的问题,因为一个物体可以被多个检测框检测到,但我们只想要置信度最大的框作为输出。那么可以采用NMS算法来实现这样的效果:首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除;然后对剩余的检测框重复上述过程,直到处理完所有的检测框。
YOLOv1算法相关的处理是这样的:先使用NMS,然后再确定各个box的类别。对于98个boxes,首先将小于置信度阈值的值归0,然后分类别地对置信度值采用NMS,这里NMS处理结果不是剔除,而是将其置信度值归为0。最后才是确定各个box的类别,当其置信度值不为0时才做出检测结果输出。

主要成果

YOLOv1在速度和性能上取得了显著成果,实现了单阶段目标识别网络。

优化方向

YOLOv1对于高度重合的物体识别准确度较低,并且对小物体敏感度不够,也无法完成多标签预测。

YOLOv2

YOLOv1虽然检测速度很快,但是在检测精度上却不如R-CNN系检测方法,YOLOv1在物体定位方面(localization)不够准确,并且召回率(recall)较低。YOLOv2共提出了几种改进策略来提升YOLO模型的定位准确度和召回率,从而提高mAP,YOLOv2在改进中遵循一个原则:保持检测速度,这也是YOLO模型的一大优势。

算法架构

主干网络

  1. 输入层:输入图像被调整为固定大小(416x416像素)用于网络输入。
    • 理由:因为YOLOv2采用了五次下采样,下采样总步长为32。而对于 416x416 大小的图片,最终得到的特征图大小为 13x13 ,维度是奇数,这样特征图恰好只有一个中心位置。对于一些大物体,它们中心点往往落入图片中心位置,此时使用特征图的一个中心点去预测这些物体的边界框相对容易些
  2. Darknet-19:这是一个包含19个卷积层和5个池化层的深度卷积神经网络,结构如下。
    该网络通过逐层的卷积和池化操作提取图像的特征,并且使用了批量归一化(Batch Normalization)和Leaky ReLU激活函数。
    在这里插入图片描述
  3. 输出层:13x13x(B×(5+C))

损失函数

在这里插入图片描述
W和H分别指的是特征图(13* 13)的宽与高,而 A 指的是先验框数目(这里是5),各个 λ \lambda λ 值是各个loss部分的权重系数。

  • 第一项loss是计算background的置信度误差,但是需要先计算各个预测框和所有ground truth的IOU值,并且取最大值Max_IOU,如果该值小于一定的阈值(YOLOv2使用的是0.6),那么这个预测框就标记为background,需要计算noobj的置信度误差。
  • 第二项是计算先验框与预测宽的坐标误差,但是只在前12800个iterations间计算,这项应该是在训练前期使预测框快速学习到先验框的形状。
  • 第三大项计算与某个ground truth匹配的预测框各部分loss值,包括坐标误差、置信度误差以及分类误差。
    • 先说一下匹配原则,对于某个ground truth,首先要确定其中心点要落在哪个cell上,然后计算这个cell的5个先验框与ground truth的IOU值(YOLOv2中bias_match=1),计算IOU值时不考虑坐标,只考虑形状,所以先将先验框与ground truth的中心点都偏移到同一位置(原点),然后计算出对应的IOU值,IOU值最大的那个先验框与ground truth匹配,对应的预测框用来预测这个ground truth。
    • 在计算obj置信度时,target=1,但与YOLOv1一样而增加了一个控制参数rescore,当其为1时,target取预测框与ground truth的真实IOU值。对于那些没有与ground truth匹配的先验框(与预测框对应),除去那些Max_IOU低于阈值的,其它的就全部忽略,不计算任何误差。

相较之前的优化

添加Batch Normalization

  • 作用:提升模型收敛速度,起到一定正则化效果,降低模型的过拟合。在YOLOv2中,每个卷积层后面都添加了Batch Normalization层,并且不再使用droput。
  • 结果:使用Batch Normalization后,YOLOv2的mAP提升了2.4%。

引入锚框(Anchor Boxes)机制

  • 对比:在YOLOv1中,输入图片最终被划分为 7x7 网格,每个单元格预测2个边界框。YOLOv1最后采用的是全连接层直接对边界框进行预测,其中边界框的宽与高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。

  • 理由:v2借鉴了Faster R-CNN中RPN网络的先验框(anchor boxes)策略。RPN对CNN特征提取器得到的特征图(feature map)进行卷积来预测每个位置的边界框以及置信度(是否含有物体),并且各个位置设置不同尺度和比例的先验框,所以RPN预测的是边界框相对于先验框的offsets值,采用先验框使得模型更容易学习。所以YOLOv2移除了YOLOv1中的全连接层而采用了卷积和anchor boxes来预测边界框。

  • 定义方法:YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:
    d(box, centroid) = 1 - IOU(box, centroid)

  • 计算公式:预测边界框中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)。总结来看,根据边界框预测的4个offsets t x , t y , t w , t h t_x, t_y, t_w, t_h tx,ty,tw,th ,可以按如下公式计算出边界框实际位置和大小。
    在这里插入图片描述

    • 其中 ( c x , c y ) (c_x, c_y) (cx,cy) 为cell的左上角坐标,在计算时每个cell的尺度为1。由于sigmoid函数的处理,边界框的中心位置会约束在当前cell内部,防止偏移过多。
    • p w p_w pw p h p_h ph 是先验框的宽度与长度,它们的值也是相对于特征图大小的,在特征图中每个cell的长和宽均为1。
    • t w t_w tw t h t_h th是神经网络输出的一个值,表示锚框宽度和高度的对数偏移量。
    • 为了将预测的偏移量转换为实际的宽度,使用指数变换。通过对偏移量取指数,公式能够生成一个正值宽度。这个变换确保了预测的宽度总是正的,因为宽度不能为负数。通过将先验框宽度和长度 p w p_w pw p h p_h ph乘上偏移量,得到预测框宽度和长度 b w b_w bw b h b_h bh
      • 补充理解——从预测值到实际边界框尺寸:
        神经网络输出的是相对于锚框的对数偏移量,通过对这个偏移量取指数并乘以锚框的宽度,可以得到实际的边界框宽度。这种方法有助于稳定训练,因为网络只需要预测相对较小的对数偏移量,而不是直接预测绝对尺寸。
  • 结果:YOLOv1只能预测98个边界框( 7x7x2 ),而YOLOv2使用anchor boxes之后可以预测上千个边界框( 13x13xnum_anchors )。所以使用anchor boxes之后,YOLOv2的召回率大大提升,由原来的81%升至88%。

引入DarkNet-9

  • 定义:包括19个3x3的卷积层和5个maxpooling层。采用 2x2 的max pooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍(可以从表格里看出来)。Darknet-19最终采用global avgpooling做预测,并且在 3x3 卷积之间使用 1x1 卷积来压缩特征图channles以降低模型计算量和参数。
  • 和Batch Norm的关系:Darknet-19每个卷积层后面同样使用了batch norm层以加快收敛速度,降低模型过拟合。
  • 结果:在ImageNet分类数据集上,Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%,但是模型参数相对小一些。使用Darknet-19之后,YOLOv2的mAP值没有显著提升,但是计算量却可以减少约33%。

多尺度输入训练

  • 定义:在训练过程中每间隔一定的iterations之后改变模型的输入图片大小。在训练过程,每隔10个iterations随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练。
  • 结果:在VOC 2007数据集上的效果为:采用较小分辨率时,YOLOv2的mAP值略低,但是速度更快,而采用高分辨输入时,mAP值更高,但是速度略有下降,对于 544x544 ,mAP高达78.6%。

网络训练

第一阶段:在ImageNet上预训练Darknet-19

  1. 模型输入
    • 输入尺寸为 ( 224 × 224 ) (224 \times 224) (224×224)
    • 在ImageNet分类数据集上进行训练,共训练160个epochs。

第二阶段:在ImageNet上调整输入尺寸并finetune

  1. 调整输入尺寸

    • 输入尺寸调整为 ( 448 × 448 ) (448 \times 448) (448×448)
    • 继续在ImageNet数据集上进行finetune,训练10个epochs。
  2. 分类模型准确度

    • Top-1准确度为76.5%。
    • Top-5准确度为93.3%。

第三阶段:将分类模型转换为检测模型,并在检测数据集上fine tune

  1. 网络结构修改

    • 移除最后一个卷积层、全局平均池化层(global avgpooling layer)以及Softmax层。
    • 新增三个卷积层。
    • 增加一个passthrough层(用于结合不同尺度的特征)。
  2. 输出预测结果的卷积层

    • 使用一个 ( 1 × 1 ) (1 \times 1) (1×1) 的卷积层来输出预测结果。
  3. 输出channels数

    • 由于anchors数为5,对于VOC数据集,输出的channels数为125;对于COCO数据集,输出的channels数为425。
    • 具体来说,对于VOC数据集,输出的预测矩阵形状为 ( 13 × 13 × 125 ) (13 \times 13 \times 125) (13×13×125)
    • 其中,125是因为每个网格单元预测5个边界框,每个边界框包括4个位置坐标(x, y, w, h)、1个置信度和20个类别的预测(4 + 1 + 20)× 5 = 125。

具体的输出矩阵解释

  1. 预测矩阵形状

    • 对于VOC数据集,最终的预测矩阵为 (13 \times 13 \times 125)(假设特征图尺寸为13x13)。
    • 可以将其reshape为 (13 \times 13 \times 5 \times 25)。
  2. 具体含义

    • (25) 表示每个边界框的预测值,分为:4个边界框的位置和大小((b_x, b_y, b_w, b_h)),1个边界框的置信度(confidence),以及20个类别的预测值(classes)。
    • 具体来说:
      • (b_x, b_y, b_w, b_h) 为边界框的位置和大小。
      • confidence 为边界框的置信度。
      • classes 为类别预测值。

总结

YOLOv2的训练过程分为三个阶段:

  1. 在ImageNet上预训练Darknet-19,输入尺寸为 (224 \times 224)。
  2. 调整输入尺寸为 (448 \times 448),在ImageNet上finetune分类模型。
  3. 修改分类模型为检测模型,并在检测数据集上finetune,增加新的卷积层和passthrough层,调整输出channels数以适应目标检测任务。

通过这三个阶段,YOLOv2模型能够有效地进行分类和检测任务,适应不同尺度和长宽比的物体,提高检测精度和速度。

优化方向

  • 检测不同大小的目标可能不够灵活
    • 原因:YOLOv2只在最后一个特征图上进行预测
    • 改进建议:在不同尺度的特征图上进行预测,这使得模型能够更好地检测不同大小的目标,特别是小目标。
  • 没有充分利用浅层特征,这些特征对检测小物体非常重要
    • 改进建议:引入特征金字塔网络(Feature Pyramid Network, FPN),使用了更多层的特征图进行检测。
  • 特征提取网络深度较浅,限制了其特征提取能力
    • 改进建议:采用更深的特征提取网络和残差连接(ResNet),提高特征提取的能力和模型表现

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机学习(16)--直流电机驱动

直流电机驱动 15.1直流电机驱动基础知识1.直流电机介绍2.电机驱动电路3.PWM介绍 15.2LED呼吸灯和直流电机调速1.LED呼吸灯代码2.直流电机调速(1)产生PWM的方法(2)工程目录(3)main.c函数 15.1直流电机驱动基…

kaggel-汽车价格预测项目

1.读取数据,查看数据基本概况 import pandas as pd datapd.read_csv(r./car_price_prediction.csv)#查看前5行数据 print(data.head(5))output:ID Price Levy ... Wheel Color Airbags 0 45654403 13328 1399 ... Left wheel Silve…

css 滚动词云

css javascript 实现滚动词云效果 // 163css.js var radius 120; var dtr Math.PI / 180; var d 300; var mcList []; var active false; var lasta 1; var lastb 1; var distr true; var tspeed 10; var size 250; var mouseX 0; var mouseY 0; var howElliptic…

宝塔安装rabbitMQ实战

服务器环境说明 阿里云服务器、宝塔、centos7 一、下载erlang 原因:RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装Rabbit MQ的前提是安装Erlang。 下载地址:http://www.erlang.org/downloads 下载对应的版本&…

进程间通信简介-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

进程间通信简介 进程间通信简介 进程间进程简称IPC(interprocess communication),进程间通信就是在不同进程之间传递信息或交换信息 进程间通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的…

互联网算法备案 | 填报指南

一、填报入口 登陆互联网信息服务算法备案系统(以下简称备案系统)进行填报,网址为https://beian.cac.gov.cn。系统首页如图1所示。 图1备案系统首页(示意图) 二、填报流程 填报人员需首先注册并登陆备案系统&#x…

用Roofline模型去分析pytorch和Triton算子

用Roofline模型去分析pytorch和Triton算子 1.参考链接2.测试环境3.安装相关依赖4.锁频5.获取理论算力6.创建测试脚本7.运行测试程序生成Roofline图8.NVIDIA Nsight Compute生成Roofline9.效果图A.nn.LinearB.Triton实现 本文演示了如何用Roofline模型去分析pytorch和Triton算子…

探秘 NTHU-DDD:疲劳与哈欠背后的驾驶安全密码(目标检测)

亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 一、引言…

【最新鸿蒙应用开发】——用户信息封装

用户管理工具封装 1. 为什么要封装 在进行如下登录功能时, 通常需要将一些用户信息以及token进行持久化保存,以方便下次进行数据请求时携带这些用户信息来进行访问后端数据。下面分享一下鸿蒙当中实用的持久化封装操作。 2. 步骤 封装用户信息管理工具…

Django 配置静态文件

1,DebugTrue 调试模式 Test/Test/settings.py DEBUG True...STATICFILES_DIRS [os.path.join(BASE_DIR, static),] STATIC_URL /static/ 1.1 创建静态文件 Test/static/6/images/Sni1.png 1.2 添加视图函数 Test/app6/views.py from django.shortcuts impor…

【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(二)

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 1.1 何为 D3.js?1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形 ✔️ 第一部分【第二部分】✔️第三部分(精译中 ⏳) 1.2.3 Canvas 与 WebGL&#x…

互联网大厂核心知识总结PDF资料

我们要敢于追求卓越,也能承认自己平庸,不要低估3,5,10年沉淀的威力 hi 大家好,我是大师兄,大厂工作特点是需要多方面的知识和技能。这种学习和积累一般人需要一段的时间,不太可能一蹴而就&…

获取 url 地址栏 ? 后面的查询字符串,并以键值对形式放到对象里面

写在前面 在前端面试当中,关于 url 相关的问题很常见,而对于 url 请求参数的问题也很常见,大部分以笔试题常见,今天就根据这道面试题一起来看一下。 问题 获取 url 地址栏?后面的查询字符串,并以键值对形式放到对象…

【图解大数据技术】Hadoop、HDFS、MapReduce、Yarn

【图解大数据技术】Hadoop、HDFS、MapReduce、Yarn HadoopHDFSHDFS架构写文件流程读文件流程 MapReduceMapReduce简介MapReduce整体流程 Yarn Hadoop Hadoop是Apache开源的分布式大数据存储与计算框架,由HDFS、MapReduce、Yarn三部分组成。广义上的Hadoop其实是指H…

Ubuntu网络管理命令:netstat

安装Ubuntu桌面系统(虚拟机)_虚拟机安装ubuntu桌面版-CSDN博客 顾名思义,netstat命令不是用来配置网络的,而是用来查看各种网络信息的,包括网络连接、路由表以及网络接口的各种统计数据等。 netstat命令的基本语法如…

Sora DiT图解【文生视频】

“在古老的迪萨罗斯大陆,曾经住着一位传奇人物,名叫索拉(Sora)。这个传奇人物体现了无限潜力的本质,包括天空的浩瀚和壮丽。 当它飞得很高,彩虹色的翅膀横跨广阔的空间,光线从它引人注目的身体…

QTreeView第一列自适应

通过setStretchLastSection(bool stretch)可以设置最后一列自适应,对于QTreeView,stretch默认为true。但有时候我们需要设置第一列自适应,比如文件浏览器,共有名称、大小和修改日期三列,大小和日期的宽度几乎是固定的,但名称却可长可短,此时我们希望在窗口大小变化时,第…

【算法专题--栈】用栈实现队列 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐双栈 模拟 队列 🥝栈 和 队列 的特性 🍍具体思路 🍍案例图解 四、总结与提炼 五、共勉 一、前言 用栈实现队列 这道题,可以说是--栈专题--,最经典的一道题&…

Python数据分析-股票分析和可视化(深证指数)

一、内容简介 股市指数作为衡量股市整体表现的重要工具,不仅反映了市场的即时状态,也提供了经济健康状况的关键信号。在全球经济体系中,股市指数被广泛用于预测经济活动,评估投资环境,以及制定财政和货币政策。在中国…