YOLO一波流

早期的论文笔记,整理发布~

1 / YOLO v1

BREAKTHOUGH: 将传统的物体检车任务转化为回归任务。。one stage 同时搞定 Bounding box 和 分类。

主打 real time

base YOLOFast YOLO
45 fps155 fps

v1 在 box 的定位上还有待提升,但是也很少框住 negative sample/background。

不同于 sliding window 以及 rpn 技术的局部特性,YOLO 使用整张图进行训练及测试,所以可以基于图片的全局信息作出预测。也就可以学习到物体的更 generalized representations。

Unified Detection

v1 把输入图片分成 S×S 的网格。gt 中的 object 落到哪个 grid ,就由那个来负责预测这个物体。每一个小格子预测 B 个 Bounding box 以及这些 box 对应的 confidence scores。该置信度得分表示 model 对该 box 包含 object 的信任度以及 box 负责预测物体的准确度。它的数值形式如下:

后面乘以一个 iou 应该是 yolo v1 很少框不中物体的最佳助攻吧(要是 cell 中没有物体,那么它对应的 Pr 就是 0)。

每个 box 包含 5 个预测值:x,y,w,h,confidence。(x,y)相对于 grid cell ,(w,h)对应全图。

v1 在 PASCAL (包含 20 个类别)上测试。取 S=7, B=2,C=20。那输出就是 7*7×(2×(4+1)+20)= 7*7*30 的一个 tensor。

Architecture

yolo v1 借鉴了 Googlenet,并且前 24 层都是在 imagenet 上做分类任务预训练。然后加上后面几层做detection。(v1 并没有使用 inception module,可能是为了 real time )

为了测试 fast 的极限,作者同步给出了 fast yolo。fast version 采用 9 层 Googlenet 以及更少的 filter 数目。

Training

先在 imagenet 上做分类任务进行 pretrain,然后接上俩全连接层做 detection 的 finetune。最终一起输出 Bounding box 和类别得分。box 的长宽都根据原图 normalize 到 [0, 1]。同时 x,y 也是相对某一个特定 cell 的 offsets,所以也是  [0, 1]。

主干优化函数是 sum-squared error。但是它对 box localizaiton error 和 classification error 进行同等优化,这应该不是最佳状态。同时,cell 中并未包含 object 的个数毕竟占多数,这就导致一个 postive sample 和 negative sample 的类别不平衡问题,因此 negative sample 会主导了梯度的更新。如此这般,训练就会不稳定,以及过早收敛(此时的收敛是‘异常’的)。

为了解决这一问题,作者增加了 box 坐标预测的损失,降低了不含 object 的 box 的 confidence 的预测损失。furthermore,作者为了提高小偏差(梯度)利好小物体而非大物体,预测 w,h 的平方,而非直接预测 w,h。

YOLO 对每个 grid cell 预测多个 box。在训练阶段,作者取预测的 box 与 gt 的 iou 最大的 predictor,并让这个 predictor 负责预测该 object。这样可以提升预测的 sizes, aspect ratios,以及 类别,提高整体的 recall。

简而言之,如果某个 cell 中没有目标,则不对分类误差进行反向传播; B 个 bounding box ,只取与 gt 的 iou 最高的一个 box 进行反向传播,其余不更新。

note: non-maximal suppression 把 mAP 提升了 2-3 个百分点。

limitations:每个 grid cell 只能预测两个 box 和 一个 类别。对 groups 中的小物体不友好。

2 / YOLO v2

result:YOLO9000  (v2)可以识别超过 9k 个物体类别。同时保持 real time

motivation:yolo 相比其它 的 sota 算法有一些差距。跟 fast rcnn 比,localization 误差大。跟 rcnn 比 recall rate 又低。所以 v2 在保持分类准确率的基础上要提高 recall 和 localization。

 Better:其实可以看做 tricks 。

  1. batch normalization:通过增加 batch normaization,mAP 提高了 2 个百分点。同时也起到了一个正则化的作用。
  2. High Resolution Classifier:作者先在 448*448 的分辨率上 finetune classification 任务,然后 finetune detection 任务。这就提高了 4 个百分点。
  3. conventional with anchor boxes:YOLO是在卷积层上面加几个 全连接层来预测 Bounding box 的坐标。但是 rpn 可以对每一个 坐标点都预测一个 box 的 offsets而不是坐标,这就简化了问题,使网络更容易学习。
  4. Multi-scale training: 多尺度训练可以让 model 更 robust。downsample factor 取 32 。每 10 个 batchs,网络就随机选择一个 resolution。

