本文为YOLOv3算法笔记,部分内容可能与SSD算法进行对比,如有错误或表达不当之处,欢迎指正。
1. YOLOv3的关键改进
-
新的网络结构:
yolo3采用Darknet53作为检测的backbone,最关键的是引入了ResNet的残差块结构,有53层卷积的DarkNet因为identity避免梯度消失现象。
关于网络结构可以参考博文。 -
多尺度特征检测
不同于v2版本的passthrough层来检测不同大小的目标,v3更进一步的结合FPN的思想实现检测不同大小的目标。我们知道在浅层网络容易获得目标的局部特征(如:边缘、棱角),深层网络容易获得目标的语义特征(如:car or cat)。yolo3在卷积层的第26、43和59层分别进行采样获取特征,在第59层直接卷积得到13x13x256的输出结果,而在第26层是通过与第52层特征图upsampling得到的特征图进行concat再卷积得到结果,第43层思想类似;
有人讲这里的思想与SSD差不多,SSD分别在六个不同的特征层卷积得到结果;个人认为小改进有大学问,在浅层网络26与后面深层网络的上采样concat,这样一个简单的concat,却能让具有较多局部特征的浅层网络同时获得“未来”层的语义信息,对于分类将更加准确。
-
prior box
与v2类似,v3依然先用维度聚类获取最适用的prior box大小,作者在coco数据集上的结果是anchor=9,但是不同于SSD在所有层的每个grid cell都同时应用所有带下的anchor,v3对于9个不同大小的prior box,将他们分别应用在三个输出的特征层上,总体思想是,浅层特征图应用小的box,目的检测小目标,深层特征层应用大的box用来检测大目标。 -
目标对象分类由softmax改为logistics
假设将特征图划分为SxS大小的格子(grid cell),则每个prior box输出 SxSx3(4+1+classes),其中:3:每个grid cell预测三个不同大小的prior box; 4:预测的box的位置参数x, y, w, h; 1:置信度参数 classes:类别数
其中需要强调一下
位置参数x, y, w, h中,xy表示对坐标左上角的偏移,不同于SSD中是对cell中心的偏移,这里作者认为更可控,SSD中会出现偏移超过图片大小的情况;
置信度参数是经过逻辑回归得到的,范围在0-1,有两层含义:对该box包含有目标的自信度和该目标是某一个类别的自信度(这个概率值可以理解为:网络认为预测出来的box大小与真实box大小的IOU值,但真实框在测试时是不存在的,所以称之为网络判定为某一个类别的自信度),也正是这个原因,classes就等于类别数,SSD中为类别数+1(+背景类)
此外,在对classes进行分类的时候将softmax改为logistics可以满足目标的多层定义,比如可以区分(women 和 person)
2. 思考
- 关于训练多少个prior box
在SSD中通过两个原则选取与ground truth IOU值大的prior box,训练这些选择后的box进行回归与分类,而yolov3不一样:
计算cell中不同尺度的box与gt的IOU,选择IOU值最大的那一个,当然IOU值有个阈值(表示最少要有多少重合,default = 0.5),如果有prior box的iou大于这个阈值但是不是iou值最大的那个box,那这个box将不会进行预测;如果一个prior box没有被分配有gt(iou值小于阈值),这个box也不会预测,同样只有objectness即置信度有值。
our system only assigns one bounding box prior for each ground truth object.
上面这句是原文的内容,即对于每一个gt,有且仅有一个prior box去预测它。
- 关于yolov3正负样本
在RCNN系列中,特别是从fast RCNN开始有ROI Pooling,通过ROI pooling选择正负样本,而在SSD算法中,将所有大于iou阈值的视为正样本,并且为了保证正负样本均衡,涉及了一个小ticks,进行hard negative mining,那在yoloV3中呢?
理论上是这么做的:
正样本:
所有的prior box中与每一个gt计算IOU,对应值最大的那个就是正样本;
负样本:
所有的prior box中与每一个gt计算iou,对应值小于阈值(0.5)的全部当做负样本。
还有一部分既不是正样本也不是负样本:iou值大于阈值0.5但又不是最大的那个,这部分不能简单的当做负样本,因此将他们丢弃,不参与计算。
然后只是理论上,实际操作中:
貌似根本没有设置负样本,看有些代码将除开正样本的全部当做负样本
此处不太理解,如果这么做,会出现比SSD更严重的正负样本不均衡问题,因为yolo3的正样本更少