「yolov3网络」yolov3网络模型改进
yolov3网络
yolov3网络模型改进
一文帮你搞定Yolov3我们知道传统机器学习中如果要预测出一条短信是否为垃圾短信,我们会把很多条短信拿来做训练样本,然后每条短信的标签是用0和1来标注他是否为垃圾短信。通过将这些训练样本及对应的标签输入到机器学习模型中,使得模型能够学习怎样判别一条短信是否为垃圾短信,从而当随便拿一条短信输入到模型中,就能判断这个短信是否为垃圾短信了。 Yolov3算法的训练方法与传统机器学习算法训练的本质是一样的。 Yolov3中用来训练的样本实际上是一群框,yolov3通过训练这群样本框,让模型能够学习到如何将这群样本框挪动位置来框住图片中真实的物体。从而当随便拿一张图片,yolov3都能将这张图片中的物体给框住,并判断其类别。 这群样本框是怎么定义的,这群框的样本标签又该如何定义,我们接下来给大家介绍。 Yolov3的多尺度预测 Yolov3通过对图片卷积提取特征后会得到三个尺度的feature map,这三个尺度的feature map分别是13*13,26*26,52*52.然后对每个feature map的每个cell下分配三个anchor box,anchor box的尺寸有(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)这九种。怎么把这9个anchor box分配给3个feature map.我们可以通过如下分析得到:(10*13),(16*30),(33*23)属于小尺度的anchor box,主要用于检测小尺寸的物体,而feature map中52*52的感受野最小,适合检测小的物体,所以把(10*13),(16*30),(33*23)分配给52*52的feature map,(30x61),(62x45),(59x119)属于中等尺度的anchor box,主要用于检测中等尺寸的物体,所以把他分配给26*26(负责检测中等尺寸物体的feature map),(116x90),(156x198),(373x326)属于较大尺度的anchor box,主要用于检测较大尺寸的物体,所以把他分配给13*13(负责检测较大尺寸物体的feature map)的feature map.将上述anchor box分配好后,我们可以利用公式计算出anchor box在原图中的位置。这群在三个feature map的每一个cell下的anchor box,实际上就是我们模型的训练样本。如果将这群anchor box都还原回原图,每张图片上差不多有1万多个anchor box.我们都知道训练样本是要有样本标签的,那么yolov3是如何给训练样本(这群anchor box)打上标签呢? 如何给样本打标签 但是每张图片上就有1万多个anchor box,而且一张图片上可能有多个gt box.gt box就是我们对图片中标记的样本框。如果每一个anchor box都要打上gt box的标签,就会有两个问题,其一:anchor box与gt box之间如何对应?其二:每一张图片有一万多anchor box要训练,yolov3算法效率岂不太低。 为此yolov3采用了中心负责制,即gt box中心落在哪个cell,就由该cell上面的某个anchor box用来负责预测该gt box中的物体。 注意:不是每个cell下面都有3个anchor box吗,为什么只由某个anchor box负责预测该gt box呢?其实,这也很好解释,如果对一堆anchor box做位置移动,使其接近gtbox。那么肯定是与gt box重合度高的anchor box在做适当的坐标修正后比较接近该gt box.因此,每个gt box都要与anchor box计算交并比,找到与其交并比最大的anchor box来负责预测该gt box. 那具体来说一下操作流程: 首先生成13*13*3*(80+5),26*26*3*(80+5),52*52*3(80+5)这样维度大小的三个零矩阵。 对训练样本图片做循环,在每次循环中再对gtbox做循环,在每次gtbox循环中再对9个anchor box做循环。举个例子,有10张图片,每张图片上有3个gtbox(这个gtbox就是我们对样本图片上的物体进行标注的框),用9个anchor box与gt box计算iou,找到最大的iou对应的anchor box.例如,第四个anchor box与gt box的iou最大,而我们已经知道第四个anchor box分配给了26*26的feature map.所以当前这个gt box中的物体由26*26这个feature map中某个cell中的anchor box负责预测。 怎么找到这个cell呢? 将gt box所在的原图image划分成26*26的网格,看gt box的中心落在哪个cell上,feature map上对应的那个cell就负责预测这个gtbox中的物体。假设中心落在第四行第三列上。 那么图片中该gtbox中的物体由26*26的feature map中的(4,3)的这个cell里面的第一个anchor box来预测。因此我们只用将该gtbox的坐标,类别,置信度填入该anchor box 对应的位置就好了,因为这是我们的anchor box要达到的目标。注意:我们填入的并不是gt box的坐标,而是gt box与anchorbox的坐标之间通过编码公式换算出来的一种值。而第二个anchor box与第三个anchor box不负责预测物体,所以全部填0. Yolov3的预测值 Yolov3中的预测值在3个feature map与3*3的filter卷积得到的结果中取得。以26*26的feature map为例,26*26*256的feature map和3*3*256*(3*85)做卷积运算,输出26*26*(3*85)的预测值.这个85中80是预测的anchor box中属于每一类别的概率,4是gtbox与anchor box之间的偏移量,1是置信度,是这个anchor box中有无物体的概率和anchor box与其对应的gt box之间iou的乘积。 损失计算 上面将yolov3的样本标签,及每个样本的预测值做了解释,接下来就是如何计算损失了。Yolov3的损失函数包括三部分,坐标损失,置信度损失和分类损失。把样本分为了正负样本。 通常我们把不需要负责预测物体的anchorbox称作负样本。负样本不需要计算坐标损失和分类损失,只需要计算置信度损失,而负样本的置信度的目标值是0,就是说我这个框的置信度目标的预测值接近0,就是让算法去学习让这个框不包含物体。 而把需要负责预测物体的anchorbox称作正样本,正样本需要计算坐标损失,置信度损失和分类损失。 正负样本的区分 在yolov3中我们把anchor box样本分为正样本,负样本和忽略样本。anchor box样本标签中置信度为1的anchor box,称为正样本,置信度为0的anchor box,称为负样本。忽略样本则是从负样本中抽取出来的,如何理解呢? 由于yolov3使用了多尺度预测,不同尺度的特征图之间可能会出现重复检测的部分。例如有一个物体狗的gt box在训练时与13*13的feature map中的某个anchor box对应。此时在训练模型的预测值中,恰好26*26的feature map中的某个anchor box与该gtbox的iou达到0.93。而模型中我们让这个anchor box的置信度标签为0,网络学习结果肯定会不理想。所以我们的处理办法是,将这种与gtbox之间 iou较大(大过设定的阈值,如0.5),但又不负责预测物体的anchor box称之为忽略样本,不纳入损失计算。 在负样本中挖掘出忽略样本的步骤如下: 让所有的预测的缩放比(tx,ty,tw,th)与对应的anchorbox 进行解码,得到对应的预测框,我们称为bbox. 让这些bbox与当前预测的图片上的所有gtbox (假设有v个)计算交并比,就可以让每个bbox有对应的v个分数。对每个预测框取v个分数中的最大值,即可以得到best_score,这个best_score就是与这个anchor box交并比最大的那个gt box,他们之间的交并比。 将anchor box置信度标签为0,但best_score>阈值的部分设置为忽略样本,不参与损失计算。 而anchor box置信度标签为0,但best_score<阈值的部分才是参与损失计算的负样本。 2.Yolov3的预测流程 预测流程: 模型输出三种尺度的预测结果,分别为13*13*3*(80+5),26*26*3*(80+5),52*52*3(80+5)。此处以batch*13*13*(3*85)为例进行说明。 将输出的batch*13*13*(3*85),用输出的置信度和类别概率相乘,得到筛选各个bbox框的score值。 对筛选的物体检测框,进行非极大值抑制算法来删掉对同一类物体重合度较高的框,然后选出最后的最优框。 非极大值抑制的计算步骤: 1:设置阈值 2:对每类对象 2.1:选取该类中概率最大的框,然后用这个框与该类中的其他框计算iou,iou大于阈值则剔除,把这个最大的框放入输出列表中,这个最大的框也剔除出去 2.2:在余下的该类框中再选出概率最大的框,重复2.1的操作 2.3:返回步骤2,继续下一类对象

