目标检测网络的介绍及应用(三) -- YOLO系列

10 篇文章 0 订阅
10 篇文章 1 订阅

三、One-stage的代表—从YOLO到SSD

3.1 YOLO系列算法

尽管之前提到的Faster-RCNN系列算法大幅提高了目标检测的速度和准确度,但是其检测速度大概是10FPS左右,离实时视频检测还有一定距离。于是在2016年CVPR会议上,RGB提出了一种全新的目标检测框架,YOLO(You Only Look At Once)算法。尽管YOLO算法的精度不及Faster-RCNN,但是其速度要远远快于Faster-RCNN,而且YOLO算法经过不断的发展,已经有三个版本的YOLO算法,YOLOv3已经基本能够达到和Faster-RCNN算法差不多精度的同时实现实时检测的任务。下面我们就来一一介绍YOLO系列算法的原理。

3.1.1 YOLO v1算法
3.1.1.1 YOLO v1算法原理

YOLOv1论文原文在这里

作者在论文中指出,RCNN算法之所以速度较慢的原因是其将目标检测分为两部分,首先生成候选框后再对候选框分类回归得到预测框。为了改善算法的检测速度,作者抛弃掉了RCNN中Region proposal方案,YOLO模型能够直接将图像的原始像素作为输入,直接输出目标的bounding boxes和类别,没有生成候选框的步骤,也就所谓的one-stage方法

YOLO算法首先会将图像缩放成固定大小,然后再将图像分解成 S ∗ S S*S SS的网格(论文中S=7),并且每个网格预测 B B B个bounding boxes和这些bounding boxes的置信度(confidence)。其中置信度表示当前bounding
box包含目标的概率,当该网格内存在object时 Pr ⁡ ( object ) = 1 \Pr\left( \text{object} \right) = 1 Pr(object)=1,否则为0,置信度的计算如下

C o n f i d e n c e = Pr ⁡ ( object ) ∗ I o U p r e d t r u t h Confidence = \Pr\left( \text{object} \right)*IoU_{pred}^{truth} Confidence=Pr(object)IoUpredtruth

除了bounding boxes的置信度外,YOLO还要求每个网格输出检测目标的类别概率 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_{i}|Object) Pr(ClassiObject),这是一个条件概率,表示每个当前物体是某个类别的概率。注意这里的类别概率是针对网格的,而不是针对网格预测的bounding boxes的(虽然这样做简化了类别概率的计算,但对于检测小目标物体很不利)。其计算如下:
S c o r e = Pr ⁡ ( Clas s i ∣ object ) ∗ C o n f i d e n c e = Pr ⁡ ( Clas s i ∣ object ) ∗ Pr ⁡ ( object ) ∗ I o U p r e d t r u t h {Score = \Pr\left( \text{Clas}s_{i} \middle| \text{object} \right)*Confidence}= \Pr\left( \text{Clas}s_{i} \middle| \text{object} \right)*\Pr\left( \text{object} \right)*IoU_{pred}^{truth} Score=Pr(Classiobject)Confidence=Pr(Classiobject)Pr(object)IoUpredtruth
这样,对每个网格,其需要预测B个bbox值 ( x , y , w , h ) (x,y,w,h) (x,y,w,h)以及其对应的置信度和 C C C个对应的类别概率, C C C为类别的数量,也就是一副图像需要预测 S ∗ S ∗ ( B ∗ ( 4 + 1 ) + C ) S*S*(B*\left(4 + 1 \right) + C) SS(B(4+1)+C)个值,以VOC数据集为例,YOLO算法每个网格需要预测 7 ∗ 7 ∗ ( 2 ∗ 5 + 20 ) = 7 ∗ 7 ∗ 30 7*7*\left(2*5 + 20 \right) = 7*7*30 77(25+20)=7730个tensor。如下图:

在这里插入图片描述

YOLO算法的流程如下图所示:

在这里插入图片描述