YOLO 一张图片只预测出 98 个 box,而使用了 anchor 后,提升到一千多个。尽管集成 anchor 后 mAP 降低了一点(69.5->>69.2)但是 recall 提升了不少(0.81 ->> 0.88)

issues: 集成 anchor 时有两个问题。一是,box dimension 要“手选”(实际是使用 k-means 模拟实现)。先输入手选好的 box 有利于网络训练以及更好的预测结果。二是,训练不稳定。主要是由于 box 的 (x,y)不好预测。

Faster: low latency 是实时应用的一个追求指标。这也是 YOLO v2 的一个目标

许多检测框架用 VGG 作为基础改造网络,但是它过于复杂。v2 在 GoogleNet 的基础上进行改动。

Stronger:训练时,作者将检测数据和分类数据混合着用。但是参数更新方式有异。对于 detection 中的图片,进行 full loss update;对于 classification 中的图片,只根据 classification loss update。但是!!detection dataset 只包含常用的物体和label,例如“cat” “dog”。imagenet 里面,光狗就有一百来个品种。如果希望训练有效,必须解决这个类别不平衡问题!

传统的分类算法使用 softmax 来进行概率预测归一化。但这是基于所有类别互斥的前提下的。所以在这里不能直接使用(因为“dog”的子类和“dog”本身不是互斥的)。所以作者取了一个 multi-label model 来整合detection 和 classification dataset。

3 / YOLO v3

Result:在 320*320 的resolution 下,YOLO v3 跑进 22 ms,mAP 达 28.2。与 SSD 精度相仿,但是比 SSD 快 3 倍!

Bounding Box Prediction:

仍使用维度聚类作为 anchor 来预测 bounding box(四值表示 tx ,ty , tw, th )。

示例:如果当前 cell 距图片左上角的偏移量是 (cx, cy)以及 bounding box 的宽和高的先验是 pw,ph。那预测结果就如下所示:

YOLO v3 使用 logistic 回归为每个 bounding box 预测一个 objectness score。如果某个 box 比所有与 gt 中相同的 物体的 overlaps 都大,那这个box 就被赋值为 1(非极大值抑制)。v3 仅对gt 中 object 的一个 box 赋予一个先验值。如果该 box 不对应 gt 中的 object ,那它就不参与分类和 box 回归损失,只参与更新 objectness score。

Classification:对每个 box 使用 multilabel loss 进行预测类别(实验说 softmax 对高性能没啥帮助,顾 v3 未使用。此处使用独立的 logstic 分类器,训练时使用二分类交叉熵。这对 overlap 多的情况比较友好)。

Predictions Across Scales: v3 生成三种不同 scale 的 box。再使用类似 FPN 的网络来提取特征,最后输出一个编码了 bounding box,objectness,以及类别预测的 3-d tensor。以 COCO 为例,作者输出的 tensor 的格式为 N × N × [ 3 * (4+1+80)] ,4 代表 box 的预测值 offsets,1 是 objectness score,80 是 coco 的类个数。

NOTE: 

What is hard negative mining? And how is it helpful in doing that while training classifiers?

Let’s say I give you a bunch of images that contain one or more people, and I give you bounding boxes for each one. Your classifier will need both positive training examples (person) and negative training examples (not person).

For each person, you create a positive training example by looking inside that bounding box. But how do you create useful negative examples?

A good way to start is to generate a bunch of random bounding boxes, and for each that doesn’t overlap with any of your positives, keep that new box as a negative.

Ok, so you have positives and negatives, so you train a classifier, and to test it out, you run it on your training images again with a sliding window. But it turns out that your classifier isn’t very good, because it throws a bunch of false positives (people detected where there aren’t actually people).

A hard negative is when you take that falsely detected patch, and explicitly create a negative example out of that patch, and add that negative to your training set. When you retrain your classifier, it should perform better with this extra knowledge, and not make as many false positives.

Share this to:

发表评论

电子邮件地址不会被公开。 必填项已用*标注