【计算机视觉CV | 笔记】one-stage目标检测总结
【计算机视觉CV | 笔记】one-stage目标检测总结
前言
笔者只是一名学生,初入CV领域,写这篇的目的是帮助自己梳理学习过的内容,且为大家学习提供或许有用的学习材料。文末附手写笔记。
目录
YOLOv1、YOLOv2、YOLOv3、其他方法(RetinaNet、SSD、anchor free)、mAP
一、YOLOv1【2015】
1、主要思想
将图片分成S×S的小格子,某个物体的中心落在某个小格子上,该cell将负责预测这个物体。
每个cell对应B个bbox(bbox是网络生成的,不像人为指定的anchor),每个bbox对应5个值,分别为x,y,h,w,confidence,分别代表bbox的位置长宽和该cell是目标的置信度。
最终输出即为 S×S×(B×2+10),文章中S=7,B=2。
2、Loss Function
注意:网络输出为S×S×(B×2+10),label需要转换为对应格式才能计算loss
2.1 Loss、框的回归损失
2.2 loss、置信度损失(是否有物体)
2.3 loss、分类损失
一些问题
a、为什么w和h需要开根号?抑制大框的影响
b、2.2loss中为什么还需要考虑noobj的?为了考虑到负样本,否则全预测为背景loss就很小了,因为有目标的cell占比很少只有3个cell共有49个
c、每个cell对应两个bbox,用哪个bbox的坐标来回归?confidence较大的bbox
3、优缺点总结
pros:速度快,可达45fps,当时较快的faster rcnn也只有18fps
cons:
a、一个cell只负责预测一个物体,但如果2个物体都落在这个cell内呢?即不适合与密集目标
b、S=7,格子较大。不适合于小物体
c、bbox的width-height ratio是由train得到的,测试时若有新的w/h则不适应
d、没有BN,训练较慢
二、YOLOv2【2016】
1、改进点
a、add BN
b、High Resolution Classifier(focusing on backbone)
原本的bcakbone是在ImageNet上训练的,大大部分都是224×224,测试时会出现448×448,不是很匹配,那应该如何使得较高分辨率的图可以用呢?
先在448×448的图片上做finetune,448×448的图片最好是现成的,也可做upsampleing和resize
在检测数据上做finetune
将7*7的格子改为13×13
c、加入了anchor的概念(详见第2部分)
d、Fine-Grained Features 细粒度特征(即使得特征更加丰富,不是从同一卷积后得到的,多层卷积后的特征图concact)
尺度不同如何concat?(即多尺度融合)
这里采用了reorg,即拆分后concact
e、多尺度size做训练
使用FCN代替FC,FCN的输入较为灵活。用16个size训练前160个epochs,每个size对应10次(warm),这样就可以达到多个尺度的效果
2、Anchor in YOLOv2
a、anchor的size和number
faster rcnn:9 by hands,比例为 1:2,1:1,2:1
YOLO:5 by K-Means。将训练集的所有框进行聚类,聚成5大类,为什么是5呢?经实验发现,5哪个点是梯度变慢的转折点。
b、Anchors
论文中K-Means得到的anchors尺寸分别为
是通过如下方式转换到0~13之间的,因为S=13,需要把anchor处理到跟特征图匹配的维度。
c、Truth Bbox
如何归一化?
原始的bbox:【x0,y0,w0,h0】,是在(0,w)和(0,h)之间的。
将其除以最大值归一到(0,1)之间
将其乘S=13转换到跟anchors和特征图匹配的维度
确定好在某个格子后再转换到(0,1)之间。
例如x=6.5,即在第七个格子的6.5-6=0.5的位置,w和h仍然需要加log抑制值过大的影响
d、一个问题:为什么x和y需要加sigmoid函数?
从faster rcnn开始就存在刚开始时训练慢的问题,这是因为刚开始tx和ty偏移真实值较大,一开始收敛较慢,通过sigmoid函数将其控制在(0,1)之间,可加快训练速度。
3、评价
对小物体和密集物体更加友好,性能和速度都更好了
4、YOLO 9000
狗有下属分类哈士奇等,树叶有下属分类枫叶等,狗和枫叶就不可以直接计算,不可再直接用softmax,是将其概率相乘如:树叶的概率*是树叶时是枫叶的概率。
三、YOLOv3【2018】
1、改进
a、引入了ResNet的想法,改变了backbone,采用了跳阶结构
b、使用了多尺度的结构:v1的7*7到v2的13×13到v3的 13×13和26×26和52×52共存,对应三个scale的anchor,每个scale对应3个anchor。
c、80个类别(包含子类,类似于树叶和枫叶)将softmax改为logistic,转换成多标签问题
2、summary
a、输出:
(13×13×3+26×26×3+52×52×3)×(4+1+80)
b、COCO数据集比较难,YOLOv3的速度很快,不过精度属于中上不是最高的
3、FPN Net
FP Feature Pyramid
a、各种金字塔结构
对图片进行resize,再分别predict
输入一张图片,对特征图进行操作。常见的各种backbone的结构
对不同尺寸的特征图进行predict
FPN:对不同尺寸的特征图进行concat
b、优点
特征更加丰富,即底层具有更丰富的位置,纹理信息,高层具有更丰富的语义信息
c、一些细节
FPN used as RPN时3×3卷积的目的?直接从w×h up 到2w×2h是,可能会存在一些问题(明暗等),加个3×3卷积可以较好的缓解此问题
将FPNused in faster rcnn时
大的特征图需匹配小框,公式为
即wh越大,k越小,k表示特征图的顺序,k越小,特征图尺寸越小
四、其他方法
1、RetinaNet【2018】
a、结构:ResNet+FPN+FCN
b、贡献:Focal Loss(对难以样本权重进行调节)
问:为什么one-stage的表现会比two-stage差?
答:不是因为stage数目少,而是因为one-stage的负样本与正阳比比例过大。two-stage为3:1,one-stage为几十或几百:1,样本过于不均衡,梯度被负样本(easy sample)主导。
应该如何解决?Focal loss,调整正负样本的权值
加权交叉熵损失就已经给其加了相应权重,不过该权重是认为固定的。focal loss认为这个权重不应该人为固定,而是跟概率有关,概率越小,越困难,其权重应该越大。
2、SSD【2015】
sigle shot detection,也是采用了多尺度,FPN的想法
3、Anchor free net【2018-2019】
用cornet、ceteNet代替anchor
五、mAP
mean average precision
1、混淆矩阵
FP:误检,框错了
TP:框对了(Iou大于一个阈值,例如0.5)
FN:漏检,有目标没框出来
TN:太多了,这里不关注
2、PR曲线
准确率P等于TP/(TP+FP),认为是正样本里面真正是正样本的比例
召回率R等于TP/(TP+FN),实际正样本里面有多少被检测出来了
横坐标是R纵坐标是P
3、AP和mAP
AP(AUC):PR曲线下的面积
mAP:AP是针对每一类的,给个类求平均值就是mAP
【附加纸质版笔记】
*仅为笔者学习是用,或许会有错误请见谅
1、v1
找不到了…
2、v2
3、v3
4、其他
5、mAP