YOLOv2论文阅读笔记

YOLO9000:Better, Faster, Stronger-阅读笔记

1 摘要
1.1 背景
yolov2相比于yolo有了一些较大程度上的改进,属于当时(2017)的一个sota的算法,相比于SSD和R-CNN和ResNet效果,表现更佳。

  • 主要提升的地方:
    • 相比于yolov1可检测的类别更多了,可以检测超过9000个种类。
    • 使用了新的,多尺度(multi-scale)训练模型,可以运行在多种size上。
    • 提供了对于检测速度和精度的简单权衡。
    • 提出了一种模型来联合训练目标检测和分类任务,作者用这个模型在CoCo的检测数据集上ImageNet分类数据集上同时训练;联合训练使得YOLOv2可以预测没有标注的检测数据的目标的类别 。

Yolov1和Yolov2对比图在这里插入图片描述

引用原文(yolo测试的结果)

YOLO9000 gets19.7 mAP on the ImageNet detection validation set despite only having detection data for 44 of the 200 classes. On the156 classes not in COCO, YOLO9000 gets 16.0 mAP. But YOLO can detect more than just 200 classes; it predicts detections for more than 9000 different object categories. And it still runs in real-time.

yolov2部分检测结果展示

2 引言
2.1 背景与问题
大部分检测方法受限于检测集数目的数量(small),比如(现在仍然存在):目标检测数据集要比分类和标记数据集要少,这是因为目标检测数据集标注成本高且费时费力。

基于此,作者想要利用分类数据集,用其来扩充目前检测系统的视野,利用目标分类的分层视野来将不同的数据集结合在在一起。

提出联合训练算法让目标检测器在可在检测集和分类集上训练,通过学习检测数据集来提升框选精度,分类数据集提升语义性和鲁棒性。

代码和与训练模型网址http://pjreddie.com/yolo9000/

