yolov1, yolo v2 和yolo v3系列分析

2024-01-05 14:28
文章标签 分析 系列 yolo v2 v3 yolov1

本文主要是介绍yolov1, yolo v2 和yolo v3系列分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目标检测模型主要分为two-stage和one-stage, one-stage的代表主要是yolo系列和ssd。简单记录下学习yolo系列的笔记。

1 yolo V1

yolo v1是2015年的论文 you only look once:unified,real-time object detection 中提出,为one-stage目标检测的开山之作。其网络架构如下:(24个卷积层和两个全连接层,注意最后一个全连接层可以理解为14096到11470(7730)的线性变换)

yolo v1的理解主要在于三点:

1.1 网格划分: 输入图片为448448,yolo将其划为为49(77)个cell, 每个cell只负责预测一个物体框, 如果这个物体的中心点落在了这个cell中,这个cell就负责预测这个物体

1.2  预测结果:最后网络的输出为7730, 也可以看做49个1*30的向量,每个向量的组成如下: (x, y, w, h, confidence) *2 + 20; 即每一个向量预测两个bounding box及对应的置信度,还有物体属于20个分类(VOC数据集包括20分类)的概率。

1.3  Loss 函数理解:loss函数如下图所示,下面几个概念需要理清楚

s2:最后网络的输出为7730, 因此49个cell;

B: 每个cell(1*30)预测了两个bbox,因此B=2,只有和ground truth具有最大IOU的bbox才参与计算

7*7的正掩膜𝕝𝑖𝑗obj:最开始进行网络划分时,ground truth的中心点落在了该cell中,则该cell出值为1;只有为1出的cell才参与计算

7*7的反掩膜𝕝𝑖𝑗noobj:正掩膜取反。

(1) 坐标预测损失(coordinate loss) : 上面损失函数的第一部分是对预测bbox的坐标损失,如下图所示,有两个注意点:一是对宽高取平方根,抑制大物体的loss值,平衡小物体和大物体预测的loss差异;二是采用了权重系数5,因为参与计算正样本太少(如上面7*7掩膜中只有三个cell的坐标参与计算),增加权重

(2)置信度损失(Confidence loss) :第二部分是正负样本bbox的置信度损失,如下图所示;注意下ground truth的置信度: 对于正样本其置信度为预测框和ground truth之间的IOU1, 对于负样本,置信度为IOU0;另外由于负样本多余正样本,取负样本的权重系数为0.5

(3)分类损失(Classification Loss) :  第三部分是预测所属分类的损失,如下图所示,预测值为网络中softmax计算出,真实值为标注类别的one-hot编码(可以理解为20分类任务,若为第五类,则编码为00001000000000000000)

yolo v1的主要特点

(1) 优点: one-stage,速度快

缺点:

(1) 不支持拥挤物体的检测(划分网格时一个cell只预测一个物体)

(2) 对小物体的检测效果差, 且对新的宽高比物体检测效果不好

(3)网络中没有使用batch normalization

下面是pytorch的实现的Yolo V1 network 和 loss计算方式:(未经实验,仅供理解用)

 Yolo_loss

 Yolo V1 network

2. Yolo V2

Yolo V2是在2016年的Yolo9000: Better, Faster, Stronger 中提出的, 采用了新的网络模型,称为Darknet-19, 包括19个卷积层和5个maxpooling层,相比Yolo V1的计算量减小了33%左右。其结构如下:

在ImageNet上预训练的结构:

进行检测任务训练时模型结构:(引入了不同尺度特征融合)

Yolo V2 主要对Yolo V1进行了五处改进:

(1) 加入Batch Normalization, 去掉dropout

(2) High resolution classifier (高分辨率图片分类器)

(3) 引入 Anchors

(4) Fine-grained Features (低层和高层特征融合)

(5) Multi-scale Training (不同尺度图片的训练)

2.1 High resolution classifier  (4% mAP)

yolo v1中分类器在ImageNet数据集(224224)上预训练,而检测时图片的大小为448448,网络需要适应新的尺寸,因此yolo V2中又加入了一步finetune,步骤如下:

