YOLOV1-V9发展历程(1) (V1-V5)

news2025/2/26 18:49:38

简介

计算机视觉领域包含很多不同的方向,从处理数据的类型上分为图片,视频,点云,在2D图像的任务中再细分就分为单目标任务和多目标任务(如上图)YOLO是用于解决多目标检测问题的计算机视觉算法,相比于多阶段的目标检测算法,YOLO(单阶段目标检测方法)一经问世就以其简单高效果的特点备受关注,至今已经发展到yolov9,下面将对yolov1-v9进行梳理.

(由于本人不专门研究Object detect领域,如有错误请您指出)

(内容来自B站:同济子豪兄

(特别鸣谢:同济子豪兄

Object Detection前情概述

DPM,人工特征+滑动窗口

R-CNN:先提取2000个候选框(Region of interest)这个过程称为region proposal,再把2000个候选框送入CNN进行甄别,最终再经过SVM和Boundbox regression进行分类或回归,最终得到结果(2000个候选框每个都要处理一遍,要经过40s才能处理一张图片)

Fast-RCNN 先不着急提取候选框,先把整个图像喂到一个CNN里面,获得一个共享的特征,所有的候选框都共享这一套特征,这样可以加快一些速度

到后来还有Faster-RCNN用一个单独的RPN网络来挑选候选框..

总结

两阶段:优点:1、准确 (候选框多,效果自然好一些)

              缺点: 1、慢 2、候选框太小不能看到整个图像的全景(管中窥豹)(会丢失信息:背景|背景和前景之间的关系|不同物体之间的关系|全图的关系)

单阶段:Yolo:优点:速度快,不需要复杂的上下游产业链的协同,也不需要对每一个工序单独的训练和优化,是一个,端到端,完整统一的框架

                       缺点:但准确率不高,对小目标和密集目标识别效果不好(当然这是以前的说法了)

YOLOV1(CVPR2016)

backbone

先缩放到448*448*3的图像(裁剪+rgb)经过一顿处理变成了一个7*7*1024大小的feature map,经过一个(7*7*1024(拉平),4096)的线性层得到4096维的向量,再过一个(4096,1470)的线性层,得到一个1470维度的向量,把该向量reshape成7*7*30的特征图

Yolo测试过程(正向推断过程)

yoloV1先把图像划分成S*S(7*7)的网格(gridcell),每个gridcell预测出b个boundbox(预测框)(b=2),两个预测框地中心点落在gridsell里边,,(无论预测框的形状只要bbox的中心点落在gridcell里就说明这个bbox是由这个gridcell生成的)

所以共生成了98个bbox,每个bbox都包含四个位置参数和一个置信度参数(包含物体的概率)(x,y,w,h,c)(黑框,框的粗细代表置信度的大小)

每个网格还能生成所有类别的条件概率(假设包含某个物体的前提下是某一个类别的概率)(彩图)

将每个bbox的置信度乘以其对应的gridcell的条件概率,就能得到每个bbox是各类别的概率

结合bbox和gridcell的信息就可以获得最终的预测结果了

这些信息都是从那个7*7*30维的向量中获取的(S*S*(5*B+C))

7*7*30特征解读(包含所有预测框的坐标,置信度,类别结果)

每个gridcell是30个数 组成是5+5+20,两个五表示两个预测框,20表示条件概率(在PASCOL中有20个类别)

30维的向量是一个gridcell的信息,一共7*7个gridcell就是7*7个30

输入一张图像,Yolo能输出S*S个gridcell的信息,每个gridcell包含两个bbox和20个条件概率的信息,每个bbox又包含5个参数(4个位置参数和一个置信度参数)

yolov1的缺点,49个预测框最多预测49个物体,小目标和密集目标效果差的原因

中间这个图经过一系列后处理得到最终的预测结果。

Yolo的后处理

(只有预测阶段需要后处理,训练阶段不需要后处理,训练阶段每个框都要算损失):低置信度的框过滤掉&重复的框过滤掉(NMS)

先看狗这个类别的,设阈值——>置0——>排序——>NMS(去重)

NMS(取框比IOU和IOU阈值,超过阈值,保留概率大的框,概率较低的框被认为是重复框将其概率置0,低于阈值的都保留,每一个框都和所有概率小于自己的框比IOU阈值,跳过概率为0的框)

最后不为0的类别拎出来分拎出来就是最后的结果

Yolo训练过程(反向传播)

损失函数如下(第二行中的根号的作用是使得误差对小框更敏感,对大框更不敏感,起到一种均衡的作用)

YOLOV1缺点:

1、map准确度低

2、定位性能也比较差,

3、recall也比较低(把全部目标全部检出的能力比较差)因为7*7=49个gridcell每个gridcell最多预测出一个物体,所以49个gridcell最多预测出49个物体

4、预测小目标和密集目标效果差,因为7*7=49个gridcell每个gridcell最多预测出一个物体,所以49个gridcell最多预测出49个物体

YOLOV2(YOLO9000:Better,Faster,Stronger)(CVPR2017)

简介

better:比V1性能提升。准确率高

Faster:比V1更快

Strong:V2能检测9000多种类别

YOLOV2对YOLOV1做出了改进

Better

1、BN

BN层作用:防止梯度消失或者梯度爆炸,加快收敛

BN层原理(激活函数是tanh):

BN层方法:

BN层一般在线性层后在激活层前

2、高分辨率判别器

迁移学习(图片大小不匹配导致性能降低)

高分辨率判别器 目的是适应大分辨率的输入 直接在高分辨率图像上训练 弥补不同尺寸图像之间的gap

3、Anchor(V2-V5)
 什么是Anchor?

给bbox一个先验的形状,每个bbox的长宽不再是野蛮生长的,而是具有一定的高宽比(长得矮胖,或者瘦高)会使模型训练更加稳定(有固定的形状匹配,而不是谁与groundtruth的IOU大谁来匹配),每一个预测框只需要预测出它相较于anchor的偏移量就可以了(预测偏移量比从头那样瞎套要简单得多)

YoloV2的将每张图片划分成(S*S个gridcell,S=13,每个gridcell预测5个anchor,事先制定了五种长宽,大小,尺度不同的先验框,每个anchor都对应一个预测框,预测框只需要取预测它相对于anchor的偏移量就可以了)

feature map的长宽应该设置成奇数

否侧中心实体就要被最靠近中心得四个gridcell争抢

模型输出得结构

类别归anchor管了,一个gridcell产生125个数(5个anchor,每个anchor25个数字)

这个图更加直观

损失函数

 4、Dimension Clusters

聚类确定anchor长宽比(K-means)

5、Direct location prediction

要限制预测框的位置,防止预测框乱窜

6、Fine-Grained Features

整合不同尺度得特征,有利于小目标的目标检测

7、Multi-Scale Training

能这么做的原因是有global average pooling而不是用的FNN

这么做可以在速度和精度之间做权衡

同准确度速度最快,同速度准确度最高

Faster(更快)

改了骨干网络 V2 用Darknet19作为backbone V3用了darknet53

Model

Stronger(类别更多)(不是重点)

联合训练

不能简单融合,类别互斥,softnet互斥

形成分层的softmax结构,同级子节点做softmax

YOLOV3(An incremental improvement)(2018.4)

V4 V5 YoloX都是对V3的小修小补 并没有什么本质上的创新

基本的性能在V3就已经奠定了

包括现在很多的业界的应用用的还是yoloV3 因为它本身已经是一个很经典很优秀的算法了

唯一不太好的点就是它的论文写的不太正式,而且他的很多内容都很难推敲,各种网上的代码复现也是参差不齐

yolov3对V1和V2进行了一系列改进,解决了对小目标和(密集目标)检测不准确的问题

yolov2的骨干网络是Darknet19,有十九层

Backbone Darknet-53

(有52个卷积层和一个全连接层,并且里面加了残差连接)

(residual是残差链接不是单独的一层)

下采样是通过步长为2的卷积实现的,当作为backbone时去除了全连接层,就变成了卷积层的堆叠(backbone是全卷积层),因此可以兼容任意尺度的图像,但输入图像必须是32的倍数,因为要下采样32倍

骨干网络性能不错可以和resnet152媲美,它能够高效使用GPU,它实现了精度和速度的一个权衡

yolov3就以darknet作为骨干网络进行特征提取

Model

<骨架提取特征,颈部融合特征,头获得最终的预测结果>

输入的是416*416*3,输出的是三个尺度的featuremap(目的是匹配多尺度的物体),分别是13*13*255,26*26*255,32*32*255,255=3*85,每个gridcell生成3个anchor,每个anchor对应一个预测框,85=5+80,5=x,y,w,h,c ,80是Coco数据集包含80个类别对应的条件类别概率,左上角的就是Darknet53的骨干网络,骨干网络分别抽取到了下采样32倍的特征下采样16倍的特征和下采样8倍的特征(表示不同粒度的特征),

通过concat操作,下采样16倍的特征融合了下采样32倍的特征,下采样8倍的特征同时融合了下采样16倍的特征和下采样32倍的特征,经过这种特征融合,52*52*255的特征既发挥了深层网络的抽象特征,也同时利用了细粒度的细节纹理特征。所以通过这种结构可以实现多尺度的特征融合和不同尺度物体的预测

再看一眼255的含义

图片缩放方法:

1、不保留原来的长宽比例直接缩放成416*416,resize:会发生一些畸变

2、在保留原始长宽比例的情况下给图片多余的部分加上灰框

一些其他细节

v1产生98个预测框(检测小目标和密集目标的能力当然很差),v2产生13*13*5=

yoloV3对一个图像产生10647个预测框3*(13*13+26*26+52*52)改善了对小目标和密集目标的检测性能

对于yolov3来说输入的图片尺寸越大,grid数越多,输出的预测框的个数也越大。

concat是先上采样再按照通道方向叠加,上图展现了一下concat细节

损失函数

对于yoloV3来说于groundtruth IOU最大的框为正样本,IOU低于某个阈值的框为负样本,IOU处于中间位置的值不参与损失函数的计算

训练过程

测试过程

YoloV3改进变种

密集连接

空间金字塔池化

YOLOV4

简介

YoloV4是YoloV3的加强版!

其主要在YOLOV3的基础上添加了一些列的小改进。

因此YOLOV4于YOLOV3整体的预测思路是没有差别的!解码过程甚至一模一样!

YOLOV4的改进

1、Backbone:Darknet53—>CSPDarknet53

2、Backbone:应用SPP和PANet结构

3、Dataset:使用了Mosaic数据增强

4、Loss:使用了CIOU作为回归LOSS

5、activatefunc:使用了MISH激活函数

Model

与yolov3相同,输入图像的大小可以不同

SPP是利用不同尺寸的最大池化核来对输入进来的特征层进行最大池化,池化后的结果在进行一个堆叠(concat)之后再进行三次卷积

PANet是用特征金字塔对特征进行融合

输出头与yolov3没有区别

75=3*25,25=5(X,Y,W,H,C)+20(是针对VOC数据集来讲的,有20个类)

YOLOV5

简介

模型效果,带6的模型是处理更大尺寸的图片的

带6的和普通的除了在输入分辨率上有区别在模型的搭建上也有一些区别,

右上角模型最大的下采样倍率是32倍,所采用的预测特征层有三层(P3,P4,P5)(和之前的yolov3和V4都是一样的)

左下角这几个针对更大分辨率的模型,他们的下采样率达到了64倍(因为输入的分辨率更大,所要分的层次自然更多一些),它所采用的预测特征层一共有四层(P3,P4,P5,P6)

网络结构

backbone:New Csp-Darknet53

Neck:SPP->SPPF,PN->New CSP-PAN

Head:YOLOv3 Head

数据增强

mosaic(将四张图片拼成一张图片)

Copy paste

仿射变换

MixUp将两张图片按照一定透明程度混合成一张新的图片

Albenmentation

Augment HSV随机调整色度饱和度明度

Random horizontal filp随机水平翻转

训练策略

EMA:给学习变量加上一个动量

混合精度训练:加快训练提高GPU利用率

超参设置

其他

损失计算

平衡不同尺度损失

消除Grid敏感度

匹配正样本(Build Targets)

参考文献

【精读AI论文】YOLO V1目标检测,看我就够了_哔哩哔哩_bilibili

【精读AI论文】YOLO V2目标检测算法_哔哩哔哩_bilibili

【精读AI论文】YOLO V3目标检测(附YOLOV3代码复现)_哔哩哔哩_bilibili

科普:什么是YOLOV4目标检测算法_哔哩哔哩_bilibili

睿智的目标检测30——Pytorch搭建YoloV4目标检测平台-CSDN博客

YOLOv5网络详解_哔哩哔哩_bilibili

YOLOv5网络详解_yolov5网络结构详解-CSDN博客

YOLOv5 模型结构详细讲解_哔哩哔哩_bilibili

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

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

相关文章

PHP反序列化--_wakeup()绕过

一、漏洞原理&#xff1a; 二、靶场复现: 进入靶场&#xff0c;分析源代码&#xff1a; <?php error_reporting(0); class secret{var $fileindex.php;public function __construct($file){$this->file$file;}function __destruct(){include_once($this->file);ech…

【C++庖丁解牛】继承的概念及定义 | 继承中的作用域 | 继承与友元继承与静态成员 | 复杂的菱形继承及菱形虚拟继承

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.继承的概念及定义1.1继…

Ant Design 的 Table,设置自动滚动效果,触底返回顶部,悬浮停止滚动, Table的 scrollTo 简单使用。

环境&#xff1a; antdesign 版本号&#xff0c; 5.11 一、实现目标 使用 AntDesign 中 Table的 scrollTo 来设置滚动条的显示位置&#xff0c;达到自动滑动效果。 简单介绍 scrollTo 方法: scrollTo 有三个参数 ({index:number,top:number,key:React.key}), index: 表示…

代码随想录算法训练营第二十五天|● 216.组合总和III ● 17.电话号码的字母组合(JS写法)

216 组合总和Ⅲ 题目链接/文章讲解&#xff1a;https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1wg411873x 方法一&#xff1a;自己写的 自己写的&#xff0c;本题和77很像&#xf…

mozilla ctypes用法了解

参考文档&#xff1a;ctypeshttp://udn.realityripple.com/docs/Mozilla/js-ctypes/js-ctypes_reference/ctypes 一、引用 ctypes.jsm方法 Components.utils.import("resource://gre/modules/ctypes.jsm") 二、用法 已知用法1&#xff1a; 结构体的声明ctypes.S…

英特尔生态的深度学习科研环境配置-A770为例

之前发过在Intel A770 GPU安装oneAPI的教程&#xff0c;但那个方法是用于WSL上。总所周知&#xff0c;在WSL使用显卡会有性能损失的。而当初买这台机器的时候我不在场&#xff0c;所以我这几天刚好有空把机器给重装成Ubuntu了。本篇不限于安装oneAPI&#xff0c;因为在英特尔的…

nginx 报Too many open files

nginx 异常报 Too many open files 上周时&#xff0c;nginx已经报 Too many open files 当时把 配置文件调整最大连接65535了&#xff0c;reload 重新加载nginx后不报错了。 cat /proc/14921/limits |grep "Max open file" * soft nofile 65535 * hard nof…

【01】htmlcssgit网络基础知识

一、html&css 防脱发神器 一图胜千言 使用border-box控制尺寸更加直观,因此,很多网站都会加入下面的代码 * {margin: 0;padding: 0;box-sizing: border-box; }颜色的 alpha 通道 颜色的 alpha 通道标识了色彩的透明度,它是一个 0~1 之间的取值,0 标识完全透明,1…

vue2(vue3也可以使用)移动端h5网页实现扫一扫功能

一、效果 可以看调起了我们的摄像头&#xff0c;点击允许过后就打开了扫码界面 二、实现过程 1.安装包 zxing/library 2.构建页面 <template><div class"scan"><div class"video-container"><div class"scan-box">&…

图论03-所有可能路径(Java)

3.所有可能路径 题目描述 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到…

TypeScript(六)条件类型,函数,装饰器

条件类型 TypeScript 中的条件类型是一种高级类型&#xff0c;它使我们根据不同的条件创建更复杂的类型。 TS中的条件类型就是在类型中添加条件分支&#xff0c;以支持更加灵活的泛型 条件类型允许我们根据某个类型的属性是否满足某个条件&#xff0c;来确定最终的类型。 type…

【海贼王的数据航海】排序——冒泡|快速|归并排序|总结

目录 1 -> 交换排序 1.1 -> 冒泡排序 1.1.1 -> 代码实现 1.2 -> 快速排序 1.2.1 -> hoare版本 1.2.2 -> 挖坑法 1.2.3 -> 前后指针法 1.2.4 -> 快速排序(递归版) 1.2.5 -> 快速排序(非递归版) 2 -> 归并排序 2.1 -> 归并排序 2.…

泛微 OA - 根据流程 requestid 获取流程中的附件

泛微 OA - 根据流程 requestid 获取流程中的附件 在泛微 OA 流程中&#xff0c;附件是通过加密上传的&#xff0c;如果在第三方系统想要调用 OA 系统获取 OA 附件&#xff0c;暂时没有很好的方法实现。但是可以在本地进行调用&#xff0c;得到附件 url 地址、附件 id、附件上传…

蓝桥杯练习02随机数生成器

随机数生成器 介绍 实际工作中随机数的使用特别多&#xff0c;比如随机抽奖、随机翻牌。通过随机数还能实现很多有趣的效果&#xff0c;比如随机改变元素的位置或颜色。 本题需要在已提供的基础项目中使用JS知识封装一个函数&#xff0c;该函数可以根据需要&#xff0c;生成指…

01. 【Android教程】系统背景及结构概述

1. Android 的历史 Android 一词的本意指“人形机器人”&#xff0c;安迪•鲁宾 (Andy Rubin) 在 2003 年以此名创办了 Android 公司并开始召集团队研发 Android 系统。后于 2005 年被 Google 收购&#xff0c;安迪•鲁宾随后任 Google 工程部副总裁&#xff0c;继续负责 Andr…

数据可信流通:从运维信任到技术信任

1.数据可信流通概念 "数据可信流通"通常指的是确保数据在不同系统、应用程序或者组织之间的传输和交换过程中的可信性、完整性和安全性。在数据流通的过程中&#xff0c;确保数据的真实性、完整性和保密性是非常重要的&#xff0c;尤其是涉及到敏感信息或者重要数据…

大数据开发--01.初步认识了解

一.环境准备 1.使用虚拟机构建至少三台linux服务器 2.使用公有云来部署服务器 二.大数据相关概念 大数据是指处理和分析大规模数据集的一系列技术、工具和方法。这些数据集通常涉及海量的数据&#xff0c;包括结构化数据&#xff08;如关系型数据库中的表格&#xff09;以及…

Verdaccio部署及基础使用

1. Verdaccio 简介 Verdaccio&#xff0c;是一个轻量级的 npm 私有仓库的开源解决方案。npm是一个基于http的协议&#xff0c;用来存放软件包并且维护版本和依赖&#xff0c;利用 http 提供的 url路径 来对软件包进行增删改查。所以 Verdaccio 这款软件的核心就是实现 npm协议…

机器人路径规划:基于双向A*算法(bidirectional a star)的机器人路径规划(提供Python代码)

一、双向A*算法简介 传统A*算法是一种静态路网中求解最短路径最有效的方法&#xff0c; 它结合了BFS 算法和迪杰斯特拉算法(Dijkstra)的优点。 和迪杰斯特拉算法(Dijkstra)一样&#xff0c; A*算法能够用于 搜索最短路径&#xff1b; 和BFS 算法一样&#xff0c; A*算法可以用…

从头手搓一台ros2复合机器人(带机械臂)

一.前言 大家好呀&#xff0c;从本小节开始我们就步入了仿真篇&#xff0c;主要对机器人仿真进行介绍与操作&#xff0c;当然仿真有优点也有缺陷&#xff0c;基于对此学习&#xff0c;我们可以对上几小节创建的小车模型模拟硬件的特性&#xff0c; 比如&#xff1a; 有多重…