yolov9000:better,faster,stronger

目标检测|YOLOv2原理与实现(附YOLOv3) - 知乎码字不易,欢迎给个赞! 欢迎交流与转载,文章会同步发布在公众号:机器学习算法全栈工程师(Jeemy110) 前期文章:小白将:目标检测|YOLO原理与实现小白将:目标检测|SSD原理与实现小白将:综述|基于深度学习的目标…https://zhuanlan.zhihu.com/p/35325884【论文解读】Yolo三部曲解读——Yolov2 - 知乎打个广告,复现Yolov3之后的深度原理剖析请移步下文(含代码): 【算法实验】能检测COCO并鉴黄的SexyYolo(含Yolov3的深度原理剖析)Yolov2论文链接: YOLO9000: Better, Faster, StrongerYolov2是基于Yolov1的一…https://zhuanlan.zhihu.com/p/74540100<机器爱学习>YOLOv2 / YOLO9000 深入理解 - 知乎YOLOv2相对v1版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测9000种不同对象,称之为YOLO…https://zhuanlan.zhihu.com/p/47575929YOLO-V2 输入和输出数据的编码和解码_xf1234的博客-CSDN博客_yolov2输出YOLO-V2 数据的编码和解码输入数据格式输入数据编码输出数据格式输出数据解码Yolo v2是怎么处理数据的呢?输入数据是什么样子,输入数据怎么编码,输出数据是什么样子,输出数据怎么解码,网上很多帖子都是讲解yolo的原理,但是这些只能通过代码来理解,这里做一下总结根据参考yolov2 keras 实现,作者是用的低版本的tensorflow,然后我用的版本是tensorflow2.2,因此对代码做了轻微的改动输入数据格式相比较yolov1,yolov2的输入标签有些复杂,主要是加入了anchorhttps://blog.csdn.net/xf8964/article/details/107255235/        

        yolov2的论文其实包含两部分,一部分是yolov1的改进版本yolov2,另一个是yolo9000,后面一个不在本文中讨论,这里只单纯的去看yolo检测系列。其实yolo9000还是挺强的,工程设计比较多,感觉细节一时半会也不一定能整明白,效果不太行也能理解,主要是他这个树状关系这块能借鉴的东西其实不少。在多标签中出现标签涵盖时可以用来作为处理的手段。yolov2相对于yolov1的改动还是挺多的,backbone,anchor,训练方式,box的编解码等,这也是yolo的风格,v3也是在v2的一系列改动下产生的,核心还是直接回归的思想没有变,利用网格点负责相应的检测对象的正负样本分配方式没有变。

1.Better

        yolo系列和fast rcnn比,定位误差较大,和rpn相比召回比较低,因此yolo的改进主要关注提高召回率和定位,同时保证分类精度。

yolov9000:better,faster,stronger_第1张图片

1.1 batch normalization

        yolov2在每个卷积层后都是用bn层,并且不再使用dropout,yolov2的map提了2.4%。

1.2 high resolution classifier

        很多检测框架的backbone都是在imagenet上预训练的,这个在retinking pretrained imagenet文章有提到,也可以train from scratch,效果不一定差,yolov1先在imagenet上用224x224预训练,在检测上用448x448,v2觉得直接切换高分辨率,检测模型可能难以快速使用高分辨率。因此yolov2增加了在imagenet上用448x448来fine-tune的这一中间过程,10个epochs,map提了4%。

1.3 convolutional with anchor boxes

        yolov1输入448x448,最后输出是7x7,相当于降采样了64倍,对于点回归方案这其实很影响的,yolov2输入416x416,最后输出是13x13,降采样32倍,输出是奇数,这样做是希望在特征图中有奇数个位置,有一个中心网格单元,对于大目标,往往占据图像的中心,因此最好在中心位置有一个有单元去预测这些对象,而不是附近的四个位置。centernet只降采样了4倍,理论上其实yolo的正样本要更多一点,但是重叠现象肯定要更严重一点,召回不一定高。

        yolov1没有anchor,是一个网格单元有一个类别预测,有了anchor,就要解耦空间位置和类别预测机制了,对每一个anchor要有一个类别预测,类别预测不再绑定网格单元,而是和anchor进行绑定了,即便v2中在计算loss时也只是计算了一个anchor和gt最大IOU的那个anchor。

        用了anchor,ap有个小下降,但是召回从81%涨到88%,yolov1对一张图只有98个预测框,但是yolov2有超过1000个anchor。作者没有测一下降采样32倍的影响,其实这一步应该也是很提召回的一步。