总结一下,YOLO算法将图像分割成尺寸相同的网格,当然不能直接将网格作为预测框,而是由每个网格生成bounding boxes,在YOLOv1算法中总共产生7*7*2个bounding boxes,然后再对每个bounding boxes的坐标进行回归和类别预测,提取有用的bounding boxes,最后通过非极大值抑制输出最后的预测框。即:

  • 将图像分割成S*S的单元格;

  • 计算每个网格的生成的bounding boxes的回归参数及置信度和每个网格的类别概率;

  • 根据bounding boxes的置信度和类别概率,删除不满足阈值条件的bounding boxes;

  • 非极大值抑制生成最终的bounding boxes。

与Faster-RCNN算法相比,YOLO算法在设计上非常简单,没有繁杂的RPN层,也没有基于感受野的映射,其网络结构看起来就像一个普通的分类CNN,只有卷积层、最大池化层和两个全连接层,如下图:

在这里插入图片描述

各层的网络参数如下:

在这里插入图片描述

3.1.1.2 YOLO v1网络训练

YOLO算法同样在训练时采用了迁移学习的技巧,首先在ImageNet上预训练前20个卷积层,然后添加一个池化层和全连接层。预训练之后再将网络修改为如上表所示的24个卷积层和2个全连接层结构,同时将网络输入图像尺寸由224*224修改为448*448。网络的整个损失函数如下:

在这里插入图片描述

可以看出YOLO算法的损失损失函数比较复杂的,其实整个损失函数可以分成三个部分,每个部分都用均方误差来表示,分别是bbox的损失、confidence的损失以及categories的损失,如下图所示:

在这里插入图片描述

其中, l ij obj \mathbb{l}_{\text{ij}}^{\text{obj}} lijobj表示第 i i i个网格预测的第 j j j个候选框中包含物体是否存在,如果存在则为1,否则为0; x ^ , y ^ , w ^ , h ^ , C ^ , p ^ \hat{x},\hat{y},\hat{w},\hat{h},\hat{C},\hat{p} x^,y^,w^,h^,C^,p^表示标签值, x , y , w , h , C , p x,y,w,h,C,p x,y,w,h,C,p表示预测值。由于分解出来的每个网格不一定都包含object,如果没有object,那么confidence就会变成0,这样在优化模型的时候可能会让梯度变化太大,模型容易不稳定。所以作者在损失函数中引入了两个参数 λ coord \lambda_{\text{coord}} λcoord λ noobj \lambda_{\text{noobj}} λnoobj来分别控制bbox预测位置的损失和单元格没有object的损失。

总结一下,YOLO算法直接通过一次暴力回归来一次性得到目标框的坐标和类别,使用单个网络完成整个检测过程。但是YOLO算法由于一个网格只预测两个bbox的值,召回率低,对小目标物体检测效果不是很理想,但是其背景误检测率也更低。如下图:

在这里插入图片描述

3.1.2 YOLO v2算法

YOLO v1算法的横空出世,为目标检测提供了新的思路,直接通过one-stage模型来生成预测框,从而省去了生成候选框的步骤。然而,YOLO算法的速度虽快,但是在准确度上却还是难以与Faster-RCNN算法一较高下,于是YOLO v2算法在YOLO v1的基础上使用了很多tricks,大大提高了算法的准确度,同时还提出了一种YOLO 9000结构,可以利用ImageNet和COCO数据集检测9000个类别。论文原文在这里

3.1.2.1 YOLO v2改进点

YOLO v2借鉴了当时很多的目标检测网络和分类网络的优点,如下图所示:

在这里插入图片描述

下面就来一一介绍一下YOLO v2使用的这些tricks。

  • Batch Normalization

批标准化方法能够对数据改变数据的分布,能够在一定程度上防止过拟合的问题。其原理在之前的博客中介绍了,有兴趣的同学可以去看看。论文中在网络的每层都增加了Batch Norm,同时弃用dropout方法,这使得网络增加了2%的精度。

  • High Resolution Classifier

