YOLOv1的损失函数和关键概念详解

在这里插入图片描述

Loss function详解

在loss function中,前面两行表示localization error(即坐标误差),第一行是box中心坐标(x,y)的预测,第二行为宽和高的预测。这里注意用宽和高的开根号代替原来的宽和高,这样做主要是因为相同的宽和高误差对于小的目标精度影响比大的目标要大。举个例子,原来w=10,h=20,预测出来w=8,h=22,跟原来w=3,h=5,预测出来w1,h=7相比,其实前者的误差要比后者小,但是如果不加开根号,那么损失都是一样:4+4=8,但是加上根号后,变成0.15和0.7。
第三、四行表示bounding box的confidence损失,正样本(包含object且IOU最大)置信度真值Ci为1,负样本置信度真值Ci为0。
第五行表示预测类别的误差,注意前面的系数只有在grid cell包含object(物体中心点落入网格中)的时候才为1。

注意:
如果一个grid cell中有ground truth(物体中心点落入网格中(1obj,i=1)),那么就用IOU最大的那个预测框来预测。如果该单元格内确实存在目标,那么只选择与ground truth的IOU最大的那个边界框来负责预测该目标(1obj,ij=1),而其它边界框不负责或者认为不存在目标(1noobj,ij=1)。(1obj,i,1obj,ij,1noobj,ij表示损失函数中的系数)
YOLO中损失函数中关于对于不含object的grid cell预测的box是只计算confidence loss,置信度为0是理想情况,实际上网络可能预测出的置信度是接近0的数,通过损失函数逐渐减小,由于不含object的珊格一般比较多,所以前面加上一个系数进行约束。(训练的时候根据监督信息去训这些参数使得预测的confidence尽可能接近真实值Pr(object)*IOUtruth,pred,测试的时候就根据训好的参数直接得到confidence)

一个grid cell中是否包含object怎么界定?
首先要明白grid cell的含义,以文中77为例,这个size其实就是对输入图像(假设是448448)不断提取特征然后sample得到的(缩小了64倍),然后就是把输入图像划分成7*7个grid cell,这样输入图像中的64个像素点就对应一个grid cell。回归正题,那么我们有每个object的标注信息,也就是知道每个object的中心点坐标在输入图像的哪个位置,那么不就相当于知道了每个object的中心点坐标属于哪个grid cell了吗,而只要object的中心点坐标落在哪个grid cell中,这个object就由哪个grid cell负责预测,也就是该grid cell包含这个object。(注意区分该 grid cell 包含这个object【Pr(object)=1或者1obj,i=1】与该bounding box 负责预测该object【1obj,ij=1】的区别)另外由于一个grid cell会预测两个bounding box,实际上只有一个bounding box是用来预测属于该grid cell的object的,那么这两个bounding box到底哪个来预测呢?答案是:和该object的ground truth的IOU值最大的bounding box。

训练时:

数据集: Pascal voc数据集
网络: GoogleNet inception module用11 + 33 网络代替
激活函数:除最后一层用线性激活函数外,其它层都用leaky relu函数
采用drop out和数据增强来防止过拟合
输入一张包含M个objections的图像,每个objection包含4个坐标(x,y,w,h)和1个label。然后通过网络得到7730大小的三维矩阵。每个1*30的向量前5个元素表示第一个bounding box的4个坐标和1个confidence,第6到10元素表示第二个bounding box的4个坐标和1个confidence。最后20个表示这个grid cell所属类别。注意这30个都是预测的结果。然后就可以计算损失函数的第一、二 、五行。至于第二三行,confidence可以根据ground truth和预测的bounding box计算出的IOU和是否有object的0,1值相乘得到。真实的confidence是0或1值,即有object则为1,没有object则为0。 这样就能计算出loss function的值了。

测试时:

输入一张图像,跑到网络的末端得到7730的三维矩阵,这里虽然没有计算IOU,但是由训练好的权重已经直接计算出了bounding box的confidence。
在这里插入图片描述
然后再跟预测的类别概率相乘就得到每个bounding box属于哪一类的概率(confidence scores)。接下来进行NMS处理(测试时候才有):每个bounding box的confidence和每个类别的概率相乘,得到每个bounding box属于哪一类的confidence score。即得到每个bounding box属于哪一类的confidence score。也就是说最后会得到20*(772)=20*98的score矩阵,括号里面是bounding box的数量,20代表类别。接下来的操作都是20个类别轮流进行:在某个类别中(即矩阵的某一行),将得分少于阈值(0.2)的设置为0,然后再按得分从高到低排序。最后再用NMS算法去掉重复率较大的bounding box(NMS:针对某一类别,选择得分最大的bounding box,然后计算它和其它bounding box的IOU值,如果IOU大于0.5,说明重复率较大,该得分设为0,如果不大于0.5,则不改;这样一轮后,再选择剩下的score里面最大的那个bounding box,然后计算该bounding box和其它bounding box的IOU,重复以上过程直到最后)。最后每个bounding box的20个score取最大的score,如果这个score大于0,那么这个bounding box就是这个socre对应的类别(矩阵的行),如果小于0,说明这个bounding box里面没有物体,跳过即可。

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值