YOLO的意思的You Only Look Once。本文包括对YOLO,YOLOv2/YOLO9000的论文理解。
YOLOv1: You only look once unified real-time object detection
对象识别和定位,可以看成两个任务:
- 找到图片中某个存在对象的区域;
- 识别出该区域中具体是哪个对象。
目前的解决方法:
- 最简单的方法:遍历图片,不同大小,不同位置的每个区域,选择最大概率的结果作为输出。
- RCNN:候选区(Region Proposals)方法。先找到可能存在对象的候选区(Selective Search),然后对每个候选区进行对象识别。候选区域生成 --> 特征提取 --> 类别判断 --> 位置微调
- YOLO:将两个任务合并,使用预定义的预测区(类似于RCNN的候选区),后使用边框回归,对边框进行微调。
YOLO
YOLOv1的核心思想是将目标检测作为回归问题进行解决。
步骤:
- 将原始图片尺寸为448*448;
- 将图片划分为s*s个网格,每个网格预测2个bouding box(每个box包含5个预测量)以及20个类别概率,总共输出7×7×(2*5+20)=1470个tensor;
- 每个网格预测C个条件类别概率,根据上一步可以预测出7 * 7 * 2 = 98个目标窗口,然后根据阈值去除可能性比较低的目标窗口,再由NMS去除冗余窗口即可。
其中,B是boundingbox的个数,设置为7;C是预测的类别个数,设置为20。
本文中,S=7,B=2,C=20(因为PASCAL VOC有20个类别),所以有7*7*30个张量。详见下图。
Bounding box
每个边界框(bounding box)包括(confidence, x, y, w, h)。x和y是位置,边界框宽度w和高度h标准化为图像宽度和高度,因此,(x, y, w, h)的值都在0和1之间。
YOLO的单对象预测规则限制了物体的接近程度,假设为7*7的网格,则,一张图片最多预测49个对象。
输入和输出
输入
YOLO的输入就是原始图像,唯一的要求就是缩放到448*448的大小。因为YOLO的网络中,卷积层最后接了两个全连接,全连接是要求固定大小的向量作为输入,所以倒推回去也就要求原始图像有固定的尺寸。YOLO设计的尺寸就是448*448.
输出
输出是一个7*7*30的张量(tensor)。将输入图像划分为7*7的网格,每一个网格对应于一个30维的向量。30维向量的意义见下图。
置信度
网络结构
相较于其他网络,YOLO去掉候选区步骤之后,结构非常简单,就是单纯的卷积、池化,加上最后两层全连接。单看网络结构的话,和普通的CNN对象分类网络几乎没有本质区别.最大的差异是最后输出层用线性函数作为激活函数(其他的层都使用leaky rectified线性激活函数),因为需要预测边界框的位置(数值型),而不仅仅是对象的概率。所以粗略来说,YOLO的整个结构就是输入图片经过神经网络的变换得到一个输出的张量。
YOLO有24个卷积层,后面是2个全连接层(FC)。部分卷积层交替使用1*1缩减层以减少特征图的深度。对于最后一个卷积层,它输出一个形状为(7, 7, 1024)的张量。张量然后变平,使用2个全连接层作为线性回归的形式,输出7*7*30个参数,然后重新变换为(7, 7, 30),即每个位置2个边界框的预测。
损失
最大化抑制
YOLO的好处
YOLOv2
YOLOv1对于bounding box的定位不是很好,在精度上比同类网络还有一定的差距,所以YOLOv2对于速度和精度做了很大的优化,并且吸收了同类网络的优点。
YOLOv2受到fast rcnn的启发,引入了anchor。同时使用了K-Means方法,对anchor数量进行了讨论,在精度和速度之间做出了这种。并且修改了网络结构,去掉了全连接层,改成了全卷积结构。在训练时引入了世界树(WorldTree)结构,将检测和分类问题做成了一个统一的框架,并且提出了一种层次新联合训练方法,将ImageNet分类数据集和COCO检测数据集同时对模型训练。
YOLOv3
改进:
- 多标签预测(类FPN)
- 更好的基础分类网络(类ResNet)和分类器
多标签分类预测
大多数分类器假设输出标签是互斥的。YOLOv3应用softmax函数将分数转换为总和为1的概率,从而达到互斥标签的目的。如果输出是互斥的对象类,则结果的确如此。对于处理多标签分类问题,YOLOv3用独立的逻辑分类器替换softmax函数,以计算各个标签的可能性。例如,输出标签可以是“行人”和“儿童”,其输出的总和可以大于1。
同时,在计算分类损失时,YOLOv3不使用均方误差,而是对每个标签使用二元交叉熵损失。这也通过避免softmax功能而降低了计算复杂度。
多尺度预测
原来的YOLOv2层中包括passthrough layer。假设最后提取的feature map的size是13*13,那么这个层的作用就是将前面一层的26*26的feature map和本层的13*13的feature map进行连接,有点像ResNet。这样的操作也是为了加强YOLO算法对小目标检测的精确度。这个思想在YOLO v3中得到了进一步加强,在YOLO v3中采用类似FPN的上采样(upsample)和融合做法(最后融合了3个scale,其他两个scale的大小分别是26*26和52*52),在多个scale的feature map上做检测,对于小目标的检测效果提升还是比较明显的。
YOLOv3采用多个尺度融合的方式做预测。每种尺度预测3个box, anchor的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给3中尺度.
- 尺度1: 在基础网络之后添加一些卷积层再输出box信息.
- 尺度2: 从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个16x16大小的特征图相加,再次通过多个卷积后输出box信息.相比尺度1变大两倍.
- 尺度3: 与尺度2类似,使用了32x32大小的特征图.
网络结构
YOLOv3使用新的网络来实现特征提取。在Darknet-19中添加残差网络的混合方式,使用连续的3*3和1*1卷积层,但现在也有一些shortcut连接,YOLOv3将其扩充为53层并称为Darknet-53。
- 多级预测:终于为yolo增加了top down 的多级预测,解决了yolo颗粒度粗,对小目标无力的问题。v2只有一个detection,v3一下变成了3个,分别是一个下采样的,feature map为13*13,还有2个上采样的eltwise sum,feature map为26*26,52*52,也就是说v3的416版本已经用到了52的feature map,而v2把多尺度考虑到训练的data采样上,最后也只是用到了13的feature map,这应该是对小目标影响最大的地方。在论文中从单层预测五种boundingbox变成每层3种boundongbox;
- loss不同:作者v3替换了v2的softmax loss 变成logistic loss,由于每个点所对应的bounding box少并且差异大,每个bounding与ground truth的matching策略变成了1对1。当预测的目标类别很复杂的时候,采用logistic regression进行分类是更有效的,比如在Open Images Dataset数据集进行分类。在这个数据集中,会有很多重叠的标签,比如女人、人,如果使用softmax则意味着每个候选框只对应着一个类别,但是实际上并不总是这样。复合标签的方法能对数据进行更好的建模。
- 加深网络: 采用简化的residual block 取代了原来 1×1 和 3×3的block; (其实就是加了一个shortcut,也是网络加深必然所要采取的手段)。这和上一点是有关系的,v2的darknet-19变成了v3的darknet-53,为啥呢?就是需要上采样啊,卷积层的数量自然就多了,另外作者还是用了一连串的3*3、1*1卷积,3*3的卷积增加channel,而1*1的卷积在于压缩3*3卷积后的特征表示。
- router:由于top down 的多级预测,进而改变了router(或者说concatenate)时的方式,将原来诡异的reorg改成了upsample