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的各个部分整合到一个单独的网络
- 将整张图片划分为个网格grid,每个网格预测出B个bounding box,每个box各预测出一个置信度confidence(用于描述这个box包含object的概率),confidence的定义为
假如没有object落在box中,则confidence为0 - 每个box要预测五个值,其中一个便是confidence,另外四个是,表示box的中心。是box相对于grid的的相对位置,归一化到,而是相对于input(整张图)的比例,一样
- 每个grid还需要预测出C(C为类别的总数)个概率值
- 在测试阶段,可以根据以下公式得到类别指定的置信度class-specific confidence
- 因此,整个网络的输出是一个的tensor
3. Experiment
- CNN采用类似GoogleNet的结构
没有采用inception模块,采用的卷积层降维加上一个的卷积层代替 - 网络一共24层,fast yolo采用9层
- 数据集采用Pascal VOC,S=7,B=2,C=20,因此输出为的向量。
- 在ImageNet上进行预训练卷积层(预训练时长1周),在预训练的卷积层(20层)后加入4层卷积层和2层全连接层。因为目标识别需要更多的信息,将输入大小从224*224增大到448*448。
- loss采用sum-squared error。因为大部分的box都不包含object,不加权的情况下会使网络倾向于预测出confidence全0。同时,位置信息与分类错误权重一致的情况下实验不太理想。因此,增大位置信息(coordinate)的权重并增大那些包含object的box的权重,论文中加入两个参数。最终的loss function为
其中
- C为box的confidence,
- 为第i个grid属于第c类的概率;
- 代表object是否出现在第i个grid上(构建ground truth的时候每个object只在一个grid上有置信度,即object中心所在的grid才会使)
- 代表第i个grid中的第j个box是否responsible(首先筛选grid,选出object中心所在的grid,对这些grid中两个box选择具有最大iou的box,最后产生的box才是responsible。思想与进化算法相似,每个grid产生两个个体(grid),选择适应值(IOU)最高的grid)
- 是除了4.中所指的其他所有的box
- 值得注意的是,对于分类error的惩罚只作用于出现object的grid上
- 对于宽和高h w的开根,是因为对于不同的大小box回归,预测偏差相等时对于小box的惩罚更大。如偏差同样为10,对于长为100的box的惩罚显然应该小于长为20的box
- 对于responsible的box的置信度error计算,target也就是ground truth需要在计算出预测值以后才能动态计算出相应的置信度,置信度为预测box与target box的IOU
- loss总结:对于responsible的box需要计算边框的error以及置信度(目标置信度为与object的IOU)的error,对于其他box只需要计算置信度的error(目标置信度为0)。对于分类error,只需要计算object中心所在的grid。
YOLO v2 (67fps的情况下76.8mAP,40fps则78.6mAP)
- 首先介绍YOLO v2相比v1作出了哪些改变
- 加入Batch Normalization,v1假如BN以后mAP提升了2%
- 高分辨率分类器的使用:此前v1是先使用224*224的图片进行预训练,然后再直接插值到448448再训练。而现在是直接采用448448的图片在ImageNet上再finetune10个epoch,使得图像更好的适应高分辨率
- 加入anchor,使用全卷积网络,干掉全连接层,使得box在空间上保持原有的关联。同时去掉了v1中最后一层的池化层以获取更高分辨率的特征图,同时v2采用416*416的图片作为输入(v1采用448*448),这样输出的最终的特征图为13*13(恰好是一个奇数)。通过这种操作,可以使网络更好地预测在图片中心的目标(这样子大目标(通常在中心)通常会落在最中心的grid上,而不是周围的四个grid,有点Attention的味道)
- 采用K-means对VOC和COCO的bounding box进行聚类,采用不同的k(聚类中心数目)进行聚类,最后发现k=5时tradeoff模型复杂度以及recall(v1相比其他region proposal的方法recall比较低)。
- 直接对定位进行预测:faster rcnn是对偏移量(中心坐标的偏移量,单位相对anchor box的长宽的比例,没有对移动距离进行约束,从而可以移动很远)进行预测,预测不太稳定,尤其在训练初期。而在yolo v2中直接预测相对中心位置相对grid左上角的偏移量也就是说直接回归预测中心坐标,采用一个sigmoid来进行归一化。同时使用边框聚类以及直接定位预测可以提高约5%。
- Fine-Grained Features。将13*13之前的26*26的特征图的层26*26*512进行一次采样降到13*13*2048(比如四个像素,分别采样四个生成四张图,对26*26中每2*2个采样一次,增加了四倍的通道数,同时分辨率降低)。通过这种操作,可以提高1%性能,且对小目标的预测更加准确
- 多尺度的训练,每10个epoch随机从{320,352,608}中选取尺寸(都是32的倍数)来训练
- 文章中没有提到loss的计算。v1中的前景后景分类是相对于grid而言,而对于v2,是相对于box而言的。
YOLO v3
- 主要的不同点在于:
- 不再使用softmax进行分类,而是直接使用sigmoid,使得一个框可以同时被认为多多个类(如女人和人)
- 采用了残差模块,同时利用多尺度特征进行目标检测
- 跟v2同样采用聚类进行选择anchor box尺寸,只不过这次有9种的size。使用13*13的特征图预测最大的三类框,较大52*52的特征图预测最小的三类框,中等大小的特征图预测剩余的框
- 相比其余版本,改变的真的不多…