目标检测算法,按算法结构可以分为one-stage和two-stage两类。two-stage经典算法主要是R-CNN族,以准确度见长,速度稍慢,一般不如one-stage。one-stage算法主要包括YOLO、SSD、CornerNet等,以速度快见长,准确度一般不如two-stage。按照是否使用anchor,可分为anchor-based、anchor-free、两者融合类。anchor-based类算法代表是fasterRCNN、SSD、YoloV2/V3等。anchor-free类算法代表是CornerNet、ExtremeNet、CenterNet、FCOS等。融合anchor-based和anchor-free分支的方法:FSAF、SFace、GA-RPN等。
整个网络由三大部分组成:VGG Backbone、Extra Layers、Multi-box Layers
Backbone网络可以使用VGG、ResNet50、mobilenet等。SSD的核心思想是使用多个特征图进行目标位置的回归和类别的分类。Extra layer负责提取6个尺寸和深度的特征图,大小分别为 (38,38),(19,19),(10,10),(5,5),(3,3),(1,1),每个特征图上设置的先验框数量不同,prior_box_num = [4,6,6,6,4,4],共8732个anchor。
先验框的设置,包括尺度(或者说大小)和长宽比两个方面。对于先验框的尺度,其遵守一个线性递增规则:随着特征图大小降低,先验框尺度线性增加:
编码过程,使用gt_box和bounding_box的归一化后的中心点表示的offset作为基准,与模型的输出做loss。
解码过程:模型的输出为bounding_box与真实值的offset。推理阶段,用offset与bounding_box,即可得到最终目标框
绿框为真实框:gt_box;蓝框为与gt_box匹配的先验框prior_box,称为bounding_box,它是整个回归过程的核心;红框为预测框,pred_box;在训练过程中,首先需要确定训练图片中的 gt_box与哪一个prior_box来进行匹配,匹配原则: 1、对于图片中的每个gt_box,找到与其IOU最大的prior_box,该先验框与其匹配,这样可以保证每个gt_box一定与某个prior_box匹配。 2、 对于剩余未匹配的prior_box,若与某个gt_box的IOU大于某个阈值(一般0.5),那么该prior_box与这个gt_box匹配。 3、难例挖掘(Hard negative mining,选取负样本):选取完正样本后,实际上剩下来的都是负样本,但由于负样本数目过多,因此需要挑选出Confidence_Loss排在前面的一批负样本,以保证负/正样本数为3:1
SSD的损失函数包括两部分的加权:位置损失函数和置信度损失函数 整个损失函数为: N 是先验框的正样本数量;c 为类别置信度预测值; l 为先验框的所对应bounding box的位置预测值; g 为ground truth的位置参数;
位置损失函数如下:
置信度损失函数:
测试阶段,NMS应该在解码之后
镜像
随机裁剪
色彩转换
模型特点:
SSD提取了不同尺度的特征图来做检测,大尺度特征图可以用来检测小物体,而小特征图用来检测大物体; SSD采用了不同尺度和长宽比的先验框 SSD每一张训练图片由如下方法随机产生:原图片;截取一部分图片,保证截取框与物体框的最小IoU是0.1,03,0.5,0.7,或者0.9;随机截取一部分图片;随机截取图片的大小是[0.1,1]原图片大小,aspect ratio是0.5~2
2. 优点: 运行速度可以和YOLO媲美,检测精度可以和Faster RCNN媲美
3. 缺点: 需要人工设置prior box的min_size,max_size和aspect_ratio值。 网络中prior box的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层feature使用的prior box大小和形状恰好都不一样,导致调试过程非常依赖经验; 虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,并没有达到碾压Faster RCNN的级别