目标检测——YOLOv2算法解读

论文:YOLO9000: Better, Faster, Stronger
作者:Joseph Redmon, Ali Farhadi
链接:https://arxiv.org/pdf/1612.08242v1.pdf
代码:http://pjreddie.com/yolo9000/

YOLO系列其他文章:

  • YOLOv1通俗易懂版解读
  • SSD算法解读

文章目录

  • 1、算法概述
  • 2、YOLOv2细节
    • 2.1 Better
    • 2.2 Faster
    • 2.3 stronger(利用YOLOv2训练YOLO9000)
  • 3、创新点和不足


1、算法概述

YOLO9000,能检测超过9000类的目标,是YOLOv2的延伸,这里只介绍YOLOv2的部分。YOLOv2利用多尺度方式训练可以适应不同尺寸大小的输入,它能在VOC2007测试集上以67FPS的推理速度达到76.8%mAP,大尺寸输入下,以40FPS的推理速度达到78.6%mAP,相对于Faster R-CNN和SSD算法有较大提升。最后作者提出了一种目标检测与分类联合训练的方法,利用该方法作者同时在COCO检测数据集和ImageNet分类数据集上训练出了YOLO9000,YOLO9000可以预测标记之外的类别。


2、YOLOv2细节

2.1 Better

与基于区域提议的R-CNN系列方法相比,YOLO的召回率相对较低。因此,作者主要关注在保持分类准确性的同时提高召回率和定位准确率。现在大多数方法普遍趋向于更大、更深的网络,更好的性能通常取决于训练更大的网络或将多个模型集成在一起。但作者不屑于这样做,他在YOLOv1的基础上一步一步通过实验改进最终得到YOLOv2,实验结果如下:
在这里插入图片描述


Batch Normalization
通过加入batch normalization,YOLOv1可以提升2%mAP,它可以正则化模型,即使去除原有的dropout也不会造成过拟合。

Hight Resolution Classifier
现在的检测算法都是用分类网络作为检测网络的主干,首先用分类网络在ImageNet上进行预训练得到预训练模型,而自AlexNet开始,大多数分类网络输入都是256x256的,而YOLOv1是用224x224大小的输入训练分类网络,而用448x448大小的输入训练检测网络,这就导致分类网络和检测网络输入分辨率不匹配;YOLOv2的分类网络以448x448的分辨率先在ImageNet上进行Fine Tune 10个epochs,让网络有时间调整它的参数,好让其能更好的运行在新分辨率上,最终给模型带来了4%mAP的提升。

Convolutional With Anchor Boxes
YOLOv1使用全连接层直接预测Bounding Boxes的坐标值。Faster R-CNN的方法只用卷积层与Region Proposal Network来预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是直接预测坐标值能够简化问题,让神经网络有个参考坐标,学习起来更容易。所以作者最终去掉了YOLOv1中的全连接层,使用Anchor Boxes来预测 Bounding Boxes。同时,作者去掉了网络的Pooling层,使得输出更高的分辨率,输入图片尺寸由原来的448x448调整为416x416,这样做是作者想有一个奇数大小的特征图,因为通常来说比较大的物体,往往会占据图像的中心,所以最好在中心有一个位置来预测这些物体;416x416大小的图像经过32倍下采样会得到13x13大小的特征图用于最后的预测。使用Anchor Box会让精确度稍微下降,但用了它能让YOLO从预测98个框到能预测出大于一千个框,提升召回率recall达到88%,mAP达到69.2%。

Dimension Clusters
当Anchor boxes与YOLO一起使用时,Anchor boxes设置可以通过两种方式,手工设置和网络学习,作者通过在训练集上使用k-means聚类算法聚类训练集的bounding boxes来计算设置Anchor boxes的宽高以及数量。最终在模型复杂性与高召回率之间权衡之后,选择聚类分类数K=5。
在这里插入图片描述

Direct location prediction
当YOLO使用anchor boxes进行训练时,在迭代初期会出现训练不稳定问题,大部分的不稳定性来自于对矩形框的(x,y)坐标位置预测。基于anchor boxes直接预测(x,y)坐标的公式如下:
在这里插入图片描述
如果tx的预测值为1,x的预测结果将是向右偏移该anchor box的宽度,相反,如果tx为-1,x的预测结果将向左偏移同样的量。这个公式是不受约束的,所以任何anchor box都可以在图像中的任何一点结束。在随机初始化的情况下,模型需要较长的稳定时间才能预测出合理的偏移量。
相比预测偏移量,作者还是采用YOLO的方式,预测相对于网格单元位置的位置坐标。这会将真实坐标框限制在0-1的范围之内,作者用sigmoid激活函数将最后的预测转换到这个范围之内。该网络在输出特征图的每个单元格上预测5个边界框,每个边界框又预测5个值,tx,ty,tw,th和to,假设一个网格单元对于图片左上角的偏移量是cx,cy,Bounding Boxes Prior的宽度和高度是pw,ph,那么预测的结果见如下公式:
在这里插入图片描述

