[关闭]
@w460461339 2020-09-07T10:06:32.000000Z 字数 6268 阅读 4282

目标检测:Yolo,Yolo2,Yolo3

MachineLearning


1、前情回顾

我们这里简单回顾一下Yolo之前几个RCNN的操作。

2、Yolo

you only look once

2.0 参考

https://zhuanlan.zhihu.com/p/24916786?refer=xiaoleimlnote
https://chenzomi12.github.io/2016/12/14/YOLO-details/

代码阅读:
https://zhuanlan.zhihu.com/p/36819531 【这里其实可以看到,yolov1中用的都是relu作为激活函数】
https://zhuanlan.zhihu.com/p/35325884 【这里可以看到,通过主干网络得到的13*13*50的结果,又按照各自不同的功能(位置,是否包含物体,属于每个class的概率)进行了不同的激活,这个很重要,这样也解释了在v3中,说用sigmoid替换softmax是如何做到的】

根据前面的梳理,我们发现,目标检测过程还是分两步,首先提取proposal-region,然后再对proposal-region进行分类和位置精修。

这样也不优雅,yolo使用一种方法,将分类问题转换为一种回归问题。

这里有些点我其实卡了一会,想要弄清楚,需要将其分为训练和测试两部分。

2.0 网络结构

image_1e1c4trr8i821r8usb79bu1bqm1m.png-40.6kB
image_1e1c4t8odn0e1r8s1qe81aso1kge19.png-65.9kB

2.1 训练

注意:以下注意区分 网格,bbox(预测框),ground-truth-box

记住以下假设:

1、下面是一个20类的分类问题。
2、图像被分为7*7小网格。
3、每个网格产生2个boundingbox。

20200218:

回过头来看这里真的是可爱…训练的是,物体中心落入的那个网格负责检测物体,其实对应着loss的设计,比如这个公式,对于左下角的狗狗,有8个cell都包含,那么究竟让那块来做预测呢?都做吗?这样偏离太远的,会让网络训练不稳定。所以就在标注label的时候,让中间那个cell来作为ground_truth,它对应的为1,其他为0.

2.2 预测/测试

20200218:

这里再提一句,这个公式,是在训练的时候,用来标注用的…换句话说,这个是告诉你如何计算label的;我们从模型中得到的,就是[0.1,0.2,0.3,0.4....]这样的值,然后和我们用自定义的confidence公式算出来的结果去计算loss,然后训练。

image_1cf7i2ehr1tu51gqt1qkd1km38ig3q.png-278.6kB

2.3 Yolo v1 缺点

2、YOLO2

参考:
https://zhuanlan.zhihu.com/p/25167153

Yolo2主要就是把一系列方法加入进去,来对Yolo做提升.

之后还有很多操作,这里就不多说了,参考里都有。

3、YOLOV3

https://zhuanlan.zhihu.com/p/49556105
实例代码
https://github.com/eriklindernoren/PyTorch-YOLOv3

几个关键词:

1、Residual Block
2、FPN思想
3、anchors按需分配。
4、激活函数最后一层:logistics换softmax
5、边框回归
3.1 网络结构

image_1e1c64sj11kdg11qmaoi14noj923.png-365.7kB

3.2 Inference过程

事先准备好的anchors:
image_1e1c6887m1u22frj1udmq0lh72g.png-56.6kB
注意,这里先验框的大小都是针对原图而言的。

图像输入后,前面通过residual-block进行特征提取,到79层的时候,已经缩小了32倍了。

第79层的feature-map,其感受野最大,所以要用最大的三个先验框。下图中,黑色的小方块代表79层的feature-map上每一个1*1的点对应的感受野。另外蓝色框表示的就是我们的先验框。比如最小的那个蓝色,差不多占3.5*3个黑色方框,其实就是(116/32)*(90/32).
image_1e1c6a23fb2q1ok13mb9cqqrl2t.png-2041.5kB

然后91层和106层同理。

注意,这里用了FPN的思想哈,不仅上采样,还会和之前的降采样相同大小的feature-map记性concatente。

对于feature-map上的每个位置,需要预测(某个anchor的分类概率+某个anchor的坐标+某个anchor的前背景置信度),因此,总共有(13*13*3+26*26*3+52*52*3)个边框被预测出来,每个边框对应(80+4+1)这么个维度。

输入到输出映射:
image_1e1c6guua1hugaru18cbtth3v3a.png-170.9kB

3.3 logistics和softmax

softmax:

1、当softmax做激活函数时,假设输出80个p,那么sum(p1...p80)=1

logistics:

1、当logistics做激活函数时,80个p互不相干,仅输出属于这个类别的可能性。
3.4 边框回归

预测款:bbox
label框:gt

class_label, cx,cy,cw,ch
0. 0.1129 0.5605 0.06226 0.079

对于416*416大小的原图,图中狗狗框的中心坐标为x=100,y=100,w=50,h=60,
那么,cx=100/416,cy=100/416,cw=50/416,ch=60/416

但这个不是inference过程给出来的结果。

中间需要转换。

回味一下yolov3的FPN,对于13*13这个尺寸的输出,在每个cell上,它都会预测anchors_num*(4+1+class_conf)个值。

那么,对于每个cell的每个anchors,我会预测4+1+class_conf个值,不管后面的1+class_conf,我们看前面这个4。

这个4对应上图中的tx,ty,tw,th。其中,tx,ty在经过sigmoid之后,变成了bbox的中心在这个cell内的偏移量;而tw和th在变成e的次幂后,变成了bbox和anchors的比值。

通过这种方式,就将bbox和cell以及anchors绑定在一起。

https://github.com/eriklindernoren/PyTorch-YOLOv3

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注