SSD
2018-11-22 本文已影响0人
小松qxs
titile | SSD: Single Shot MultiBox Detector |
---|---|
url | https://arxiv.org/pdf/1512.02325.pdf |
动机 | 当前目标检测流程:假设bounding boxes->重采样框像素或特征->分类器。如Faster R-CNN 准确度高但计算量大,实时难,每帧秒级实现,Faster R-CNN->7fps 当前加速的检测算法都牺牲精度 |
内容 | SSD,一种针对多个类别的single-shot detector,比previous single shot detectors(YOLO)更快,更准确;与region proposals and pooling方法精度相似(Faster R-CNN)(59 FPS with mAP 74.3% on VOC2007 test, vs. Faster R-CNN 7 FPS with mAP 73.2% or YOLO 45 FPS with mAP 63.4%) 核心:小的convolutional filters,预测固定bounding boxes的category scores and box offsets。 为实现高精度,根据不同尺度的feature maps得到不同尺度的predictions,根据不同aspect ratio得到不同长宽比predictions。 基于以上方法,低分辨率输入图像上也能实现端到端训练和高精度,提高速度与精度的权衡。 模型结构: Multi-scale feature maps:不同卷积层共同连接到主网络末端,卷积层尺度逐渐减小,感受野增大(多尺度),每一层用于预测detections的convolutional model不同。 Convolutional predictors:使用convolutional filters得到一组固定的detection predictions。形状为m*n*p的特征图,采用3*3*p的小卷积核得到检测值。 Default boxes and aspect ratios:一个m*n的feature map,每个cell有k个先验框,则(c+4)kmn个预测值(m*n*((c+4)k))。 训练: Matching strategy:(1)ground truth box匹配jaccard overlap最高的default box(同MultiBox),保证每个ground truth box有一个对应的default box; (2)避免负样本过多,未匹配default boxes与某一个jaccard overlap>0.5的ground truth box匹配(选IoU最大的),简化学习过程,某个ground truth可能与多个先验框匹配,一个先验框只能匹配一个ground truth。 (1)优先级大于(2) Training objective: 每个输出的feature map经过两个并列的3*3卷积核卷积,一个定位,一个分类。 不是一个预测feature map单独计算一次softmax socre+box regression(ground truth匹配存在问题)。而是通过Permute(交换caffe blob中数据维度bottom blob = [batch_num, channel, height, width] ==> top blob = [batch_num, height, width, channel],每C个数据表示在当前feature map上一个点的信息,It is to make it easier to combine predictions from multiple layers),Flatten(n*(h*w*c))和Concat这3种层将所有的预测结果连接到一起。 num_classes包括背景,share_location = True即坐标归不区分类别,4 × anchor,不乘num_classes,无confidence。 最后预测时分别得到loc_layers、conf_layers、priorbox_layers层。 priorbox_layers层variance参数作用,prior_variance = [0.1, 0.1, 0.2, 0.2],作者回答如下: 除以variance是对预测box和真实box的误差进行放大,从而增加loss,增大梯度,加快收敛。 本文采用中心坐标加上长宽,计算loss时可能需要对中心坐标loss和长宽loss做权衡,prior_variance = [0.1, 0.1, 0.2, 0.2]。如果采用box四大顶点坐标方式,variance都是0.1,相互之间没有权重差异。 Choosing scales and aspect ratios for default boxes: (Conv4_3层靠前,norm较大,在其后面增加了一个L2 Normalization层,以保证和后面的层差异不大,增加鲁棒性,训练稳定,feature的模长放缩到刚好等于1的长度,会让学到的feature变得很小,网络难以训练。所以将feature的值放大一定倍数,程序取20倍(scale_filler)。 accross_spatial(程序取false):normalization范围。true(默认:对每个num(channel*height*width)整体进行normalization,平方加和的个数是channel*height*width;false:normalization不是accross_spatial,加和个数是channel,每个像素点(height*width个数)分别进行normalization,减小了normalization的范围。 channel_shared(程序取false):归一化后,将top_data乘以一个scale(这个scale是normalization_layer的唯一参数),true(默认):top_data的所有channel乘以同一个数,false:top_data的channel乘的数不一样。 和Batch Normalization层不太相同,其仅对每个像素点在channle维度做归一化,而Batch Normalization层是在[batch_size, width, height]三个维度上做归一化) 不同尺度对象通过不同feature map(共享参数),不需要变换输入图大小。 Hard negative mining:macthing之后,负样本较多(特别是default boxes很大),对负样本default box按confidence loss高到低排序,选高的,保证正负比1:3。 Data augmentation:(1)原始图像,(2)采样一块,与目标最小jaccard overlap是0.1, 0.3,0.5, 0.7, or 0.9,(3)随机采样一块。(1)(2)(3)随机选一个。每个patch大小是原始尺寸的[0.1, 1],aspect ratio在0.5到2之间,ground truth box中心在patch中保留。patch最后会resize到固定大小,0.5概率翻转。 测试:每个预测框,首先根据类别置信度确定其类别(置信度最大者)与置信度值,并过滤背景预测框。 然后根据置信度阈值(如0.5,论文0.01)过滤阈值较低预测框。 留下的预测框解码,根据先验框得到其真实的位置参数(解码后一般还需要做clip,防止预测框位置超出图片)。 解码后,根据置信度进行降序排列,NMS(论文0.45)算法,过滤重叠较大的预测框。保留top-k(如400,论文200)个预测框。 剩余的预测框就是检测结果。 |
实验 |
Base network:VGG16,fc6、fc7改为卷积层,change pool5 from 2 × 2 − stride2 to 3 × 3 − stride1, and use the à trous algorithm to fill the "holes"。删除dropout和fc8,初始学习率0.001,0.9 momentum,0.0005 weight decay, batch大小32,衰减策略不同数据集不同。 PASCAL VOC2007:(小目标不好Figure4) Model analysis: Data augmentation is crucial More default box shapes is better Atrous is faster Multiple output layers at different resolutions is better: PASCAL VOC2012: COCO: Data Augmentation for Small Object Accuracy: Inference time: |
思考 | 同时借鉴Yolo和Faster R-CNN,多尺度feature map和不同尺度大小先验框解决Yolo难以检测小目标,而且定位不准问题。 但是小物体效果仍不好 |
参考 | https://zhuanlan.zhihu.com/p/33544892 |
补充 | atrous algorithm: 不增加参数与模型复杂度的条件下指数级扩大卷积的视野 pool5将2x2-s2变成3x3-s1,pool5后feature map保持较大尺度,但之后感受野改变(变小),atrous algorithm可以增大感受野。 feature map变大不能用原网络参数fintune的情况,也可采用atrous algorithm(带洞的卷积核)。 程序中pool5->fc6的卷积kernel是3,pad是6,dilation是6。膨胀的卷积核尺寸 = 膨胀系数 * (原始卷积核尺寸 - 1) + 1,所以真实的卷积核大小是13。pad=6保证输出featuremap尺度不变,仍为19×19。 为什么dilation是6,保证与原来fc6的感受野相同,作者回答如下: The original kernel size of (convolutional) fc6 is 7 x 7. Since I subsample and reduce it to 3 x 3, dilation should be 3. Besides, I also changed pool5 from stride of 2 to stride of 1, that is how it get to 6. (The default dilation is 1, not 0) 假设pool5输入是14×14,经过pool5为7×7,再经过7 x 7卷积核得到1 x 1,这个1 x 1的feature map对应conv5 14×14。 将pool5 stride=1,则pool5输出为13 × 13,13 × 13的卷积核(dilation=6,kernel=3),仍得到1 x 1的feature map对应conv5 14×14。感受野相同。 |