我们知道传统机器学习中如果要预测出一条短信是否为垃圾短信,我们会把很多条短信拿来做训练样本,然后每条短信的标签是用0和1来标注他是否为垃圾短信。通过将这些训练样本及对应的标签输入到机器学习模型中,使得模型能够学习怎样判别一条短信是否为垃圾短信,从而当随便拿一条短信输入到模型中,就能判断这个短信是否为垃圾短信了。 Yolov3算法的训练方法与传统机器学习算法训练的本质是一样的。 Yolov3中用来训练的样本实际上是一群框,yolov3通过训练这群样本框,让模型能够学习到如何将这群样本框挪动位置来框住图片中真实的物体。从而当随便拿一张图片,yolov3都能将这张图片中的物体给框住,并判断其类别。 这群样本框是怎么定义的,这群框的样本标签又该如何定义,我们接下来给大家介绍。 Yolov3的多尺度预测 Yolov3通过对图片卷积提取特征后会得到三个尺度的feature map,这三个尺度的feature map分别是13*13,26*26,52*52.然后对每个feature map的每个cell下分配三个anchor box,anchor box的尺寸有(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)这九种。怎么把这9个anchor box分配给3个feature map.我们可以通过如下分析得到:(10*13),(16*30),(33*23)属于小尺度的anchor box,主要用于检测小尺寸的物体,而feature map中52*52的感受野最小,适合检测小的物体,所以把(10*13),(16*30),(33*23)分配给52*52的feature map,(30x61),(62x45),(59x119)属于中等尺度的anchor box,主要用于检测中等尺寸的物体,所以把他分配给26*26(负责检测中等尺寸物体的feature map),(116x90),(156x198),(373x326)属于较大尺度的anchor box,主要用于检测较大尺寸的物体,所以把他分配给13*13(负责检测较大尺寸物体的feature map)的feature map.将上述anchor box分配好后,我们可以利用公式计算出anchor box在原图中的位置。这群在三个feature map的每一个cell下的anchor box,实际上就是我们模型的训练样本。如果将这群anchor box都还原回原图,每张图片上差不多有1万多个anchor box.我们都知道训练样本是要有样本标签的,那么yolov3是如何给训练样本(这群anchor box)打上标签呢? 如何给样本打标签 但是每张图片上就有1万多个anchor box,而且一张图片上可能有多个gt box.gt box就是我们对图片中标记的样本框。如果每一个anchor box都要打上gt box的标签,就会有两个问题,其一:anchor box与gt box之间如何对应?其二:每一张图片有一万多anchor box要训练,yolov3算法效率岂不太低。 为此yolov3采用了中心负责制,即gt box中心落在哪个cell,就由该cell上面的某个anchor box用来负责预测该gt box中的物体。 注意:不是每个cell下面都有3个anchor box吗,为什么只由某个anchor box负责预测该gt box呢?其实,这也很好解释,如果对一堆anchor box做位置移动,使其接近gtbox。那么肯定是与gt box重合度高的anchor box在做适当的坐标修正后比较接近该gt box.因此,每个gt box都要与anchor box计算交并比,找到与其交并比最大的anchor box来负责预测该gt box. 那具体来说一下操作流程: 首先生成13*13*3*(80+5),26*26*3*(80+5),52*52*3(80+5)这样维度大小的三个零矩阵。 对训练样本图片做循环,在每次循环中再对gtbox做循环,在每次gtbox循环中再对9个anchor box做循环。举个例子,有10张图片,每张图片上有3个gtbox(这个gtbox就是我们对样本图片上的物体进行标注的框),用9个anchor box与gt box计算iou,找到最大的iou对应的anchor box.例如,第四个anchor box与gt box的iou最大,而我们已经知道第四个anchor box分配给了26*26的feature map.所以当前这个gt box中的物体由26*26这个feature map中某个cell中的anchor box负责预测。 怎么找到这个cell呢? 将gt box所在的原图image划分成26*26的网格,看gt box的中心落在哪个cell上,feature map上对应的那个cell就负责预测这个gtbox中的物体。假设中心落在第四行第三列上。 那么图片中该gtbox中的物体由26*26的feature map中的(4,3)的这个cell里面的第一个anchor box来预测。因此我们只用将该gtbox的坐标,类别,置信度填入该anchor box 对应的位置就好了,因为这是我们的anchor box要达到的目标。注意:我们填入的并不是gt box的坐标,而是gt box与anchorbox的坐标之间通过编码公式换算出来的一种值。而第二个anchor box与第三个anchor box不负责预测物体,所以全部填0. Yolov3的预测值 Yolov3中的预测值在3个feature map与3*3的filter卷积得到的结果中取得。以26*26的feature map为例,26*26*256的feature map和3*3*256*(3*85)做卷积运算,输出26*26*(3*85)的预测值.这个85中80是预测的anchor box中属于每一类别的概率,4是gtbox与anchor box之间的偏移量,1是置信度,是这个anchor box中有无物体的概率和anchor box与其对应的gt box之间iou的乘积。 损失计算 上面将yolov3的样本标签,及每个样本的预测值做了解释,接下来就是如何计算损失了。Yolov3的损失函数包括三部分,坐标损失,置信度损失和分类损失。把样本分为了正负样本。 通常我们把不需要负责预测物体的anchorbox称作负样本。负样本不需要计算坐标损失和分类损失,只需要计算置信度损失,而负样本的置信度的目标值是0,就是说我这个框的置信度目标的预测值接近0,就是让算法去学习让这个框不包含物体。 而把需要负责预测物体的anchorbox称作正样本,正样本需要计算坐标损失,置信度损失和分类损失。 正负样本的区分 在yolov3中我们把anchor box样本分为正样本,负样本和忽略样本。anchor box样本标签中置信度为1的anchor box,称为正样本,置信度为0的anchor box,称为负样本。忽略样本则是从负样本中抽取出来的,如何理解呢? 由于yolov3使用了多尺度预测,不同尺度的特征图之间可能会出现重复检测的部分。例如有一个物体狗的gt box在训练时与13*13的feature map中的某个anchor box对应。此时在训练模型的预测值中,恰好26*26的feature map中的某个anchor box与该gtbox的iou达到0.93。而模型中我们让这个anchor box的置信度标签为0,网络学习结果肯定会不理想。所以我们的处理办法是,将这种与gtbox之间 iou较大(大过设定的阈值,如0.5),但又不负责预测物体的anchor box称之为忽略样本,不纳入损失计算。 在负样本中挖掘出忽略样本的步骤如下: 让所有的预测的缩放比(tx,ty,tw,th)与对应的anchorbox 进行解码,得到对应的预测框,我们称为bbox. 让这些bbox与当前预测的图片上的所有gtbox (假设有v个)计算交并比,就可以让每个bbox有对应的v个分数。对每个预测框取v个分数中的最大值,即可以得到best_score,这个best_score就是与这个anchor box交并比最大的那个gt box,他们之间的交并比。 将anchor box置信度标签为0,但best_score>阈值的部分设置为忽略样本,不参与损失计算。 而anchor box置信度标签为0,但best_score<阈值的部分才是参与损失计算的负样本。 2.Yolov3的预测流程 预测流程: 模型输出三种尺度的预测结果,分别为13*13*3*(80+5),26*26*3*(80+5),52*52*3(80+5)。此处以batch*13*13*(3*85)为例进行说明。 将输出的batch*13*13*(3*85),用输出的置信度和类别概率相乘,得到筛选各个bbox框的score值。 对筛选的物体检测框,进行非极大值抑制算法来删掉对同一类物体重合度较高的框,然后选出最后的最优框。 非极大值抑制的计算步骤: 1:设置阈值 2:对每类对象 2.1:选取该类中概率最大的框,然后用这个框与该类中的其他框计算iou,iou大于阈值则剔除,把这个最大的框放入输出列表中,这个最大的框也剔除出去 2.2:在余下的该类框中再选出概率最大的框,重复2.1的操作 2.3:返回步骤2,继续下一类对象

