第一章 Yolo(Yon Only Look Once)

1.1 介绍

     关于它的详细介绍,在这里,我不想多说,网上有太多它的介绍了,大家可以自行查阅。我主要简单地介绍下,整个的核心想法,便于理解整个框架。要介绍yolov3,不得不从yolov1开始说起。

     yolov1:核心想法:(1)“分而治之”,输入图片:划分为7*7的网格,每个单元独立作检测。注意:网格只是物体中心点位置的划分之用,并不是对图片进行切片,不会让网格脱离整体的关系。输出:S*S*(B*5+C),S*S:表示网格数量,B表示每个网格生成框的个数,C表示能检测识别的种类(受输出的深度影响)。(2)训练,yolov是端到端的训练,意思就是我们只注意输入和输出就行了,整个网络也就一个损失函数搞定。具体关于损失函数介绍就不多说了。(3)总结,v1对于整个yolov系列的价值:1)leaky RelU y=\left\{\begin{matrix} x &x>0 \\ 0.1x & otherwise \end{matrix}\right.,保留负数输出。2)分而治之。3)端到端训练,损失函数的反向传播可以贯穿整个网络。

anchor机制:anchor("锚"),第一步:把feature maps(256张map)拍扁,变成一张图,基于每个256d点开始“下锚”;第二步:“下锚”以后开始撒网,即以每一个锚点为中心生成大小不同的k个框,假设k=9,框的大小:长宽比:1:1,2:1,1:2三种,大小也有三种。这描述虽然不是专业的解释,但是通俗易懂,对anchor机制有了更好的理解。(4)Dimension clusters:当作者对yolov使用anchor机制时,遇到两个问题:1)模板框的大小是手动挑选的,作者并没有手动设定prior(框的大小),而是在训练集的b-box上用了k-means聚类来自动找到prior,找到的依据是:想要IOU得分更高的优选项,与box大小无关。所以对于距离的判断:d(box,centroid)=1-IOU(box,centroid)。(5)Direct location prediction:2)模型不稳定。不稳定因素主要来自于box预测(x,y)位置,yolov为每个bounding box预测出5个坐标(tx,ty,tw,th,to),

bx=\sigma(tx)+Cx                                     Pw和Ph都是k-means聚类之后的prior的宽和高,yolov直接预测出偏移量tw和th。使用聚类搭
by=\sigma(ty)+Cy                                     直接预测法的操作,使得模型上升了5个百分点。
bw=P_{w}e^{tw}
bh=P_{h}e^{th}
Pr(object)*IOU(b,object)=\sigma(to)

(6)Fine-Grained Feature(细粒度特征):调整后的yolo将在13*13的特征图上做检测任务,对小物体检测十分有帮助。(7)multi-scale training:用多种分辨率的输入图片进行训练。(8)darknet-19:用darknet-19作为yolov2的backbone分类网络,同时在darknet-19中使用batch normalization来加速收敛。

     yolov3:保留的东西:(1)“分而治之”。(2)采用“lerky RelU”作为激活函数。(3)端到端进行训练。一个loss function搞定训练,只需要关注输入端到输出端。(4)从yolov2开始,yolo就用batch normalization作为正则化,加速收敛和避免过拟合的方法。把BN层和leaky relu层接到每一层卷积层之后。(5)多尺度训练。在速度和准确率之间tradeoff。

    yolo每一代的提升很大一部分决定于backbone网络的提升,从v2的darknet-19到v3的darknet-53。yolov3还提供替换backbone----tiny darknet,想要性能好用Darknet-53,想要轻量高速用tiny-darknet。

    (1)backbone:没有池化层和全连接层,在forward中,张量的尺寸变换是通过改变卷积核的步长实现的。输入为416*416,则输出为13*13(416/32=13),stride=(2,2)。经历了5次缩小,1/2^5=1/32,所以通常要求输入图片是32的倍数。

    yolov2对于前向过程中张量尺寸的变换,都是通过Maxpool来进行的,一共5次,而yolov3是通过增大步长来进行的。

    (2)Output:最后输出是三个y1,y2,y3,深度都是255,边长规律是13:26:52。每个网格单元预测3个box,每个box有(x,y,w,h,confidence)五个基本参数,然后还要有80个类别的概率,所以3*(5+80)=255。v3用上采样的方法来实现这种多尺度的feature map。将backbone中间层的处理结果和后面网络层的上采样结果进行一个拼接之后的处理结果作为feature map。

    (3)Some tricks:1)Bounding Box Prediction。2)选用的b-box priors的k=9,对于tiny-yolo,k=6。priors都是在数据集上聚类得到的。3)v3对b-box进行预测的时候,采用了logistic regression。

    (4)Loss function:除了w,h的损失函数依然采用总误差之外,其他部分的损失函数用的是二值交叉熵。
5.OpenCV+yolov3实现目标检测(C++,Python) (代码完整)