在ImageNet数据集上,输入图像的尺寸为224*224,YOLO算法在后面再利用448*448重新训练网络,这样就需要网络重新适应分辨率的变化。所以YOLO v2算法直接使用448*448大小的图像来训练网络,这使得网络增加了4%的精度。

  • Convolutional with Anchor Boxes

在YOLO算法中,生成候选框的方式是通过网格来实现的,以VOC2007数据集为例,每个图像可以生成的最大的候选框数量为7*7*2=98个,用来做目标检测实在是太少了。于是YOLO v2借鉴了anchor的思想,在feature
map上生成anchors,然后再重映射生成候选框,计算相应的box参数
。YOLO v2去掉了YOLO的最后一个池化层,设置下采样了32,对于416*416的输入图像,其feature map的尺寸为13*13,这样每个feature map上的像素点上能生成9个anchor boxes,总共能生成13*13*9=1521个候选框,大大超过了YOLO算法的预测框的数量。这使得算法的mAP下降了0.3%,但是召回率上升了7%。

  • Dimension Clusters

在Faster-RCNN中,anchors的数量是通过人为设定的,而在YOLO v2中,为了使得anchors的尺寸设计更加合理,使用了K-means聚类找到更符合大部分标定框形状的anchor。一般的聚类是使用欧式距离,这会导致ground truth大的比ground truth小的更受误差的影响,而且我们在实际的评价中是使用IoU的,很自然的想到用IoU来做聚类尺度。实际的度量尺度:

d ( b o x , c e n t r o i d ) = 1 − I o U ( b o x , c e n t r i o d ) d\left( box,centroid \right) = 1 - IoU(box,centriod) d(box,centroid)=1IoU(box,centriod)

下图给出了聚类数目与平均IoU的关系及anchor boxes的形状,可以看出,随着聚类的增加,其平均IoU在不断上升,论文中综合考虑模型复杂度和召回率中选取了聚类数目k=5。

在这里插入图片描述

  • Direct location prediction

前面讲到,YOLO v2采用anchor的方法来生成候选框,在RPN网络中,候选框的实际中心位置 ( x , y ) (x,y) (x,y)需要根据预测的坐标偏移值 ( t x , t y ) (t_{x},t_{y}) (tx,ty),尺度 ( w a , h a ) (w_{a},h_{a}) (wa,ha)以及anchor在feature map的中心点坐标 ( x a , y a ) (x_{a},y_{a}) (xa,ya)来预测,如下:

x = ( t x ∗ w a ) − x a x = \left( t_{x}*w_{a} \right) - x_{a} x=(txwa)xa

y = ( t y ∗ h a ) − y a y = \left( t_{y}*h_{a} \right) - y_{a} y=(tyha)ya

作者认为,上述公式的参数 ( t x , t y , w a , h a ) (t_{x},t_{y},w_{a},h_{a}) (tx,ty,wa,ha)是无界的,即在feature map上的任意一个中心点可以生成原始图像上任何位置上bbox,所以容易造成模型的不稳定。为此,YOLO v2使用了YOLO v1的方法,将边界框中的中心点约束在当前cell中,使用sigmoid函数将偏移值固定在(0,1)区间内,这样能够防止参数在训练过程中跑飞。YOLO v2中的bbox预测坐标计算公式如下:

b x = σ ( t x ) + c x b_{x} = \sigma\left( t_{x} \right) + c_{x} bx=σ(tx)+cx

b y = σ ( t y ) + c y b_{y} = \sigma\left( t_{y} \right) + c_{y} by=σ(ty)+cy

b w = p w e t w b_{w} = p_{w}e^{t_{w}} bw=pwetw

b h = p h e t h b_{h} = p_{h}e^{t_{h}} bh=pheth