关于YOLOv3的一些细节本文是我对YOLO算法的细节理解总结,本文的阅读前提是已读过YOLO相关论文,文中不会谈及YOLO的发展过程,不会与其他对象检测算法进行对比,也不会介绍YOLO9000相关的内容,只总结YOLOv3算法的具体流程和实现细节。所以,下文中所有提到的YOLO,如非特别说明,均指YOLOv3。 如果需要了解更多对象检测算法,可以参考以下部分相关论文:R-CNNFast R-CNNFaster R-CNNSSDYOLOv1YOLOv2YOLOv3RetinaNet最新关于对象检测的综述文献可以参考这篇论文:Deep Learning for Generic Object Detection: A Survey 在YOLO算法发表之前,大部分表现比较好的对象检测(Object Detection)算法都是以R-CNN为代表两阶段算法,这样的算法存在一个很明显的问题,那就是速度太慢,对于实时性要求很高的应用场景是不适用的。YOLO算法的作者没有走优化算法第一阶段或者第二阶段的老路子,而是直接提出一步完成预测,而且是在一个CNN网络模型中完成图片中所有位置对象的box和类别预测,推理速度大大提升,完全可以满足实时对象检测。 YOLO算法创新性地提出了将输入图片进行N*N的栅格化(每个小单元叫grid cell),然后将图片中某个对象的位置的预测任务交与该对象中心位置所在的grid cell的bouding box。简单理解的话,可以认为这也是一种很粗糙的区域推荐(region proposal),在训练的时候,我们通过grid cell的方式告诉模型,图片中对象A应该是由中心落在特定grid cell 的某个范围内的某些像素组成,模型接收到这些信息后就在grid cell周围以一定大小范围去寻找所有满足对象A特征的像素,经过很多次带惩罚的尝试训练后,它就能找到这个准确的范围了(说明不是瞎找,如滑动窗口),当然这个方位不仅是指长宽的大小范围,也包括小幅度的中心位置坐标变化,但是不管怎么变,中心位置不能越过该grid cell的范围。这大大限制了模型在图片中瞎找时做的无用功。这样将位置检测和类别识别结合到一个CNN网络中预测,即只需要扫描一遍(you only look once)图片就能推理出图片中所有对象的位置信息和类别。举例如下图。 以上是我个人理解的YOLO算法的核心思想,不管是YOLOv1还是v2、v3,其主要的核心还是以上所述,只是在bounding box的拟合方式、骨干网络的设计、模型训练的稳定性、精度方面有所提升罢了。下面对整个模型的网络结构、实现和训练细节进行阐述。 既然已经有了you only look once的想法,那接下来就要将这个想法数学化,这样才能用数学的方法训练模型学习拟合坐标和类别的特征,用于后期的预测。YOLO算法几乎是输入原图就直接预测出每个grid cell“附近”是否有某个对象和具体的 box位置,那最终这个想法数学化后便体现在loss函数上,这里我先不给出loss函数的具体公式,因为在提出loss函数之前要先了解三个概念:anchor box、置信度(confidence)和对象条件类别概率(conditional class probabilities)。作者提出,在网络最后的输出中,对于每个grid cell对应bounding box的输出有三类参数:一个是对象的box参数,一共是四个值,即box的中心点坐标(x,y)和box的宽和高(w,h);一个是置信度,这是个区间在[0,1]之间的值;最后一个是一组条件类别概率,都是区间在[0,1]之间的值,代表概率。下面分别具体介绍这三个参数的意义。 anchor box最初是由Faster RCNN引入的。anchor box(论文中也称为bounding box prior,后面均使用anchor box)其实就是从训练集的所有ground truth box中统计(使用k-means)出来的在训练集中最经常出现的几个box形状和尺寸。比如,在某个训练集中最常出现的box形状有扁长的、瘦高的和宽高比例差不多的正方形这三种形状。我们可以预先将这些统计上的先验(或来自人类的)经验加入到模型中,这样模型在学习的时候,瞎找的可能性就更小了些,当然就有助于模型快速收敛了。以前面提到的训练数据集中的ground truth box最常出现的三个形状为例,当模型在训练的时候我们可以告诉它,你要在grid cell 1附件找出的对象的形状要么是扁长的、要么是瘦高的、要么是长高比例差不多的正方形,你就不要再瞎试其他的形状了。anchor box其实就是对预测的对象范围进行约束,并加入了尺寸先验经验,从而可以有效解决对象多尺度的问题(Faster RCNN论文中指出的作用)。 这篇文章 对anchor box的作用进行了另外的解释,个人觉得也很有道理,将部分内容翻译如下: 要在模型中使用这些形状,总不能告诉模型有个形状是瘦高的,还有一个是矮胖的,我们需要量化这些形状。YOLO的做法是想办法找出分别代表这些形状的宽和高,有了宽和高,尺寸比例即形状不就有了。YOLO作者的办法是使用k-means算法在训练集中所有样本的ground truth box中聚类出具有代表性形状的宽和高,作者将这种方法称作维度聚类(dimension cluster)。细心的读者可能会提出这个问题:到底找出几个anchor box算是最佳的具有代表性的形状。YOLO作者方法是做实验,聚类出多个数量不同anchor box组,分别应用到模型中,最终找出最优的在模型的复杂度和高召回率(high recall)之间折中的那组anchor box。作者在COCO数据集中使用了9个anchor box,我们前面提到的例子则有3个anchor box。 那么有了量化的anchor box后,怎么在实际的模型中加入anchor box的先验经验呢?我们在前面中简单提到过最终负责预测grid cell中对象的box的最小单元是bounding box,那我们可以让一个grid cell输出(预测)多个bounding box,然后每个bounding box负责预测不同的形状不就行了?比如前面例子中的3个不同形状的anchor box,我们的一个grid cell会输出3个参数相同的bounding box,第一个bounding box负责预测的形状与anchor box 1类似的box,其他两个bounding box依次类推。作者在YOLOv3中取消了v2之前每个grid cell只负责预测一个对象的限制,也就是说grid cell中的三个bounding box都可以预测对象,当然他们应该对应不同的ground truth。那么如何在训练中确定哪个bounding box负责某个ground truth呢?方法是求出每个grid cell中每个anchor box与ground truth box的IOU(交并比),IOU最大的anchor box对应的bounding box就负责预测该ground truth,也就是对应的对象,后面还会提到负责预测的问题。 到此,还有最后一个问题需要解决,我们才能真正在训练中使用anchor box,那就是我们怎么告诉模型第一个bounding box负责预测的形状与anchor box 1类似,第二个bounding box负责预测的形状与anchor box 2类似?YOLO的做法是不让bounding box直接预测实际box的宽和高(w,h),而是将预测的宽和高分别与anchor box的宽和高绑定,这样不管一开始bounding box输出的(w,h)是怎样的,经过转化后都是与anchor box的宽和高相关,这样经过很多次惩罚训练后,每个bounding box就知道自己该负责怎样形状的box预测了。这个绑定的关系是什么?那就是下面这个公式: 其中,和为anchor box的宽和高,和为bounding box直接预测出的宽和高,和为转换后预测的实际宽和高,这也就是最终预测中输出的宽和高。你可能会想,这个公式这么麻烦,为什么不能用 这样的公式,我的理解是上面的公式虽然计算起来比较麻烦,但是在误差函数求导后还带有和参数,而且也好求导 (此观点只是个人推测,需要进一步查证) 。 既然提到了最终预测的宽和高公式,那我们也就直接带出最终预测输出的box中心坐标的计算公式,我们前面提到过box中心坐标总是落在相应的grid cell中的,所以bounding box直接预测出的和也是相对grid cell来说的,要想转换成最终输出的绝对坐标,需要下面的转换公式: 其中,为sigmoid函数,和分别为grid cell方格左上角点相对整张图片的坐标。作者使用这样的转换公式主要是因为在训练时如果没有将和压缩到(0,1)区间内的话,模型在训练前期很难收敛。最终可以得出实际输出的box参数公式如下,这个也是在推理时将输出转换为最终推理结果的公式: 关于box参数的转换还有一点值得一提,作者在训练中并不是将、、和转换为、、和后与ground truth box的对应参数求误差,而是使用上述公式的逆运算将ground truth box的参数转换为与、、和对应的、、和,然后再计算误差,计算中由于sigmoid函数的反函数难计算,所以并没有计算sigmoid的反函数,而是计算输出对应的sigmoid函数值。 关于anchor box训练相关的问题除了与loss函数相关的基本上都解释清楚了,但是预测的问题还没有解释清楚,还存在一个很关键的问题:在训练中我们挑选哪个bounding box的准则是选择预测的box与ground truth box的IOU最大的bounding box做为最优的box,但是在预测中并没有ground truth box,怎么才能挑选最优的bounding box呢?这就需要另外的参数了,那就是下面要说到的置信度。 置信度是每个bounding box输出的其中一个重要参数,作者对他的作用定义有两重:一重是代表当前box是否有对象的概率,注意,是对象,不是某个类别的对象,也就是说它用来说明当前box内只是个背景(backgroud)还是有某个物体(对象);另一重表示当前的box有对象时,它自己预测的box与物体真实的box可能的的值,注意,这里所说的物体真实的box实际是不存在的,这只是模型表达自己框出了物体的自信程度。以上所述,也就不难理解作者为什么将其称之为置信度了,因为不管哪重含义,都表示一种自信程度:框出的box内确实有物体的自信程度和框出的box将整个物体的所有特征都包括进来的自信程度。经过以上的解释,其实我们也就可以用数学形式表示置信度的定义了: 其中,表示第i个grid cell的第j个bounding box的置信度。对于如何训练的方法,在损失函数小节中说明。 对象条件类别概率是一组概率的数组,数组的长度为当前模型检测的类别种类数量,它的意义是当bounding box认为当前box中有对象时,要检测的所有类别中每种类别的概率,其实这个和分类模型最后使用softmax函数输出的一组类别概率是类似的,只是二者存在两点不同:1.YOLO的对象类别概率中没有background一项,也不需要,因为对background的预测已经交给置信度了,所以它的输出是有条件的,那就是在置信度表示当前box有对象的前提下,所以条件概率的数学形式为;2.分类模型中最后输出之前使用softmax求出每个类别的概率,也就是说各个类别之间是互斥的,而YOLOv3算法的每个类别概率是单独用逻辑回归函数(sigmoid函数)计算得出了,所以每个类别不必是互斥的,也就是说一个对象可以被预测出多个类别。这个想法其实是有一些YOLO9000的意思的,因为YOLOv3已经有9000类似的功能,不同只是不能像9000一样,同时使用分类数据集和对象检测数据集,且类别之间的词性是有从属关系的。 介绍完所有的输出参数后,我们总结下模型最终输出层的输出维数是多少。假如一个图片被分割成S*S个grid cell,我们有B个anchor box,也就是说每个grid cell有B个bounding box, 每个bounding box内有4个位置参数,1个置信度,classes个类别概率,那么最终的输出维数是:。 介绍完模型最终输出中有哪些参数后,我们应该可以定义loss函数了,作者使用了最简单的差平方和误差(sum-squared error),使用的原因很简单,因为好优化。那我们试着给出loss函数的公式: 如果看过YOLOv1的论文你会发现,这里的公式和论文中的公式虽然相似,但是差别还是很大的。其实,作者是在上面这个公式的基础上加了很多限制和优化参数,上面的公式只是我为了更好说明YOLO的loss公式而给出的对比公式,这样有助于更好的理解YOLO的loss函数公式中加入的每个参数的意义,下面给出真正的YOLO loss函数公式(这个公式是我根据YOLO三篇论文前后的发展总结出来的,v3论文中未给出此类似的公式): 细心的你一定也注意到了,这个公式和YOLOv1论文中的公式是不一样的。那是因为在YOLOv3中,作者将置信度和条件类别概率放到了每个bounding box中,即每个bounding box都有一对置信度和条件类别概率,而v1中所有的bounding box共用一个条件类别概率,上文中在说明输出的各个参数时,默认解释的是v3的输出格式,关于v1的细节不再赘述。下面几点是loss函数的几点细节: YOLO算法从三个不同的尺寸预测对象box,这三个不同的尺寸来自不同层级的卷积层的输出。该方法借鉴了feature pyramid network的思想: 由于卷积层每隔几层,特征映射(feature mapping)的宽和高就会减少,而通道数会增加,随着网络层次的加深,特征映射组成的形状类似于金字塔,如果将不同层级的特征映射转换为最终的输出,那么将有助于提升模型在对象不同尺度大小上的表现,即有助于提高模型从小目标到大目标的综合检测(box的精度)能力,关于feature pyramid network的具体内容,此处不详细展开,可参考 论文 。我们先看下YOLO模型的网络结构,我们以检测COCO数据集输入尺寸为416*416的网络结构为例(COCO数据集类别数为80,anchor box总数为9): 从上面的模型的网络结构图我们可以明显看出基于darknet-53的最新的模型结构有以下几个特点: 以上,就是我个人理解的YOLO算法的一些细节。 作者能力有限,不正确之处欢迎斧正。

