为什么vs会输出一个框作为结果_从输入到结果,给你理清楚yolov3

feb8d72eaee5030840e784d0e1ed4a1f.png

之前写了yolov1,yolov2我自己的理解。现在写了这篇yolov'3的,写得非常详细,看完这篇文章回头看以前的即使有不太清楚的地方也会有新的收获。

不谈创新点,我们先看yolov3的流程是什么样的,讲完流程会铺开讲细节,带着疑问慢慢往下看。

首先传入(batch_size, image_size, image_size, 3)的张量,其中imagesize为416.经过一个网络,darknet-53(当然做检测的话,要把最后的全连接层去掉)。我们能够得到三个输出(batch_size, 13,13, 255),(batch_size, 26,26, 255),(batch_size, 52,52, 255),对每个输出的每个方格会有三个先验框,对每个输出的框进行筛选,选出符合要求的作为检测的目标框,计算各部分loss。

ok,接下来依次讲述下列问题:1,darknet-53结构,为什么会有三个输出。2,输出的每个数字是什么意思,预测的是什么值。3,框的筛选。4,loss。

  1. darknet-53
    首先我们看一下作者贴的网络性能图,可以说非常厉害了。

4edd068661b0349903065f2633fa7abc.png

首先保持了非常高的精度,与resnet-152差不多,大家有兴趣可以看一下resnet-152的网络有多深。并且在速度上也非常快,自然而言计算次数也少,真的非常强。接着我们看一下网络结构

02b79b6831c5b967acc8649f7d9b8463.png

红线以上是yolov3的网络结构(下面全连接层是为了分类,并且加了全连接就限制了输入尺寸为固定256,引入大量参数,这也是作者为什么去掉全连接层的原因)。这个网络是32倍下采样(也就是将原始尺寸缩小32倍),实际输入为416*416,缩小32倍所以应该是13*13,而不是上面的8。对于这个网络,作者继续借鉴了残差网络的东西,大量运用了残差结构。

用蓝色画笔圈出来的是作者选择提取的不同层的特征图。实际输入416*416对应的三个篮圈部分分别为52*52,26*26,13*13。因为现在很多算法都注意到不同层特征图的表征能力不同,从浅层到高层捕捉细节的能力也越强。特征图尺寸越小,感受野越大。所以这些输入,分别用作检测小目标,中目标,大目标。接下来,把这三层分别进行1*1,3*3的卷积,改变通道数的同时,继续提高非线性程度,提高精度,最终将通道数变成我们想要的255。ok,第一部分结束。

2. 输出数字的含义
我们从上面得到三个(batch_size, 13,13, 255),(batch_size, 26,26, 255),(batch_size, 52,52, 255)张量,13,26,52三个数字上一部分已解释,下面解释一下255的由来。以13*13的特征图为例。将图片分成13*13个部分。如果一个物体的中心落在这个格子中,那么这个格子就要负责检测出这个物体。每一个格子会产生3个框对应的值,每个框有85个值,分别是4个坐标,一个得分score,,80个类别概率(因为作者用的coco数据集,总共80类,每个数对应这个类的概率)。坐标表示框的位置,得分是表示这个框是否含有物体。那么对于一个格子,总共需要预测出

个数,这就是255的由来。作者设置了3个先验框,不同特征图的先验框尺度不同,关于先验框个数和尺寸的选择可看最后补充部分。

对于预测的坐标,要详细说一下。首先为什么不能直接预测坐标实际值,而要做一个encode,化成一个0-1之间的数。预测的值越大,模型越不稳定,最后计算loss也会比较大,容易波动。作者的用法如图

8602af1cdc86fd6a6a5bdb2172a0881f.png

网络输出的是

,先验框的宽高为
是当前方格距离图片左上角的距离,最终我们转化为真实的坐标为
是logistic函数。通过这个式子,我们能对结果与真实值进行转换。

3. 框的筛选
我们来计算一下总共得到了多少个框,分为三层,13那层对应

,26对应
,52对应
总共这么多框。这里作者首先用了一个技巧,首先筛选先验框,把不用的先验框先去掉,减少后续计算量。框的筛选是根据物体得分score以及与ground truth的iou决定的。我们知道,每个物体的中心都会落在确定的一个格子里,对于不存在物体的格子的框都可以忽视掉了。对于存在物体的格子,对于先验框与ground true重合度最高的框,score应该是1(如果不是1,所以就会产生loss),接着我们会计算出predict(真实的框坐标,用于后续loss计算)。即使先验框不是最好的但是与ground true重合度超过阈值(论文中设为0.5),也不会列为候选框计算损失(在某些算法中,会考虑正负样本的问题,所以会设置阈值多接收一些框)。ok,所有的框分为了两类,有目标的,没有目标的。

4. loss
首先,从上面我们知道,框分成两类,有目标和没有目标的。只有有目标的会计算三个损失,坐标损失,物体得分损失(存在物体,要让值为1),类别损失(属于这个类的值为1,其他要全为0)。没有目标的只会计算物体得分损失(不存在物体,要让值为0)。除了坐标损失用的均方误差外,得分loss和类别loss都用的交叉熵损失。别的较于yolov1中的损失函数就没什么改动了。

最后吐槽一句,这种大神写得文章,很多细节都默认你知道,真的要看看别人讲解,结合代码在理解理解,也算慢慢成长的过程。下面准备用这个算法,跑一跑自己的数据集(当然还要写一些文件处理的代码,太蛋疼了),等弄完,也会把自己的心得细节详细介绍给大家,奥利给。

补充

关于yolov2(yolov3同理)中作者提到的用聚类的方法,选择先验框的数量和尺寸,我们具体看一下做法。选择voc2012数据集,将所有的ground true的长宽都记录下来,考虑到图片尺寸可能不一样,所以有一个归一化的操作,即将长和宽分别除以原图片的尺寸,总共40138个框,所以我们有(40138, 2)的矩阵。在github上有长宽的分布图。

7505a6ba0ebf26e8b9c96527053dcc7e.png

接下来运用kmeans的算法,作者设置了k从2到10(不能再大因为框越多检测速度会越慢)。以k=2为例,我们有(40138, 2)的矩阵记录每个框的w和h,首先随机选择两个中心wh,接着计算其余每个wh与我们选好的中心wh的距离。距离计算公式为

。iou计算很简单,可以想象把两个矩形左上角对齐即可,iou越大,说明重复度越高,那距离就越近。计算完之后,选择距离最近的那个wh作为他的类别,并且用这一类的均值作为下次迭代的中心,不断重复到中心不再改变。

fa03d309f4980300ef89bb8fb61ccb7e.png

最后可以看出,其实k越大,效果越好,为了兼顾精度与速度,在yolov2中作者选择了5个先验框。这部分代码能够从github上找到,我也是借用别人的实验图,项目地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值