【目标检测算法】YOLOv2学习笔记

2024-03-24 20:59

本文主要是介绍【目标检测算法】YOLOv2学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

趁着放寒假,把目标检测算法总结了(*^__^*) 

这篇文章有很多细节,参考的文章已经说得很详细了,有些太详细的部分如果只是为了看论文不操作代码的话(比如我)就可以忽略了,直接看yolov3更好。

所以下面的部分都是我认为(对于本弱鸡我)要掌握的。。。

Darknet-19和VGG一样都是用来做特征提取的,一个新的网络结构(未知URL)。

3、Convolutional With Anchor Boxes 

引入了anchor使得每个cell可以预测多个尺度的不同物体

这里的anchor和SSD中的prior box的含义是一样的,都是初始框,根据你设定的大小和宽高比和其他一些参数就能生成这些有规律的框,anhor翻译过来就是锚,可以说是比较形象了,相当于基准。而一般说的bounding box是指预测框。

yolo v2设置的5种anchor是通过维度聚类得到的。5种anchor的宽高,分别如下:

# 宽高
[0.57273, 0.677385], 
[1.87446, 2.06253],
[3.33843, 5.47434],
[7.88282, 3.52778],
[9.77052, 9.16828].

注意,这个宽高是在grid cell的尺度(即feature map)下的,不是在原图尺度上,在原图尺度上的话还要乘以步长32。

5、Direct Location prediction 

因为引入了anchor的概念,所以计算bbox的位置计算又和v1不一样了(绝望.jpg)。

(回忆:v1里是预测出来bbox的\hat{x},\hat{y},\hat{w},\hat{h},,这里x_hat,y_hat是cell左上角坐标的偏移量,就找到了bbox。)

开始啦!!!求bbox坐标沿用了YOLO算法中直接预测相对于grid cell的坐标位置的方式 —— 沿用YOLOv1的方法,就是预测bbox中心点相对于对应cell左上角位置的相对偏移值,为了将bbox中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)。

The network predicts 5 bounding boxes at each cell in the output feature map. The network predicts 5 coordinates for each bounding box,640?wx_fmt=png, and t_o.  这里t_o就是confidence啦。

根据anchor预测的4个offsets640?wx_fmt=png,可以按如下公式计算出bbox实际位置和大小

其中,

(c_x,c_y) 为cell的左上角坐标,在计算时每个cell的尺度为1,所以当前cell的左上角坐标为(1,1)。由于sigmoid函数的处理,bbox的中心位置会约束在当前cell内部,防止偏移过多。

p_wp_h先验框(是anchor吗?嗯)的宽度与长度,前面说过它们的值也是相对于特征图大小的,在特征图中每个cell的长和宽均为1。这里记特征图的大小为(W,H)(在文中是13*13),这样我们可以将bbox相对于整张图片的位置和大小计算出来(4个值均在0和1之间): 

640?wx_fmt=png

如果再将上面的4个值分别乘以(为啥公式里写的是➗除呢?)图片的宽度和长度(像素点值)就可以得到边界框的最终位置和大小了。(bbox的坐标解码结束!)

(黑色的是先验框,就是那个被挑中的、IoU最为匹配的anchor;蓝色blue的是边界框即bbox。)

训练

1. 给anchor分配label

首先,对于一个物体的bbox,我们得到它的中心,看这个中心落在grid中的哪一个cell,那么这个cell就负责预测这个物体。但是,需要注意的是,每个cell中实际上有5个anchor,并不是每个anchor的会预测这个物体,我们只会选择一个长宽和这个bbox最匹配的anchor来负责预测这个物体。那么什么叫长宽最为匹配?这个实际上就是将anchor移动到图像的右上角,bbox也移动到图像的左上角,然后去计算它们的iou,iou最大的其中一个anchor负责预测这个物体,如下图所示。

2. 损失函数(论文里都没介绍!我找了好久~~)和多尺度输入图片训练,直接看reference1吧,上面的anchor打label也是来源于此。

和YOLOv1一样,对于训练图片中的ground truth,若其中心点落在某个cell内,那么该cell内的5个先验框所对应的边界框负责预测它,具体是哪个边界框预测它,需要在训练中确定,即由那个与ground truth的IOU最大的边界框预测它,而剩余的4个边界框不与该ground truth匹配。YOLOv2同样需要假定每个cell至多含有一个grounth truth,而在实际上基本不会出现多于1个的情况。与ground truth匹配的先验框(就是被挑中的那个anchor)计算坐标误差、置信度误差(此时object为1)以及分类误差,而其它的边界框只计算置信度误差(此时object为0)

YOLO中一个ground truth只会与一个先验框匹配(IOU值最好的),对于那些IOU值超过一定阈值的先验框,其预测结果就忽略了。这和SSD与RPN网络的处理方式有很大不同,因为它们可以将一个ground truth分配给多个先验框。

损失函数有5个部分:

第一项:负责预测物体的anchor的xywh损失。如果anchor负责预测物体,那么需要计算坐标的L2损失。

第二项:不负责预测物体的anchor的xywh损失。如果anchor不负责预测物体,那么需要在迭代的初期(比如iteration<12800)去计算坐标的L2损失。问题的关键是,anchor都不负责预测物体,那么它的预测目标是什么呢?答:预测目标是anchor的xywh。为什么要这么做?我的理解是,这么做可以让所有anchor的预测都接近anchor自身的xywh,这样当它有物体落入这个anchor的时候,anchor的预测不至于和目标差别太大,相应的损失也会比较小,训练起来会更加容易。