3 Better
Yolov1 相比于Faster-R-CNN存在的一些问题:框选位置错误较多,召回率低。
作者准备在Yolov2中解决此问题,提升召回率和选定位置准确度,同时保持分类精确度。
作者并未复杂化网络,相反做了一定的简化,让网络更好的学习表征。
以下是作者提出的改进的地方:

  1. 在卷积层和激活层之间加入Batch normalization操作,来帮助模型更好的正则化,并提升检测精度。
    BN层是一种常见的操作,主要的作用是:
    1.降低dropout率或者可以替代dropout操作,来防止网络过拟合。
    2.降低L2权重衰减系数。
    3.让网络更快的收敛,可以使用更高的学习率。
    BN操作原理

  2. 作者针对预训练中图像分辨率较小的问题,比如YOLO中分类器网络现在224x224的图片中训练然后用分辨率为448 x 448的图片检测,这意味着网络要同时转换学习适应新的分辨率的图像,在yolov2中让分类网络先在ImageNet的448 x 448分辨率图像中跑10个epochs,然后再微调网络来做检测,这样做提升了大约4%的mAP。

  3. 对比与Faster-R-CNN的RPN网络,RPN预测box的偏移和分类用的是卷积层,这样可以让RPN在特征图的任何位置预测offsets,而且预测offsets比单纯预测坐标更好让网络去学习。yolov2中移除了最后一个feature map后的全连接层,并且采用anchor box来预测边界框。(用FCL去分类和计算坐标的话,只能计算固定的数目,卷积操作可以获取更多特征信息)
    由于大物体往往会占据图像的中心,因此利用中心位置来预测这些物体比附近的4个位置更好,所以作者使用416分辨率的图像而不是448分辨率的图像作为输入,这样是因为yolo的darknet的卷积层的下采样因子为32,输入416分辨率的(416/32=13)图像就可以得到13 x 13的输出特征图,这样奇数特征图就可以得到一个center cell(全feature map)。
    最后作者总结了一下使用anchor box的方法大幅提升了召回率,提升了模型的检测潜力(虽然精确度有1%左右的下降…,但总体检测精度是相似的)。

  4. K-means 聚类产生anchor-box
    . 作者针对anchor box中需要手动设定的问题,提出使用K-means聚类的方法来自动生成anchor box;如果使用标准的k-means和欧式距离,大框会比小框产生更多误差,所以作者为了获得更高的IOU分数,采用了以下distance metric :
    在这里插入图片描述
    这里box是指生成的box,centroid是指聚类的质心,这个公式的意思就是,d越小说明IOU越大,box和质心的交集程度越高。
    至于利用k-means算法来生成anchor-box的思路,这里我的理解是,k-means算法中K代表了聚类数,首先需要人为设定k参数,文中选取k=5为最佳参数(经过了一些实验得出),选定k=5后,首先将随机生成的anchor-box的坐标信息,随机找出5个质心,然后对所有的坐标信息点进行距离计算,找出与这5个质心点d最小的点,分别划分5类,然后这样就分出了5个anchor-box的类别,再进行新的一轮质心计算,这里要注意,此时计算的质心不是随机生成,而是在每一个类别集合进行质心计算,这样就会产生新的5个质心,随后同样前面工作,进行距离计算再分类,然后不断迭代直到所有迭代次数完成。
    PS:注意这里的质心,就是每一轮的比对对象,是一个框,是需要和box来计算iou的 。 ( • ̀ω•́ )✧
    这样一来就会产生5个种类的anchor-box,相比于yolo中的2个box还需要人工标记,这里有了很大的进步,而且作者在后面的实验中发现,用anchorbox的办法生成9个box,和聚类生成的5个box效果一样,且聚类生成9个box比anchor生成的9个box计算的IOU效果更好.
    在这里插入图片描述
    在这里插入图片描述
    有关K-means算法的原理参考:k-means原理简介
    k-means相关计算公式:
    类别判断
    在这里插入图片描述
    质心计算
    在这里插入图片描述
    约束条件
    在这里插入图片描述

  5. 位置预测
    . 一般来说RPN网络产生的预测值的计算公式为,该公式缺乏有效约束:
    在这里插入图片描述
    其中tx代表网络计算的offsets; wa,ha,xa,ya代表预测框的坐标信息,这里文中也给出了相应的描述,不再详细赘述。
    以下是Faster-R-CNN中的计算公式供参考:
    在这里插入图片描述
    作者使用的预测方法如下:
    在这里插入图片描述
    作者任然延续了yolov1中算法的方法,采用每个cell生成bounding box的办法检测,并借鉴了RPN的偏移公式,对每个边界框,采用了5个坐标参数 tx, ty, tw, th,to,(cx,cy)表示图像中cell的左上角坐标,Pw和Ph表示先验框的宽和高,为了给偏差设定约束,作者采用了逻辑激活函数;
    这样一来就完成了边界框在原图上生成(解码)所需的坐标信息。
    在这里插入图片描述

  6. Fine-Grained Features
    为了让模型可以更好的检测到细小的物体,作者提出了使用passthrough layer来将最后一个输出层前的26 x 26的特征图片融合到13x13的特征图中,使用concatenates操作,不过26x26的特征图是512维的而13x13的特征图是1024维的,这样就无法很好的连接,所以这里作者想到了利用passthrough layer来将26x26x512的特征图像变成13x13x2048的特征图,具体的操作方法:就是行和列分别隔点采样取值然后重新进行排列,再在channel维度上进行叠加,此处的层是不学习参数变化的,只是一个特征图片处理的操作,这样就会产生4种与原特征图不同的排列,从而让512维翻了4倍。
    (此处的size:13只是作者举的例子)
    在这里插入图片描述
    此图借鉴----“无名wxd”

  7. 多尺度训练
    . 与SSD采用的multi-scale 训练的方法还是有着不同的地方,yolov2采用的网络只有卷积和池化,而ssd中除了backbone后面都是卷积操作来进行多尺度图像检测训练,而yolov2中的多尺度训练更加趋向于输入阶段就定好了一些sacle的范围,由于下采样因子是32所以,采用的输入规定为32的倍数,其中最小输入为320x320最大为608x608,这里图片的挑选是每10个batches从这个范围里面随机采样,这样产生的特征图大小为10x10-19x19,这样来实现多尺度训练,并实现对于多种size图片的检测,这样相比于ssd,降低了模型的复杂性,相对减少了训练的时间,也相对提升了模型的检测精度,算是一个简单的 tradeoff 。