本文是我对YOLO算法的细节理解总结,本文的阅读前提是已读过YOLO相关论文,文中不会谈及YOLO的发展过程,不会与其他对象检测算法进行对比,也不会介绍YOLO9000相关的内容,只总结YOLOv3算法的具体流程和实现细节。所以,下文中所有提到的YOLO,如非特别说明,均指YOLOv3。 如果需要了解更多对象检测算法,可以参考以下部分相关论文:R-CNNFast R-CNNFaster R-CNNSSDYOLOv1YOLOv2YOLOv3RetinaNet最新关于对象检测的综述文献可以参考这篇论文:Deep Learning for Generic Object Detection: A Survey 在YOLO算法发表之前,大部分表现比较好的对象检测(Object Detection)算法都是以R-CNN为代表两阶段算法,这样的算法存在一个很明显的问题,那就是速度太慢,对于实时性要求很高的应用场景是不适用的。YOLO算法的作者没有走优化算法第一阶段或者第二阶段的老路子,而是直接提出一步完成预测,而且是在一个CNN网络模型中完成图片中所有位置对象的box和类别预测,推理速度大大提升,完全可以满足实时对象检测。 YOLO算法创新性地提出了将输入图片进行N*N的栅格化(每个小单元叫grid cell),然后将图片中某个对象的位置的预测任务交与该对象中心位置所在的grid cell的bouding box。简单理解的话,可以认为这也是一种很粗糙的区域推荐(region proposal),在训练的时候,我们通过grid cell的方式告诉模型,图片中对象A应该是由中心落在特定grid cell 的某个范围内的某些像素组成,模型接收到这些信息后就在grid cell周围以一定大小范围去寻找所有满足对象A特征的像素,经过很多次带惩罚的尝试训练后,它就能找到这个准确的范围了(说明不是瞎找,如滑动窗口),当然这个方位不仅是指长宽的大小范围,也包括小幅度的中心位置坐标变化,但是不管怎么变,中心位置不能越过该grid cell的范围。这大大限制了模型在图片中瞎找时做的无用功。这样将位置检测和类别识别结合到一个CNN网络中预测,即只需要扫描一遍(you only look once)图片就能推理出图片中所有对象的位置信息和类别。举例如下图。 以上是我个人理解的YOLO算法的核心思想,不管是YOLOv1还是v2、v3,其主要的核心还是以上所述,只是在bounding box的拟合方式、骨干网络的设计、模型训练的稳定性、精度方面有所提升罢了。下面对整个模型的网络结构、实现和训练细节进行阐述。 既然已经有了you only look once的想法,那接下来就要将这个想法数学化,这样才能用数学的方法训练模型学习拟合坐标和类别的特征,用于后期的预测。YOLO算法几乎是输入原图就直接预测出每个grid cell“附近”是否有某个对象和具体的 box位置,那最终这个想法数学化后便体现在loss函数上,这里我先不给出loss函数的具体公式,因为在提出loss函数之前要先了解三个概念:anchor box、置信度(confidence)和对象条件类别概率(conditional class probabilities)。作者提出,在网络最后的输出中,对于每个grid cell对应bounding box的输出有三类参数:一个是对象的box参数,一共是四个值,即box的中心点坐标(x,y)和box的宽和高(w,h);一个是置信度,这是个区间在[0,1]之间的值;最后一个是一组条件类别概率,都是区间在[0,1]之间的值,代表概率。下面分别具体介绍这三个参数的意义。 anchor box最初是由Faster RCNN引入的。anchor box(论文中也称为bounding box prior,后面均使用anchor box)其实就是从训练集的所有ground truth box中统计(使用k-means)出来的在训练集中最经常出现的几个box形状和尺寸。比如,在某个训练集中最常出现的box形状有扁长的、瘦高的和宽高比例差不多的正方形这三种形状。我们可以预先将这些统计上的先验(或来自人类的)经验加入到模型中,这样模型在学习的时候,瞎找的可能性就更小了些,当然就有助于模型快速收敛了。以前面提到的训练数据集中的ground truth box最常出现的三个形状为例,当模型在训练的时候我们可以告诉它,你要在grid cell 1附件找出的对象的形状要么是扁长的、要么是瘦高的、要么是长高比例差不多的正方形,你就不要再瞎试其他的形状了。anchor box其实就是对预测的对象范围进行约束,并加入了尺寸先验经验,从而可以有效解决对象多尺度的问题(Faster RCNN论文中指出的作用)。 这篇文章 对anchor box的作用进行了另外的解释,个人觉得也很有道理,将部分内容翻译如下: 要在模型中使用这些形状,总不能告诉模型有个形状是瘦高的,还有一个是矮胖的,我们需要量化这些形状。YOLO的做法是想办法找出分别代表这些形状的宽和高,有了宽和高,尺寸比例即形状不就有了。YOLO作者的办法是使用k-means算法在训练集中所有样本的ground truth box中聚类出具有代表性形状的宽和高,作者将这种方法称作维度聚类(dimension cluster)。细心的读者可能会提出这个问题:到底找出几个anchor box算是最佳的具有代表性的形状。YOLO作者方法是做实验,聚类出多个数量不同anchor box组,分别应用到模型中,最终找出最优的在模型的复杂度和高召回率(high recall)之间折中的那组anchor box。作者在COCO数据集中使用了9个anchor box,我们前面提到的例子则有3个anchor box。 那么有了量化的anchor box后,怎么在实际的模型中加入anchor box的先验经验呢?我们在前面中简单提到过最终负责预测grid cell中对象的box的最小单元是bounding box,那我们可以让一个grid cell输出(预测)多个bounding box,然后每个bounding box负责预测不同的形状不就行了?比如前面例子中的3个不同形状的anchor box,我们的一个grid cell会输出3个参数相同的bounding box,第一个bounding box负责预测的形状与anchor box 1类似的box,其他两个bounding box依次类推。作者在YOLOv3中取消了v2之前每个grid cell只负责预测一个对象的限制,也就是说grid cell中的三个bounding box都可以预测对象,当然他们应该对应不同的ground truth。那么如何在训练中确定哪个bounding box负责某个ground truth呢?方法是求出每个grid cell中每个anchor box与ground truth box的IOU(交并比),IOU最大的anchor box对应的bounding box就负责预测该ground truth,也就是对应的对象,后面还会提到负责预测的问题。 到此,还有最后一个问题需要解决,我们才能真正在训练中使用anchor box,那就是我们怎么告诉模型第一个bounding box负责预测的形状与anchor box 1类似,第二个bounding box负责预测的形状与anchor box 2类似?YOLO的做法是不让bounding box直接预测实际box的宽和高(w,h),而是将预测的宽和高分别与anchor box的宽和高绑定,这样不管一开始bounding box输出的(w,h)是怎样的,经过转化后都是与anchor box的宽和高相关,这样经过很多次惩罚训练后,每个bounding box就知道自己该负责怎样形状的box预测了。这个绑定的关系是什么?那就是下面这个公式: 其中,和为anchor box的宽和高,和为bounding box直接预测出的宽和高,和为转换后预测的实际宽和高,这也就是最终预测中输出的宽和高。你可能会想,这个公式这么麻烦,为什么不能用 这样的公式,我的理解是上面的公式虽然计算起来比较麻烦,但是在误差函数求导后还带有和参数,而且也好求导 (此观点只是个人推测,需要进一步查证) 。 既然提到了最终预测的宽和高公式,那我们也就直接带出最终预测输出的box中心坐标的计算公式,我们前面提到过box中心坐标总是落在相应的grid cell中的,所以bounding box直接预测出的和也是相对grid cell来说的,要想转换成最终输出的绝对坐标,需要下面的转换公式: 其中,为sigmoid函数,和分别为grid cell方格左上角点相对整张图片的坐标。作者使用这样的转换公式主要是因为在训练时如果没有将和压缩到(0,1)区间内的话,模型在训练前期很难收敛。最终可以得出实际输出的box参数公式如下,这个也是在推理时将输出转换为最终推理结果的公式: 关于box参数的转换还有一点值得一提,作者在训练中并不是将、、和转换为、、和后与ground truth box的对应参数求误差,而是使用上述公式的逆运算将ground truth box的参数转换为与、、和对应的、、和,然后再计算误差,计算中由于sigmoid函数的反函数难计算,所以并没有计算sigmoid的反函数,而是计算输出对应的sigmoid函数值。 关于anchor box训练相关的问题除了与loss函数相关的基本上都解释清楚了,但是预测的问题还没有解释清楚,还存在一个很关键的问题:在训练中我们挑选哪个bounding box的准则是选择预测的box与ground truth box的IOU最大的bounding box做为最优的box,但是在预测中并没有ground truth box,怎么才能挑选最优的bounding box呢?这就需要另外的参数了,那就是下面要说到的置信度。 置信度是每个bounding box输出的其中一个重要参数,作者对他的作用定义有两重:一重是代表当前box是否有对象的概率,注意,是对象,不是某个类别的对象,也就是说它用来说明当前box内只是个背景(backgroud)还是有某个物体(对象);另一重表示当前的box有对象时,它自己预测的box与物体真实的box可能的的值,注意,这里所说的物体真实的box实际是不存在的,这只是模型表达自己框出了物体的自信程度。以上所述,也就不难理解作者为什么将其称之为置信度了,因为不管哪重含义,都表示一种自信程度:框出的box内确实有物体的自信程度和框出的box将整个物体的所有特征都包括进来的自信程度。经过以上的解释,其实我们也就可以用数学形式表示置信度的定义了: 其中,表示第i个grid cell的第j个bounding box的置信度。对于如何训练的方法,在损失函数小节中说明。 对象条件类别概率是一组概率的数组,数组的长度为当前模型检测的类别种类数量,它的意义是当bounding box认为当前box中有对象时,要检测的所有类别中每种类别的概率,其实这个和分类模型最后使用softmax函数输出的一组类别概率是类似的,只是二者存在两点不同:1.YOLO的对象类别概率中没有background一项,也不需要,因为对background的预测已经交给置信度了,所以它的输出是有条件的,那就是在置信度表示当前box有对象的前提下,所以条件概率的数学形式为;2.分类模型中最后输出之前使用softmax求出每个类别的概率,也就是说各个类别之间是互斥的,而YOLOv3算法的每个类别概率是单独用逻辑回归函数(sigmoid函数)计算得出了,所以每个类别不必是互斥的,也就是说一个对象可以被预测出多个类别。这个想法其实是有一些YOLO9000的意思的,因为YOLOv3已经有9000类似的功能,不同只是不能像9000一样,同时使用分类数据集和对象检测数据集,且类别之间的词性是有从属关系的。 介绍完所有的输出参数后,我们总结下模型最终输出层的输出维数是多少。假如一个图片被分割成S*S个grid cell,我们有B个anchor box,也就是说每个grid cell有B个bounding box, 每个bounding box内有4个位置参数,1个置信度,classes个类别概率,那么最终的输出维数是:。 介绍完模型最终输出中有哪些参数后,我们应该可以定义loss函数了,作者使用了最简单的差平方和误差(sum-squared error),使用的原因很简单,因为好优化。那我们试着给出loss函数的公式: 如果看过YOLOv1的论文你会发现,这里的公式和论文中的公式虽然相似,但是差别还是很大的。其实,作者是在上面这个公式的基础上加了很多限制和优化参数,上面的公式只是我为了更好说明YOLO的loss公式而给出的对比公式,这样有助于更好的理解YOLO的loss函数公式中加入的每个参数的意义,下面给出真正的YOLO loss函数公式(这个公式是我根据YOLO三篇论文前后的发展总结出来的,v3论文中未给出此类似的公式): 细心的你一定也注意到了,这个公式和YOLOv1论文中的公式是不一样的。那是因为在YOLOv3中,作者将置信度和条件类别概率放到了每个bounding box中,即每个bounding box都有一对置信度和条件类别概率,而v1中所有的bounding box共用一个条件类别概率,上文中在说明输出的各个参数时,默认解释的是v3的输出格式,关于v1的细节不再赘述。下面几点是loss函数的几点细节: YOLO算法从三个不同的尺寸预测对象box,这三个不同的尺寸来自不同层级的卷积层的输出。该方法借鉴了feature pyramid network的思想: 由于卷积层每隔几层,特征映射(feature mapping)的宽和高就会减少,而通道数会增加,随着网络层次的加深,特征映射组成的形状类似于金字塔,如果将不同层级的特征映射转换为最终的输出,那么将有助于提升模型在对象不同尺度大小上的表现,即有助于提高模型从小目标到大目标的综合检测(box的精度)能力,关于feature pyramid network的具体内容,此处不详细展开,可参考 论文 。我们先看下YOLO模型的网络结构,我们以检测COCO数据集输入尺寸为416*416的网络结构为例(COCO数据集类别数为80,anchor box总数为9): 从上面的模型的网络结构图我们可以明显看出基于darknet-53的最新的模型结构有以下几个特点: 以上,就是我个人理解的YOLO算法的一些细节。 作者能力有限,不正确之处欢迎斧正。

