YOLO V1 (45fps,fast version150fps)

1. idea

  • 此前的目标检测将问题看成是分类问题,而yolo看成是一个回归问题
  • yolo非常快,可以达到一秒45帧的速度
  • yolo在运行时将整张照片作为输入,可以得到更多的context。而不像R-CNN那样将Bounding Box作为输入
  • YOLO具有更强的泛化能力(得益于将图片整体作为输入?)
  • yolo的运行步骤为:1. resize图片;2. 输入网络;3. 极大值抑制

2. details

  • 将object detection的各个部分整合到一个单独的网络
  • 将整张图片划分为部署yolo到GPU yolo运行_ide个网格grid,每个网格预测出B个bounding box,每个box各预测出一个置信度confidence(用于描述这个box包含object的概率),confidence的定义为
    部署yolo到GPU yolo运行_ide_02
    假如没有object落在box中,则confidence为0
  • 每个box要预测五个值,其中一个便是confidence,另外四个是部署yolo到GPU yolo运行_权重_03部署yolo到GPU yolo运行_ide_04表示box的中心。部署yolo到GPU yolo运行_ide_04是box相对于grid的的相对位置,归一化到部署yolo到GPU yolo运行_部署yolo到GPU_06,而部署yolo到GPU yolo运行_ide_07是相对于input(整张图)的比例,一样部署yolo到GPU yolo运行_部署yolo到GPU_06
  • 每个grid还需要预测出C(C为类别的总数)个概率值部署yolo到GPU yolo运行_卷积_09
  • 在测试阶段,可以根据以下公式得到类别指定的置信度class-specific confidence
    部署yolo到GPU yolo运行_卷积_10
  • 因此,整个网络的输出是一个部署yolo到GPU yolo运行_权重_11的tensor

3. Experiment

  • CNN采用类似GoogleNet的结构

    没有采用inception模块,采用部署yolo到GPU yolo运行_权重_12的卷积层降维加上一个部署yolo到GPU yolo运行_权重_13的卷积层代替
  • 网络一共24层,fast yolo采用9层
  • 数据集采用Pascal VOC,S=7,B=2,C=20,因此输出为部署yolo到GPU yolo运行_权重_14的向量。
  • 在ImageNet上进行预训练卷积层(预训练时长1周),在预训练的卷积层(20层)后加入4层卷积层和2层全连接层。因为目标识别需要更多的信息,将输入大小从224*224增大到448*448。
  • loss采用sum-squared error。因为大部分的box都不包含object,不加权的情况下会使网络倾向于预测出confidence全0。同时,位置信息与分类错误权重一致的情况下实验不太理想。因此,增大位置信息(coordinate)的权重并增大那些包含object的box的权重,论文中加入两个参数部署yolo到GPU yolo运行_卷积_15。最终的loss function为
    其中
  1. C为box的confidence,
  2. 部署yolo到GPU yolo运行_卷积_16为第i个grid属于第c类的概率;
  3. 部署yolo到GPU yolo运行_权重_17代表object是否出现在第i个grid上(构建ground truth的时候每个object只在一个grid上有置信度,即object中心所在的grid才会使部署yolo到GPU yolo运行_权重_18
  4. 部署yolo到GPU yolo运行_ide_19代表第i个grid中的第j个box是否responsible(首先筛选grid,选出object中心所在的grid,对这些grid中两个box选择具有最大iou的box,最后产生的box才是responsible。思想与进化算法相似,每个grid产生两个个体(grid),选择适应值(IOU)最高的grid)
  5. 部署yolo到GPU yolo运行_部署yolo到GPU_20是除了4.中所指的其他所有的box
  6. 值得注意的是,对于分类error的惩罚只作用于出现object的grid上
  7. 对于宽和高h w的开根,是因为对于不同的大小box回归,预测偏差相等时对于小box的惩罚更大。如偏差同样为10,对于长为100的box的惩罚显然应该小于长为20的box
  8. 对于responsible的box的置信度error计算,target也就是ground truth需要在计算出预测值以后才能动态计算出相应的置信度,置信度为预测box与target box的IOU
  9. loss总结:对于responsible的box需要计算边框部署yolo到GPU yolo运行_权重_03的error以及置信度(目标置信度为与object的IOU)的error,对于其他box只需要计算置信度的error(目标置信度为0)。对于分类error,只需要计算object中心所在的grid。

YOLO v2 (67fps的情况下76.8mAP,40fps则78.6mAP)

  • 首先介绍YOLO v2相比v1作出了哪些改变
  1. 加入Batch Normalization,v1假如BN以后mAP提升了2%
  2. 高分辨率分类器的使用:此前v1是先使用224*224的图片进行预训练,然后再直接插值到448448再训练。而现在是直接采用448448的图片在ImageNet上再finetune10个epoch,使得图像更好的适应高分辨率
  3. 加入anchor,使用全卷积网络,干掉全连接层,使得box在空间上保持原有的关联。同时去掉了v1中最后一层的池化层以获取更高分辨率的特征图,同时v2采用416*416的图片作为输入(v1采用448*448),这样输出的最终的特征图为13*13(恰好是一个奇数)。通过这种操作,可以使网络更好地预测在图片中心的目标(这样子大目标(通常在中心)通常会落在最中心的grid上,而不是周围的四个grid,有点Attention的味道)
  4. 采用K-means对VOC和COCO的bounding box进行聚类,采用不同的k(聚类中心数目)进行聚类,最后发现k=5时tradeoff模型复杂度以及recall(v1相比其他region proposal的方法recall比较低)。
  5. 直接对定位进行预测:faster rcnn是对偏移量(中心坐标的偏移量,单位相对anchor box的长宽的比例,没有对移动距离进行约束,从而可以移动很远)进行预测,预测不太稳定,尤其在训练初期。而在yolo v2中直接预测相对中心位置相对grid左上角的偏移量也就是说直接回归预测中心坐标,采用一个sigmoid来进行归一化。同时使用边框聚类以及直接定位预测可以提高约5%。
  6. Fine-Grained Features。将13*13之前的26*26的特征图的层26*26*512进行一次采样降到13*13*2048(比如四个像素,分别采样四个生成四张图,对26*26中每2*2个采样一次,增加了四倍的通道数,同时分辨率降低)。通过这种操作,可以提高1%性能,且对小目标的预测更加准确
  7. 多尺度的训练,每10个epoch随机从{320,352,608}中选取尺寸(都是32的倍数)来训练
  8. 文章中没有提到loss的计算。v1中的前景后景分类是相对于grid而言,而对于v2,是相对于box而言的。

YOLO v3

  • 主要的不同点在于:
  1. 不再使用softmax进行分类,而是直接使用sigmoid,使得一个框可以同时被认为多多个类(如女人和人)
  2. 采用了残差模块,同时利用多尺度特征进行目标检测
  3. 跟v2同样采用聚类进行选择anchor box尺寸,只不过这次有9种的size。使用13*13的特征图预测最大的三类框,较大52*52的特征图预测最小的三类框,中等大小的特征图预测剩余的框
  • 相比其余版本,改变的真的不多…