1、ubified detection
将图片分割成 s * s 个格子,如果目标的中心落在其中的一个格子内,那么由这个格子负责检测目标。
每一个格子预测B个 bounding boxes 和C个概率(数据集中的类别数,注意,这里和R-cnn系列不同,R-cnn系列是预测 C+1 个概率,多了一个背景概率)。其中,每个 bounding boxes 包含5个预测值:x, y, w, h 和置信度(即,IOU)。在这里, x, y, w, h 需要进行归一化。归一化的方法:(1) x, y :所在格子的偏移量 (2)w, h :和整个图片的比例。那么网络最终输出的维度为: s * s * (B * 5 + C)。
2、Network Design
1. 网络结构:24个卷积层(主要为 1* 1 和 3* 3 卷积)+ 2个全连接层。
2. 训练过程:首先用ImageNet-1000数据集对前20个卷积层进行预训练,然后加入4个卷积层和2个全连接层进行训练,新加入的层的参数进行随机初始化。误差函数用欧式距离,但是会存在一些问题,所以需要进行一些改进。
存在的问题:
(1)定位误差和分类误差对总误差产生相同的影响,直觉上觉得它们所起的作用应该不同。
(2)在一张图片中,大部分的格子中没有目标,所以它们会淹没掉含有目标的给子的信息,因此给它们分别加上系数来改变影响力,有目标的格子:λ=5,没有目标的格子: λ=0.5
(3)对于在large box中的物体和在small box 中的物体,目标函数同等对待,这不符合实际,我们知道,对于预测的bounding box,一般会和ground truth有差别,对于large box来说,一些小的差别影响不大,但是如果是比较小的box,可能就会偏差很多。
因此,我们需要减少large box的影响,增加small box的影响。论文中的做法是:对w和h求平方根。(ps:①这种做法只能缓解影响,不能从根本上解决问题。②这也是造成YOLO不好收敛的一个原因,而在R-cnn系列中,回归的是offset,就不会出现这种问题,所以在YOLOv2中,作者借鉴了这种方法,不过做了一些改变。)
3. 虽然YOLO每个grid里面有B个box,但是只取其中的一个进行预测(注意,在inference阶段,所有的box都会采用)。选取的标准是:取IOU最大的那个box,这种做法可以取得更好的效果。
3、Inference
预测的过程比较简单,可以采取以下几个步骤进行:
(1)将所有的bounding box的C个概率乘以它们所在格子的置信度,这样会得到20行98列的矩阵(Pascal数据集,每张图片分割成7 * 7的格子)
(2)对矩阵的每一行进行如下操作(也就是,分别操作每个类别):①按照数值从大到小进行排序,然后取一个阈值:0.2,将小于0.2的数值直接改为0。 ②对剩余的非0元素进行NMS操作,NMS的阈值取0.5。
(3)剩余的非0元素就是我们预测的目标概率(实际上是:概率*置信度),行代表对应的目标类别,每一列对应一个bouding box。
4、Limitation
(1)YOLO仅仅划分成7 * 7的格子,而且每个给子只预测2个bounding box,所以对小目标的预测效果并不好,而且对于密集的目标预测效果也不好。
(2)因为YOLO是直接做回归,而且从现有的数据中进行学习,所以,如果遇到一些宽高比或者一些形状比较奇怪的目标就抓瞎了。
(3)YOLO经过了多次的下采样,造成提取的特征的细腻度不够。而且,YOLO和R-cnn、Fast R-cnn、Faster R-cnn一样,都是采用最后一层的特征进行预测,这样会损失空间结构信息。所以,现在流行的是从多个卷积层提取特征,综合空间信息进行预测,这样可以提高预测效果。
网友评论