YOLOv3 深入理解YOLOv3没有太多的创新,主要是借鉴一些好的方案融合到YOLO里面。不过效果还是不错的,在保持速度优势的前提下,提升了预测精度,尤其是加强了对小物体的识别能力。 本文主要讲v3的改进,由于是以v1和v2为基础,关于YOLO1和YOLO2的部分析请移步 YOLO v1深入理解和YOLOv2 / YOLO9000 深入理解 。 YOLO3主要的改进有:调整了网络结构;利用多尺度特征进行对象检测;对象分类用Logistic取代了softmax。 在基本的图像特征提取方面,YOLO3采用了称之为Darknet-53的网络结构(含有53个卷积层),它借鉴了残差网络residual network的做法,在一些层之间设置了快捷链路(shortcut connections)。 上图的Darknet-53网络采用256*256*3作为输入,最左侧那一列的1、2、8等数字表示多少个重复的残差组件。每个残差组件有两个卷积层和一个快捷链路,示意图如下: YOLO2曾采用passthrough结构来检测细粒度特征,在YOLO3更进一步采用了3个不同尺度的特征图来进行对象检测。 结合上图看,卷积网络在79层后,经过下方几个黄色的卷积层得到一种尺度的检测结果。相比输入图像,这里用于检测的特征图有32倍的下采样。比如输入是416*416的话,这里的特征图就是13*13了。由于下采样倍数高,这里特征图的感受野比较大,因此适合检测图像中尺寸比较大的对象。 为了实现细粒度的检测,第79层的特征图又开始作上采样(从79层往右开始上采样卷积),然后与第61层特征图融合(Concatenation),这样得到第91层较细粒度的特征图,同样经过几个卷积层后得到相对输入图像16倍下采样的特征图。它具有中等尺度的感受野,适合检测中等尺度的对象。 最后,第91层特征图再次上采样,并与第36层特征图融合(Concatenation),最后得到相对输入图像8倍下采样的特征图。它的感受野最小,适合检测小尺寸的对象。 随着输出的特征图的数量和尺度的变化,先验框的尺寸也需要相应的调整。YOLO2已经开始采用K-means聚类得到先验框的尺寸,YOLO3延续了这种方法,为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框。在COCO数据集这9个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。 分配上,在最小的13*13特征图上(有最大的感受野)应用较大的先验框(116x90),(156x198),(373x326),适合检测较大的对象。中等的26*26特征图上(中等感受野)应用中等的先验框(30x61),(62x45),(59x119),适合检测中等大小的对象。较大的52*52特征图上(较小的感受野)应用较小的先验框(10x13),(16x30),(33x23),适合检测较小的对象。 感受一下9种先验框的尺寸,下图中蓝色框为聚类得到的先验框。黄色框式ground truth,红框是对象中心点所在的网格。 预测对象类别时不使用softmax,改成使用logistic的输出进行预测。这样能够支持多标签对象(比如一个人有Woman 和 Person两个标签)。 不考虑神经网络结构细节的话,总的来说,对于一个输入图像,YOLO3将其映射到3个尺度的输出张量,代表图像各个位置存在各种对象的概率。 我们看一下YOLO3共进行了多少个预测。对于一个416*416的输入图像,在每个尺度的特征图的每个网格设置3个先验框,总共有 13*13*3 + 26*26*3 + 52*52*3 = 10647 个预测。每一个预测是一个(4+1+80)=85维向量,这个85维向量包含边框坐标(4个数值),边框置信度(1个数值),对象类别的概率(对于COCO数据集,有80种对象)。 对比一下,YOLO2采用13*13*5 = 845个预测,YOLO3的尝试预测边框数量增加了10多倍,而且是在不同分辨率上进行,所以mAP以及对小物体的检测效果有一定的提升。 YOLO3借鉴了残差网络结构,形成更深的网络层次,以及多尺度检测,提升了mAP及小物体检测效果。如果采用COCO mAP50做评估指标(不是太介意预测框的准确性的话),YOLO3的表现相当惊人,如下图所示,在精确度相当的情况下,YOLOv3的速度是其它模型的3、4倍。 不过如果要求更精准的预测边框,采用COCO AP做评估标准的话,YOLO3在精确率上的表现就弱了一些。如下图所示。 [1] YOLOv3: An Incremental Improvement[2] Deep Residual Learning for Image Recognition[3] What’s new in YOLO v3? [4] How to implement a YOLO (v3) object detector from scratch in PyTorch

