yolov1学习笔记
1.yolov1介绍
在yolov1诞生之前使用的目标检测方法是滑动窗口,比如DPM模型。而更近一段时间使用的目标检测方法为两阶段的目标检测方法,如R-CNN。
两阶段的方法:
第一阶段:提取出潜在的候选框
第二阶段:用分类器对候选框进行筛选
和以上两种方法不同,yolov1采用的是单阶段的方法,即输入图片——神经网络提取特征——后处理获得检测结果整个过程一气呵成,不需要像R-CNN一样先单独训练模型提取出潜在的候选框,然后再对候选框进行分类等处理。
yolov1的大概检测流程如下图所示。
1.重新调整输入图片的大小为448*448
2.通过卷积神经网络提取特征
3.设置阈值过滤,最后通过非极大值抑制(NMS)获取最终结果
归功于直接在整幅图像上训练和对预测结果优化,yolov1拥有以下的优点:
1.目标检测的速度很快
2.yolov1是对整张图片进行分析,因此相比于先提取候选框这种更容易将背景误判为目标的方法(因为候选框只是图片的一部分,只对一部分分析就相当于管中窥豹,容易出错),yolov1拥有更少的误判。
3.泛用性更强,用自然物体的图片进行训练以后,也可以直接用来预测类似于油画的艺术品
说完了优点,那我来说一下它的缺点吧。虽然速度很快,但它的定位准确率却不如R-CNN这类模型,同时,它对小物体的预测能力比较弱(后面会解释)。
2.统一的目标检测框架
2.1位置预测
首先,yolov1将一张输入的图像分为SxS个的网格(如上图所示),如果物体的中心点落在了某个网格上,那么这个网格就负责预测这个物体。其中,每一个网格又会有B个边界框(bounding box),而与ground truth框(也就是标签,如上图的绿框所示)的IOU(交并比)最大的那个bounding box会负责预测物体(前提是物体中心点落在该bounding box所属的网格)。
bounding box会预测五个数值,分别是x,y,w,h,c。
x,y为bounding box的中心点相对于网格左上角的坐标
w,h为bounding box相对于整幅图像的宽和高
c为置信度得分(confidence score)。confidence socre的计算公式为:
置信度得分反映了模型对bounding box中包含物体的自信程度,以及它认为bounding box预测的准确性。
其中,左边的Pr(Object)表示的是存在物体的概率,它非1即0(要么有物体要么没有物体)。右边的式子就是bounding box和ground truth的IOU。因此,对于负责预测物体的网格中的bounding box来说,它得到的置信度就是它本身与ground truth的IOU(因为若该bounding box负责预测物体,则表明它所在的网格包含物体,Pr(Object)为1)。
2.2类别预测
bounding box负责预测物体的位置信息,而物体的分类信息则不是由bounding box负责的,而是由网格负责。每一个网格负责预测一组条件类别概率,即在该网格包含物体的条件下,该物体是猫、狗或者人等的条件类别概率。公式如下:
需要注意的是,对于一个网格里面的B个bounding box,他们是共享这一组条件类别概率的。
2.3测试阶段
在测试的时候,yolov1会将每个bounding box的置信度与它所对应网格的条件类别概率相乘:
相乘的结果就包含了分类的信息以及位置的信息,因此这个结果就反应了分类精度和定位精度。
上图表示的是模型的正向推断(测试过程)。
1.最左边的那幅图表示将图像分为SxS个网格
2.中间的两幅图像中,上面的图像中大小不等的黑框表示bounding box,而框的粗细表示置信度的大小
3.中间的两幅图像中,下面的图像不同的颜色代表不同的类别
4.最右边的图像表示的是经过后处理(阈值过滤和非极大值抑制)之后的结果
模型在没有经过后处理的时候输出的是一个SxSx(Bx5+20)的向量,其中SxS为网格的数量,而B就是每个网格中的bounding box的数量,而每bounding box都要预测x,y,w,h,c这5个量,所以B*5。最后加上20是因为yolov1采用的PASCAL VOC数据集,包含20个类别。一般情况下,将S设置为7,B设置为2,也就是说将图像分割为7x7个网格,每个网格有两个bounding box。在这种情况下我们就可以得到7x7x(2x5+10)的向量。
2.4神经网络
上图即为yolov1的网络结构,它有24层的卷积层,用于提取特征,最后再连接两层全连接层回归得到7x7x30的tensor。这里你可能会好奇,最后一个全连接层是如何从4096变成7x7x30的。其实,他中间隐含了一层,即把4096这一层全连接到一个大小为1470的中间层,然后再通过这个中间层得到7x7x30的tensor。
2.5训练
前面我们说过,ground truth(如上图所示)的中心点落在哪个网格中就由哪个网格所产生的bounding box来负责拟合,而一个网格有两个bounding box,我们选择与ground truth的IOU最大的那个bounding box来负责拟合。如下图所示,一个网格产生了两个bounding box(绿色虚线框),显然,大的虚线框与ground truth(绿色实线框)的IOU更大,所以选择它来拟合ground truth。(注意:在一开始的时候bounding box是随机产生的)
由于物体的类别是由网格负责预测而非bounding box,所以,对于划分为7x7个网格的图片来说最多只能预测49个物体,这也是为什么yolov1对于小目标和密集目标的预测能力弱的原因。
前面我们介绍的都是ground truth的中心点落在网格的情况,而实际上多数的网格是没有物体落在上面的,对于这些网格的处理就是让它们的bounding box的置信度越小越好,以减少对预测结果的影响。
需要注意的是,我们前面提到的bounding box预测出来的五个数值中x,y,w,h是经过归一化的。
x,y表示的是相对于该bounding box所在网格的左上角的偏移量,而不是相对于整幅图像的绝对坐标,它们的取值在0和1之间,这就保证了bounding box的中心始终是落在它所属的网格之内的。
w,h的归一化比较简单:w=框的宽度/图片总宽度,h=框的高度/图片总高度
经过归一化后,各个取值都变小了,这样有利于加快迭代的速度。
接下来给出yolov1的损失函数:
这个损失函数看起来很复杂,但其实只是简单的平方和误差损失函数,下面对其进行解释。可以看到整个损失函数有五个式子,但其实可以将他们分成三个部分:
第一部分是第一和第二个式子
这两个式子表示的是坐标回归的误差,其中第一个是bounding box中心点的定位误差,第二个则是bounding box高宽的预测误差。
当第i个网格的第j个bounding box负责预测物体时,上面的参数值(如上图所示)为1,否则为0。所以,坐标回归的误差只计算那些负责预测物体的bounding box的误差。
上面的这个参数的值一般设为5,其作用就是为了加强坐标回归的误差的影响。从上面我们可以知道,当我们不加这一个参数时,坐标回归由于只计算
负责预测物体的bounding box的误差,所以它的值会比较小,而下面会介绍的分类误差由于需要计算所有类别的误差,因此分类误差的值会比较大。然而,坐标回归误差和分类误差其实同等重要,如果分类误差过大则会导致模型偏向于分类,而坐标回归的误差由于比较小受模型的重视程度会比较小,所以为了避免这种情况,作者加入了上面的参数,使得坐标回归的误差的影响增大。
细心的朋友会发现,在宽高的平方和误差公式中宽和高都加上了根号,其实这也是作者高明的地方。我们预测的物体有大有小,所以bounding box也有大有小,这样在误差为30个像素点的时候,对于大的bounding box比如400300像素大小的框来说影响较小,它与ground truth的IOU不会有多大的改变,但是对于小的bounding box比如5060像素大小的框来说,带来的影响就会很大。所以,加上根号的目的就是减少大框与小框的差别。具体的效果如下图所示
可以看到,虽然横轴上的值已经取到1000了,但是纵轴对应的值也仅比30多一点。
第二部分是第三和第四个式子
第二部分是置信度的误差,第三个式子是负责预测物体的bounding box的置信度误差,而第四个式子是不负责预测物体的bounding box的误差。
第三个式子的参数的含义和前面一样,而第四个式子中间的参数(如上图所示)表示在第i个网格的第j个bounding box不负责预测物体的时候,其值为1,否则相反。
而第四个式子最前面的参数(如下图所示)的取值为0.5,其目的是降低不负责预测物体的bounding box对模型的影响。显然,负责预测物体的bounding box的数量是很少的,而它们又比较重要,因此通过减少不负责预测物体的bounding box对模型的影响,来变相的增加了它们的权重。
在这里说明一下,置信度的标签就是负责预测物体的bounding box与ground truth的IOU。而那些没有物体落在其中的网格,他们的bounding box与ground truth的IOU就为0,也就是说标签为0。所以,不负责预测物体的bounding box的置信度其实是向着0去拟合的。
第三部分是最后一个式子
第三部分是分类的误差,显然,我们只在乎那些有物体的网格所预测出来的分类数据,因此有了如下图的参数,当第i个网格包含物体时,其值为1,否则为0,这样模型就只计算那些负责预测物体的网格所预测出来的分类的误差。
yolov1的主要内容到这里就介绍完了,我们前面提到模型的输出为一个7x7x30的tensor,得到了这个tensor以后并不能直接得到我们在实际中看到的检测效果,我们还要对这个结果进行非极大值抑制(NMS)的后出来才能有那样的效果,本文就不展开讲了,感兴趣的朋友可以自己去了解。