a, 在ImageNet上预训练分类器(224*224),大概160个epoch

b,将ImageNet的图片resize到448*448,再finetune 10个epoch, 让模型适应大图片

c, 采用上述预训练的权重,在实际数据集上finetune(416416),最终输出为1313

2.2 Anchors

借鉴Faster RCNN中Anchor的思想,通过kmeans方法在VOC数据集(COCO数据集)上对检测物体的宽高进行了聚类分析,得出了5个聚类中心,因此选取5个anchor的宽高: (聚类时衡量指标distance = 1-IOU(bbox, cluster))

COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)

这样每个grid cell将对应5个不同宽高的anchor, 如下图所示:(上面给出的宽高是相对于grid cell,对应的实际宽高还需要乘以32)

关于预测的bbox的计算:(416416-------1313 为例)

(1) 输入图片尺寸为416416, 最后输出结果为1313125,这里的125指5(5 + 20),5表示5个anchor,25表示[x, y, w, h, confidence ] + 20 class ),即每一个anchor预测一组值。

(2) 对于每一anchor预测的25个值, x, y是相对于该grid cell左上角的偏移值,需要通过sigmoid函数将其处理到0-1之间。如13*13大小的grid,对于index为(6, 6)的cell,预测的x, y通过sigmoid计算为xoffset, yoffset,   则对应的实际x = 6 + xoffset,   y = 6+yoffset, 由于0<xoffset<1, 0<yoffset<1, 预测的实际x, y总是在(6,6)的cell内。对于预测的w, h是相对于anchor的宽高,还需乘以anchor的(w, h), 就得到相应的宽高

(3) 由于上述尺度是在13*13下的,需要还原为实际的图片对应大小,还需乘以缩放倍数32

实际计算代码如下:

2.3 Fine-Grained Features

由上面网络架构中,可以看到一条shortcut,将低层的的feature map(2626512)和最后输出的feature map(13131024)进行concat,从而将低层的位置信息特征和高层的语义特征进行融合。另外由于2626尺度较大,网络采用Reorg层对其进行了reshape,使其转变为1313,如下图所示:

2.4 Multi-scale Training

上述网络架构中,最后一层的(Conv22)为11125的卷积层代替全连接函数,可以处理任何大小的图片输入,因此在训练时,每10个epoch,作者从320×320, 352×352, … 608×608选一个尺度作为输入图片的尺寸进行训练,增加模型的鲁棒性。(当尺度为416416时,输出为1313125;输入为320320,则输出为1010125)

Yolo V2的特点:

(1)采用Darknet19网络结构,层数比Yolo V1更少,且没有全连接层,计算量更少;模型运行更快;

(2) 使用卷积代替全链接:解除了输入大小的限制, 多尺度的训练使得模型对不同尺度的图片的检测更加鲁棒

(3) 每个cell采用5个anchor box进行预测,对拥挤和小物体检测更有效

3. Yolo 9000

Yolo 9000是和yolo v2在同一篇文章中提出,是在YOLOv2的基础上提出的一种可以检测超过9000个类别的模型,其主要贡献点在于提出了一种分类和检测的联合训练策略, 具体细节参考:https://zhuanlan.zhihu.com/p/35325884

4. Yolo V3

Yolo V3是在2018年的文章YOLO V3: An Incremental Improvement 中提出,Yolo V3网络结构为DarkNet53, 如下图所示:(有ResNet, FPN的思想)。Yolo V3每个网格单元预测3个anchor box,每个box需要有(x, y, w, h, confidence)五个基本参数,然后有80个类别(COCO数据集) 的概率,所以3*(5 + 80) = 255。(y1, y2,y3的深度都是255)

相比于Resnet,Darknet中的残差结构如下:

采用FPN的思想,将不同尺度的Feature map进行融合,并在每个尺度上进行预测,如下图所示:

yolo_v3也和v2一样,backbone都会将输出特征图缩小到输入的1/32,通常都要求输入图片是32的倍数,Yolo v3中的DarkNet 53 和yolo v2 的DarkNet 19对比如下图所示:

这篇关于yolov1, yolo v2 和yolo v3系列分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/573170

相关文章

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.