YOLOv3没有太多的创新,主要是借鉴一些好的方案融合到YOLO里面。不过效果还是不错的,在保持速度优势的前提下,提升了预测精度,尤其是加强了对小物体的识别能力。 本文主要讲v3的改进,由于是以v1和v2为基础,关于YOLO1和YOLO2的部分析请移步 YOLO v1深入理解和YOLOv2 / YOLO9000 深入理解 。 YOLO3主要的改进有:调整了网络结构;利用多尺度特征进行对象检测;对象分类用Logistic取代了softmax。 在基本的图像特征提取方面,YOLO3采用了称之为Darknet-53的网络结构(含有53个卷积层),它借鉴了残差网络residual network的做法,在一些层之间设置了快捷链路(shortcut connections)。 上图的Darknet-53网络采用256*256*3作为输入,最左侧那一列的1、2、8等数字表示多少个重复的残差组件。每个残差组件有两个卷积层和一个快捷链路,示意图如下: YOLO2曾采用passthrough结构来检测细粒度特征,在YOLO3更进一步采用了3个不同尺度的特征图来进行对象检测。 结合上图看,卷积网络在79层后,经过下方几个黄色的卷积层得到一种尺度的检测结果。相比输入图像,这里用于检测的特征图有32倍的下采样。比如输入是416*416的话,这里的特征图就是13*13了。由于下采样倍数高,这里特征图的感受野比较大,因此适合检测图像中尺寸比较大的对象。 为了实现细粒度的检测,第79层的特征图又开始作上采样(从79层往右开始上采样卷积),然后与第61层特征图融合(Concatenation),这样得到第91层较细粒度的特征图,同样经过几个卷积层后得到相对输入图像16倍下采样的特征图。它具有中等尺度的感受野,适合检测中等尺度的对象。 最后,第91层特征图再次上采样,并与第36层特征图融合(Concatenation),最后得到相对输入图像8倍下采样的特征图。它的感受野最小,适合检测小尺寸的对象。 随着输出的特征图的数量和尺度的变化,先验框的尺寸也需要相应的调整。YOLO2已经开始采用K-means聚类得到先验框的尺寸,YOLO3延续了这种方法,为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框。在COCO数据集这9个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。 分配上,在最小的13*13特征图上(有最大的感受野)应用较大的先验框(116x90),(156x198),(373x326),适合检测较大的对象。中等的26*26特征图上(中等感受野)应用中等的先验框(30x61),(62x45),(59x119),适合检测中等大小的对象。较大的52*52特征图上(较小的感受野)应用较小的先验框(10x13),(16x30),(33x23),适合检测较小的对象。 感受一下9种先验框的尺寸,下图中蓝色框为聚类得到的先验框。黄色框式ground truth,红框是对象中心点所在的网格。 预测对象类别时不使用softmax,改成使用logistic的输出进行预测。这样能够支持多标签对象(比如一个人有Woman 和 Person两个标签)。 不考虑神经网络结构细节的话,总的来说,对于一个输入图像,YOLO3将其映射到3个尺度的输出张量,代表图像各个位置存在各种对象的概率。 我们看一下YOLO3共进行了多少个预测。对于一个416*416的输入图像,在每个尺度的特征图的每个网格设置3个先验框,总共有 13*13*3 + 26*26*3 + 52*52*3 = 10647 个预测。每一个预测是一个(4+1+80)=85维向量,这个85维向量包含边框坐标(4个数值),边框置信度(1个数值),对象类别的概率(对于COCO数据集,有80种对象)。 对比一下,YOLO2采用13*13*5 = 845个预测,YOLO3的尝试预测边框数量增加了10多倍,而且是在不同分辨率上进行,所以mAP以及对小物体的检测效果有一定的提升。 YOLO3借鉴了残差网络结构,形成更深的网络层次,以及多尺度检测,提升了mAP及小物体检测效果。如果采用COCO mAP50做评估指标(不是太介意预测框的准确性的话),YOLO3的表现相当惊人,如下图所示,在精确度相当的情况下,YOLOv3的速度是其它模型的3、4倍。 不过如果要求更精准的预测边框,采用COCO AP做评估标准的话,YOLO3在精确率上的表现就弱了一些。如下图所示。 [1] YOLOv3: An Incremental Improvement[2] Deep Residual Learning for Image Recognition[3] What’s new in YOLO v3? [4] How to implement a YOLO (v3) object detector from scratch in PyTorch