第三项:负责预测物体的anchor的confidence损失。负责预测物体的anchor需要计算confidence损失,confidence的目标就是预测的bbox和真实bbox的iou。

第四项:不负责预测物体的anchor的confidece损失。对那些不负责预测gt的anchor,需要计算每个anchor和所有gt box的IOU。如果算出来的最大IOU<0.6,相应的 \lambda^{conf}_{noobj}=1 并且confidence的label就是0。但是,如果这个值大于0.6,相应的 \lambda^{conf}_{noobj}=0 ,也就是说,这个时候是不算这个anchor的confidence损失的。为什么要这么做呢?我的理解是,当anchor不负责预测物体的时候,如果它预测出来的结果和真实值差别很大的话,那代表它是没有物体的,那么这个时候就希望它的预测的confidence接近0。但是如果预测的结果和真实值比较接近的话,则不计算损失。

第五项:负责预测物体的anchor的类别损失。每个类别的输出概率0-1之间,计算的是L2损失。也就是说分类问题也把它当做了回归问题。另外需要注意的是,类别预测中是不需要预测背景的,因为confidence实际上就已经代表是否存在物体,类别就没必要去预测背景。

?:图片中的阿拉斯加object,它落在了一个cell里,那么这个cell就是只用来预测阿拉斯加的,这个cell有5个anchor,在训练的时候我们只挑选IoU与gt最为匹配的anchor当做负责预测物体的bbox,就xywhc计算loss,然后就是网络的预测值和gt不断进行优化,训练好网络权重。

问题:那么这个cell就是只用来预测阿拉斯加的,这个“只”还对吗?

测试 

image进入网络,Darknet-19特征提取之后为13*13*125的矩阵,产生13*13*5个anchor,做NMS留下confidence最高的(同v1)。

对于“YOLOv2使用了anchor boxes之后,每个位置(一个cell)的5个anchor都单独预测一套分类概率值”这句话的理解(所以一个cell里可以产生狗的bbox,也可以产生猪的bbox了?v1中一个cell里只能产生同类的bbox)。


一些问题

Q:multi scale的训练输入的话那网络结构不用实时改变么? 在做分类预训练时那个平均池化层要如何应对224×224和448×448这两种不同分辨率?

A:multi scale训练网络结构是可以不改变的,因为大部分网络最后都会将提到的特征做flatten,然后和全连接层相连,所以差别无非是将7*7 flatten成49和将9*9 flatten成81而已。以ResNet为例,最后的池化层采用的是global pooling,也就是不管输入是多大都处理成1*1大小,所以当输入是224*224时,池化层的输入就是7*7,输出是1*1;当输入是448*448时,池化层的输入就是14*14,输出还是1*1。(前面的global pooling会保证flatten前的特征数量相同,网络的最后有个全局pooling操作,这个和很多分类网络类似,因此不管输入图像分辨率多少,最后经过全局pooling后尺寸都是1*1。)


Q:网络抛弃了全连接,采用全卷积FCN的架构,因此可以输入任意大小的图片。

(这句话我自己目前还不太明白,也可以理解为全连接换成全卷积的好处是什么?在我看来一直都可以输入任意大小的图片啊,只要送进CNN之前resize到要的尺寸不就可以了吗?求指点)

A:因为faster rcnn有ROI pooling,所以变成size一样的送入全连接,这里又没有。

所以加入全卷积,就可以输入任意size大小的图片。


Q:训练部分,那么这个cell就是只用来预测阿拉斯加的,这个“只”还对吗?

和YOLOv1一样,对于训练图片中的ground truth,若其中心点落在某个cell内,那么该cell内的5个先验框所对应的边界框负责预测它,具体哪一个选IoU最大的那个框。

第一项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置信度时,在YOLOv1中target=1,而YOLOv2增加了一个控制参数rescore,当其为1时,target取预测框与ground truth的真实IOU值。对于那些没有与ground truth匹配的先验框(与预测框对应),除去那些Max_IOU低于阈值的,其它的就全部忽略,不计算任何误差。

A:我自己答的,?。狗的中心点落入这个cell中,选择IOU最大的anchor进行训练,恰好!猫的中心点也落入这个cell中,选择IoU最大的anchor进行训练。问题又来了。。。如果这两个anchor是同一个呢?


Q:测试部分,所以一个cell里可以产生狗的bbox,也可以产生猪的bbox了?(v1中一个cell里只能产生同类的bbox)这与之前所说中心落入哪个cell,哪个cell就负责预测该类别是否冲突呢?

A:因此yolo v2借鉴了faster RCNN中anchor的思想,这样实际上使得grid的每个cell可以预测多个尺度的不同物体

 9021年了,中心落入哪个cell,哪个cell就负责预测该类别这句话是描述yolov1的,那个这里的anchor和faster rcnn中就一模一样了,一个像素点对应回原图产生了多少个anchor。anchor找与它iou最大的gt,这个gt是什么类,那么这个anchor在训练的时候就和这个类(dog or cat?)不断拟合了。这些anchor可以任意学,可以任意预测不同物体,就按照faster rcnn中的anchor理解即可。


参考:

1. 重温yolo v2

2. YOLO v2算法详解

3. 目标检测|YOLOv2原理与实现(附YOLOv3) 

YOLOv2目标检测详解 (这里有计算举例,bbox的计算更清楚)

一文详解YOLO 2与YOLO 9000目标检测系统 | 分享总结 (这里有视频讲解)

5分钟学会AI(里面列出了具体的数据),一个讲v2的文章但用的v1的名字。

?不知道什么时候才能写好v3的总结帖,/(ㄒoㄒ)/~~

 

这篇关于【目标检测算法】YOLOv2学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学