Bootstrap

目标检测指标-以及YOLOv1简介

一、物体检测评估指标

1.1 IOU

IOU就是交并比,交集和并集之比,GT就是Ground-Truth真实值,红色的就是预测值。

我们希望预测值与真实值越接近越好,IOU越大越好。

1.2 MAP

如上图,右上角Actual是真实值,左边Predicted是预测值。

True Positive是正例且预测正确

False Positive是错误的预测为正例(表明是负例,就是把负例当成正例)

False Negative是错误的预测为负例(表明是正例,把正例当成负例)

True Negative 正确的把负例当作负例

物体检测的结果就是输出一个预测框,并输出置信度。

        任务中一般是TP,FP,FN用的多,TN一般没用,但是一般需要计算P和R

Precision=TP/(TP+FP)

Recall=TP/(TP+FN)

P即精度,表明了描述的正确性,肯定就是正确的除以(正确的+错误的)

R即召回率,表明了覆盖了率,就是正确的除以(正确的+没有预测出的)

        如下图,绿色框为GT,红色框为预测,所以TP=1,即正确的预测出真实值;FP=0,就是错误的预测为正确的,这个图显然为0(没有将背景错误的预测为正例);FN=1,就是错误的预测为负例,就是说正例没有找到,把正例当作负例了。

1.2.1 PR曲线

        如下七张图,绿色是GT,红色是预测,IOU阈值是0.5,第一步就是找到哪些是TP,哪些是FP。

计算完后得到如下数据,根据该数据即可获得Precision-Recall曲线,即PR图

        可以看出,随着置信度下降,准确率在下降,但是召回率在提高。这两个数据是矛盾的,画PR图时,很难又准又全

1.2.2 MAP计算

MAP就是要求PR曲线的面积。这个面积的求法多种多样。

        ①11点插值法,画出0-1.0共11个点,然后向右取PR曲线的最大值,画出矩形,求出面积,如下图,0向右对齐取PR曲线最大值,然后得出矩形,求出面积,最后所有矩形面积相加。

AP=1/11(1+0.66+3*0.4285+6*0)=0.2683

        ②直接计算面积

        不同的阈值的AP求出后再求平均,即可得到MAP,MAP就是A1+A2+A3+A4,我们希望MAP值越接近1越好。MAP在不同的阈值下综合考虑Precision和Recall,所以作为衡量检测指标

        以上都是VOC数据集的计算方法。

        ③对于COCO数据集,阈值不再是0.5,而是从0.5-0.95之间间隔0.05,这样就得出10个阈值,0.5,0.55,0.6……每个阈值都可以算出一个AP,然后将所有的AP求平均值。

COCO数据集这个计算方法更为科学。而VOC数据集的计算方法一视同仁,多劳多得。

1.3 指标分析

         通常情况下,精度越大,召回率越小,而我们希望精度和召回率都较大。Map是综合衡量检测效果的,单看精度或者召回率是不行的。map越大越好。IOU是Intersection Of UnionIOU越大越好

二、深度学习经典检测方法

2.1概述

two-stage(两阶段),Faster-rcnn Mask-Rcnn系列,多了个预选的阶段。

one-stage(单阶段):Yolo系列

2.2优劣势

        one-stage最大的优点就是,速度非常快,适合做实时检测任务,缺点是可能检测效果不是很好

        two-stage通常速度较慢,但是效果会很不错

三、Yolo V1

        经典的one-stage单阶段方法,Yolo即就是You Only Look Once,名字表明了一切,看一遍就完事了,说明将检测任务变得十分简单,把检测问题转化为回归问题,一个CNN就完事了,并且可以对视频进行实时监测,应用领域非常广。

3.1核心思想

        如下图,假设输入是S*S(S=7)的有方格组成的图像,左下角有个狗,中心是坐标x,y(红色的框)并利用经验值得出两种不同的检测框h1w1和h2w2(图中的两个绿色框),现在要把这些经验值进行修正,进行微调(这就是回归任务),就是更改h和w使之最好。

        YoloV1中给出两个候选框(但是实际中完全不够用),然后有个真实值,分别计算h1w1和h2w2的IOU,选择较大的进行更改h和w(微调)。每一个物体都有经验框,然后微调,预测结果会有很多BoundingBox,但是会给出置信度(图中的中间上方的图),然后过滤掉置信度小的BoundingBox,得出最后的实际检测的框。

3.2 网络架构

        输入是448*448*3的图像,是不是这个输入图像被固定了呢?其实这个输入是经过resize后固定的,任何输入图像都可以转化为448*448*3。但是确实是YoloV1把这个输入图像大小固定了,确实是局限了,但是后续的版本会进行改变。卷积神经网络的输入是不能变的(并不是因为conv层的影响,这个只是得出的特征图大小不一样,而是FC层,全连接层是定死的,由最后的conv再得到的FC的过程中的W权重参数矩阵是不能改变的)。

        中间的GoogleNet也不用了解了,用的不多,后面就是卷积神经网络,最终得出7*7*1024的特征图,然后全连接得到4096*1的矩阵,再全连接得到1470*1的矩阵,再reshape成为一个7*7*30(7*7*30=1470)的“特征”(左下角),这个7*7表示输出的是(7小网格*7小网格)的图像30表示每个小网格内有30个值,每一个网格预测出两个框B1(x1,y1,w1,h1,c1)(注:这里的x和y不是实际的坐标值,而是归一化后为0-1的相对于整个图像的相对值)和B2(x2,y2,w2,h2,c2),每个B有5个数据,两个B就有10个数据,这就是30的前10个数据,后20表示的20类别或20分类(这个分类个数是根据实际任务可以改变的),20个里面是判断为该类别的概率值。

        计算机是如何得到这个不同分类的概率值?因为我们会给一个损失函数,我们想要的就是损失函数最小的时候,计算机就会猜出每个值表示的是什么意思,怎么做会迎合这个损失值,使损失最小。

        含义总结:10=(X,Y,W,H,C)*B,最终得出(S*S)*(B*5+ClassesNumber)

3.3 损失函数

         位置误差:对于W,H加上根号的原因是对于大物体,检测框与真实框的差距假如是1单位,而对于小物体,检测框和真实框的差距也是1单位,这样小物体的差距实则是更大的,对于y=√x,值较小时切线斜率大,即数值小的时候,比较敏感。

         置信度误差:不含object目标的(背景)前有权重λnoobj是描述这一项的重要程度的,一般是0.1,表示这一项并不重要。

3.4 NMS非极大值抑制

         对于同一物体,可能会检测到很多的框,根据置信度排序,保留最大的。

3.5 YoloV1存在问题

        ①重合在一起的东西很难检测到。如右图假如狗的后旁边蹲着一只猫,同样的红色框,就难以检测到猫,即每个cell得到两个候选框,只预测一个类别。

        ②小物体检测不到,这个经验框一般都是比较大的物体,小物体检测不到。

;