1.4 dimension clusters

        anchor在faster rcnn中都是人工设计的,是超参,yolov2在数据集上用k-means直接聚类anchor,这样可以使网络更容易学习预测好的检测结果。如果用欧式距离的标准k-means,那么较大的框比较小的框产生更多的误差,然后,真正想要的是能够获得好的IOU的anchor,这和gt box的宽高是无关的,度量距离选了1-iou,如下:

最终聚类的结果是5个anchor的宽高,也就是将来分布在13个网格单元上面的具有一定宽高的anchor,怎么理解呢?k-means的指标是d,d=1-iou,d越小越往一起聚,聚类时假设所有bbox的中心是一致的,一张图降采样到一个点(对应整个原图,如果降采样到32,就是13x13区域,13个点上做聚类),整图区域的所有gt bbox的中心就一致了,在这个点上做聚类,聚类出5个宽和高,这5个宽和高返回到原图上和gt计算iou,平均iou最高。

yolov9000:better,faster,stronger_第2张图片

上图是作者在voc和coco上选择聚类中心和平均iou的关系,最终选择了5个聚类中心,就是5组宽和高,聚类中心选择anchor和手工选择的不同,There are fewer short, wide boxes and more tall, thin boxes.        

yolov9000:better,faster,stronger_第3张图片

作者这个统计说明了质心选择的越多,平均IOU越高,同是9个anchor能比anchor boxes的平均iou高7个点多,不过这个聚类anchor也不一定就有效果,之前在电商图片数据集上检测有时候就没啥效果,但是对检测对象变化比较多,logo这种文本比较长还是有效果的。

1.5 direct location prediction

        yolov2使用anchor,就涉及对anchor的回归进行编解码的问题,在faster rcnn中,预测的是offet,如下所示,这里可能有些小问题,右边不是减,是加。        

x,y是预测的边界框是通过tx,ty和anchor的x,y,w,h解码出来的,这样做有个问题就是模型的不稳定性,上面的公式是没有约束的,预测的边界框很容易向任何方向偏移,tx=1时,边界框向右偏移anchor一个宽度大小,tx=-1时则向做偏移anchor一个宽度大小,因此每个位置预测的边界框可以落在图片的任何位置,在训练时需要很长时间来预测出正确的offset。因此yolov2没有预测offset,而是继承了yolov1的做,预测边界框相对于网格单元位置的坐标,这将gt限制在0-1之间,我们用sigmoid将网络的输出也限制在0-1之间。网络输出特征图时每个网格单元预测5和值,边界框tx,ty,tw,th和边界框置信度to。这里面有两点,一是encode编码过程,输入的原图的坐标需要编码成tx,ty,tw,th的形式进行loss的监督,二是decode解码过程,预测产生的这四个坐标值最终要解码成原图上的bbox。只有前向输出时才考虑预测值的解码,在训练时只考虑输入的编码。

编码过程:假设输入图片宽高为 (600,500)。

1.计算输入图像左上角坐标和右下角坐标。(50,100),(250,300)

2.计算中心点坐标和宽高,x,y,w,h都是输入图像的真实像素。150,200,200,200

3.计算中心点坐标和宽高相对于输入图像的相对值,即同时除以原图的宽高。0.25(150/600),0.4,0.33,0.4

4.中心点相对于网格单元索引和offset。3.25(0.25*13),5.2,4.29,5.2->3,5,0.25,0.2

5. 求相对于单元格的w和h,anchor表示在5个anchors中和gt box的iou最接近的anchor,这里我们假设取第五个,log的原因就是在计算模型输出的时候要对w和h进行一个指数运算,除以anchor是因为我们在计算输出的时候要乘以anchors,这个操作和faster rcnn还是一致的。

tw = log(w/anchors.w) = log(3.25/9.77052) = -0.478

th = log(h/anchors.h) = log(5.2/9.16828) = -0.246

6.tx,ty,tw,th->一个监督标签 0.25,0.2,-0.478,-0.246

解码过程:

yolov9000:better,faster,stronger_第4张图片