回归坐标框的示意图如下图所示:
在这里插入图片描述
由于我们约束了位置预测,因此参数化更容易学习,使网络更稳定。使用维度聚类和直接预测边界框的中心位置可以提高精度,与锚框版本相比,YOLO提高了近5%mAP。

Fine-Grained Features
经过之前的调整,YOLO用于预测的特征图大小变为13x13,这个尺寸对于检测图像中的大目标足够了,同时使用这种细粒度的特征对定位小目标的位置可能也有好处。Faster R-CNN和SSD算法都用了多个特征图来做预测,而作者没有采用这种方式,他只是在26x26特征图大小后面添加了一个贯通层(passthrough layer)。贯通层通过将相邻的特征叠加到不同的通道来连接高分辨率特征和低分辨率特征,这有点似于ResNet中的identity映射。贯通层将26x26x512的特征图变成13x13x2048的特征图,YOLO中的检测器位于扩展后的特征图后面,所以它能取得细粒度的特征信息,这提升了YOLO 1%mAP的性能。

Multi-Scale Training
作者希望YOLOv2能在不同输入大小的图片上运行,所以将这多尺度训练应用在训练阶段。作者采用每10个batches就随机调整输入图片大小,图片大小按32的大小排列如下{320,352,…,608},这种机制迫使神经网络学会在各种输入维度上进行良好的预测。这意味着相同的网络可以预测不同分辨率的探测结果。网络在较小的尺寸下运行速度更快,因此YOLOv2在速度和准确性之间提供了一个简单的权衡。小尺寸输入,精度稍低但速度快,大尺寸输入,精度高但速度会慢一点,结果如下:
在这里插入图片描述

Further Experiments
YOLOv2在VOC2012和COCO数据集上实验结果如下:
在这里插入图片描述
在这里插入图片描述


2.2 Faster

大多数检测算法都用VGG16作为主干网络,但是它太复杂了,224x224分辨率下要做30.69 billion次浮点运算,相比于YOLO采用的Googlenet网络,它比VGG16更快,同样分辨率下只需做8.52 billion次浮点运算,精度只低2%左右。

Darknet-19
作者基于现有知识重新设计了一个分类网络,比如采用3x3卷积,池化层后通道加倍,采用全局平均池化用来预测,用1x1卷积来调整通道数量,用batch normalization来稳定训练过程、加速收敛和正则化模型。最终的模型被作者命名为Darknet-19,拥有19个卷积层和5个最大池化层,它只需要5.58 billion次浮点运算,其结构参数设置如下:
在这里插入图片描述

Training for classification
网络训练在ImageNet1000类分类数据集,用随机梯度下降法用初始学习率为0.1训练了160epochs,训练完成后,又用448x448的分辨率,以学习率为0.001微调了10个epochs。

Training for detection
网络去掉了最后一个卷积层,而加上了三个3x3卷积层,每个卷积层有1024个Filters,每个卷积层紧接着一个1x1卷积层,这个1x1的卷积层会将输入通道压缩到我们输出所需要的通道数量,对于VOC数据集,对于每个网格单元网络会预测五个Bounding Boxes,每个Bounding Boxes预测5个坐标和20个类别分数,所以一共有125个Filters。数据扩充方法与YOLO和SSD一样都采用随机裁剪、颜色抖动等等,对于COCO数据集,与VOC数据集的训练对策相同。


2.3 stronger(利用YOLOv2训练YOLO9000)

作者提出了一种分类和检测数据联合训练的机制。该方法使用带标注框的图像来学习特定于检测的信息,比如边界框坐标预测和对象以及如何对常见对象进行分类;使用仅带有类别信息的图像来扩展它可以检测的类别的数量。在同时利用检测数据集和分类数据集进行训练时,当网络遇到带有标注框图像时,YOLOv2会进行完整的梯度反向传播进行训练,但当网络遇到仅带有类别信息的图片时,网络只会反向传播类别信息部分的梯度。
但是检测数据集只有粗粒度的标记信息,像“猫”、“ 狗”之类,而分类数据集的标签信息则更细粒度,更丰富。比如狗这一类就包括“哈士奇”、“牛头梗”、“金毛狗”等等。所以如果想同时在检测数据集与分类数据集上进行训练,那么就要用一种一致性的方法融合这些标签信息。再者,用于分类的方法,大多数采用softmax,而softmax是类别之间互斥的,这就导致检测数据集中的“狗”类与分类数据集中的“哈士奇”、“金毛狗”这些类别要互斥,这与实际情况是不符合的。最终作者用WordTree 把数据集合中的类别映射到分层树中的同义词上,如图:
在这里插入图片描述
作者训练的时候使用WordTree混合了COCO检测数据集与ImageNet中的Top9000类,混合后的数据集对应的WordTree有9418个类。


