解析YOLOv1源码及背后逻辑
解析YOLOv1源码及背后逻辑
实现步骤
-
将一幅图像分成 7x7 个单元格(grid cell),如果某个物体( object )的中心落在这个单元格中,则这个单元格就负责预测这个物体。如图所示:
-
每个单元格用2 个 bounding box去预测这个物体的真实框(ground truth)
-
yolo 通过CNN去预测7x7 个单元格的2 个 bounding box的中心点坐标(x,y)、宽高(w,h)、物体分类、confidence(这个值代表了所预测的bounding box中是否含有object和若有object,这个object预测得有多准的两重信息),如图所示:
注:该网络用leaky ReLU,代替ReLU,leaky并不会让负数直接为0,而是乘以一个很小的系数(恒定),保留负数输出,但衰减负数输出。
-
上面是结构图yolo_v1结构图,通过结构图可以轻易知道前向传播的计算过程,是很便于读者理解的。v1的输出是一个7x7x30的张量,7x7表示把输入图片划分位7x7的网格,每一个小单元的另一个维度等于30。30=(2*5+20)。代表能预测2个框的5个参数(x,y,w,h,confidence)和20个种类。每个单元格预测一个属于类别的条件概率。要注意的是,属于一个网格的2个bboxs共享一套条件概率值,因为这两个box都是为了一个单元格服务,最终预测出一个物体类别。
-
每个bounding box的confidence和各个类别预测概率相乘,得到每一个bounding box关于所有类别的class-specific confidence scores(其形状为20 x 1),其中的一个bounding box计算过程如下:
-
将所有bounding boxes中class-specific confidence scores低于阈值的设为0(最后所有scores为0的将不会画出该bounding box)
-
对每一个类别的scores从大到小排序
-
对每一个类别根据scores进行非极大值抑制:拿到score最大的bounding box与score比它小的bounding boxes计算iou,如果大于阈值,则将他们设置该类别的scores为0,之后对不为0的bounding box执行这一操作。6~8步如下所示:
- 对每一个bounding box只要有一个class-specific confidence score不为0,就画出这个框,并标出scores最大的类别名。
损失函数
论文中的公式如下:
表示网格数,在这里是7x7。B表示每个单元格预测框的个数,这里是2。
取值为0和1,即单元格内是否有目标的中心。
结合网络输出,理解损失函数,如下所示:
损失函数设计细节:
- YOLOv1对位置误差,confidence误差,分类误差均使用了均方差作为损失函数。
- 三部分误差损失(位置误差,confidence误差,分类误差),在损失函数中所占权重不一样,位置误差权重系数最大,为5。
- 大部分bounding box中都没有物体,积少成多,造成loss的第2部分与第3部分的不平衡,因此,损失函数中对没有物体中心的单元格中预测的bounding box的confidence误差给予小的权重系数,为0.5。
- 有目标的单元格中预测的bbox的confidence损失和分类损失,权重系数正常为1。
- confidence损失,分为obj和no_obj两种情况计算,对于no_obj(该单元格不包含物体中心)并且当检测框和所有真实框的iou都低于0.5。
- 对于不包含某个物体的中心点的单元格,confidence的真实值则为0,如果包含,confidence的真实值则等于 bounding box与真实框的IOU。
- 计算confidence损失的目的,想惩罚那些附近没有物体(和所有真实框的iou都低于0.5)而confidence很高的bounding box和那些包含物体中心,confidence却很小的bounding box。
- 由于相同的位置误差对大目标和小目标的影响是不同的,相同的偏差对于小目标来说影响要比大目标大,故作者选择将预测的bounding box的w,h先取其平方根,再求均方差损失。
- 一个网格预测2个bounding box,在计算损失函数的时候,只取与ground truth box中IoU大的那个预测框来计算损失。
- 分类误差,只有当单元格中含有目标时才计算,没有目标的单元格的分类误差不计算在内。
优点:
端到端训练,损失函数的反向传播可以贯穿整个网络,这也是one-stage检测算法的优势,适合工程化。
速度快,YOLO将物体检测作为回归问题进行求解,整个检测网络通道简单
背景误检率低,YOLO在训练过程中可利用整张图像的整体(context)信息,而Faster-Rcnn是局部图像信息。因此,若当图像背景(非物体)中的部分数据被包含在候选框中送入检测网络进行检测时,容易被误检测成物体。
通用性强,对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。
局限性:
漏检,每个单元格只预测一个 类别的Bounding Boxes,而且最后只取置信度最大的那个 Box。这就导致如果多个不同物体(或者同类物体的不同实体)的中心落在同一个网格中,会造成漏检。
小目标检测效果不好,yolov1网络到后面感受野较大,小目标的特征无法在后面7*7的单元格中体现。
只支持一种分辨率图片,由于输出层为全连接层,因此在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率的图片。
召回率低,召回率就是检测出的物体数除以总物体数,YOLO虽然可以降低将背景检测为物体的概率,但同时导致召回率较低。
参考
https://blog.****.net/mrjkzhangma/article/details/100128257
https://zhuanlan.zhihu.com/p/46691043