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

news2025/1/17 9:00:50

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),提高特征提取的能力和模型表现

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

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

相关文章

数据结构--队列(图文)

队列是一种特殊的线性表,其核心特点是先进先出。 概念及特点: 概念 队列是一种只允许在一端进行插入数据操作,在另一端进行删除数据操作的线性表。进行插入操作的一端被称为队尾(Tail 或 Rear),进行删除…

使用ChatGLM3自带的网页客户端

【图书推荐】《ChatGLM3大模型本地化部署、应用开发与微调》-CSDN博客 通过简单的代码领略一下ChatGLM3大模型_chatglm3 history怎么写-CSDN博客 除了我们上面使用自定义的gradio组件完成网页客户端的搭建,智谱AI的ChatGLM3在创建之初就本着“方便用户&#xff0c…

小韩厂涨乌托邦公式源码

小韩厂涨&乌托邦&公式源码已经测试通过,可以发布云平台自行编辑 DRAWGBK(C>0, RGB(50,60,250),RGB(17,21,89),0,11,0); H1:=MAX(DYNAINFO(3),DYNAINFO(5)); L1:=MIN(DYNAINFO(3),DYNAINFO(6)); P1:=H1-L1; 阻力:=L1+P1*7/8,COLORGREEN; 支撑:=L1+P1*0.5/8,COLORRED;…

java学习 - 消息中间件简介 + RabbitMQ下载安装

消息与消息中间件 消息是指应用之间传输的数据消息中间件是一个提供高性能高可靠的消息传输交换的平台 消息传递的方式 点对点通讯 - P2P 基于队列实现队列使异步通讯成为可能 发布订阅模式 - Pub/Sub 有个节点,称为主题消息发布者将消息发布到这个节点上订阅者…

spring boot(学习笔记第十一课)

spring boot(学习笔记第十一课) Session共享,JPA实现自动RESTful 学习内容: Session共享JPA实现自动RESTful 1. Session共享 Session共享面临问题 spring boot默认将session保存在web server的内存里面,会产生什么问题呢。 如上图所示&#…

web全屏api,实现元素放大全屏,requestFullscreen,exitFullscreen

全屏api 主要方法 document.exitFullscreen(); 退出页面全屏状态,document是全局文档对象 dom.requestFullscreen(); 使dom进入全屏状态,异步,dom是一个dom元素 dom.onfullscreenchange(); 全…

阿里云centos7.9 挂载数据盘到 www目录

一、让系统显示中文 参考:centos7 怎么让命令行显示中文(英文->中文)_如何在命令行中显示中文-CSDN博客 1、输入命令:locale -a |grep "zh_CN" 可以看到已经存在了中文包 2、输入命令:sudo vi…

51单片机第21步_将TIM0用作两个8位定时器同时将TIM1用作波特率发生器

本章重点讲解将TIM0用作两个8位定时器,同时将TIM1用作波特率发生器。 当定时器T0在方式3时,T1不能产生中断,但可以正常工作在方式0、1、2下,大多数情况下,T1将用作串口的波特率发生器。 1、定时器0工作在模式3框图&a…

智能制造 v3.13.14 发布,ERP、MES 更新

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台],适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…

惧怕人工智能不如拥抱人工智能,聊聊如何使用Spring AI框架快速开发大模型项目

自ChatGPT出现以来,技术圈子里人人自危,导致大家心态越来越浮躁,生怕努力学习来的技术最后被人工智能轻易替代变得一文不值。其实换个角度来说大家也不用过于担心,社会的向前发展,生产力工具的优化更迭导致效率的提升是…

着色器预热?为什么 Flutter 需要?为什么原生 App 不需要?那 Compose 呢?Impeller 呢?

依旧是来自网友的问题,这个问题在一定程度上还是很意思的,因为大家可能会想,Flutter 使用 skia,原生 App 是用 skia ,那为什么在 Flutter 上会有着色器预热(Shader Warmup)这样的说法&#xff1…

(一)Docker基本介绍

部署项目的发展 传统部署适合需要最大性能和可靠性的场景,但在资源利用和管理方面有显著劣势。虚拟化部署提供了良好的资源利用率和隔离性,适用于需要灵活扩展和多租户环境的场景,但存在性能开销。容器部署在轻量级、可移植性和资源利用率方面…

甄选范文“论单元测试方法及应用”,软考高级论文,系统架构设计师论文

论文真题 1、概要叙述你参与管理和开发的软件项目,以吸你所担的主要工作。 2、结给你参与管理和开发的软件项目,简要叙述单元测试中静态测试和动态测试方法的基本内容。 3、结给你惨与管理和研发的软件项目,体阐述在玩测试过程中,如何确定白盒测试的覆盖标准,及如何组织实施…

NetSuite Amount正负符号在Saved Search和DataSet中的不同含义

近期在一个项目中碰到Amount取值的Bug,原因是我们的代码中数据源从Saved Search转为了DataSet,由于这个转换导致了Amount的正负值混乱。今天记录一下。 正负号原则 • Saved Search, Amount的正负需要考虑科目类型。 Amount字段根据科目类型…

⭐Ollama的本地安装⚡

先来逛一下咱们的主角Ollama的官网地址: Ollama 大概长这个样子🤔 因为本地系统的原因,文章只提供Widows的安装方式,使用Linux和Mac的大佬,可以自行摸索🧐 下载完成后就是安装了🍕&#xff0c…

使用Petalinux设计linux系统

文章目录 1.通过 Vivado 创建硬件平台,得到 hdf 硬件描述文件2.设置 Petalinux 环境变量3.创建 Petalinux 工程4.配置Petalinux 工程5.配置Linux内核6.配置Linux根文件系统7.配置设备树文件8.编译 Petalinux 工程9.制作BOOT.BIN启动文件10.制作SD启动卡 1.通过 Viva…

Linux Swap机制关键点分析

1. page被swap出去之后,再次缺页是怎么找到找个换出的页面? 正常内存的页面是通过pte映射找到page的,swap出去的page有其特殊的方式:swap的页面page->private字段保存的是:swap_entry_t通过swap_entry_t就能找到该页面的扇区号sector_t,拿到扇区号就可以从块设备中读…

Golang | Leetcode Golang题解之第208题实现Trie前缀树

题目: 题解: type Trie struct {children [26]*TrieisEnd bool }func Constructor() Trie {return Trie{} }func (t *Trie) Insert(word string) {node : tfor _, ch : range word {ch - aif node.children[ch] nil {node.children[ch] &Trie{…

物体识别桌颠覆传统,创新科技重塑感知体验!

随着科技的疾驰进步,设想一下,站在一张桌面前,你只需优雅地挥动手掌,桌面的物品便如魔法般消失或重现。这不再是科幻电影的幻想,而是当下真实可触的奇迹——物体识别桌。这一革命性的技术不仅颠覆了观众对世界的感知&a…

Spark SQL----ANSI Compliance

Spark SQL----ANSI Compliance 一、算术运算二、Cast2.1 Rounding in cast 三、存储分配四、Type coercion4.1 类型提升和优先级4.2 最不常见类型解析 五、SQL函数5.1 函数调用5.2 具有不同行为的函数 六、SQL操作符七、ANSI模式的有用函数八、SQL关键字(可选,默认禁…