YOLOv3 阅读笔记

# YOLOv3 阅读笔记

论文链接:https://arxiv.org/abs/1804.02767

代码链接:https://github.com/pjreddie/darknet 非官方win+Linux版:https://github.com/AlexeyAB/darknet

一句话总结:

用了更新的网络结构,借鉴SSD多次检测,采用多分类熵损失获得了在COCO 57.9 AP50 A P 50 51ms(19.6FPS).

概述:

相对于YOLOv2的主要区别如下:

  • 更有效的backbones: 引入残差结构来构建新的Darknet-53

  • 多次检测: 在三个尺度不同的特征图上分别设置3个不同anchor来进行检测.特征图尺度越大,anchor越小.

  • 多分类熵损失:bbox不再利用softmax指定为某一类来适应复杂数据集

结果

MethodbackboneAP AP50 AP75 APs A P s APM A P M APL A P L Speed
YOLOv3 608 × 608Darknet-5333.0 57.9 34.418.3 35.4 41.951ms(19.6FPS)

yolov3结果

论文细节:

detection网络结构

v2只在最后提取出来的13x13(对于416x416的输入)上进行了检测,而v3在三个不同的特征层利用不同的anchor进行了检测.具体的detection网络的结构如下. 大尺度的feature map上使用了更小的feature map,这与SSD的anchor tile是一样的思想.

YOLOv3检测网络结构

anchor获取与设定

anchor的获取同v2一样以两矩形框的IOU作为相似度( 1IOU 1 − I O U 作为距离)对训练集所有gt(只包含w,h)进行k-means聚类.

但v3选取了 k=9 k = 9 ,然后按获得的类中心对应的矩形面积排序后从小到大分类三类.为52x52大小feature map上的{(10× 13); (16× 30); (33× 23);}, 26x26上的 {(30× 61); (62× 45); (59×119);} 与13x13上的{(116 × 90); (156 × 198); (373 × 326)}.

以上网络结构与anchor与源码对应:

  • 在cfg的yolo层参数:
    • anchor: 列出所有会用到的anchor的w,h
    • mask: 决定用哪些anchor
    • num: 所有anchor的数量
  • 代码实现:
    • 相关函数见 src/yolo.c代码:初始化网络与网络fp bp的代码
    • src/parser.c的parse_yolo函数:解码cfg
    • parse_yolo_mask函数:读取mask并根据mask数量更新l.n而不是之前的detection层中的l.n = cfg的num,而是l.total=cfg的num读入所有尺寸anchor其总数目l.total = cfg中的num。所有anchor的数据存在l.biases中而网络的l.n参数(具体有几个anchor)用mask的数量来重新更新。在计算box时用mask获取biases的偏移量来找到对应的anchor的值

实验细节与结果分析:

data augmentation

与v2一致. 无旋转,saturation=1.5 exposure = 1.5 hue = 0.1

训练策略:

COCO见yolov3.cfg. 为 batch=64 momentum=0.9 decay=0.0005 learning_rate=0.001 训练前1000使用burn_in. 共训练500200个batch. 前400000为 103 10 − 3 ,400000-450000为 104 10 − 4 ,之后为 105 10 − 5 .

对burn_in而言,实际learning_rate = lr*(batch/burn_in)^2$, lr为预设的0.001,burn_in就是1000,batch就是当前的batch数. 这1000主要为了稳定网络.

最终结果与分析思考

  1. 较之v2在小目标检测的性能上有了很大的提升 APS A P S 从5提升到18.3. 很大程度上应该是多阶段检测的优势,因为同时期SSD513为10. [!]
    1. 多阶段检测一种理解就是给小目标被分配更精准的anchor,提供更好的先验.这意味着大尺度feature map用于检测小目标,小尺度feature map检测大目标. 实际情况是否如此?–>查看anchor分类时的分布
    2. 而另一种也可以说是在高层的feature map上由于空间位置不敏感且小目标信息丢失,或者为了得到浅层精细的纹理等低级语义特性,相对于思考1的理解,当利用了resnet等模型后这种问题还会很明显吗?–>将最后13x13 上采样到52x52来检测. 或者说,高层语义与低层语义的区别在resnet上与vgg16上有什么不同的表现?
    3. –>在最后一层融合三个检测层特征并利用所有anchor,即52x52的9个anchor,效果会更好只是速度更慢吗?因为若在同一层检测时是否融合底层语义信息,从卷积上来说是等价的(不融合等于融合的置为0)
  2. 在AP与 AP75 A P 75 性能较之 AP50 A P 50 急剧下降,57.9下降到34.4/33.0. (其它方法一般下降40%,而v3下降45%,v2下降55%),.[?]
  3. 尝试了Faster R-CNN 的坐标回归方法与直接线性预测中心坐标而不是逻辑回归,均效果不好.原因不清楚.同时参见思考3.[!]
    1. 以1为基础,在之前讨论anchor的作用的时候可以说是让网络输出值对各种目标都较为接近.或者说让训练更加容易.在v3中尝试了faster-rcnn 和线性回归x,y的方法,但是效果都不好,这不是其让网络输出值不够稳定导致? –>查看anchor分配后的相对gt需要的预测值的分布
  4. Focal loss效果不好.[?] 等待focal loss阅读完成 感觉这与5也相关
  5. 尝试Faster R-CNN中的IOU阈值选取. >0.7为正样本,0.3-0.7忽视,<0.3为负样本. 而v3为每个gt对应iou最大的anchor为正样本,<0.7为负样本,其它的忽略.这可能和loss函数相关.[?]
  6. 作者对于mAP与coco 新的m mAP的思考. 这一部分参见论文的Rebuttal部分.那张图确实很说明问题的. 我看来mAP至少意味着每个类之间的置信度都是没有可比性的.为什么不考虑加入阈值后将pre,rec,thresh作多条三维空间中的曲线了做一些计算衡量呢? 或者像他说的What about getting rid of the per-class AP and just doing a global average precision? Or doing an AP calculation per-image and averaging over that? 恩,大致就是评价标准得更加与人的识别相贴切. 由评价指标performance+gt生成标注然后让人评价该标注性能从而衡量该评价指标的性能之类的. 有没有相关的关于如何选取合适的评价指标的研究? [?][!]

代码细节:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值