3、创新点和不足

创新点
1、基于v1的版本做了很多改进,batch normalization,提高分类器训练分辨率,候选框聚类,多尺度训练。

不足
1、相对于Faster R-CNN和SSD,YOLOv2还是没有采用多个特征图预测,文中也没提及为什么没有采用多个特征图预测,只是说通过passthrough layer能达到相似效果,但是从后面的YOLO系列算法设计来看,多个特征图做预测还是有帮助的。

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

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

相关文章

视觉图像处理和FPGA实现第三次作业--实现一个加法器模块

一、adder模块 module adder(ina, inb, outa); input [5:0] ina ; input [5:0] inb ; output [6:0] outa ;assign outa ina inb; endmodule二、add模块 module add(a,b,c,d,e); input [5:0] a ; input [5:0] b ; input [5:…

git上拉下来的web项目,只有一个.git路径解决

代码拉下来的时候,web项目路径只有一个.git,可能指没有致命分支: 用idea打开web项目;切换到对应的分支即可

EEPROM ADDRESS BYTE长度说明

1、24C16 ADDRESS BYTE 2、24C32 ADDRESS BYTE 3、ADDRESS BYTE 长度说明 容量小于16Kbits(含)的EEPROM 地址是8位的 容量大于16Kbits的EEPROM地址是16位的 4、操作说明 例如:STM的HAL库函数中 HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi…

ElasticSearch之聚合原理以及精准度分析

写在前面 本文看下es聚合的原理,以及精准度相关的问题。 1:分布式系统近似统计算法 万物都有其内在的规律和限制,如CAP,我们无法设计一个系统同时满足所有的因素,在分布式的计算中也是如此,它也有3个因素…

SpringBoot配置达梦数据库依赖(达梦8)

maven配置 <!-- 达梦数据库 --><dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.1.193</version></dependency><dependency><groupId>com.alibaba&l…

搞懂HR脑回路,春招Offer送上门!

春天已经来了工作还会远吗&#xff1f; 对准程序员们而言&#xff0c;意味着金主打开大门的春招季要来啦&#xff01; Offer飞来飞去&#xff0c;你会收到心仪的offer吗&#xff1f; 要Get这些大厂Offer不难&#xff0c;但前提是——你得先“懂”HR。所谓“懂”&#xff0c;并不…

性能测试场景分析并设计?超细案例讲解

前言 性能测试场景&#xff0c;其实和功能测试没什么区别&#xff0c;只是侧重点不同。 我们在功能测试中经常用到的等价类边界值等分析和设计测试case的方法&#xff0c;目的是为了尽可能的覆盖业务场景&#xff0c;避免遗漏导致的功能逻辑缺失或者未达到预期。 而在性能测试…

数据分析-Pandas雷达图的多维数据可视化

数据分析-Pandas雷达图的多维数据可视化 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表…

机试:偶数分解

题目描述: 代码示例: #include <bits/stdc.h> using namespace std; int main(){ // 算法思想1:遍历小于该偶数的所有素数,存入数组中,遍历数组找出两个数之和等于偶数的数int n;cout << "输入样例" << endl;cin >> n;int nums[n];int k …

echarts绘制雷达图

<template><div><div>【云端报警风险】</div><div ref"target" class"w-full h-full" stylewidth&#xff1a;200px;height:300px></div></div> </template><script setup> import { ref, onMounte…

MySQL教程-SQL

SQL(Structured Query Language)结构化查询语言&#xff0c;操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一标准。 语法 SQL语句可以单行或多行书写&#xff0c;以;为结束标记SQL可以使用空格或缩进来增强语句的可读性SQL分单行注释(-- 注释内容 或 …

代码随想录 Day41 动态规划(背包问题)

动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是解决背包问题&#xff08;Knapsack Problem&#xff09;的一种常用方法。背包问题可以描述为&#xff1a;给定一组物品&#xff0c;每种物品都有自己的重量和价值&#xff0c;背包的总容量是固定的。我们需…