https://www.bilibili.com/video/BV1Vg411V7bJhttps://www.bilibili.com/video/BV1Vg411V7bJ
yolo3的性能
以0.5为步长,计算IoU从0.5到0.95的map.yolo3在速度上确实是一骑绝尘,在准确度上也在可接受的范围内
在IoU=0.5,大分辨率输入的前提下,yolo3就是一个又快又准的模型了,是一个非常恐怖的存在。中科院的SSD似乎也不差
影响推理速度的因素是什么??首先就是模型的规模
backbone-darknet53
和Yolo2一样的策略,分为分类网络和定位网络。在进行分类训练的时候,需要在卷积网络后加上全局平均池化,全卷积,softmax.在进行定位训练的时候,拿掉这三个结构,加上多尺度训练需要的passthrough结构。yolo3进行了更全面的多尺度融合训练,有3个passthrough结构
在精度上,yolo3和resnet不相上下,但是速度要比resnet快很多。较之yolo2,毫无疑问,yolo3的网络规模更大,FPS就降下来了
yolo3会输出3个尺度的feature map.他们的channel都是255,因为yolo3每个grid cell有3个anchor,coco数据集有80个类,对于每个预测框,和yolo1,yolo2一样,都是输出5个值。所以255 = 3 * (5 + 80)
上面说每个grid cell有3个anchor,实际上是9个anchor,只是给每个最后输出的feature map 分配3个anchor.但我不理解的是,分辨率小的feature map分配的反而是大的anchor,说是用它取处理大目标???
都是一样的,都是在描述yolo3的结构图
在yolo2中,我提到具体是怎么得到多尺度的照片的,我认为就是resize,在确定好当前训练的样本尺度之后,直接进行resize
像coco、VOC这样的数据集,样本的尺寸并不是像cifar那种32*32的固定尺寸,所以要以他们为基础进行多尺度训练,我估计就是resize
进一步对网络结构话,第一次提到neck。注意区别于yolo2中出现的bottleneck结构,他是先降维再升维的操作,而neck结构是用于多尺度融合训练的,作用就是将进行的所有特征融合的操作统称为neck层,或者叫特征金字塔feature pyramid
注意啊,以上这三个分辨率的feature map实际上是一个grid cell的输出,不对不对不对
应该是这样,yolo3应该是将样本做了三种grid cell的划分13*13,26*26,52*52,每种划分的grid cell都会生成3个预测框,实际上总的预测框数量就变成了10647
实际上总的anchor数量是9个,每种分辨率的feature map分配三种anchor
这也就是yolo3进一步提升了对小目标和密集目标的识别准确率。其实在yolo1的时候,我们大概也能想到要增加预测框的数量,但是如果采用RCNN那种硬扩充的方式,势必会带来速度上的问题。实际上yolo2也确实硬扩充了预测框的数量,但是相对比较保守,将总量提到了900左右,还加入了anchor机制改善了模型的定位能力,极大地增加了recall检出目标的能力。
毫无疑问,yolo3想出了一种更好地扩充预测框数量的方式,充分复用了之前验证过了良好结构
我认为这是yolo对神经网络本质思想的又一次挖掘,这三个分辨率的feature map实际上是你中有我我中有你的状态,他仍然是单阶段的,如果说RCNN的rigion proposal做到10000出头,我估计性能直接就负数了
这张图就解答了我刚才的问题,为什么分辨率更大的feature map要分配更小的anchor, 非常直观的说明了这一点
还是yolo3的结构图
这张图用batch_size来描述处理后的feature map的尺寸挺容易让人无解的>.<
这张图更加形象地说明了yolo3是如何进行输出的,和yolo2的差异
之前结构图的输入是416*416,那么输出的feature map的三个分辨率是13,26,52
现在的输入是608*608,输出的feature map的三个分辨率是19,38,76
也就是说输入图像越大,那么预测框的数量就越多,这种功能是其他模型所不具备的,我认为这就是对神经网络本质的充分利用
yolo2只有在进行分类训练的时候在全局平均池化的基础上才能允许任意尺度的输入,当模型分类、定位训练结束之后,推理阶段,包括定位训练阶段都没有机制来实现任意尺度的输入
其实仔细想来,yolo2要是真想实现yolo3这样效果完全是可以的,因为网络结构允许他这样做。只是说他最终只会输出一个feature map,当前是固定分辨率13*13
我们再讨论这个grid cell的划分:
回顾yolo1,yolo2对于grid cell的划分,我也是逐步领会到他并不是RCNN的技术路线,yolo并没有对图像进行实际的分割,它只是一种设计模型的参数,它真实的作用是对输出的分辨率进行限制,设计的网络最终的输出必须保证是这个规定好的分辨率,无论使用多少的卷积、池化、bottleneck、1*1卷积、passthrough、FC,就是说这个参数最终只是体现在输出上
比如说yolo1,7*7的grid cell规定了FC的输出层输出是一个7*7*30 = 1470维的向量,并且需要reshape成一个7*7*30的tensor
yolo2,13*13的grid cell规定了训练完成的全卷积网络最后要输出一个分辨率为13*13的feature map,channel数为125
到了yolo3,甚至都没有明确去说明grid cell的划分,而是沿用并扩展了yolo2的思路,最终要输出3种分辨率的feature map,13*13,26*26,52*52
在yolo2,已经彻底解决多尺度训练这个问题,最终训练完成的网络就是一个全卷积网络
终于,到了yolo3开始正式提出关于正负样本选取的问题,应该说这个问题肯定是一直存在的,但是之前两个版本的论文并没有花任何的篇幅来讨论这个正负样本的选取。yolo2倒是提了一嘴,anchor机制虽然在map的提升上没有什么效果,但是极大地提升了recall,recall以及precision的计算就需要用到正负样本
在RCNN的论文中,提到了他是如何去规定正负样本。之前我也专门弄过这个概念,正负样本就是一个相对的概念,正 是由我们本次训练的目的来确定的
《focal loss》这篇文章专门讲了正负样本的选取问题
子豪兄说,在yolo3中规定如果某个anchor 与ground truth的IoU最大,那么这个anchor就是一个正样本。这是否就意味着,正样本的个数就是我的模型所预测的目标个数,这个数量可能是少于ground truth中标注的目标个数,他们的比值就能得到一个有意思的评价指标
以yolo1为例,在前向推断中,推断完成之后会产生98个预测框,如果要计算recall或者precision,那么就需要去比较7*7*30tensor当中的置信度参数,以这个为基准确定正负样本的个数。如果说这98个预测框包括的实际目标比较多,那正样本的个数肯定就会多
在yolo1中似乎并没有说将与ground truth IoU最大的预测框设定为正样本,yolo1只是在计算置信度时需要用到预测框和ground truth的IoU,每个grid cell的置信度不会单纯的设为0或者是1。分为两个部分:
1.训练阶段。通过比较每个grid cell的两个预测框的置信度的大小,来得出loss function的相应标签值,这个标签值就只有0,1
2.预测后处理阶段。预测框的置信度要用来计算自己的全类别概率,不存在直接使用置信度进行比较的情况
为什么会构建三个尺度、三个方面的损失函数???
从前文中,loss function的结构来看,它需要遍历每个grid cell的每个预测框,而我们输出了三种分辨率的feature map,自然也就需要三个尺度的loss function