Pr ⁡ ( object ) ∗ I o U ( b , o b j e c t ) = σ ( t 0 ) \Pr\left( \text{object} \right)*IoU\left( b,object \right) = \sigma(t_{0}) Pr(object)IoU(b,object)=σ(t0)

下图展示了中心点坐标的尺度是相对于cell的关系:

在这里插入图片描述

  • Fine-Grained Features

尽管使用anchor的方法能够提高bbox的预测数量,但是由于在feature map上进行anchor采样,更加降低了YOLO v2检测小目标的准确率。作者认为合并更大尺寸的特征图能够有效地检测小目标物体,所以提出了passthrough layer。网络最后层的feature map尺寸为13*13*1024,前一层为26*26*512,作者借鉴了ResNet的shortcut结构,使前一层26*26*512的特征图经过passthrough layer之后变为13*13*2048,并与最后一层feature map结合行程13*13*3072的feature map,最后在该特征图上进行预测。这样能让网络性能提升1%。

  • Multi-Scale Training

在YOLO v2的训练过程,为了提高模型的鲁棒性,使用了多尺度训练的策略,即针对不同的图像输入尺寸来训练网络。因为网络的降采样因子是32,所以输入尺寸选择了32的倍数{320,352,…,608}。当使用小尺寸输入时,YOLO v2算法的速度可以达到90FPS,mAP也能达到Faster-RCNN的水平。

  • Darknet19

除了上面提到的这些已有的改进,YOLO v2算法还提出了Darknet19网络结构,Darknet19模型在ImageNet上能够达到91%的top-5精度,同时只需要5.58 billion的浮点运算量,相比于VGG模型,大大减小了运算量。Darknet19是用了19个卷积层和5个最大池化层,最后用平均池化层来代替全连接层来进行预测,如下图:

在这里插入图片描述

3.1.2.2 YOLO v2训练策略

YOLO v2的训练主要分为3个阶段,预训练darknet分类网络,fine-tuning darknet网络以及训练darknet检测网络,前两个阶段为训练分类网络,最后一个阶段训练检测网络。如下所示:

第一阶段:在ImageNet训练集上预训练上述darknet19网络,总共训练160个epoch,输入图像尺寸为224*224,设置学习率设为0.1,并使用随机裁剪,旋转,色彩变化等方式进行数据增强;

第二阶段:将网络的输入图像尺寸调整为448*448,同时将学习率设为0.001,总共训练10个epoch来fine tuning分类网络;

第三阶段:修改darknet网络结构,去掉最后一个卷积层、平均池化层和softmax层,新增3个3*3*1024的卷积层,同时增加一个passthrough层,最后使用1*1的卷积层输出预测结果,其通道数是我们要detection的数量。如对于voc数据集,每个cell预测5个anchors,每个anchor预测5个bbox参数和20个类别条件概率,所以1*1的卷积层通道数filter_num=5*(5+20)=125个(注意比较和YOLO算法的异同)。

在这里插入图片描述

YOLO v2的损失函数相比于YOLO算法更加复杂,其解释请参考这里

3.1.2.3 YOLO 9000

除了对目标检测网络本身速度和精度的改进外,论文中还提到了一种用于识别多种分类的网络结构YOLO
9000算法,其可以检测超过9000个类别。众所周知,检测数据集的标准要比分类数据集的标注繁琐的多,所以用于分类的ImageNet数据集的数据量要远远多于用于检测的VOC数据集。为了能够再小样本数据集上检测出更多的类别的数据,作者提出了一种联合训练的机制:即使用检测数据集来训练模型检测的相关网络结构,使用分类数据集来训练模型分类的相关结构,这样就能够大大扩充模型检测到的物体种类。