Yolov3理论详解Yolo系列采用了one-stage的识别方案,故名思意,就是一个阶段,图像进来之后,卷积提取特征,到和labels计算损失,他就一个阶段。相教于fasterrcnn,masterrcnn等需要生成大量候选框的two-stage方案,在识别速度上还是比较到位的,这样就使得它非常的实用,传说被美军应用在了导弹识别方面,传说的很玄乎,也确实,无论在速度还是准确率,yolov3都做的非常不错。 我们看下yolov3的结构,先附上一张整体结构图。 从上到下我们走一遍YOLOV3流程。 1.A位置,当图像输入进来以后,图像的尺寸并不是正方形的,为了后面的计算方便,我们首先把他转换成能被32整除的正方形。为什么是32,整个网络要经过16次放缩变换(步长为2的卷积操作{替代池化}),最后得到的特征图尺寸是11*11 或者12*12或者14*14这样的方格。每次转换称的正方形图像并不是固定尺寸,这样就增强了网络适应不同大小图像的能力. 2.B位置, 一个conv2d是Convolution卷积+Batch Normalization+Leaky_relu激活的组合。Batch Normalization归一化替代正则,提升模型收敛速度。Leaky_relu软路激活解决了relu激活时负数不学习的问题。 从A位置进来416*416*3的图像,经过了32(32个卷积核)*3*3(卷积核的尺寸3*3) 步长为1的卷积操作之后,变成了416*416*32的输出。 3.B到C过程中,我们看到图像尺寸从416*416转换成208*208,中间有一层步长为2的卷积层,来替代池化层。比单纯的用池化层效果要好一些。 4.C位置,这里是卷积和残差连接的组合,yolov3的残差连接是同模块内的残差连接,shape相同才能连接。 C位置以下的resnet层 ,我们就不再说明了,原理和连接都是一致的。越往下,特征图的尺寸约小,特征核的层数越多。 5.我们看下E位置的尺寸是13*13*1024,D位置的尺寸是26*26*512 ,越往下的层越能识别大物体,而上面的层越能识别小物体,我们把上下两层相加,使得它同时具备了识别大物体和小物体的能力。上下两层即E层和D层怎么融合呢,我们把E层上采样,变成26*26*256,这样他就能和D层首尾相连进行拼合了。 6.拼合以后我们看到到了F位置,注意F位置的尺寸 (batch_size,26,26,75),分类数是 70 ,这里却是75,多出来的五个就是,x,y,w,h,conf(是物体与不是物体的判断)。 7.YOLO层是一个预测值和Lables目标值相减求损失的层。 yolov3一共有三个YOLO层分别去训练网络,为什么有三个,较小的特征图有比较大的视野,教大的特征图有比较小的视野,这样yolo3就拥有了既能识别大目标也能识别小目标的能力,同时,一个点既能是一种分类,也可以属于另外的分类. 8.好了,pytorch执行loss.back(),反向传播,就开始训练了。

Yolo系列采用了one-stage的识别方案,故名思意,就是一个阶段,图像进来之后,卷积提取特征,到和labels计算损失,他就一个阶段。相教于fasterrcnn,masterrcnn等需要生成大量候选框的two-stage方案,在识别速度上还是比较到位的,这样就使得它非常的实用,传说被美军应用在了导弹识别方面,传说的很玄乎,也确实,无论在速度还是准确率,yolov3都做的非常不错。 我们看下yolov3的结构,先附上一张整体结构图。 从上到下我们走一遍YOLOV3流程。 1.A位置,当图像输入进来以后,图像的尺寸并不是正方形的,为了后面的计算方便,我们首先把他转换成能被32整除的正方形。为什么是32,整个网络要经过16次放缩变换(步长为2的卷积操作{替代池化}),最后得到的特征图尺寸是11*11 或者12*12或者14*14这样的方格。每次转换称的正方形图像并不是固定尺寸,这样就增强了网络适应不同大小图像的能力. 2.B位置, 一个conv2d是Convolution卷积+Batch Normalization+Leaky_relu激活的组合。Batch Normalization归一化替代正则,提升模型收敛速度。Leaky_relu软路激活解决了relu激活时负数不学习的问题。 从A位置进来416*416*3的图像,经过了32(32个卷积核)*3*3(卷积核的尺寸3*3) 步长为1的卷积操作之后,变成了416*416*32的输出。 3.B到C过程中,我们看到图像尺寸从416*416转换成208*208,中间有一层步长为2的卷积层,来替代池化层。比单纯的用池化层效果要好一些。 4.C位置,这里是卷积和残差连接的组合,yolov3的残差连接是同模块内的残差连接,shape相同才能连接。 C位置以下的resnet层 ,我们就不再说明了,原理和连接都是一致的。越往下,特征图的尺寸约小,特征核的层数越多。 5.我们看下E位置的尺寸是13*13*1024,D位置的尺寸是26*26*512 ,越往下的层越能识别大物体,而上面的层越能识别小物体,我们把上下两层相加,使得它同时具备了识别大物体和小物体的能力。上下两层即E层和D层怎么融合呢,我们把E层上采样,变成26*26*256,这样他就能和D层首尾相连进行拼合了。 6.拼合以后我们看到到了F位置,注意F位置的尺寸 (batch_size,26,26,75),分类数是 70 ,这里却是75,多出来的五个就是,x,y,w,h,conf(是物体与不是物体的判断)。 7.YOLO层是一个预测值和Lables目标值相减求损失的层。 yolov3一共有三个YOLO层分别去训练网络,为什么有三个,较小的特征图有比较大的视野,教大的特征图有比较小的视野,这样yolo3就拥有了既能识别大目标也能识别小目标的能力,同时,一个点既能是一种分类,也可以属于另外的分类. 8.好了,pytorch执行loss.back(),反向传播,就开始训练了。

