6.2.2 设置先验框
在yolo中,每个单元预测多个边界框,但是其都是相对这个单元本身(正方块),但是真实目标的形状是多变的,yolo需要在训练过程中自适应目标的形状。而ssd和faster r-cnn相似,也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点。以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(ssd中称为default box)。每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。
ssd的检测值也与yolo不太一样。对于每个单元的每个先验框,其都输出一套独立的检测值,对应一个边界框,主要分为两个部分。第一部分是各个类别的置信度或者评分,值得注意的是ssd将背景也当做了一个特殊的类别,如果检测目标共有 个类别,ssd其实需要预测 个置信度值,其中第一个置信度指的是不含目标或者属于背景的评分。后面当我们说 个类别置信度时,请记住里面包含背景那个特殊的类别,即真实的检测类别只有 个。在预测过程中,置信度最高的那个类别就是边界框所属的类别,特别地,当第一个置信度值最高时,表示边界框中并不包含目标。第二部分就是边界框的location,包含4个值 ,分别表示边界框的中心坐标以及宽高。但是真实预测值其实只是边界框相对于先验框的转换值(paper里面说是offset,但是觉得transformation更合适,参见r-cnn(https://arxiv.org/abs/1311.2524) 另外,ssd采用了数据增强。生成与目标物体真实box间iou为0.1 0.3 0.5 0.7 0.9的patch,随机选取这些patch参与训练,并对他们进行随机水平翻转等操作。ssd认为这个策略提高了8.8%的准确率。
6.3 筛选层
和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用nms非极大值抑制,筛掉重叠度较高的。只不过ssd综合了各个不同feature map上的目标检测输出的default box。
7 其他模型
针对yolo准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合ssd的特点,提出了yolov2。它主要还是采用了yolo的网络结构,在其基础上做了一些优化和改进,如下:
网络采用darknet-19:19层,里面包含了大量3x3卷积,同时借鉴inceptionv1,加入1x1卷积核全局平均池化层。结构如下
去掉全连接层:和ssd一样,模型中只包含卷积和平均池化层(平均池化是为了变为一维向量,做softmax分类)。这样做一方面是由于物体检测中的目标,只是图片中的一个区块,它是局部感受野,没必要做全连接。而是为了输入不同尺寸的图片,如果采用全连接,则只能输入固定大小图片了。
batch normalization:卷积层后加入bn,对下一次卷积输入的数据做归一化。可以在增大学习率的前提下,同样可以稳定落入局部最优解。从而加速训练收敛,在相同耗时下,增大了有效迭代次数。
使用anchors:借鉴faster r-cnn和ssd,对于一个中心点,使用多个anchor,得到多个bounding box,每个bounding box包含4个位置坐标参数(x y w h)和21个类别概率信息。而在yolo中,每个grid(对应anchor),仅预测一次类别,而且只有两个bounding box来进行坐标预测。
pass through layer:yolo原本最终特征图为13x13x256。yolov2还利用了之前的26x26的特征图进行目标检测。26x26x256的feature map分别按行和列隔点采样,得到4幅13x13x256的feature map,将他们组织成一幅13x13x2048的feature map。这样做的目的是提高小物体的识别率。因为越靠前的卷积,其感受野越小,越有利于小物体的识别。
高分辨率输入training:yolo采用224x224图片进行预训练,而yolov2则采用448x448
multi-scale training:输入不同尺寸的图片,迭代10次,就改变输入图片尺寸。由于模型中去掉了全连接层,故可以输入不同尺寸的图片了。从320x320,到608x608 yolo和yolov2只能识别20类物体,为了优化这个问题,提出了yolo9000,可以识别9000类物体。它在yolov2基础上,进行了imagenet和coco的联合训练。这种方式充分利用imagenet可以识别1000类物体和coco可以进行目标位置检测的优点。当使用imagenet训练时,只更新物体分类相关的参数。而使用coco时,则更新全部所有参数。
下一篇:父母“婴语”好 孩子更健谈