作者选择在COCO数据集(80个类别)和ImageNet数据集(1000个类别)上来进行联合训练,然而在现实生活中,很多类别是从属关系,而不是互斥的关系,比如狗和哈士奇,猫和英国断尾猫之类的。但是如果我们使用softmax分类器却是给每个类别分配一个概率,默认各个类别之间是互斥的关系。除此之外,有些类别即属于某一上层类又属于另一上层类,比如狗,即属于“犬科”,又属于“家畜”,所以直接利用ImageNet来构建树形结构是不行的。作者提出了一种层级分类的方法(Hierarchical classification),主要思路是根据各个类别之间的从属关系建立一颗WordTree。建立步骤如下:

  • 遍历ImageNet中的所有名词;

  • 对每一个名词,从ImageNet数据集中找出它所在位置的根节点(ImageNet数据的存储方式是一个有向图结构,而非树结构)的路径,有许多名词只有一条路径能够到达根节点,所以先把这些名词加入到WordTree结构中;

  • 对于其他的名词,如果一个物体有多个路径到达其根节点,在将其加入到已有的WordTree结构中时,选择最短的那条路径(比如一条需要添加3个边到WordTree,另一条仅需添加一条边,则选择后一种路径)。

结合COCO和ImageNet数据集的WordTree如下图所示:

在这里插入图片描述

对于分类概率的计算,使用条件概率:

在这里插入图片描述
为了验证WordTree方法,作者用1000个类别的ImageNet数据集训练了Darknet19模型,同时为了创建WordTree模型,作者还添加了很多中间节点,将标签从1000扩展到了1369。在训练过程中,如果有一个图片的标签是“Norfolk terrier”,那么这个图片还会获得“狗”(dog)以及“哺乳动物”(mammal)等标签,也就是说一个物体可以有多个标签,而不仅仅是某一类标签。举个例子,假设Norfolk terrier在ImageNet数据集中的标签为[0,0,0,0,0,1,0,0,0,0],但是在WordTree中的标签有可能为[0,0,1,0,1,1,0,0,1,0]。如下图所示:

在这里插入图片描述

也就是在WordTree中,不是由一个大的softmax来输出分类概率,而是由许多某一语义下的所有“同义词集”来计算softmax分类概率。还是以Norfolk terrier为例,假设网络的预测结果为[0.10,0.05,0.85|,0.02,0.98|,0.90,0.02,0.08,|0.95,0.05]分别对应的是**[哈士奇,柯基,Norfolkterrier|猫,狗|哺乳动物,爬行动物,鸟类|动物,物体]的子标签,那么它的为Norfolk terrier的概率可以算出为:

Pr ⁡ ( Norfolk terrier ) = 0.85 ∗ 0.98 ∗ 0.90 ∗ 0.95 = 0.71 \Pr\left( \text{Norfolk terrier} \right) = 0.85*0.98*0.90*0.95 = 0.71 Pr(Norfolk terrier)=0.850.980.900.95=0.71

如果我们设置阈值为0.7,那么最终的输出结果就为Norfolk terrier,如果设置阈值为0.8,那么最终的输出分类结果应该为狗。按照这种方式来组织分类数据能够提高对未知物体分类的准确率,比如我们有一只狗的图片,但是不确定狗的类别,网络最终输出分类结果为狗的置信度依然很高,而狗的下位词(哈士奇,金毛)的置信度就很低。有了这种映射机制,就可以将不同的数据集结合起来。

在论文中,作者检测了WordTree结构的性能。在训练时使用了COCO检测数据集和ImageNet中的Top9000个类别,混合后的数据集共有9418个类。由于检测数据集和分类数据集之间相差太大,为了平衡两个数据集之间的数据量,作者将COCO数据集过采样,使得COCO与ImageNet的比例为1:4。YOLO9000使用的是YOLO
v2的架构,但是每个cell只产生3个anchors以限制输出大小(每个cell输出3*(5+9418)大小的tensor),当网络遇到检测数据集中的图片时则正常的方向传播,遇到分类数据集图片时,只使用分类loss进行反向传播。通过联合训练侧率,YOLO 9000可以检测超出9000个类别的物体,但是mAP不是很高,仅有19.7%。