超越yolov3,Centernet 原理详解(object as points)ariXiv: https://arxiv.org/abs/1904.07850 github:https://github.com/xingyizhou/CenterNet 摘要:目标检测要求作出包含物体的最小矩形框。大多数成功的目标检测器罗列出大量的候选框并对其分类。 这是浪费资源的,而且低效,还需要后续的处理。在这篇文章中,我们提出了一种新的方法。 我们将要检测的目标定位到一个点 --- 即检测矩形框的中心点。 我们的检测器通过热力图寻找中心点然后回归目标的其他属性,比如大小, 3D 位置坐标, 方向, 甚至姿态。 我们的基于中心点的检测网络 CenterNet, 是一个端到端的独特的, 简单而快速的目标检测器, 而且比一些基于锚框的检测器更加准确。 CenterNet 在MS COCO 数据集上在速度与准确率方面取得了最好的平衡, 142 FPS时有28.1% AP , 52 FPS时有37.4% AP, 多尺度测试时可以达到45.1% AP和 1.4 FPS。我们用同样的方法在KITTI 基准上去估计3D坐标 ,在 COCO 关键点数据集上估计人体姿态。当与其他复杂的多阶段的方法比较时我们的方法表现出巨大的竞争力而且能实时检测。 a:Hourglass 沙漏网络,文中未对其修改b:带转置卷积的resnet, 同时增加了deformable convc:原始的DLA-34语义分割网络d:文中用到的修改过的DLA-34,增加了FPN结构 由于采用全卷积网络直接得到4倍下采样的热力图,所以不需要提前设定anchors, 所以大大减少了网络参数量和计算量。热力图的通道数等于要检测的目标类别数,热力图的前100个峰值作为网络提取的目标中心点,然后设定一个阈值进行筛选得到最终的目标中心点。Centernet 中所有的上采样前都有deformable卷积,这种卷积的作用就是使得网络的感受野变得更加精确,而不是限定为3*3的矩形卷积框内。同时4倍的下采样feature map 比一般网络的分辨率高很多,所有不需要进行多尺度预测和特征金字塔也可以同时较好的检测大小目标。Centernet 不需要NMS,因为所有检测的中心点是由热力图的峰值得到的,这样就已经有一个非极大值抑制的过程,而且NMS是十分耗时的,所以Centernet才能又好又快。Centernet 采用编码解码的全卷积骨干网络,上采样用到的是转置卷积,与一般上采样中的双线性差值有很大区别,转置卷积可以更好的还原图像的语义信息和位置信息。 上图表示了anchor free 算法与基于anchor算法在对待正负样本上的区别,a是基于anchor的检测算法,检测框与ground truth 交并比大于0.7的作为正样本,检测框与ground truth 交并比小于0.3的作为负样本。b是centernet 的检测器,ground truth中心点的热力图不是中心的是1, 周围像素都是0, 而是呈高斯核分布,高斯核大小与物体的大小有关,所以中心点周围高斯核内点会作为负样本,但是会有一个呈高斯分布的衰减。具体见下面的分类损失,Lk loss . 直接根据网络预测的中心点,加上回归的中心点偏移量,结合回归的box 大小得到最终的检测box 将目标类别数量设置为17,对应人体姿态估计的17 个关键点,预测17维的热力图得到所有17类别的中心点,然后回归一个34(2*17)维的每个人体中心点到17个关键点的偏移值(因为有17 个x,y坐标偏移),人体中心点加上这个34 维的偏移量可以得到每个物体的17个关键点,再将17维的热力图中心点分配到距离最近的每个人体上,再回归一个二维的关键点偏移量作为最终的准确关键点。 这里回归的将是3维的box size, 加上一个1维的深度,和一个8维的方向,最终得到3D box。

ariXiv: https://arxiv.org/abs/1904.07850 github:https://github.com/xingyizhou/CenterNet 摘要:目标检测要求作出包含物体的最小矩形框。大多数成功的目标检测器罗列出大量的候选框并对其分类。 这是浪费资源的,而且低效,还需要后续的处理。在这篇文章中,我们提出了一种新的方法。 我们将要检测的目标定位到一个点 --- 即检测矩形框的中心点。 我们的检测器通过热力图寻找中心点然后回归目标的其他属性,比如大小, 3D 位置坐标, 方向, 甚至姿态。 我们的基于中心点的检测网络 CenterNet, 是一个端到端的独特的, 简单而快速的目标检测器, 而且比一些基于锚框的检测器更加准确。 CenterNet 在MS COCO 数据集上在速度与准确率方面取得了最好的平衡, 142 FPS时有28.1% AP , 52 FPS时有37.4% AP, 多尺度测试时可以达到45.1% AP和 1.4 FPS。我们用同样的方法在KITTI 基准上去估计3D坐标 ,在 COCO 关键点数据集上估计人体姿态。当与其他复杂的多阶段的方法比较时我们的方法表现出巨大的竞争力而且能实时检测。 a:Hourglass 沙漏网络,文中未对其修改b:带转置卷积的resnet, 同时增加了deformable convc:原始的DLA-34语义分割网络d:文中用到的修改过的DLA-34,增加了FPN结构 由于采用全卷积网络直接得到4倍下采样的热力图,所以不需要提前设定anchors, 所以大大减少了网络参数量和计算量。热力图的通道数等于要检测的目标类别数,热力图的前100个峰值作为网络提取的目标中心点,然后设定一个阈值进行筛选得到最终的目标中心点。Centernet 中所有的上采样前都有deformable卷积,这种卷积的作用就是使得网络的感受野变得更加精确,而不是限定为3*3的矩形卷积框内。同时4倍的下采样feature map 比一般网络的分辨率高很多,所有不需要进行多尺度预测和特征金字塔也可以同时较好的检测大小目标。Centernet 不需要NMS,因为所有检测的中心点是由热力图的峰值得到的,这样就已经有一个非极大值抑制的过程,而且NMS是十分耗时的,所以Centernet才能又好又快。Centernet 采用编码解码的全卷积骨干网络,上采样用到的是转置卷积,与一般上采样中的双线性差值有很大区别,转置卷积可以更好的还原图像的语义信息和位置信息。 上图表示了anchor free 算法与基于anchor算法在对待正负样本上的区别,a是基于anchor的检测算法,检测框与ground truth 交并比大于0.7的作为正样本,检测框与ground truth 交并比小于0.3的作为负样本。b是centernet 的检测器,ground truth中心点的热力图不是中心的是1, 周围像素都是0, 而是呈高斯核分布,高斯核大小与物体的大小有关,所以中心点周围高斯核内点会作为负样本,但是会有一个呈高斯分布的衰减。具体见下面的分类损失,Lk loss . 直接根据网络预测的中心点,加上回归的中心点偏移量,结合回归的box 大小得到最终的检测box 将目标类别数量设置为17,对应人体姿态估计的17 个关键点,预测17维的热力图得到所有17类别的中心点,然后回归一个34(2*17)维的每个人体中心点到17个关键点的偏移值(因为有17 个x,y坐标偏移),人体中心点加上这个34 维的偏移量可以得到每个物体的17个关键点,再将17维的热力图中心点分配到距离最近的每个人体上,再回归一个二维的关键点偏移量作为最终的准确关键点。 这里回归的将是3维的box size, 加上一个1维的深度,和一个8维的方向,最终得到3D box。

相关推荐
评论列表
暂无评论,快抢沙发吧~
你 发表评论:
欢迎