【目标检测算法】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使用Apache Tika检测敏感信息

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

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个