总之,YOLO v2算法是YOLO v1算法的改进版,在YOLO v1的基础上加入了很多深度学习的技巧,同时还提出了YOLO 9000的网络结构,能够从ImageNet数据集中学习更广泛的物体分类

3.1.3 YOLO v3算法

YOLO v3论文在这里。(这篇论文写得还是很有意思的)

经过前两个版本的迭代,在2017年作者提出了最终版本的YOLO v3算法,YOLO v3算法进一步改进了之前YOLO算法的缺点,提出多尺度预测和DarkNet53网络结构,及保证了算法的速度,又大幅提高了算法小物体检测的准确度,特别适用于工程应用,可以说是目前state-of-the-art的算法了。下面让我们看看YOLO v3又哪些提高吧。

  • 多尺度预测

在之前的YOLO系列算法中,很令人诟病的一点是小目标物体检测精度不够,这是因为之前的算法在最后一层feature map上生成anchors,这就使得有anchor生成的bbox尺度太大,不能满足小目标检测的需要。为了解决这一问题,在YOLO v2中提出了passthrough结构,YOLO v3进一步拓展其思想,采用了3个不同尺度的特征图来进行目标检测。Yolo v3的结构如下图所示(图片来源):

在这里插入图片描述

可以看出,YOLO v3结构中共有三层输出, y 1 , y 2 , y 3 y1,y2,y3 y1,y2,y3,网络的预测需要先经过最开始的Darknet53分类卷积网络,然后再经过一个卷积层,BN层和一个1*1的卷积层得到尺寸大小为13*13*1024的feature map。YOLO v3以COCO数据集为研究对象,总共有80个类别,每个cell预测3个anchors,所以每个输出的通道数(预测参数)都是3*(5+80)=255个。为了得到更高分辨率的feature map,提高模型检测对小目标物体的检测能力,与SSD算法不同(SSD通过直接采样backbone中间层的方法),作者通过上采样的方法来实现多尺度的feature map,并在不同尺度的feature map进行训练和预测。模型在上采样的同时,还与Darknet53中间层中相同尺寸输出tensor进行连接(concatenate),然后又经过一个5层的卷积分别得到26*26和52*52大小的feature map,其具有更小的感受野,更适合小尺度目标的检测。通过在这三个不同尺寸的feature map进行预测,能够实现模型的细腻度检测。对比YOLO v1中只能产生7*7*2=98个预测框来说,YOLO v3的多尺度检测策略能够产生13*13*3+26*26*3+52*52*3=10647个预测框,大大增加了算法模型的预测性能。如下图所示:

在这里插入图片描述

  • Darknet-53基础网路结构

在YOLO v2中,作者提出了Darknet-19的网络结构,而YOLO v3则借鉴的当时流行的ResNet残差网络结构,进一步提出了53层的Darknet-53的特征提取网络。在Darknet-53中没有全连接层和池化层,特征的尺寸变化是通过改变卷积核的步长来实现的。Darknet-53的网络结构如下:

在这里插入图片描述

YOLO自诞生之日起就注定是与快紧密联系起来的,尽管Darknet-53的网络参数更多,层数更深,但是其运行速度却并不慢,实时FPS能够达到78,能满足工程上的应用要求,而且准确率要比其他Darknet-19高大约2%。如果处理速度不能满足需求,除了Darknet-53之外,官方还推出了一个轻量级的tiny-Darknet网络结构,其参数量甚至比SqueezeNet结构还小,仅为4MB,为嵌入式或机器人深度学习应用开发提供了一个强有力的武器。Darknet-53与其他网络结构的对比如下图所示:

在这里插入图片描述

  • Bounding boxes和类别预测

对于bounding boxes的预测,YOLO v3中采用了和YOLO v2一样的预测方法,anchor坐标和bounding boxes坐标之间的关系如下所示:

