单阶多层检测器SSD(Single Shot MultiBox Detector)的Pytorch实现

SSD(Single Shot MultiBox Detector) 算法借鉴了Faster RCNN与YOLO的思想,在一阶段网络的基础上使用了固定框进行区域生成,并利用了多层的特征信息,在速度与检测精度上都有了一定的提升。

1. SSD算法流程

单阶多层检测器SSD(Single Shot MultiBox Detector)的Pytorch实现_第1张图片

 SSD算法流程如上图,输入图像首先经过VGG的基础网络,在此之上又增加了几个卷积层,然后利用3×3的卷积核在6个大小与深浅不同的特征层上进行预测,得到候选框的分类与回归预测值,最后直接预测出结果,或者求得网络的损失。

SSD的算法思想,主要可以分为4个方面:

  1. 数据增强:SSD在数据部分做了充分的数据增强工作,包括光学变换与几何变换等,极大限度地扩充了数据集的丰富性,从而有效提升了模型的检测精度。
  2. 网络骨架:SSD在原始VGGNet的基础上,进一步延伸了4个卷积模块,最深处的特征图大小为1×1,这些特征图具有不同的尺度和感受野,可以负责检测不同尺度的物体。
  3. Default Box与多层特征图:与Faster RCNN类似,SSD利用了固定大小与宽高的Default Box作为区域生成,但与Faster RCNN不同的是,SSD不是只在一个特征图上设立较小的Default Box来检测小物体,在深度特征图上设立较大的Default Box来负责检测大物体。
  4. 正、负样本的选取与损失计算:利用3×3的卷积在6个特征图上进行特征的提取,并分为分类和回归两个分支,代表所有预测框的预测值,随后进行预测框与真实框的匹配,利用IoU筛选出正样本与负样本,最终计算出分类损失与回归损失。

由整个过程可以看出 ,SSD只进行了一次框的预测和损失计算,属于一届网络。由于利用了多个特征图,SSD实现了较好的检测精度。

2.数据预处理

Pytorch对于数据的加载和处理提供了一些标准类,可以很灵活地实现各种功能。SSD对于数据的预处理,尤其是数据增强做了很丰富的处理,也实现了非常优越的性能,因此将这部分单独拿出来细讲。

2.1 加载Pascal VOC 2011数据集

PyTorch家在数据集主要有3步:

  1. 继承Dataset类,重写__len__( )和__getitem__( )函数并实例化,这样就可以方便地进行数据集的迭代;
  2. 为了满足实际训练要求、增强数据的丰富性,还要选择合适的数据增强方法,这部分内容将在后面细说;
  3. 继承DataLoader类,添加batch和多线程等功能。

在训练脚本中,加载数据集的代码如下:

# 利用VOCDetection重写了Dataset类,并传入了所需的数据变换transform
dataset = VOCDetection(root=args.dataset_root,
                           transform=SSDAugmentation(cfg['min_dim'],
                                                     MEANS))

# 利用DataLoader实现了批量处理、打乱、多线程加载等功能
data_loader = data.DataLoader(dataset, args.batch_size,
                              num_workers=args.num_workers,
                              shuffle=True, collate_fn=detection_collate,
                              pin_memory=True)

 

你可能感兴趣的:(深度学习,Pytorch,实践,Python编程,深度学习,ssd)