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 / 2 5 1/2^5 1/25,即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出( t x t_x tx, t y t_y ty, t w t_w tw, t h t_h th, t o t_o to),并不像RPN中anchor机制那样去遍历每一个pixel。可以从上面的公式看出,b-box的位置大小和confidence都可以通过( t x t_x tx, t y t_y ty, t w t_w tw, t h t_h th, t o t_o to)计算得来,v2相当直接predict出了b-box的位置大小和confidence。box宽和高的预测是受prior影响的,对于v2而言,b-box prior数为5,在论文中并没有说明抛弃anchor机制之后是否抛弃了聚类得到的prior(没看代码,所以我不能确定),如果prior数继续为5,那么v2需要对不同prior预测出 t w t_w tw t h t_h th
    对于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一样都是( t x t_x tx, t y t_y ty, t w t_w tw, t h t_h th, t o t_o to),然后通过公式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 ) , c l a s s , c o n f i d e n c e (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一文看懂YOLO v4一文看懂YOLO v5

    网络结构

    这儿盗了张图,这张图很好的总结了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,对于某个ground truth,首先要确定其中心点要落在哪个cell上,然后计算这个cell的每个anchor与ground truth的IOU值,计算IOU值时不考虑坐标,只考虑形状(因为anchor没有坐标xy信息),所以先将anchor与ground truth的中心点都移动到同一位置(原点),然后计算出对应的IOU值,IOU值最大的那个先验框anchor与ground truth匹配作为正样本参与训练,对应的预测框用来预测这个ground truth。那么正样本应该如何找?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

    千次阅读 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...

    目标检测:一类基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN,Faster R-CNN),它们是two-stage的,需要先使用启发式方法(selective search)或者CNN网络(RPN)产生Region Proposal,然后再在Region Proposal上做分类与回归。另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个CNN网络直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。

    参考yoloV1

    Yolo算法的特点:You Only Look Once说的是只需要一次CNN运算Unified指的是一个统一的框架,提供end-to-end的预测,而Real-Time体现是Yolo算法速度快。

    滑动窗口与CNN

    滑动窗口的目标检测算法思路非常简单,它将检测问题转化为了图像分类问题。原理就是采用不同大小和比例(宽高比)的窗口在整张图片上以一定的步长进行滑动,然后对这些窗口对应的区域做图像分类,实现对整张图片的检测。致命的缺点,就是你并不知道要检测的目标大小是什么规模,所以你要设置不同大小和比例的窗口去滑动,而且还要选取合适的步长。

    这样会产生很多的子区域,并且都要经过分类器去做预测,这需要很大的计算量,所以你的分类器不能太复杂,因为要保证速度。解决思路之一就是减少要分类的子区域,这就是R-CNN的一个改进策略,其采用了selective search方法来找到最有可能包含目标的子区域(Region Proposal),其实可以看成采用启发式方法过滤掉很多子区域,这会提升效率

    如果你使用的是CNN分类器,那么滑动窗口是非常耗时的,结合卷积运算的特点,我们可以使用CNN实现更高效的滑动窗口方法。这里要介绍的是一种全卷积的方法,简单来说就是网络中用卷积层代替了全连接层,输入图片大小是16x16,经过一系列卷积操作提取了2x2的特征图,但是这个2x2的图上每个元素都是和原图是一一对应的,如图上蓝色的格子对应蓝色的区域,这不就是相当于在原图上做大小为14x14的窗口滑动,且步长为2,共产生4个字区域。最终输出的通道数为4,可以看成4个类别的预测概率值,这样一次CNN计算就可以实现窗口滑动的所有子区域的分类预测

    使用卷积运算,将16*16*3的图像,得到2*2*4的特征图(包含信息一样),实现滑动窗口的所有子区域的分类预测。

    上面尽管可以减少滑动窗口的计算量,但是只是针对一个固定大小与步长的窗口,这是远远不够的。Yolo算法很好的解决了这个问题,它不再是窗口滑动了,而是直接将原始图片分割成互不重合的小方块,然后通过卷积最后生产这样大小的特征图,基于上面的分析,可以认为特征图的每个元素也是对应原始图片的一个小方块,然后用每个元素来可以预测那些中心点在该小方格内的目标

    YOLOv1

    YOLO算法采用一个单独的CNN模型实现end-to-end的目标检测,整个系统如下图所示:首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标

    1. Resize image  2、Run convolutional network 3、Non-max suppression

    YOLO的CNN网络将输入的图片分割成,其中前4个表征边界框的大小与位置,而最后一个值是置信度。

    输入图片被划分为7*7个单元格,每个单元格独立做检测。

    YOLO解决的问题是怎么定位目标、怎么对目标进行分类?

    对于每一个单元格其还要给出预测出边界框 类别 置信度 表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏。后面会说,一般会根据类别置信度来过滤网络的预测框

    每个单元格需要预测大小的张量。在下面的网络结构中我们会详细讲述每个单元格的预测值的分布位置。

    个网络预测值的依据是什么,或者它根据什么来预测。CNN之后得到图像的特征信息,怎么根据特征信息去定位、分类?

    网络设计

    YOLO采用卷积网络来提取特征,然后使用全连接层(fully connected layer)得到预测值。

    全连接层(fully connected layer):卷积取的是局部特征,全连接就是把以前的局部特征重新通过权值矩阵组装成完整的图。

    因为用到了所有的局部特征,所以叫全连接。

    BatchNormalization layer:批量归一化

    https://blog.csdn.net/myarrow/article/details/51848285

    网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层,如图8所示。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数:。但是最后一层却采用线性激活函数。除了上面这个结构,文章还提出了一个轻量级版本Fast Yolo,其仅使用9个卷积层,并且卷积层中使用更少的卷积核

     

    可以看到网络的最后输出为边界框的预测结果,这样提取每个部分是非常方便的,这方面的训练集预测时的计算。Yolov1输出7*7*30的张量,7*7位图像所分的格子数30为 20个类别的概率,box1、box2的置信度,boundingbox(x,y,w,h)。

    Faster R-CNN那种two-stage复杂的网络结构而言,YOLOv1结构相对简单,基本思想:预测框的位置,大小和物体分类都通过CNN暴力预测、输出7*7*30的张量,代表能预测2个框的5个参数和20个种类。S*S(B*5+C)。深度只有30,意味着每个单元格只能预测两个框(而且只认识20类物体),这对于密集型目标检测和小物体都不能很好适用。

    每个小格子怎么判断出该物体呢?换句话说该小格子的特征,怎么能代表整个物体的特征?

    YOLO的做法不是把每个单独的网格作为输入feed到模型,在inference的过程中,网络只是物体中心点位置的划分之用,并不是对图片进行切分,不会让网格脱离整个的关系。(中心点为目标定位,而每个小格子会预测两个boudingbox,得到物体的边界框,这就是目标定位问题

    将原始图像分割成互不重合的小方块,然后通过卷积最后生产这样大小的特征图。特征图的每个元素也是对应原始图片的一个小方块,然后利用每个元素来预测那些中心点在该小方格内的目标。根据什么特征来预测那个元素是中心点的?预测完中心点后wh即boundingbox怎么预测?

    每个cell本身并不知道判断哪个是中心点,而是反过来,根据学习到的特征判断输入网络中图片得到的特征图中哪个元素是 中心点,再根据元素位置找出图像中cell。

    边界框怎么预测?物体怎么类别

    网络训练

    训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用图8中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。

    卷积层:采用各种卷积核对输入图片进行卷积处理。(平移不变性)

    池化层(average-pool):降采用。(空间不变性)

    全连接层:一个神经元在作用于整个slice,即filter的尺寸恰好为一个slice的尺寸。

    训练损失函数的分析,Yolo算法将目标检测看成回归问题,所以采用的是均方差损失函数。但是对不同的部分采用了不同的权重值。首先区分定位误差和分类误差。对于定位误差,即边界框坐标预测误差,采用较大的权重。

    yolo是端到端训练,对于预测框的位置、size、种类、置信度(score)等信息的预测都通过一个损失函数来训练。

     

    S表示网格数,这里是7*7。B表示每个单元格预测框的个数,这里是2;

    第一行总方误差(sum-squared error)来当作位置预测的损失函数,第二行用根号总方误差来当作宽度和高度的损失函数第三行和第四行对置信度confidence也用SSE作为损失函数第五行用SSE作类别概率的损失函数。最后将几个损失函数加到一起,当作YOLOv1的损失函数。

    由于每个单元格预测多个边界框。但是其对应类别只有一个。那么在训练时,如果该单元格内确实存在目标,那么只选择与ground truth的IOU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标。这样设置的一个结果将会使一个单元格对应的边界框更加专业化,其可以分别适用不同大小,不同高宽比的目标,从而提升模型性能

    如果一个单元格内存在多个目标怎么办,其实这时候Yolo算法就只能选择其中一个来训练,这也是Yolo算法的缺点之一

    要注意的一点时,对于不存在对应目标的边界框,其误差项就是只有置信度,左标项误差是没法计算的。而只有当一个单元格内确实存在目标时,才计算分类误差项,否则该项也是无法计算的。

    卷积神经网络相关概念

    激活函数

    根据一些列的输入值,神经元之间连接的权值以及激励规则,刺激神经元。leaky ReLU,相比普通RelU,leaky并不会让负数直接为0,而是乘以一个很小的系数(恒定),保留负数输出,但衰减负数输出;公式如下:

    损失函数

    在训练阶段,用于评估输出结果和实际值的差异。然后用损失函数的值更新每个神经元之间的权重值。卷积神经网络的训练目的就是最小化损失函数值。

    总结

    YOLO优点是采用一个CNN网络来实现检测,是单管道策略,其训练与预测都是end-to-end,所以yolo算法比较简单且速度快。第二点yolo是对整个图片做卷积,所以其在检测目标有更大的视野,它不容易对背景误判。全连接层起到attention的作用。另外,YOLO的泛化能力强,在做迁移时,模型鲁棒性高。

    YOLO缺点:YOLO各个单元格仅仅预测两个边界框,而且属于一个类别。对于小物体,YOLO表现会不如人意。SSD在这方面做了个改进,采用多尺度单元格。Faster R-CNN,采用anchor boxes。YOLO对于物体在宽高比方面泛化率低,无法定位不寻常比例的物体,其定位不准确也是很大的问题。

     

    图解YOLOv3

    图片尺寸:input_shape = [height,width]

    Resize 为256*256并除以255进行归一化;

    标签预处理:boxes转换 为(x,y,w,h,class)格式得到true_box,x,y,w,h除以图像的input_shape进行归一化;

    标签计算:将boxes resize到13*13得到box_output的x,y中心正好落在output的某个grid cell

    Box_output中的每个元素box与所有anchors计算IOU,找到IOU最大值对应的anchor。

    对每张图偏的每个box

     

    展开全文
  • 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-06-14 17:29:56
    YoloV1:https://arxiv.org/abs/1506.02640 YoloV2:https://arxiv.org/abs/1612.08242 YoloV3:https://arxiv.org/abs/1804.02767 官网: ... https://pjreddie.com/darknet/yolo/ Yolo...
  • 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?我是下了篇假文献吧。读完后感觉内容确实不多,而且总感觉写的不够细致,很多地方都比较模糊,可能是作者想让...
  • YOLO框架简述

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

    万次阅读 多人点赞 2018-09-10 17:52:07
    同时,v2的论文也是yolo系列论文里干货最多的文章。美中不足的是,v2论文里并没有像v1那种网络结构图(如图1所示)。 论文标题:《YOLO9000: Better, Faster, Stronger》 论文地址: yolo_v2的一大特点是可以”...
  • opencv 调用yolo,使用海康卫视相机。
  • Keras/Tensorflow+python+yolo3训练自己的数据集

    万次阅读 多人点赞 2018-06-07 21:37:35
    代码:https://github.com/qqwweee/keras-yolo3修改yolov3.cfg文件:https://blog.csdn.net/lilai619/article/details/79695109本文介绍如何制作数据集、修改代码、不加载预权重从头跑自己的训练数据一、简单回顾...
  • 利用pytorch的平台搭建了yolo3目标检测算法,实用性很强
  • 1 YOLO 1.1 Grid Cell YOLO将输入图像分成S×S网格。 每个网格单元仅预测一个对象。 例如,下面的黄色网格单元试图预测其中心(蓝点)落在网格单元内的“人”对象。 每个网格单元预测固定数量的边界框。 在此示例中...
  • MxNetR-YOLO:YOLO-源码

    2021-04-27 13:57:20
    MxNetR中的YOLO v3 这是通过MxNetR实现YOLO的简单示例。 约瑟夫·切特·雷德蒙(Joseph Chet Redmon)提出了这个想法,相关细节可以在他的上找到。 对于MxNetR用户来说,这是一个简单的示例,我将使用一个相对较小...
  • 【深度学习YOLO V1】深刻解读YOLO V1(图解)

    万次阅读 多人点赞 2018-05-08 10:43:24
    http://arxiv.org/abs/1506.02640 darknet版的代码下载:https://github.com/pjreddie/darknettensorflow版本的代码下载:https://github.com/hizhangp/yolo_tens...
  • YOLO YOLO用于物体检测
  • YOLO v3算法详解

    万次阅读 2019-03-25 23:44:21
    YOLO算法详解,YOLO v2算法详解 1.The Deal 接下来,从头梳理整个网络,如果对YOLOYOLO v2不熟悉,可以看一下我之前的博客。 1.1 Bounding Box Prediction YOLO v3沿用YOLO9000预测bounding box的方法,通过...
  • YOLO结构图理解YOLO的一些简图
  • 该资源包括YOLO权重文件,YOLO配置文件,YOLO框架的测试源码,主要针对YOLOv1-v3版本,方便大家入门YOLO
  • autoware1.14的YOLO2、YOLO3权重文件
  • YOLO1、YOLO2、YOLO3对比

    千次阅读 2019-08-27 17:40:26
    YOLO详解参见地址: YOLO1:https://blog.csdn.net/qq_32172681/article/details/99418000 YOLO2:https://blog.csdn.net/qq_32172681/article/details/99482044 YOLO3:...
  • 深度学习吴恩达课程中yolo算法需要的yolo.h5文件,欢迎下载
  • YOLO_tensorflow (版本0.3,最后更新:2017.02.21) 1.引言 这是YOLO的tensorflow实现:实时对象检测 目前,它只能使用预先训练的YOLO_small和YOLO_tiny网络进行预测。 (+ YOLO_face检测器来自 ) 我从Darknet...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,655
精华内容 18,262
关键字:

yolo