b x = σ ( t x ) + c x b_{x} = \sigma\left( t_{x} \right) + c_{x} bx=σ(tx)+cx

b y = σ ( t y ) + c y b_{y} = \sigma\left( t_{y} \right) + c_{y} by=σ(ty)+cy

b w = p w e t w b_{w} = p_{w}e^{t_{w}} bw=pwetw

b h = p h e t h b_{h} = p_{h}e^{t_{h}} bh=pheth

Pr ⁡ ( object ) ∗ I o U ( b , o b j e c t ) = σ ( t 0 ) \Pr\left( \text{object} \right)*IoU\left( b,object \right) = \sigma(t_{0}) Pr(object)IoU(b,object)=σ(t0)

除了每个Bounding boxes包含的参数外,作者还采用了**逻辑回归(logistic regression)**的方式来预测objectness score,即这个位置是目标的可能性。这一步是在预测之前进行的,如果这个box prior(box prior表示实际选择的box,并不是说k个box都参与训练)与Ground Truth的IoU大于其他bounding box prior,则objectness score为1,如果其他的bounding box prior不是IoU最大的那个,但是其仍然大于我们之前设定的阈值(如YOLO中的0.5),我还是不会将对这个box进行预测。这样做的目的是可以去掉不必要的anchor,减少计算量。**逻辑回归(logistic regression)**就是用来对生成的9个anchor(3个尺度的feature map,每个尺度预测3个)找到最优的那一个来进行预测(不理解的可以搜索下逻辑回归的原理)。

对于类别预测,YOLO v3使用逻辑分类器(logistic classifiers)代替softmax输出,训练时使用二值交叉熵损失(binary cross-entropy),作者认为这中策略能对在更复杂的数据集上有更好的性能。比如在某些数据集上,通常会有重复的标签(如woman和person),而softmax输出总是认为标签之间是相互对立的。

  • 损失函数

在YOLO v3中,损失同样分为三个部分,表示bbox坐标预测的损失,置信度的损失以及类别损失。将各部分损失加起来就得到了最后的总损失,下面是keras中关于损失函数的定义,可以看出,除了 w , h \mathbf{w,h} w,h是采用的总方误差之外,其他部分的损失函数用的是二值交叉熵损失

xy_loss = object_mask * box_loss_scale * K.binary_crossentropy(raw_true_xy, raw_pred[..., 0:2],
                                                                       from_logits=True)
wh_loss = object_mask * box_loss_scale * 0.5 * K.square(raw_true_wh - raw_pred[..., 2:4])
confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True) + \
                          (1 - object_mask) * K.binary_crossentropy(object_mask, raw_pred[..., 4:5],
                                                                    from_logits=True) * ignore_mask
class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[..., 5:], from_logits=True)

xy_loss = K.sum(xy_loss) / mf
wh_loss = K.sum(wh_loss) / mf
confidence_loss = K.sum(confidence_loss) / mf
class_loss = K.sum(class_loss) / mf
loss += xy_loss + wh_loss + confidence_loss + class_loss

YOLO系列算法到这里就介绍完毕了,总的来说,YOLO算法是一款非常适用于工程应用的算法,在保证准确度的同时,大大的提高了算法的精度,并且作者在官网上给出了详尽的算法复现教程,我们能够很容易的将目前世界上最先进的目标检测算法应用到自己的项目中来,不知道拯救了多少待毕业的研究生呢(笑)。YOLO算法的官方网站在这里,希望各位都能够自己在自己的电脑上跑一遍。

参考文献

[6] Object Detection – 论文YOLO(You Only Look Once: Unified, Real-Time Object Detection)解读

[7] YOLO算法解读

[8] YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)

[9] Object Detection – 论文YOLO2(YOLO9000:Better, Faster, Stronger)解读

[10] 论文笔记1–(YOLOv2)YOLO9000:Better,Faster,Stronger

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值