4.网络结构

下表为yolov2采用的网络结构Darknet-19,5个maxpool layer,19个Conv layer,最后在输出阶段使用1x1的卷积运算1000次然后输出7x7x1000的特征图,最后采取平均池化生成1000个结果,给softmax,最后生成预测结果。

在这里插入图片描述
原来的YOLOv1network:
在这里插入图片描述
当然在进行训练之前作者做了一些预训练,首先把网络放在ImageNet1000上以224的size训练160个epochs,然后再将其的size提升到448,在训练10个epoch,做微调.然后把训练好的模型,进行检测训练,采用VOC或者COCO数据集训练160个epochs,在训练的同时采用了和yolo,ssd一样的数据增强的办法(翻转,随机采样,颜色偏移等)

5.联合分类与检测训练
作者提出了一种用于联合训练分类和检测数据的机制,在训练期间,网络对分类数据和回归数据采用各自的反向传播的损失函数,这里文章并没有详细的给出所用的损失函数公式。

以下是网上收集的关于YOLOv2检测部分的损失函数公式
在这里插入图片描述

文中提出的这个机制在检测和分类标签划分的时候遇到一个问题:不完全互斥问题,明显分类数据集类别远多于检测数据集,这样就会出现一些矛盾的情况,比如阿拉斯加和狗都是狗,但是他是2种标签,他可能被分成狗也可能被分成阿拉斯加,而softmax的分类结果是不同的种类。

作者借鉴了ImageNet标签划分的思路(WordNet),提出了一种标签划分的办法即–层级分类法-Hierarchical classification,比如:在WordNet中,“Norfolk terrier”和“Yorkshire terrier”都是“terrier”的下位词,terrier是“hunting dog”的一种类型,是“dog”的一种类型,“dog”是“canine”的一种类型。但是WordNet是一种图的形式,作者将其转化为多层级Tree的形式。

如何构建这个Tree呢?

主要利用了从属关系来构建,作者查看了WordNet中子节点到根节点的path,首先按照分类路径将所有的路径都添加到树中,然后迭代的检测遗留的概念,并且尽可能少的添加树的路径,如果出现一个概念有2条路径,其中一个添加了3个edge而另一个只添加了一个edge,那么久选择较短的那个路径。

为了计算出分类概率,需要对每个节点下的类别概率计算,以下是一个节点下同义集合的条件概率:
在这里插入图片描述
如果想要计算出某个个体的绝对概率,只需要沿着path进行将每个节点下的条件概率值进行相乘即可。
在这里插入图片描述
要注意的是根节点概率为:P r(physical object) = 1

这种方法也适用于检测。作者不再假设每个图像都有一个对象,而是使用YOLOv2的objectness predictor来给出pr(物理对象)的值。探测器预测一个边界框和概率树。然后沿着树向下遍历,在每一个分支处取最高的置信度路径,直到达到某个阈值,然后预测对象类,这样就不像以前一样的一个大的总类别数据集做softmax,而是会在数据集中预测到概率树中路径阈值最大的一个path类别里面进行softmax,做分类,至于某一物体概率的计算则是沿着path从根节点不断乘到最后一个节点。
在这里插入图片描述
下图为WordTree的图示:
在这里插入图片描述
—————————————————————————————————————————————
最后附上YOLOv2和其他网络训练结果的对比图:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值