我们所使用的目标检测,其实就是让机器在图片找到对应的目标,然后给图片上的目标套上一个框框,并贴上标签。比如如果图片上有人,就把人框起来并标注一个"person"。
使用深度学习进行目标检测的方法,通常分为两大模块,它们分别是:
它们之间的主要差别在于:one stage是经过一个卷积神经网络之后直接给出结果,two stage还得多给几个结果,反复验证一下。因此,two stage更准但是更慢,one stage更快但效果相对较差。
two stage的诞生还要早于one stage,而正是考虑到two stage虽然速度也不能算太慢,但用于实时监测的话还是有些勉强,所以one stage应运而生。
以下是我个人关于相关术语的通俗理解
precison = TP/(TP+FP),recall = TP/(TP+FN)
关于TP、FP这些,可以把字母拆开来理解。
例如T可以代表True,正确;F代表False,错误;P代表positives,正例,比如说当要给小鸟标上框框时,那么小鸟就是这一次检测的positives;N代表Negatives,负例,比如说我们这一次检测的目标是小猪,那么小猪以外的其他东西就都是负例。
举个例子:
一张图里有十只可爱的小动物,五只猪五只羊,我们的任务则是运用目标检测,检测出图里的所有猪。但是,最终只成功给三头猪打上了猪的框框,而且两头羊给打上了猪的标签。
这时让我们来计算这一次检测的precision与recall。
我们要检测的目标是猪,所以猪是正例,羊是负例。而有三头猪被打上了正确的标签,所以TP是3;有两头猪没有被打上正确的标签,说明这两头猪被判断成了负例,很明确判断错了,但是猪是正例,所以FN是2;羊是负例,但是有两头羊被判断成了正例,这个错了,所以FP是2。
所以我们可以得出recall的大小为3/5,表示一共有五个要检测的目标,但只测出了三个。
而precision按照我们通俗的理解去理解就行了。我们要测五个物体,对了仨错了俩,那么精度自然就是3/5。
综上所述:precision看的是对了多少,recall看的是全了没有。
YOLO算法是一个经典的one stage算法,它的英文全称是You Only Look Once,意思就是在神经网络过一遍就能直接出结果,快。
想要用YOLO算法进行目标检测,肯定需要给机器一个画面,没有目标的话肯定更别说检测了。而在进行检测之前,需要先搭建一个CNN网络,对图片进行卷积处理提取特征,然后再对目标进行检测,最终在原图上标框框打标签。
以下是一个大概的流程:
本文主要讲述的是通过YOLO进行目标检测,通过CNN网络进行卷积的过程这里就不一一细说了,我们在这里只需要理解成:一个图,经过了一个卷积神经网络的加工,然后利用特定的算法计算出了框框左上角的坐标和框框的长宽。
接下来让我们围绕以上这张图进行讲解。
我们首先要给CNN网络输入一个448x448x3的图,这里要注意,在YOLO_v1版本中,由于网络中还保留有全连接层,因此输入的图片必须得是448x448x3。
之后,图片会在CNN网络中经过加工,最终得到7x7x30的图。这时可以把加工后的图理解成一个长方体。7x7就是加工之后的图片被分成了七个方格,代表长方体的长和高;30则是各类特征,表示长方体的宽。
CNN网络在这里的作用就是,使图的特征浓缩,即削减图的广度,提升图的深度。用深度学习的专业术语,就是图的感受野变大了。那么,如果不把输入图给卷一卷的话会怎么样呢?
我打个比方。
假设张三只有一个孩子,那么当他关注孩子时,看到的自然只有这一个孩子,他所了解的有关自己孩子的信息自然都是这一个孩子的。
但如果张三有一百个孩子,他再关注孩子时,看到的肯定不只是一个孩子,他了解到的有关自己孩子的信息就变成了一百个。我们可以把这个类比成深度学习中感受野的增大。
也就是说,当张三对孩子的“感受野”比较小时,即孩子比较少时,他能准确地说出每个孩子的性格特点;但是当张三对孩子的“感受野”,即孩子很多以后,他就只能说出他的孩子们一些大概的性格特点和共同点,很难再详细地去关注每一个孩子了。
综上所述,我们可以理解为:**感受野大的时候,机器更容易标出较大的物体,但是很容易忽略较小的物体,反之亦然。**当然这个大小是相对我们观看的人而言的。就像对一个高中生来说,谈个恋爱可能就是人生的大事,因为高中生的“感受野”太小,只看得到这些。
对原始输入图片进行完卷积处理后,我们会得到一个7x7x30的图。之后便是画框框打标签的时候。
打框框时,每一格图片会分别标出两个比例不同的框,因为图片变成了7x7x30的格式,所以一共有49个格子,要标98个框。然后经过一系列筛选,最终选出了机器认为最合适的那个框框。
这里要提一下7x7x30中的那个30。上图“网络架构”那张图中,我们可以看到一个绿色长条,该条把30分成了5+5+20。其中,5指的是x,y,w,h,即一个框框左上角的坐标,和长宽,还有一个则是前面所提到的confidence:置信度 。两个5就表示每个格子的两个框框。其余的20,表示的是,在当前输入的数据中,一共有20个类别。 就是所谓的人,车,牛,羊这些要被标注的类别。
经过CNN网络后,剩下的步骤就是一个回归问题。输入了一个图,再根据特定的算法,找出需要x,y,w,h,confidence。
那这里就有一个问题了,我们要怎么确定我们运用的求出最终数值的算式是正确的呢?万一找出的这些数值不是我们想要的怎么办?这里和机器学习里的线性回归和逻辑回归一样,使用了损失函数。但损失函数的数值最小时,也就意味着误差最小。
每个公式前面那个符号,我们理解成每一个格子的每一个框都要进行一次计算就行了。像我们引用的例子,一共七七四十九个格子,所以一共九十八次计算。
各部分的误差计算也都是大同小异,都要算出预测值和真实值的差异值。
最终的结果是各部分值加起来。
位置误差:位置误差的计算要从x,y,w,h这四个数值下手。坐标也就是x和y的计算就是如图计算。w和h的计算要注意,这里给它们加上了根号。原因是为了让w和h在较小范围内变化时误差变化能明显一些(有兴趣的话可以看看√x的函数图像)。
置信度误差:这里的含不含object指的是当前格子标出来的框框里有没有包含那二十个种类里的某一类,也就是这一段是不是背景。至于为什么要把它们分开,是因为一张图里肯定是背景占了更大部分,而总误差的计算结果是把各部分误差加起来,如果不分开的话最终的计算会变得效果很差。
同时,为了达到更好的效果,还特地给不含object的置信度误差计算公式加上了权重参数,用于减小它的作用。
在含object的算式里,置信度的真实值被设置为1;在不含object的算式里,置信度的真实值被设置为0。
分类误差:这里就是概率值互减,比如要预测是不是恐龙,就求预测的是恐龙的概率和是恐龙的真实的概率的差异值。
优点:不用说自然是快了,人家就是为了实时检测开发出来的。
缺点:
而YOLO后续版本的开发,就是基于保持速度这一优势的同时,努力解决以上两个缺点。
一般来说,只要理解了v1,再理解YOLO后面的版本并不会太难。后续的版本并没有做什么太大的更多,更多是进行了部分的调整。接下来会谈一谈v2相比v1有所改进的地方。
在神经网络中,YOLO_v2舍弃了全连接层,加入了BN(Batch Normalization)层,对网络的每一层输入都做了归一化。这使得收敛更加容易,减少过拟合。
这一部分的改进可以理解为,一个年级的学生原先只有一次期末考试,但是在v2里加上了月考,会定期进行检测与调整。
输入图像的分辨率上有所调整。v1输入图像训练使用224x224,测试时是使用448X448,这很有可能导致模型“水土不服”。而v2在训练时又加上了十次448x448的微调。
网络结构的变化。以下是v2神经网络的部分图。
这里要注意,在网络中,v2实际输入的图像是416x416,经过五次降采样后,会得到一个13x13的图。图中的Maxpool意思就是进行了降采样。而在v2的网络中总共要进行五次降采样,每进行一次降采样,特征图个数会翻倍,图像规格会减半。因此输入图像的规格大小必须得是能被32整除的数。
先验框提取方式的改变。v2中使用聚类算法来提取先验框,v2里聚类算法的距离并不是一般的距离,而是让距离等于(1-IOU)。
Anchor Box。通过引入Anchor Box,使得能够检测的目标变多,是解决v1中一个小方格只能检测一个目标的一个方法。
框框的偏移。一般来说,把框框弄出来后肯定需要调整框框的位置,因为很难做到一开始就完全准确。v1版本的调整,是直接设置框框偏移的距离,而v2版本的偏移是设置相对于网格的偏移量。
v2版本会在每个小方格中通过聚类算法寻找到5个中心店,每个中心点会形成一个小框框,也就是说相比于v1,v2中每个小方格的框框要多了3个。如果直接设置偏移量的话,可能会发生中心店移动到小方格以外的情况。为了防止这样的情况发生,v2采用了相对网格偏移的方法。
如图,该中心点在横纵方向上都位于第二个方格,那么cx和cy的大小就是一个方格的长度,如果位于第三个方格的话,那么cx和cy的大小就是两个方格的长度,以此类推。
前面有提到,当感受野过大时,较小的物体会比较容易被忽略,这也是v2的网络会面临的问题。为了解决这个问题,v2不单单只会选取感受野最大的图,还会把结果得到的图与之前的图进行特征融合。
大概就是类似图里这样,把原本更大的切割成更小的并且长宽一致的,最后拼接。
三种scale的意思就是,把大、中、小三种物体分开检测。相比v2中的特征融合,这是一种更合理更科学的方式,差别大概就类似于,v3是大学里不同专业的人分开考试分开排名奖学金分开来算,v2就是所有专业的人混一起考试,v1就是只让个别人多的专业来考试。
不过就像现实中对于不同专业里拿奖学金的人的比例定的不同,v3中大、中、小三类物体也不会完全分开来。
这里要注意,物体的大、中、小指的是感受野的大小,而实际上感受野越大的图,规格反而会越小。正如前面所说,感受野越大,看到的就越多。就像现实中大多都是活得更久的老者见得更多来指导更年轻的人,v3中大物体会向中物体进行一个特征融合,中物体会向小物体进行一个特征融合。也就是说,我们得到的小物体的图和中物体的图,是有经历过特征融合的。
在物体检测任务中,同样一个物体可能会有多个不同的标签。例如一个人同时做了程序员和厨师,那么这个人就有了程序员和厨师这两种标签。而在v3的softmax层里,会将这类问题的检测转换为多个二分类问题,运用logistic激活函数来完成,用以检测是或不是。
v2的网络有19个卷积层。一般的说法是,层数越多,卷积的效果应该越好。但事实上到了十九层以后,卷积的总体效果反而有所下降。为解决这个问题,v3采用了残差链接。19层以后不可能每一层都是不好的,19层后就算总体再不好肯定也会有好的,就像一个城市里最差的高中,也都会几个能考上985211的。残差连接就是说,把好的跳出来,把坏的给舍弃。