yolo

时间:2023-03-09 18:09:54
yolo

yolo

将目标检测过程设计为为一个回归问题(One Stage Detection),一步到位, 直接从像素到 bbox 坐标和类别概率

优点:

  1. 速度快(45fps),效果还不错(mAP 63.4)
  2. 利用图片整体信息进行分类和 bbox坐标预测, 所以相较于其他基于 region proposal 的目标检测算法(如FRCN), yolo 很少将背景预测为前景, 虽然 yolo 会有更多的 localization error(主要由于小物体的定位差导致);
  3. yolo能够学习到物体更加泛化的特征, 当场景迁移到 artwork 时, yolo 效果更好

yolo

局限性:

  1. yolo 的架构设计对于每个 cell 能预测的 bbox 个数和类别做了很大的限制, 每个 cell 只能预测2个bbox和1组类别概率, 而且训练时, gt-box 的中心落在哪个 cell 中, 就有这个 cell 负责预测该物体, 也就是说只会有一个 cell 负责预测该物体; 而 SSD, 只要 anchor box 和 gt-box 的 IoU 大于 0.5, 训练时就会负责预测该 gt-box; 这样一种设计会导致 yolo 很难处理邻近(nearby)物体的预测; 特别是一组密集的小物体的预测;
  2. 模型的 bbox 坐标预测完全来自于对数据的学习, 没有添加 anchor (框大小, 宽高比)的先验知识, 所以训练好的模型很难泛化到具有与训练数据集不同尺寸和宽高比的新数据上. (98个 bbox 还是太少了, 多提bbox, 感觉才能好一些)
  3. 模型使用比较高层的 "粗糙特征" 来做预测 bbox坐标, 网络有总输入图片到输出有 5 个 downsample 层, 一般来说bbox坐标预测使用低层 feature map 的高解析度的特征进行预测比较好, SSD 通过这种手段实现很好的小物体预测.
  4. bbox 坐标预测损失函数设计上的缺陷, 使用的是MSE(mean square error)损失函数, 该函数的不足之处在于, 同等对待bbox坐标预测损失; 一个小的bbox坐标预测损失可能对于一个大的 bbox 坐标预测影响不大, 但是对于小bbox坐标预测的 IOU 却有很大的影响, 而 MSE 损失函数没法区别对待这种不同之处, 而小物体的 localization error 也是 yolo 算法 localization error 的主要来源.

设计思想简介

yolo

yolo 算法将输入图片划分为 S×S 个 grid cell, 如果某个物体的中心落入一个 grid cell 中, 那么该 grid cell 就负责预测这个 object. 每个 grid cell 一共预测两个 bbox, 一个类别.

grid cell 预测 B 个 bounding boxes(论文中 B=2); 以及这些 bbox 的 confidence score, confidence score 表明了模型对该 bbox 是否包含物体以及位置预测精确度的自信程度.定义如下

\[\bf P(object)*IOU^{truth}_{pred}\]

如果 grid cell 中不包含物体中心, 那么 confidence score 为 0, 否则 confidence score 为预测的 box 与 ground-truth box 的 IOU.

每个 bbox 包含5个预测值, \((x, y, w, h, confidence)\), \((x, y)\) 表示 box 的中心相对于 grid cell 原点的偏移值(原点, 即每个 grid cell 的 top-left 顶点, yolo 将之设置为(0, 0), bottom-right顶点设置为(1, 1), 所以 \((x, y)\) 取值范围一定在(0,1)之内). \((w, h)\) 为相对于整张图片的宽和高, 即使用图片的宽和高标准化自己, 使之取值范围也在(0, 1)之间. \(confident\) 为预测 box 与 ground-truth box 的 IOU.

关于 yolo 的预测的 bbox 中心坐标是相对于 grid cell 左上角的偏移值, 很有先见之名, 不是直接预测而是预测偏移值, 但是啊, 预测的 x, y 可能为负数啊, 这样 (x, y) 就不在该 cell 中了, yolo v2 通过 (sigmoid(x), sigmoid(y)) 来解决这个问题.

yolo 预测的不是类的概率而是类的条件概率, 即条件为如果这个 cell 中包含物体(条件), 那么这个物体是N 类前景中每一类的概率; 每个 grid cell 也会预测该 grid cell 对应的 bbox 属于 \(class_i\) 条件概率 \(P(class_i|Object)\), C 为要预测的 class 的数量.

测试时, 将 confidence score 与 类条件概率相乘;

\[\bf P(Class_i|Object)*P(object)*IOU^{truth}_{pred
}= P(Class_i)*IOU^{truth}_{pred}\]

\(\color{red}{所得结果的含义为 class_i 出现在该 box 的概率以及预测的 bbox 对这个物体的拟合程度.}\)

Training

使用 image 的宽和高标准化 bbox 的宽和高(w, h), 所以 w, h 落在(0, 1]之间
(x, y) 为 bbox 相对于 grid cell 的偏移, 取值也在(0, 1)之间

sum-square 损失函数

由于每个图片中, 有很多 cell 不包含object, 这会对包含 object 的 grid cell 的影响很大, 导致模型不稳定, 或造成训练开始不久就偏离了. 通过减少不包含 object 的 grid cell 对 loss 函数的贡献来解决这个问题.

由于 sum-square 损失函数中, 同一个损失值对大bbox 的影响和它对小 bbox 的影响是相同的, 这样是不好的, 正常情况下对小的 bbox 的影响应该更大才对, 所以我们通过预测 \(\sqrt w\), \(\sqrt h\) 的平方根代替直接预测 \(w, h\).

yolo

  1. gt-box 的中心坐在哪个 cell 中, 就由这个 cell 负责预测该 gt-box; 要具体到 cell 中哪个 bbox 负责预测呢? 所谓 cell 中负责 gt-box 预测的 bbox 指的该 cell 中与 gt-box 具有最高 IOU 的 bbox.
  2. \(I_i^{obj}\) 为包含 gt-box 中心得 cell, 即只有 gt-box 中心落入的 cell 预测的类标签才会参与损失函数
  3. \(I_{ij}^{obj}\):(从 gt-box 出发理解) 图片中 gt-box 中心落在哪个 cell 中了, 那么这个 cell就负责预测这个物体, 具体为负责 gt-box 预测的 bbox

由此我们可以看到, 这个损失函数的设计要从 gt-boxes 来考虑, 而不是从 cell 的角度来考虑, 我们知道了 gt-boxes 中心落入到那些 cell 中了, 然后我们就知道了一切

yolo v3

yolo

即 FPN

yolo

yolo

上采样之后与前一层 concat 之后还需要一个 3x3 卷积来做特征提取(anchor 使用的范式)
上采样方法是双线性差值, 最近邻或者是其他方法? 木看代码, 不清楚, 配置文件也没写, FPN 中使用的是最近邻(nearest neighbor)