pw,ph是anchor的w和h,cx,xy是单元网格与图像左上角的的偏移量,即索引。用上面的公式就可以计算出bx,by,bw,bh,就是输出边界框的坐标,不过这个坐标是在13x13的图上每个网格单元的,最后还要除以13乘以图片的宽度和高度才能得到最终的位置和大小。

yolov9000:better,faster,stronger_第5张图片

如上图所示,这块大家可能看到恢复的预测边界框是蓝色,虚线黑色是anchor,预测的蓝色框比anchor还小一点,可能选的anchor是和gt的iou最大那个吧。至此编解码过程中其实都没有anchor的x,y,这一点和faster rcnn不同,结合上面的预定义anchor,在yolo中anchor是没有x,y的,它只有w,h,实际上它一组以网格单元为中心的anchor。这样改了之后,map有5%的提升。

1.6 fine-grained features

        在13x13的特征图做检测对大物体可能足够,但是对小目标可能效果不佳,因此从26x26x512的特征图上做了shortcut连接到最后输出的13x13x1024上,26x26x512可以reshape成13x13x2048,一结合变成13x13x3072,在此特征图上做回归,可以有1%的提升。

1.7 multi-scale training

        yolov2中只有卷积和池化层,因此采用多尺度的训练策略,不固定输入图像的大小,每10个batch就随机选择一个尺度的图片,我们的网络是32被下采样,因此从32的倍数样本中选择尺寸,比如320,352...608等。不过特征图大小变了,则检测的box数量也变了。

2.faster

这里主要是作者提出了一个新的bakcbone,darknet,用了darknet之后,map变化不大,但是计算量相对于vgg16减少了33%。需要注意的是,对于检测,更换了最后的conv,gap,softmax,并且增加了3个3x3,channel=1024的conv,最后再添加一个conv做输出head的,全网络是fcn的,输出channel是num_anchorx(5+num_classes),anchor为5,voc的话是5x25=126,coco的话是5x85=425.

yolov9000:better,faster,stronger_第6张图片

 3.loss function        

yolov9000:better,faster,stronger_第7张图片

yolov2如何训练呢?1.样本如何选择,2.损失函数设计。

1.和yolov1一样,对于训练图片中gt,其中心点落在某个网格单元中,那么该网格单元中的5个anchor所对应的边界框就负责预测它,至于到底是哪个边界框,则在训练中确定,即由那个gt的IOU最大的边界框负责预测,而剩余的4个边界框不与该gt匹配,yolov2同样需要假定每个网格单元至多含有一个gt,与gt匹配的anchor计算坐标误差,置信度误差(target=1,在yolov1中是预测框和gt的IOU)以及分类误差,而其他边界框只计算置信度误差,此时target=0,意思是不含有目标对象,都是mse loss,到yolov3就不再是mse loss,用这个损失本质还是在回归。

2.损失函数图如上所示,W,H是指13x13的宽高,A是指anchor的个数,λ是指各个损失的权重,第一项是计算背景的置信度误差,我们知道在yolov1中计算背景置信度其实是两方面,假设物体中心点落在该网格中,一个是b中另一个不负责预测gt的bbox和剩下的48个网格中不预测物体的边界框,在yolov2中由于anchor大大增加,13*5中有一个是负责和gt监督的bbox,其余全部都是负样本(假设全图只有一个对象落在该网格中,其余网格中没有物体中心点),这样作为边界框置信度的预测就需要做一下正负样本的采样,首先需要计算各个预测框和所有gt的Iou,定一个IOU阈值,yolov2中为0.6,如果这些边界框和gt的iou小于这个阈值就划作背景,背景置信度标签为0,这里面有个细节,如果不负责预测边界框和gt的iou大于0.6呢?不好意思,直接忽略,yolo和rpn不一样的是,yolo给物体分配anchor的时候只能有一个,而rpn是一个物体可以对应多个anchor。第二项是计算anchor和预测宽的坐标误差,只在前12800个iter之间计算,应该是在训练前期使预测框快速学习到先验框的形状。第三四五项是计算与某个gt匹配的预测框的各部分loss值,包括坐标误差,置信度误差以及分类误差。计算边界框置信度是iou值。

整体来看,yolov2相对于yolov1还是有很大改动的,包括32倍降采样,输入为416,特征图为13,增加anchor以及anchor的编码,还有就是backbone的新设计,其余都是小修小补,整体框架不变。有不少yolov3相似的特点。

你可能感兴趣的:(目标检测,目标检测,计算机视觉,深度学习)