yolo 订阅
YOLO,美语新词,是You Only Live Once的首字母缩略词,意为你只能活一次,应该活在当下,大胆去做。YOLO的寓意是人应该享受人生,即使需要承担风险。就是鼓励人们不怕冒险,想做什么就做什么,享受人生,因为只会活一次。 [1]  词典编纂者Ben Zimmer发现该新词最早起源于YOLO商标,释义为You Only Live Once,现在这一句话常常用在青少年的对话和音乐当中。加拿大饶舌歌手德雷克的《The Motto》使此句普及于网络中;BTS的歌曲《INTRO : O!RUL8,2?》 [2]  和《Go Go》 [3]  分别使用了"You only live once" [4]  和"YOLO" [5]  。2016年该新词首次作为词条收录于牛津词典。2019年中国男子流行演唱组合R1SE在其第二张专辑《炸裂狂想曲》中以柯洁与ALPHAGO人机对战为背景创作的《Never Surrender》中提到“我的格言是YOLO”。 展开全文
YOLO,美语新词,是You Only Live Once的首字母缩略词,意为你只能活一次,应该活在当下,大胆去做。YOLO的寓意是人应该享受人生,即使需要承担风险。就是鼓励人们不怕冒险,想做什么就做什么,享受人生,因为只会活一次。 [1]  词典编纂者Ben Zimmer发现该新词最早起源于YOLO商标,释义为You Only Live Once,现在这一句话常常用在青少年的对话和音乐当中。加拿大饶舌歌手德雷克的《The Motto》使此句普及于网络中;BTS的歌曲《INTRO : O!RUL8,2?》 [2]  和《Go Go》 [3]  分别使用了"You only live once" [4]  和"YOLO" [5]  。2016年该新词首次作为词条收录于牛津词典。2019年中国男子流行演唱组合R1SE在其第二张专辑《炸裂狂想曲》中以柯洁与ALPHAGO人机对战为背景创作的《Never Surrender》中提到“我的格言是YOLO”。
信息
外文名
YOLO
全    拼
You Only Live Once
含    义
你只活一次
yolo来源意义
美国好莱坞著名演员梅·蕙丝(Mae West,1893年8月7日-1980年11月22日)被公认为是最先使用这句话 的,因为她有这样一句台词“You only live once, but if you do it right, once is enough”(你只能活一次,如果活得精彩,一次也就足够了)。1774年,约翰·沃尔夫冈·冯·歌德(Johann Walfgang Van Goethe)在他年的戏剧《柯拉维果》(CLAVIGO)里的“One lives but once in the world(一个人在这世上只活一次);1855年,奥地利著名的作曲家小约翰·施特劳斯(Johann Strauß)将一首圆舞曲命名为Man lebt nur einmal!(德语,意思是你只会活一次)。 [6] 
收起全文
精华内容
下载资源
问答
  • yolo系列之yolo v3【深度解析】

    万次阅读 多人点赞 2018-09-12 16:24:48
    yolo_v3是我最近一段时间主攻的算法,写下博客,以作分享交流。 看过yolov3论文的应该都知道,这篇论文写得很随意,很多亮点都被作者都是草草描述。很多骚年入手yolo算法都是从v3才开始,这是不可能掌握yolo精髓的...

    版权申明:转载和引用图片,都必须经过书面同意。获得留言同意即可
    本文使用图片多为本人所画,需要高清图片可以留言联系我,先点赞后取图
    这篇博文比较推荐的yolo v3代码是qwe的keras版本,复现比较容易,代码相对来说比较容易理解。同学们可以结合代码和博文共同理解v3的精髓。
    github地址:https://github.com/qqwweee/keras-yolo3


    前言

    前言就是唠唠嗑,想直接看干货可以跳过前言,直接看Yolo v3。
    yolo_v3是我最近一段时间主攻的算法,写下博客,以作分享交流。
    看过yolov3论文的应该都知道,这篇论文写得很随意,很多亮点都被作者都是草草描述。很多骚年入手yolo算法都是从v3才开始,这是不可能掌握yolo精髓的,因为v3很多东西是保留v2甚至v1的东西,而且v3的论文写得很随心。想深入了解yolo_v3算法,是有必要先了解v1和v2的。以下是我关于v1和v2算法解析所写的文章:
    v1算法解析:《yolo系列之yolo v1
    v2算法解析:《yolo系列之yolo v2
    yolo_v3作为yolo系列目前最新的算法,对之前的算法既有保留又有改进。先分析一下yolo_v3上保留的东西:

    1. “分而治之”,从yolo_v1开始,yolo算法就是通过划分单元格来做检测,只是划分的数量不一样。
    2. 采用"leaky ReLU"作为激活函数。
    3. 端到端进行训练。一个loss function搞定训练,只需关注输入端和输出端。
    4. 从yolo_v2开始,yolo就用batch normalization作为正则化、加速收敛和避免过拟合的方法,把BN层和leaky relu层接到每一层卷积层之后。
    5. 多尺度训练。在速度和准确率之间tradeoff。想速度快点,可以牺牲准确率;想准确率高点儿,可以牺牲一点速度。

    yolo每一代的提升很大一部分决定于backbone网络的提升,从v2的darknet-19到v3的darknet-53。yolo_v3还提供替换backbone——tiny darknet。要想性能牛叉,backbone可以用Darknet-53,要想轻量高速,可以用tiny-darknet。总之,yolo就是天生“灵活”,所以特别适合作为工程算法。
    当然,yolo_v3在之前的算法上保留的点不可能只有上述几点。由于本文章主要针对yolo_v3进行剖析,不便跑题,下面切入正题。


    YOLO v3

    网上关于yolo v3算法分析的文章一大堆,但大部分看着都不爽,为什么呢?因为他们没有这个玩意儿:

    图1. yolo_v3结构图
    yolo系列里面,作者只在v1的论文里给出了结构图,而v2和v3的论文里都没有结构图,这使得读者对后两代yolo结构的理解变得比较难。but,对于yolo学习者来说,脑子里没有一个清晰的结构图,就别说自己懂yolo了。上图是我根据官方代码和官方论文以及模型结构可视化工具等经过好几个小时画出来的,修订过几个版本。所以,上图的准确性是可以保证的

    这里推荐的模型结构可视化工具是Netron
    netron方便好用,可以直观看到yolo_v3的实际计算结构,精细到卷积层。But,要进一步在人性化的角度分析v3的结构图,还需要结合论文和代码。对此,我是下了不少功夫。
    上图表示了yolo_v3整个yolo_body的结构,没有包括把输出解析整理成咱要的[box, class, score]。对于把输出张量包装成[box, class, score]那种形式,还需要写一些脚本,但这已经在神经网络结构之外了(我后面会详细解释这波操作)。
    为了让yolo_v3结构图更好理解,我对图1做一些补充解释:
    DBL: 如图1左下角所示,也就是代码中的Darknetconv2d_BN_Leaky,是yolo_v3的基本组件。就是卷积+BN+Leaky relu。对于v3来说,BN和leaky relu已经是和卷积层不可分离的部分了(最后一层卷积除外),共同构成了最小组件。
    resn:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit。这是yolo_v3的大组件,yolo_v3开始借鉴了ResNet的残差结构,使用这种结构可以让网络结构更深(从v2的darknet-19上升到v3的darknet-53,前者没有残差结构)。对于res_block的解释,可以在图1的右下角直观看到,其基本组件也是DBL。
    concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。

    我们可以借鉴netron来分析网络层,整个yolo_v3_body包含252层,组成如下:
    layers

    表0. yolo_v3_layers
    根据表0可以得出,对于代码层面的layers数量一共有252层,包括add层23层(主要用于res_block的构成,每个res_unit需要一个add层,一共有1+2+8+8+4=23层)。除此之外,BN层和LeakyReLU层数量完全一样(72层),在网络结构中的表现为:每一层BN后面都会接一层LeakyReLU。卷积层一共有75层,其中有72层后面都会接BN+LeakyReLU的组合构成基本组件DBL。看结构图,可以发现上采样和concat都有2次,和表格分析中对应上。每个res_block都会用上一个零填充,一共有5个res_block。

    1. backbone

    整个v3结构里面,是没有池化层和全连接层的。前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,比如stride=(2, 2),这就等于将图像边长缩小了一半(即面积缩小到原来的1/4)。在yolo_v2中,要经历5次缩小,会将特征图缩小到原输入尺寸的1/251/2^5,即1/32。输入为416x416,则输出为13x13(416/32=13)。
    yolo_v3也和v2一样,backbone都会将输出特征图缩小到输入的1/32。所以,通常都要求输入图片是32的倍数。可以对比v2和v3的backbone看看:(DarkNet-19 与 DarkNet-53)

    图2. darknet-19 vs darknet-53
    yolo_v2中对于前向过程中张量尺寸变换,都是通过最大池化来进行,一共有5次。而v3是通过卷积核增大步长来进行,也是5次。(darknet-53最后面有一个全局平均池化,在yolo-v3里面没有这一层,所以张量维度变化只考虑前面那5次)。
    这也是416x416输入得到13x13输出的原因。从图2可以看出,darknet-19是不存在残差结构(resblock,从resnet上借鉴过来)的,和VGG是同类型的backbone(属于上一代CNN结构),而darknet-53是可以和resnet-152正面刚的backbone,看下表:

    这里写图片描述

    表1. backbone对比图
    从上表也可以看出,darknet-19在速度上仍然占据很大的优势。其实在其他细节也可以看出(比如bounding box prior采用k=9),yolo_v3并没有那么追求速度,而是在保证实时性(fps>36)的基础上追求performance。不过前面也说了,你要想更快,还有一个tiny-darknet作为backbone可以替代darknet-53,在官方代码里用一行代码就可以实现切换backbone。搭用tiny-darknet的yolo,也就是tiny-yolo在轻量和高速两个特点上,显然是state of the art级别,tiny-darknet是和squeezeNet正面刚的网络,详情可以看下表:
    表2. 轻量级对比图
    所以,有了yolo v3,就真的用不着yolo v2了,更用不着yolo v1了。这也是[yolo官方网站](https://pjreddie.com/darknet/),在v3出来以后,就没提供v1和v2代码下载链接的原因了。

    2. Output

    对于图1而言,更值得关注的是输出张量:

    yolo v3输出了3个不同尺度的feature map,如上图所示的y1, y2, y3。这也是v3论文中提到的为数不多的改进点:predictions across scales
    这个借鉴了FPN(feature pyramid networks),采用多尺度来对不同size的目标进行检测,越精细的grid cell就可以检测出越精细的物体。
    y1,y2和y3的深度都是255,边长的规律是13:26:52
    对于COCO类别而言,有80个种类,所以每个box应该对每个种类都输出一个概率。
    yolo v3设定的是每个网格单元预测3个box,所以每个box需要有(x, y, w, h, confidence)五个基本参数,然后还要有80个类别的概率。所以3*(5 + 80) = 255。这个255就是这么来的。(还记得yolo v1的输出张量吗? 7x7x30,只能识别20类物体,而且每个cell只能预测2个box,和v3比起来就像老人机和iphoneX一样)
    v3用上采样的方法来实现这种多尺度的feature map,可以结合图1和图2右边来看,图1中concat连接的两个张量是具有一样尺度的(两处拼接分别是26x26尺度拼接和52x52尺度拼接,通过(2, 2)上采样来保证concat拼接的张量尺度相同)。作者并没有像SSD那样直接采用backbone中间层的处理结果作为feature map的输出,而是和后面网络层的上采样结果进行一个拼接之后的处理结果作为feature map。为什么这么做呢? 我感觉是有点玄学在里面,一方面避免和其他算法做法重合,另一方面这也许是试验之后并且结果证明更好的选择,再者有可能就是因为这么做比较节省模型size的。这点的数学原理不用去管,知道作者是这么做的就对了。


    3. some tricks

    上文把yolo_v3的结构讨论了一下,下文将对yolo v3的若干细节进行剖析。
    Bounding Box Prediction
    b-box预测手段是v3论文中提到的又一个亮点。先回忆一下v2的b-box预测:想借鉴faster R-CNN RPN中的anchor机制,但不屑于手动设定anchor prior(模板框),于是用维度聚类的方法来确定anchor box prior(模板框),最后发现聚类之后确定的prior在k=5也能够又不错的表现,于是就选用k=5。后来呢,v2又嫌弃anchor机制线性回归的不稳定性(因为回归的offset可以使box偏移到图片的任何地方),所以v2最后选用了自己的方法:直接预测相对位置。预测出b-box中心点相对于网格单元左上角的相对坐标。

    公式1

    这里写图片描述
    yolo v2直接predict出(txt_x, tyt_y, twt_w, tht_h, tot_o),并不像RPN中anchor机制那样去遍历每一个pixel。可以从上面的公式看出,b-box的位置大小和confidence都可以通过(txt_x, tyt_y, twt_w, tht_h, tot_o)计算得来,v2相当直接predict出了b-box的位置大小和confidence。box宽和高的预测是受prior影响的,对于v2而言,b-box prior数为5,在论文中并没有说明抛弃anchor机制之后是否抛弃了聚类得到的prior(没看代码,所以我不能确定),如果prior数继续为5,那么v2需要对不同prior预测出twt_wtht_h
    对于v3而言,在prior这里的处理有明确解释:选用的b-box priors 的k=9,对于tiny-yolo的话,k=6。priors都是在数据集上聚类得来的,有确定的数值,如下:

    10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
    

    每个anchor prior(名字叫anchor prior,但并不是用anchor机制)就是两个数字组成的,一个代表高度另一个代表宽度。
    v3对b-box进行预测的时候,采用了logistic regression。这一波操作sao得就像RPN中的线性回归调整b-box。v3每次对b-box进行predict时,输出和v2一样都是(txt_x, tyt_y, twt_w, tht_h, tot_o),然后通过公式1计算出绝对的(x, y, w, h, c)。
    logistic回归用于对anchor包围的部分进行一个目标性评分(objectness score),即这块位置是目标的可能性有多大。这一步是在predict之前进行的,可以去掉不必要anchor,可以减少计算量。作者在论文种的描述如下:

    If the bounding box prior is not the best but does overlap a ground truth object by more than some threshold we ignore the prediction, following[17]. We use the threshold of 0.5. Unlike [17] our system only assigns one bounding box prior for each ground truth object.

    如果模板框不是最佳的即使它超过我们设定的阈值,我们还是不会对它进行predict。
    不同于faster R-CNN的是,yolo_v3只会对1个prior进行操作,也就是那个最佳prior。而logistic回归就是用来从9个anchor priors中找到objectness score(目标存在可能性得分)最高的那一个。logistic回归就是用曲线对prior相对于 objectness score映射关系的线性建模。
    疑问解答和说明:

    在评论里有同学问我关于输出的问题,看来我在这里没有说的很清楚。了解v3输出的输出是至关重要的。
    
    第一点, 9个anchor会被三个输出张量平分的。根据大中小三种size各自取自己的anchor。
    
    第二点,每个输出y在每个自己的网格都会输出3个预测框,这3个框是9除以3得到的,这是作者设置
    的,我们可以从输出张量的维度来看,13x13x255。255是怎么来的呢,3*(5+80)。80表示80个种类,5表
    示位置信息和置信度,3表示要输出3个prediction。在代码上来看,3*(5+80)中的3是直接由
    num_anchors//3得到的。
    
    第三点,作者使用了logistic回归来对每个anchor包围的内容进行了一个目标性评分(objectness score)。
    根据目标性评分来选择anchor prior进行predict,而不是所有anchor prior都会有输出。
    

    loss function

    对掌握Yolo来讲,loss function不可谓不重要。在v3的论文里没有明确提所用的损失函数,确切地说,yolo系列论文里面只有yolo v1明确提了损失函数的公式。对于yolo这样一种讨喜的目标检测算法,就连损失函数都非常讨喜。在v1中使用了一种叫sum-square error的损失计算方法,就是简单的差方相加而已。想详细了解的可以看我关于v1解释的博文。我们知道,在目标检测任务里,有几个关键信息是需要确定的:(x,y),(w,h),class,confidence (x, y), (w, h), class, confidence
    根据关键信息的特点可以分为上述四类,损失函数应该由各自特点确定。最后加到一起就可以组成最终的loss_function了,也就是一个loss_function搞定端到端的训练。可以从代码分析出v3的损失函数,同样也是对以上四类,不过相比于v1中简单的总方误差,还是有一些调整的:

    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
    

    以上是一段keras框架描述的yolo v3 的loss_function代码。忽略恒定系数不看,可以从上述代码看出:除了w, h的损失函数依然采用总方误差之外,其他部分的损失函数用的是二值交叉熵。最后加到一起。那么这个binary_crossentropy又是个什么玩意儿呢?就是一个最简单的交叉熵而已,一般用于二分类,这里的两种二分类类别可以理解为"对和不对"这两种。关于binary_crossentropy的公式详情可参考博文《常见的损失函数》。


    总结

    v3毫无疑问现在成为了工程界首选的检测算法之一了,结构清晰,实时性好。这是我十分安利的目标检测算法,更值得赞扬的是,yolo_v3给了近乎白痴的复现教程,这种气量在顶层算法研究者中并不常见。你可以很快的用上v3,但你不能很快地懂v3,我花了近一个月的时间才对v3有一个清晰的了解(可能是我悟性不够哈哈哈)。在算法学习的过程中,去一些浮躁,好好理解算法比只会用算法难得很多。

    展开全文
  • 一文看懂YOLO v3

    万次阅读 多人点赞 2019-03-31 09:58:05
    YOLO系列的目标检测算法可以说是目标检测史上的宏篇巨作,接下来我们来详细介绍一下YOLO v3算法内容,v3的算法是在v1和v2的基础上形成的,所以有必要先回忆: 一文看懂YOLO v2,一文看懂YOLO v2...

    论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf
    论文:YOLOv3: An Incremental Improvement

    YOLO系列的目标检测算法可以说是目标检测史上的宏篇巨作,接下来我们来详细介绍一下YOLO v3算法内容,v3的算法是在v1和v2的基础上形成的,所以有必要先回忆: 一文看懂YOLO v1一文看懂YOLO v2目标检测map

    网络结构

    这儿盗了张图,这张图很好的总结了YOLOV3的结构,让我们对YOLO有更加直观的理解。在这里插入图片描述
    DBL:代码中的Darknetconv2d_BN_Leaky,是yolo_v3的基本组件。就是卷积+BN+Leaky relu。
    resn:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit。不懂resnet戳这儿
    concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。

    后面我们一起分析网络一些细节与难懂的地方

    backbone:darknet-53

    为了达到更好的分类效果,作者自己设计训练了darknet-53。作者在ImageNet上实验发现这个darknet-53,的确很强,相对于ResNet-152和ResNet-101,darknet-53不仅在分类精度上差不多,计算速度还比ResNet-152和ResNet-101强多了,网络层数也比他们少。
    在这里插入图片描述

    Yolo_v3使用了darknet-53的前面的52层(没有全连接层),yolo_v3这个网络是一个全卷积网络,大量使用残差的跳层连接,并且为了降低池化带来的梯度负面效果,作者直接摒弃了POOLing,用conv的stride来实现降采样。在这个网络结构中,使用的是步长为2的卷积来进行降采样。

    为了加强算法对小目标检测的精确度,YOLO v3中采用类似FPN的upsample和融合做法(最后融合了3个scale,其他两个scale的大小分别是26×26和52×52),在多个scale的feature map上做检测。

    作者在3条预测支路采用的也是全卷积的结构,其中最后一个卷积层的卷积核个数是255,是针对COCO数据集的80类:3*(80+4+1)=255,3表示一个grid cell包含3个bounding box,4表示框的4个坐标信息,1表示objectness score。

    output

    在这里插入图片描述
    所谓的多尺度就是来自这3条预测之路,y1,y2和y3的深度都是255,边长的规律是13:26:52。yolo v3设定的是每个网格单元预测3个box,所以每个box需要有(x, y, w, h, confidence)五个基本参数,然后还要有80个类别的概率。所以3×(5 + 80) = 255。这个255就是这么来的。

    下面我们具体看看y1,y2,y3是如何而来的。
    网络中作者进行了三次检测,分别是在32倍降采样,16倍降采样,8倍降采样时进行检测,这样在多尺度的feature map上检测跟SSD有点像。在网络中使用up-sample(上采样)的原因:网络越深的特征表达效果越好,比如在进行16倍降采样检测,如果直接使用第四次下采样的特征来检测,这样就使用了浅层特征,这样效果一般并不好。如果想使用32倍降采样后的特征,但深层特征的大小太小,因此yolo_v3使用了步长为2的up-sample(上采样),把32倍降采样得到的feature map的大小提升一倍,也就成了16倍降采样后的维度。同理8倍采样也是对16倍降采样的特征进行步长为2的上采样,这样就可以使用深层特征进行detection。

    作者通过上采样将深层特征提取,其维度是与将要融合的特征层维度相同的(channel不同)。如下图所示,85层将13×13×256的特征上采样得到26×26×256,再将其与61层的特征拼接起来得到26×26×768。为了得到channel255,还需要进行一系列的3×3,1×1卷积操作,这样既可以提高非线性程度增加泛化性能提高网络精度,又能减少参数提高实时性。52×52×255的特征也是类似的过程。

    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    从图中,我们可以看出y1,y2,y3的由来。

    Bounding Box

    YOLO v3的Bounding Box由YOLOV2又做出了更好的改进。在yolo_v2和yolo_v3中,都采用了对图像中的object采用k-means聚类。 feature map中的每一个cell都会预测3个边界框(bounding box) ,每个bounding box都会预测三个东西:(1)每个框的位置(4个值,中心坐标tx和ty,,框的高度bh和宽度bw),(2)一个objectness prediction ,(3)N个类别,coco数据集80类,voc20类。

    三次检测,每次对应的感受野不同,32倍降采样的感受野最大,适合检测大的目标,所以在输入为416×416时,每个cell的三个anchor box为(116 ,90); (156 ,198); (373 ,326)。16倍适合一般大小的物体,anchor box为(30,61); (62,45); (59,119)。8倍的感受野最小,适合检测小目标,因此anchor box为(10,13); (16,30); (33,23)。所以当输入为416×416时,实际总共有(52×52+26×26+13×13)×3=10647个proposal box。
    在这里插入图片描述
    感受一下9种先验框的尺寸,下图中蓝色框为聚类得到的先验框。黄色框式ground truth,红框是对象中心点所在的网格。
    在这里插入图片描述

    这里注意bounding box 与anchor box的区别:
    Bounding box它输出的是框的位置(中心坐标与宽高),confidence以及N个类别。
    anchor box只是一个尺度即只有宽高。

    LOSS Function

    YOLOv3重要改变之一:No more softmaxing the classes。
    YOLO v3现在对图像中检测到的对象执行多标签分类。

    logistic回归用于对anchor包围的部分进行一个目标性评分(objectness score),即这块位置是目标的可能性有多大。这一步是在predict之前进行的,可以去掉不必要anchor,可以减少计算量。

    如果模板框不是最佳的即使它超过我们设定的阈值,我们还是不会对它进行predict。
    不同于faster R-CNN的是,yolo_v3只会对1个prior进行操作,也就是那个最佳prior。而logistic回归就是用来从9个anchor priors中找到objectness score(目标存在可能性得分)最高的那一个。logistic回归就是用曲线对prior相对于 objectness score映射关系的线性建模。

    	lxy, lwh, lcls, lconf = ft([0]), ft([0]), ft([0]), ft([0])
        txy, twh, tcls, indices = build_targets(model, targets)#在13 26 52维度中找到大于iou阈值最适合的anchor box 作为targets
        #txy[维度(0:2),(x,y)] twh[维度(0:2),(w,h)] indices=[0,anchor索引,gi,gj]
    
        # Define criteria
        MSE = nn.MSELoss()
        CE = nn.CrossEntropyLoss()
        BCE = nn.BCEWithLogitsLoss()
    
        # Compute losses
        h = model.hyp  # hyperparameters
        bs = p[0].shape[0]  # batch size
        k = h['k'] * bs  # loss gain
        for i, pi0 in enumerate(p):  # layer i predictions, i
            b, a, gj, gi = indices[i]  # image, anchor, gridx, gridy
            tconf = torch.zeros_like(pi0[..., 0])  # conf
    
    
            # Compute losses
            if len(b):  # number of targets
                pi = pi0[b, a, gj, gi]  # predictions closest to anchors 找到p中与targets对应的数据lxy
                tconf[b, a, gj, gi] = 1  # conf
                # pi[..., 2:4] = torch.sigmoid(pi[..., 2:4])  # wh power loss (uncomment)
    
                lxy += (k * h['xy']) * MSE(torch.sigmoid(pi[..., 0:2]),txy[i])  # xy loss
                lwh += (k * h['wh']) * MSE(pi[..., 2:4], twh[i])  # wh yolo loss
                lcls += (k * h['cls']) * CE(pi[..., 5:], tcls[i])  # class_conf loss
    
            # pos_weight = ft([gp[i] / min(gp) * 4.])
            # BCE = nn.BCEWithLogitsLoss(pos_weight=pos_weight)
            lconf += (k * h['conf']) * BCE(pi0[..., 4], tconf)  # obj_conf loss
        loss = lxy + lwh + lconf + lcls
    
    

    以上是一段pytorch框架描述的yolo v3 的loss_function代码。忽略恒定系数不看,以下我想着重说几点:

    • 首先,yolov3要先build target,因为我们知道正样本是label与anchor box iou大于0.5的组成,所以我们根据label找到对应的anchor box。如何找?label中存放着[image,class,x(归一化),y,w(归一化),h],我们可以用这些坐标在对应13×13 Or 26×26 or 52×52的map中分别于9个anchor算出iou,找到符合要求的,把索引与位置记录好。用记录好的索引位置找到predict的anchor box。
    • xywh是由均方差来计算loss的,其中预测的xy进行sigmoid来与lable xy求差,label xy是grid cell中心点坐标,其值在0-1之间,所以predict出的xy要sigmoid。
    • 分类用的多类别交叉熵,置信度用的二分类交叉熵。只有正样本才参与class,xywh的loss计算,负样本只参与置信度loss。

    参考文章:
    https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b
    https://blog.csdn.net/yanzi6969/article/details/80505421
    https://blog.csdn.net/chandanyan8568/article/details/81089083
    https://blog.csdn.net/leviopku/article/details/82660381
    https://blog.csdn.net/u014380165/article/details/80202337

    展开全文
  • Yolo

    2020-10-26 20:11:41
    文章目录YOLO v1原理介绍网络结果分析损失函数网络训练网络存在问题网络性能Yolo V2原理改进Batch Normalization高分辨率分类器Anchor Boxes细粒度特征多尺度训练网络结果网络性能Yolo 9000Yolo v3改进策略主干网络...

    YOLO v1

    原理介绍

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    一个格子只能预测一个物体,如果存在多个小目标,效果非常的差。

    网络结果分析

    在这里插入图片描述

    损失函数

    在这里插入图片描述

    网络训练

    在这里插入图片描述

    网络存在问题

    在这里插入图片描述

    网络性能

    在这里插入图片描述

    Yolo V2

    原理

    在这里插入图片描述

    改进

    在这里插入图片描述

    Batch Normalization

    在这里插入图片描述

    高分辨率分类器

    在这里插入图片描述

    Anchor Boxes

    在这里插入图片描述
    为了让后面特征提取的宽高比为奇数,采用416 * 416大小的图像。大物体占据

    细粒度特征

    在这里插入图片描述

    多尺度训练

    在这里插入图片描述

    网络结果

    在这里插入图片描述
    在这里插入图片描述

    网络性能

    在这里插入图片描述

    Yolo 9000

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    Yolo v3

    在这里插入图片描述

    改进策略

    在这里插入图片描述

    主干网络(类ResNet)

    在这里插入图片描述

    多尺度(类FPN)

    在这里插入图片描述

    在这里插入图片描述

    分类器

    在这里插入图片描述

    网络性能

    在这里插入图片描述
    在这里插入图片描述

    Darknet

    在这里插入图片描述
    在这里插入图片描述

    Yolo优点与缺点

    在这里插入图片描述

    linux下配置DarkNet

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • YOLO

    2019-09-24 08:10:49
    run the detector ..../darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg ./darknet detector test cfg/coco.data cfg/yolo.cfg yolo.weights data/dog.jpg ./darknet detect cfg/yolo...

     run the detector

    ./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg

     

    ./darknet detector test cfg/coco.data cfg/yolo.cfg yolo.weights data/dog.jpg

     

    ./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg -thresh 0

     

    转载于:https://www.cnblogs.com/zhoulixue/p/6774373.html

    展开全文
  • yolo

    千次阅读 2019-10-24 16:06:07
    目标检测:一类基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN,Faster R-CNN),它们是two-stage的,需要先使用启发式方法(selective search)...另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个CNN...
  • YoLo

    2018-04-17 21:07:29
    yolo的过程非常简单。就是每次输入一整张的图片,文中作者选择resize到了448×448448×448448\times 448。然后输出是147014701470维的向量。其中1470=7×7×(20+2×5)1470=7×7×(20+2×5)1470=7\times...
  • YOLO系列之yolo v1

    万次阅读 多人点赞 2018-09-10 13:17:48
    yolo v1发表在CVPR2016上,是经典的one-stage检测算法。 论文标题: 《You Only Look Once: Unified, Real-Time Object Detection》 论文地址:https://arxiv.org/pdf/1506.02640.pdf v1是yolo系列的开山之作...
  • YOLO v3网络结构分析

    万次阅读 多人点赞 2018-07-26 12:07:09
    相信阅读了YOLO v3论文的小伙伴们会发现为什么这次的论文篇幅这么少?除去参考文献就四面?Excuse me?我是下了篇假文献吧。读完后感觉内容确实不多,而且总感觉写的不够细致,很多地方都比较模糊,可能是作者想让...
  • 睿智的目标检测11——Keras搭建yolo3目标检测平台

    万次阅读 多人点赞 2019-11-27 17:33:51
    睿智的目标检测11——Keras搭建yolo3目标检测平台学习前言yolo3实现思路一、预测部分1、主题网络darknet53介绍2、从特征获取预测结果3、预测结果的解码4、在原图上进行绘制二、训练部分计算loss所需参数1、y_pre2、y...
  • YOLO系列之yolo v2

    万次阅读 多人点赞 2018-09-10 17:52:07
    同时,v2的论文也是yolo系列论文里干货最多的文章。美中不足的是,v2论文里并没有像v1那种网络结构图(如图1所示)。 论文标题:《YOLO9000: Better, Faster, Stronger》 论文地址: yolo_v2的一大特点是可以”...
  • YOLO框架简述

    万次阅读 多人点赞 2019-06-14 11:08:48
    YOLO(You Only Look Once)是一种基于深度神经网络的对象识别和定位算法,其最大的特点是运行速度很快,可以用于实时系统。现在YOLO已经发展到v3版本,不过新版本也是在原有版本基础上不断改进演化的,所以本文先...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,807
精华内容 6,322
关键字:

yolo