嘿嘿嘿,相信大家都已经开始上班搬砖了吧,哈哈哈!脑瓜子嗡嗡的小刘,初七就开始上班了,真的难受,说好的假期计划也如期泡汤,唯一做的就是将kitti部分数据进行了可视化如下视频: 。
果然在家里面啥也不想做,不想动,这一篇是简单的说一下YOLOV2,感觉V2完全抛弃了YOLOV1的所有做法,下面我们来唠嗑一下V2(比较篇的话还是放在V4之后吧,这一篇也是论文的分析),如果有什么不对的地方请大哥们指正出来!下一期出一个嵌入式开发的项目:车内空气检测分析系统(没啥技术含量,由STM32F4和气体检测传感器搭建而成!),这篇论文说出了两个模型一个是V2,一个是9000!
大哥们都知道数据的重要性,当然深度学习中目标检测这一块数据也是非常重要的,然而随着目标检测的发展,数据这一块也是紧缺的,因此作者在文中提出了一种新的数据联合训练的方式(目标检测数据集和分类数据集),将COCO数据集和ImageNet数据集,采用wordNet的思想利用WordTree进行联合训练得到YOLO9000,YOLO9000名字的由来就是可以检测9000多个类别。YOLO9000在结构上并没大动V2的主体,只更改了anchor box由5调整到了3个,以及在误差计算的时候进行了调整和分类误差上。overall,较大的保留了V2的特性。当网络检测图像的时候,其进行反向传播,对于分类的损失仅仅只在标签的反向传播损失上,YOLO9000在动物的检测效果显著,其他较次。
作者为了扩大检测的能力,而不受数据集的制约,因此提出了这种方法-联合训练,在检测数据集上学习检测的相关信息,然后再去拓展到分类数据集上检测,将ImageNet和COCO中的名词对象一起构建了一个WordTree,以physical object为根节点,各名词依据相互间的关系构建树枝、树叶,节点间的连接表达了对象概念之间的蕴含关系(上位/下位关系),其中的对象不是互斥的关系,而是统一类别,比如:dog和Norfolk terrier,这样解决了9000个类别所需要的9000个softmax的问题。
ImgaeNet的标签是再WordNet中所得到的,而其结构是有向图,而YOLO2的作者希望用树结构来简化问题(树肯定比图好理解啦),首先通过遍历的ImageNet的所有视觉名词,对于每一个名词,在WordNet找到其的physical object为根结点,如果该节点到WordTree根节点(physical object)的路径只有一条,就将该路径添加到WrodTre。如果该节点有两条路径到根节点,则其中一条需要添加3个边到层次树,另一条仅需添加一条边,那么就选择添加边数少且较短的那条路径,添加到WordTree中。如图一、二为WordTree将多个数据集结合。
WordTree中存在着9418个节点(对象),即有9418维的向量,如果每个去做softmax显然是不可能的,一个WordTree对应且仅对应一个对象,不过该对象节点到根节点的所有节点概率都是1,
体现出对象之间的蕴含关系,而其它节点概率是0。WordTree预测的各个节点都是条件概率,那么一个节点的绝对值概率就是他到根节点路径上所有条件概率的乘积,在实际的计算中而是采用了一种类似于贪婪算法,从根节点向下遍历,对于每一个节点,选择概率最大的,一直遍历到某个节点的子节点概率低于所设的阈值。因为ImageNet样本比COCO多得多,所以对COCO样本会多做一些采样(oversampling),适当平衡一下样本数量,使两者样本数量比为4:1。
YOLO9000本人感觉用得比较少了,不过作者也是较早的提出了联合训练的方法,来弥补数据集的问题,使得object detection能够拓展到缺乏检测样本的对象中。
YOLOV2在YOLOV1基础上变动是非常得到大的,网络的backbone以及匹配机制都进行了更改,YOLOV2的召回率是大大的提升了(如图3),并且取消了dorpout layer 添加了Batch Normlization(BN)来提高收敛效果,同时消除了其他形式的正则影响,下面小弟来唠嗑一下,虽然有点炒冷饭的嫌疑,哈哈哈哈。
Batch Normlization能偶加快模型得收敛速度,而且在一定的程度上缓解了深层的梯度弥散,梯度消失和爆炸等问题。其主要是对每一层的数据进行归一化处理,随着网络的层数的增加数据离散和变化会越来越大,因此引入了BN层,其一定程度的防止了过拟合,可以减少惩罚项系数的添加和dropout层等处理方法。Batch Normlization一般添加咱激活函数的前面,神经网络里面使用大大多数ReLU或Leaky ReLU,YOLO里面采用的是Leaky ReLU。
BN算法基本上的处理方法为:
YOLO先用224 × 224的分辨率来训练分类网络,然后再将分辨增加到了448 × 448来对模型进10个epochs的微调,这个过程让网络有足够的时间调整filter去适应高分辨率的输入。然后finetune为检测网络。这样使得整个网络的mAP获得了4%左右的提升。
YOLOV1中其将图片划分为 S ∗ S S*S S∗S的网格,然后每一个Grid Cell 只能预测两个bbox,如果object落入中心网格,则该Grid Cell就负责检测它,YOLO一张图最多可以产生98个bbox,并且用全连接层来预测bbox中心点的坐标,后再reshape输出,这样导致了空间信息的定位不准。因此,YOLOV2采用Fast-RCNN先验框(anchor box)的思想,添加进入anchor 可以将其视为一个训练样本,因此为了训练目标模型,需要标记预测每个anchor box 的类别标签和偏移量,而非坐标,所以简化了问题的复杂度。YOLOV2的卷积层将图像进行了32倍的下采样,因此输入为416的图像,则会得到13 * 13的特征图,而先验框的数目可以如此计算13 * 13 * 5。相对YOLO1的
81%的召回率,YOLO2的召回率大幅提升到88%。同时mAP有0.2%的轻微下降。
Fast R-CNN 中是采用的人工经验筛选anchor box,人工挑选这个问题的严重性大家都知道,不说了,YOLOV2中作者使用k-means去聚类得到anchor box ,这个的code 在darknet中写好了,V2中采用的不是传统的欧氏距离,而是自己设置了一个距离度量,从而得到了更好的anchor box。
d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d(box,centroid)=1-IOU(box,centroid) d(box,centroid)=1−IOU(box,centroid) anchor box 具有不同的大小和不同的尺度,与识别的大小相近,与数据集标注很大关系,而在Fast R-CNN为超常数来进行手动设置。上述公式box 为其的边框,centroid 为其聚类被选做为中心的边框,损失函数也有这一部分的损失.
为什么选择IOU来做距离度量?——首先iou就是两个框的交并集,作者希望自己选出来的anchor box 能够尽可能的覆盖住自己的物理类别,而iou就很好的解决了这一点。因此改成了1-IOU ,就是IOU的损失,作者在这个地方做了变换意思,从下图5中我们可以看见作者做了折中所以选择了K=5。而YOLOV2和V3的anchor box生成的是有区别的V3中有3个不同的尺度,每一个尺度有3个框,因此的到的是9个anchor box。
YOLOV2在早期迭代的时候会出现模型不稳定的题,这些不稳定的因素来源于预测box的 ( x , y ) (x,y) (x,y)坐标。在区域建议网络(RPN)中会预测坐标就是预测 t x , t y t_x,t_y tx,ty。对应的中心 ( x , y ) (x,y) (x,y)按如下公式计算:
x = ( t x ∗ t y ) − x a y = ( t y ∗ h a ) − y a x = (t_x*t_y)-x_a\\ y=(t_y*h_a)-y_a x=(tx∗ty)−xay=(ty∗ha)−ya x , y x,y x,y为预测框的中心, x a , y a x_a,y_a xa,ya是先验证框(anchor)的中心点坐标, w a , h a w_a,ha wa,ha是anchor的宽和高, t x , t y t_x,t_y tx,ty是学习的参数,如果 t x t_x tx预测为1 则将移动到右边锚框宽度,为-1则向左移动锚框宽度,因为 t x , t y t_x,t_y tx,ty没有约束,因此初始的时候predicate box 的中心可以在任何位置。作者这里沿用了YOLO1的方法,直接预测Grid Cell的坐标位置,并且将ground truth通过逻辑回归函数限制在0-1之间。
这个网络最终会预测出feature map中每个grid cell的5个bbox,每个bbox包括 t x , t y , t w , t h , t o tx,ty,tw,th,to tx,ty,tw,th,to(这几个都是要学习而得到的,分别为预测的中心坐标,宽高,和置信度)。如果单元格被 ( C x , C y ) (C_x,C_y) (Cx,Cy)从图像的左上角偏移(需要归一化得到,其为单元网格1*1),并且前面的边框具有宽度和高度 P w , p h P_w,p_h Pw,ph,则预测对应于:
b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e w t b h = p h e h t p r ( o b j e c t ) ∗ I O U ( b , o b j e c t ) = σ ( t σ ) b_x = σ(t_x) + c_x \\ b_y = σ(t_y) + c_y\\ b_w = p_we^t_w \\ b_h = p_he^t_h\\ p_r(object)*IOU(b,object)=σ(t_σ) bx=σ(tx)+cxby=σ(ty)+cybw=pwewtbh=phehtpr(object)∗IOU(b,object)=σ(tσ)
b x , b y , b w , b h b_x,b_y,b_w,b_h bx,by,bw,bh是预测边框的中心和宽高, p r ( o b j e c t ) ∗ I O U ( b , o b j e c t ) = σ ( t σ ) p_r(object)*IOU(b,object)=σ(t_σ) pr(object)∗IOU(b,object)=σ(tσ)为预测边框的置信度, σ σ σ为sigmoid函数。
图6蓝色的框为prediction box,预测得到的是 t x , t y , t w , t h t_x,t_y,t_w,t_h tx,ty,tw,th 最后计算得到 b x , b y , b w , b h b_x,b_y,b_w,b_h bx,by,bw,bh 而,YOLOV1中预测的没有做限制,可以是整张图。采用sigmoid函数将 t x , t y t_x,t_y tx,ty 压缩到0-1中,因此预测的值在cell中,而不是其他地方, c y , c x c_y,c_x cy,cx为cell的大小,而中心的点预测是相对于整个图像的, p w , p h p_w,p_h pw,ph为anchor box的高宽,预测的框即为anchor box的变形,这一部分也存在这损失。都没有直接预测缩放的尺度。
这个最重要的就是passthrough layer,模型在预测的时候,输出的是13 ✖ 13的feature map,对大的object 是足够的,但是对较小的物体后继不足,因此作者添加了一层passthrough layer在最后一个pooling之前,其本质就是一种特征重排,将26 ✖ 26 ✖ 512的feature map按照隔点采样的方式,拆分成4个13 ✖ 13 ✖ 512,后再将这写按照channel叠加起来与原生的深层特征图相连接(即:加深channel的conv1与conv3 concat后作为conv4的输入),可以理解为其抽取前面层的每个2 ✖ 2的局部区域,然后将其转化为channel维度。最后得到13 ✖ 13 ✖ 2048的特征图,passthrough layer本身是不学习参数的,直接用前面的层的特征重排后拼接到后面的层,越在网络前面的层,感受野越小,有利于小目标的检测。passthrough layer很类似于ResNet的shortcut,其不直接对高分辨率的特征图处理,而是添加了一个中间层卷积,这样经过扩展后的的特征图,它可以使用细粒度(浅层)特征,使得模型的性能获得了1%的提升。
YOLOV2的输入不是固定的图像大小,而是每隔几次迭代就更改一下网络,epoch10次就选择一个新的图像尺寸,因为进行了下采样所以提取:{320,352,…,608}。 因此,最小的选项是320×320,最大的选项是608×608。这样使得网络具有鲁棒性,这种机制迫使网络学会在各种输入维度上很好地预测。 这意味着同一网络可以预测不同分辨率的检测,能够在速度和精度之间进行权衡。在高分辨率图片检测中,YOLOV2达到了先进水平(state-of-the-art),VOC2007 上mAP为78.6%,而且超过实时速度要求。图8和图9是YOLOV2和其他网络在VOC2007上的对比:
|
|
作者希望检测是准确的也足够快,大多数机器人和自动驾驶汽车都依赖于低延迟,为了最大限度的提示性能,设计了YOLOV2。YOLOV2没有采用VGG为backbone ,而是采用了darknet19。YOLO1采用的GoogleNet为backbone ,采用Googlenet 为88%,而VGG的为90%。darknet19(如图10)精度不弱于VGG,并且浮点运算量减少到原来的1/5,速度更快。这个都是为了提取出特征。
Darknet-19是一个卷积神经网络,用作YOLOV2的主干。与它主要使用的VGG模型相似3 ✖ 3在每个合并步骤之后,过滤并加倍通道数量。遵循网络中网络(NIN)的工作之后,它使用全局平均池进行预测以及1 ✖ 1的过滤器以压缩之间的特征表示3 ✖ 3卷积。批归一化(BN)用于稳定训练,加快收敛速度并规范化模型批次。最后的模型称为Darknet-19 总共有19层的卷积层和5层的最大池化层Darknet-19只需要55.8亿个操作来处理图像,但是在Image Net上达到72.9%的top-1精度和91.2%的top-5精度。YOLOV3里面采用的是darknet-53为backbone。
分类:其在Imagenet1000上分类数据上进行了160次epoch 训练,使用darknet神经网络框架,开始学习率为0.1,多项式速度衰减为4,权重衰减为0.0005,动量为0.9,在训练的过程中使用标准的数据增强技巧,包括随机作物、旋转和色调、饱和度和曝光移位(数据增强的操作,V4,V5的增强操作比这些还是多了一点),对224的图像进行初步训练后,对网络进行了微调,使得输入为448, 对于这种微调,我们用上述参数进行训练,但只训练了10个eopchs,并以 1 0 − 3 10^{-3} 10−3的学习率开始。 在这种高分辨率下,我们的网络达到了76.5%的top1精度和93.3%的top5精度。
检测:YOLOV2删除了最后一个卷积层,在3个3 * 3的卷积层添加了1024个滤波器,最后添加了1 * 1个卷积层,检测所需要的输出数,对于voc数据输出5个box,每个box有20个类,因此有126个过滤器,还从最后的3×3 * 512层添加了一个passthrough layer第二到最后的卷积层,这样我们的模型就可以使用精细的晶粒特征。我们训练网络160个时代,起始学习率为10^-3,在60和90个时代除以10,我们使用的重量衰减为0.0005,动量为0.9。 使用类似的数据增强YOLO和SSD与随机作物,颜色移动等。 我们在COCO和VOC上使用相同的策略。
1 M a x I O U < T h r e s h 1_{MaxIOU}
1 t < 128000 1_t<128000 1t<128000 意思是前128000次迭代计入误差。注意这里是与先验框的误差,而不是与真实对象边框的误差。可能是为了在训练早期使模型更快学会先预测先验框的位置。
1 t r u t h k 1^truth_k 1truthk 意思是该边框负责预测一个真实对象(边框内有对象)
尽管YOLOV2和YOLOv1计算loss处理上有不同,但都是采用均方差来计算loss。在计算boxes的 w w w和 h h h误差时还是有所不同的,YOLOv1中采用的是平方根以降低boxes的大小对误差的影响,而YOLOV2是直接计算,但是V2中的 w w w和 h h h都归一化到(0,1),其实和YOLOV1也差不多。
V2&9000中存蛮多创新点的:
简而言之,V2采用了一种新的特征提取网络darknet-19,并去除了FC层,采用了边框聚类,两层组合,多尺度训练,损失函数还是要看代码,哈哈哈哈,over!
emmmm,论文是读完了,那么接下来就要开始肝代码了,一日不肝,很难受了!脑瓜子嗡嗡的小刘最近还看了一下国外的学校研究生申请,果然学费劝退,哈哈哈哈哈!还是收拾好心态,准备复习考研!大哥到时候可以指点我一下,比如学校,试题等等,上述文章如果有不对的地方,记得说出来了。都是白嫖知识,一起进步嘛!ヾ(•ω•`)o
脑瓜子嗡嗡的小刘,是某造车新势力的一名自动驾驶图像算法实习生。同时小刘也是一枚热衷于人工智能技术的萌新小白。小刘在校期间也参加过许许多多的国内比赛(主要是嵌入式与物联网相关的),要是大哥们有什么问题,可以随时Call me,希望能和大哥们共同进步!!!同时也希望大哥们看文章的时候也能抽空点个赞!谢谢大哥们了!!!(づ ̄ 3 ̄)づ