精华内容
下载资源
问答
  • 当你还很小的时候原文
    千次阅读
    2020-05-25 13:34:00

    最近新出了YOLOV4,我系统的从V1开始整理出稿,传送门:
    【YOLOv1原文+翻译】You Only Look Once Unified, Real-Time Object Detection
    【YOLOv2原文+翻译】YOLO9000: Better, Faster, Stronger
    【YOLOv3原文+翻译】YOLOv3:An Incremental Improvement
    【YOLOv4原文+翻译】YOLOv4:Optimal Speed and Accuracy of Object Detection

    首先上传原文:百度云盘
    提取码:
    r4pi
    因为大多数博主所给的都是外链,对于没有梯子的同学来说打开非常痛苦,我直接上传PDF啦

    正文开始

    Abstract(摘要)

    我们为YOLO提供了一系列更新!它包含一堆小设计,可以使系统的性能得到更新;也包含一个新训练的、非常棒的神经网络,虽然比上一版更大一些,但精度也提高了。不用担心,虽然体量大了点,它的速度还是有保障的。在输入320×320的图片后,YOLOv3能在22毫秒内完成处理,并取得28.2mAP的成绩。它的精度和SSD相当,但速度要快上3倍。和旧版数据相比,v3版进步明显。在Titan X环境下,YOLOv3的检测精度为57.9AP5057.9AP50,用时51ms;而RetinaNet的精度只有57.5AP5057.5AP50,但却需要198ms,相当于YOLOv3的3.8倍。

    1. Introduction(介绍)

    你知道有时候你会花一年的时间只是打打电话吗?今年我没有做很多研究。我在Twitter上花了很多时间。也玩了一下GAN。去年我留下了一点点的动力;我设法对YOLO进行了一些改进。但是诚然,没有什么能像这个超级有趣了,只是一小堆(bunch)改变使它变得更好。我也帮助其他人做了一些研究。

    其实,这就是今天带给我们的。我们有一个最终稿截止日期(camera-ready deadline),我们需要引用一些我对YOLO做的随机更新,但我们没有来源。所以开始为技术报告做准备!

    关于技术报告的好处是他们不需要介绍,你们都知道我们为什么来到这里。因此,这篇介绍性文章的结尾将为本文的其余部分提供signpost。首先我们会告诉你YOLOv3的详细内容。然后我们会告诉你我们是怎么做的。我们还会告诉你我们尝试过的一些没有奏效的事情。最后,我们来思考这一切意味着什么。

    2. The Deal

    谈到YOLOv3的更新情况,其实大多数时候我们就是直接把别人的好点子拿来用了。我们还训练了一个全新的、比其他网络更好的分类网络。为了方便你理解,让我们从头开始慢慢介绍。
    在这里插入图片描述

    图1.我们采用了焦距损失论文的这一数字。YOLOv3的运行速度明显快于其他性能相当的检测方法。无论是M40还是Titan X,它们基本上是同一个GPU。

    2.1 Bounding Box Prediction(边界框预测)

    在YOLO9000后,我们的系统开始用维度集群(dimension clusters)固定锚定框(anchor box)来选定边界框。神经网络会为每个边界框预测4个坐标:tx、ty、tw、th。如果目标cell距离图像左上角的边距是(cx, cy),且它对应边界框的宽和高为pw、ph,那么网络的预测值会是:

    在这里插入图片描述
    在训练期间,我们会计算平方误差损失。如果预测坐标的ground truth是tˆ*,那相应的梯度就是ground truth值和预测值的差:tˆ*-t*。通过对上面的公式变形,可以很容易地计算这个ground truth。

    YOLOv3使用逻辑回归预测每个边界框(bounding box)的对象分数。 如果先前的边界框比之前的任何其他边界框重叠ground truth对象,则该值应该为1。如果以前的边界框不是最好的,但是确实将ground truth对象重叠了一定的阈值以上,我们会忽略这个预测,按照[17]进行。我们使用阈值0.5。与[17]不同,我们的系统只为每个ground truth对象分配一个边界框。如果先前的边界框未分配给grounding box对象,则不会对坐标或类别预测造成损失。
    在这里插入图片描述

    图2.带有维度先验和位置预测的边界框。我们预测框的宽度和高度是由集群重心的偏移量决定的。我们使用sigmoid函数来预测框的中心坐标相对于滤波器的位置。这一数字公然自我抄袭自[15]。

    2.2 Class Prediction(类预测)

    每个框使用多标签分类来预测边界框可能包含的类。我们不使用softmax,因为我们发现它对于高性能是非必要的,相反,我们只是使用独立的逻辑分类器。 在训练过程中,我们使用二元交叉熵损失来进行类别预测。

    这个公式有助于我们转向更复杂的领域,如Open Image Dataset。在这个数据集中有许多重叠的标签(如女性和人物)。使用softmax会强加了一个假设,即每个框中只有一个类别,但通常情况并非如此。多标签方法更好地模拟数据。

    2.3 Prediction Across Scales(跨尺度预测)

    YOLOv3预测3种不同尺度的框(boxes)。我们的系统使用类似的概念来提取这些尺度的特征,以形成金字塔网络[6]。从我们的基本特征提取器中,我们添加了几个卷积层。最后一种方法预测了一个三维张量编码的边界框、对象性和类预测。在我们的COCO实验中,我们在每个尺度上预测了3个框,因此张量是N×N×[3*(4 + 1 + 80)],用于4个边界盒偏移量、1个客观预测和80个类预测。

    接下来,我们从之前的两层中取得特征图(feature map),并将其上采样2倍。我们还从网络中的较早版本获取特征图,并使用连接将其与我们的上采样特征合并。这种方法使我们能够从早期特征映射中的上采样特征和更细粒度的信息中获得更有意义的语义信息。然后,我们再添加几个卷积层来处理这个组合的特征图,并最终预测出一个相似的张量,尽管现在它的大小是原来两倍。

    我们再次执行相同的设计来预测最终尺度的方框。因此,我们对第三种尺度的预测将从所有先前的计算中获益,并从早期的网络中获得细粒度的特征。

    我们仍然使用k-means聚类来确定我们的边界框的先验。我们只是选择了9个聚类(clusters)和3个尺度(scales),然后在整个尺度上均匀分割聚类。在COCO数据集上,9个聚类是:(10×13);(16×30);(33×23);(30×61);(62×45); (59×119); (116×90); (156×198); (373×326)。

    2.4 Feature Extractor(特征提取器)

    我们使用新的网络来实现特征提取。我们的新网络是基于YOLOv2,Darknet-19中的网络和那些新颖的残差网络的混合方法。我们的网络使用连续的3×3和1×1卷积层,但现在也有一些shotcut连接,该网络明显更大。它有53个卷积层,所以我们称之为… Darknet-53!
    在这里插入图片描述

    表1. Darknet-53网络结构

    在这里插入图片描述

    YOLOV3网络结构。
    DBL:代码中的Darknetconv2d_BN_Leaky,是yolo_v3的基本组件。就是卷积+BN+Leaky relu。
    resn:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit。
    concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。

    这个新型网络在性能上远超Darknet-19,在效率上同样优于ResNet-101和ResNet-152。下表是在ImageNet上的实验结果:
    在这里插入图片描述

    表2.主干网比较。准确度,数十亿次运算,每秒数十亿次浮点运算,以及各种网络的FPS

    每个网络都使用相同的设置进行训练,输入256×256的图片,并进行单精度测试。运行环境为Titan X。我们得出的结论是Darknet-53在精度上可以与最先进的分类器相媲美,同时它的浮点运算更少,速度也更快。和ResNet-101相比,Darknet-53的速度是前者的1.5倍;而ResNet-152和它性能相似,但用时却是它的2倍以上。

    Darknet-53也可以实现每秒最高的测量浮点运算。这意味着网络结构可以更好地利用GPU,使其预测效率更高,速度更快。这主要是因为ResNets的层数太多,效率不高。

    2.5 Training(训练)

    我们只是输入完整的图像,并没有做其他处理。实验过程中涉及的多尺寸训练、大量数据增强和批量归一化batch normalization等操作均符合标准。模型训练和测试的框架是Darknet神经网络。

    3. How We Do(我们怎么做)

    YOLOv3的表现非常好!请参见表3,就COCO数据集的平均mAP成绩而言,它与SSD变体相当,但速度提高了3倍。尽管如此,它仍然比像RetinaNet这样的模型要差一点。
    在这里插入图片描述

    表3.我真的只是从[9]偷了这些表,他们花了太长时间从头开始做。YOLOv3做得很好。 记住,RetinaNet处理图像的时间大约是3.8倍。YOLOv3比SSD变种要好得多,在AP50指标上可与最先进的型号相媲美。

    如果仔细看这个表,我们可以发现在IOU=.5(即表中的AP50)时,YOLOv3非常强大。它几乎与RetinaNet相当,并且远高于SSD变体。这就证明了它其实是一款非常灵活的检测器,擅长为检测对象生成合适的边界框。然而,随着IOU阈值增加,YOLOv3的性能开始同步下降,这时它预测的边界框就不能做到完美对齐了。

    在过去,YOLO一直致力于对小型对象进行检测。但现在我们可以预见其中的演变趋势,随着新的多尺寸预测功能上线,YOLOv3将具备更高的APS性能。但是它目前在中等尺寸或大尺寸物体上的表现还相对较差,仍需进一步的完善。

    当我们基于AP50指标绘制精度和速度时(参照图5),我们发现YOLOv3与其他检测系统相比具有显著优势。也就是说,它的速度正在越来越快。

    4. Things We Tried That Didn’t Work(我们尝试过却没有成功的工作)

    我们在研究YOLOv3时尝试了很多东西,以下是我们还记得的一些失败案例。

    Anchor box(锚定框)坐标的偏移预测。我们尝试了常规的Anchor box预测方法,比如利用线性激活将坐标x、y的偏移程度预测为边界框宽度或高度的倍数。但我们发现这种做法降低了模型的稳定性,且效果不佳。

    用线性方法预测x,y,而不是使用逻辑方法。我们尝试使用线性激活来直接预测x,y的offset,而不是逻辑激活。这降低了mAP成绩。

    focal loss(焦点损失)。我们尝试使用focal loss,但它使我们的mAP降低了2点。 对于focal loss函数试图解决的问题,YOLOv3从理论上来说已经很强大了,因为它具有单独的对象预测和条件类别预测。因此,对于大多数例子来说,类别预测没有损失?或者其他的东西?我们并不完全确定。

    双IOU阈值和真值分配。在训练期间,Faster RCNN用了两个IOU阈值,如果预测的边框与0.7的ground truth重合,那它是个正面的结果;如果在[0.3—0.7]之间,则忽略;如果和0.3的ground truth重合,那它就是个负面的结果。我们尝试了这种思路,但效果并不好。我们对现在的更新状况很满意,它看起来已经是最佳状态。有些技术可能会产生更好的结果,但我们还需要对它们做一些调整来稳定训练。
    在这里插入图片描述

    图3.再次改编自[9],这一次显示速度/精度权衡在地图上0.5 IOU的度量。你可以说YOLOv3很好,因为它很高而且在左边很远。哦,我忘了,我们还修复了YOLOv2中的一个数据加载错误,它是通过类似于2 mAP的方式来帮助修复的。偷偷把这个弄进来,免得破坏布局。

    5. What This All Means(这一切意味着什么)

    YOLOv3是一个很好的检测器,它速度快,精度又高。虽然基于0.3和0.95的新指标,它在COCO上的成绩不如人意,但对于旧的检测指标0.5 IOU,它还是非常不错的。

    为什么我们要改变指标呢?最初的COCO论文里只有这样一句含糊其词的话:一旦评估完成,就会生成评估指标结果。Russakovsky等人曾经有一份报告,说人类很难区分0.3与0.5的IOU:“训练人们用肉眼区别IOU值为0.3的边界框和0.5的边界框是一件非常困难的事”。如果人类都难以区分这种差异,那这个指标有多重要?

    但也许更好的一个问题是:现在我们有了这些检测器,我们能用它们来干嘛?很多从事这方面研究的人都受雇于Google和Facebook,我想至少我们知道如果这项技术发展得完善,那他们绝对不会把它用来收集你的个人信息然后卖给……等等,你把事实说出来了?噢!

    那么其他巨资资助计算机视觉研究的人还有军方,他们从来没有做过任何可怕的事情,比如用新技术杀死很多人……呸呸呸

    我有很多希望!我希望大多数人会把计算机视觉技术用于快乐的、幸福的事情上,比如计算国家公园里斑马的数量,或者追踪小区附近到底有多少猫。但是计算机视觉技术的应用已经步入歧途了,作为研究人员,我们有责任思考自己的工作可能带给社会的危害,并考虑怎么减轻这种危害。我们非常珍惜这个世界。

    最后,不要在Twitter上@我。(我已经不玩Twitter了)

    在这里插入图片描述

    图4.零轴图表可能在智力上更诚实……我们仍然可以通过改变变量来解决问题

    在这里插入图片描述

    图5.根据这两幅图像的映射,这两个假设的探测器是完美的。他们都是完美的。完全平等。

    更多相关内容
  • YOLOv4原文翻译 - v4它终于来了!

    万次阅读 多人点赞 2020-12-20 16:58:31
    论文原文:https://arxiv.org/abs/2004.10934源码:https://github.com/AlexeyAB/darknet 写在前面 不久之前,YOLO创始人Redmon宣布退出CV界,很多人都觉得真的...那天中午,看到v4提出的消息的时候,真的高兴...

    论文原文:https://arxiv.org/abs/2004.10934
    源码:https://github.com/AlexeyAB/darknet

    写在前面

    不久之前,YOLO创始人Redmon宣布退出CV界,真的很可惜!对我而言,YOLO系列的算法是我研究的第一个目标检测的算法,我对YOLO算法的感情不言而喻。

    那天中午,当看到v4提出的消息的时候,真的很高兴!当看到第一作者不再是Redmon的时候,心中还是有点抗拒的,但是,作为Redmon认可的v4以及了解v4接棒人AB对整个YOLO算法精度和速度提升的效果之后,我第一时间将论文下载了下来,花了将近两天的时间精读论文并且翻译了原文。

    因为本人能力有限,难免会有翻译不恰当的地方,还请各位看官老爷斧正。最后,欢迎大家和我交流~

     

    想要训练自己的数据集的朋友可以关注我的这篇博客:YOLOv4训练自己的数据集

    需要在windows下进行编译的朋友,可以关注我的这篇博客:windows下编译yolov4

    需要在windows下使用yolov4的动态链接库的,可以关注我的这篇博客:windows下使用yolov4动态链接库


    0 摘要

    目前有很多可以提高CNN准确性的算法。这些算法的组合在庞大数据集上进行测试、对实验结果进行理论验证都是非常必要的。有些算法只在特定的模型上有效果,并且只对特定的问题有效,或者只对小规模的数据集有效;然而有些算法,比如batch-normalization和residual-connections,对大多数的模型、任务和数据集都适用。我们认为这样通用的算法包括:Weighted-Residual-Connections(WRC), Cross-Stage-Partial-connections(CSP), Cross mini-Batch Normalization(CmBN), Self-adversarial-training(SAT)以及Mish-activation。我们使用了新的算法:WRC, CSP, CmBN, SAT, Mish activation, Mosaic data augmentation, CmBN, Dropblock regularization 和CIoU loss以及它们的组合,获得了最优的效果:在MS COCO数据集上的AP值为43.5%(65.7% AP50),在Tesla V100上的实时推理速度为65FPS

    从摘要中我们基本上可以看出:v4实际上就是保留Darknet作为backbone,然后通过大量的实验研究了众多普适性算法对网络性能的影响,然后找到了它们最优的组合。

    先放网络架构(这张图我不记得从哪里保存下来的了)

    1 介绍

    大部分基于CNN的目标检测器主要只适用于推荐系统。举例来说,通过城市相机寻找免费停车位置的系统使用着慢速但是高精度的模型,然而汽车碰撞警告却使用着快速但是低精度的模型。提高实时目标检测器的精度不经能够应用在推荐系统上,而且还能用于独立的流程管理以及降低人员数量上。目前大部分高精度的神经网络不仅不能实时运行,并且需要较大的mini-batch-size在多个GPUs上进行训练。我们构建了仅在一块GPU上就可以实时运行的CNN解决了这个问题,并且它只需要在一块GPU上进行训练

    我们工作的主要目标就是设计一个仅在单个计算系统(比如单个GPU)上就可以快速运行的目标检测器并且对并行计算进行优化,并非减低计量计算量理论指标(BFLOP)。我们希望这个检测器能够轻松的训练和使用。具体来说就是任何一个人仅仅使用一个GPU进行训练和测试就可以得到实时的,高精度的以及令人信服的目标检测结果,正如在图片1中所示的YOLOv4的结果。我们的贡献总结如下:

    (1)我们提出了一个高效且强大的目标检测模型。任何人可以使用一个1080Ti或者2080Ti的GPU就可以训练出一个快速并且高精度的目标检测器。

    (2)我们在检测器训练的过程中,测试了目标检测中最高水准的Bag-of-FreebiesBat-of-Specials方法

    (3)我们改进了最高水准的算法,使得它们更加高效并且适合于在一个GPU上进行训练,比如CBN, PAN, SAM等。

    2 相关工作

    2.1 目标检测模型

    检测器通常由两部分组成:backbonehead。前者在ImageNet上进行预训练,后者用来预测类别信息和目标物体的边界框。在GPU平台上运行的检测器,它们的backbone可能是VGG, ResNet, ResNetXt,或者是DenseNet。在CPU平台上运行的检测器,它们的backbone可能是SqueezeNet,MobileNet或者是ShuffleNet。对于head部分,通常分为两类:one-stage和two-stage的目标检测器。Two-stage的目标检测器的代表是R-CNN系列,包括:fast R-CNN, faster R-CNN,R-FCN和Libra R-CNN. 还有基于anchor-free的Two-stage的目标检测器,比如RepPoints。One-stage目标检测器的代表模型是YOLO, SSD和RetinaNet。在最近几年,出现了基于anchor-free的one-stage的算法,比如CenterNet, CornerNet, FCOS等等。在最近几年,目标检测器在backbonehead之间会插入一些网络层,这些网络层通常用来收集不同的特征图。我们将其称之为目标检测器的neck。通常,一个neck由多个bottom-up路径和top-down路径组成。使用这种机制的网络包括Feature Pyramid Network(FPN),Path Aggregation Network(PAN),BiFPN和NAS-FPN。

    除了上面的这些模型,一些学者将重点放在为目标检测器构建新的backbone(DetNet, DetNASNet)或者是一整个新的模型(SpinNet, HitDetector)。

    综上所述,一个普通的目标检测器由下面四个部分组成:

    2.2 Bag of freebies

    通常来说,目标检测器都是进行离线训练的(训练的时候对GPU数量和规格不限制)。因此,研究者总是喜欢扬长避短,使用最好的训练手段,因此可以在不增加推理成本的情况下,获得最好的检测精度。我们将只改变训练策略或者只增加训练成本的方法称之为“bag of freebies"。在目标检测中经常使用并且满足bag of freebies的定义的算法称是①数据增广。数据增广的目的是增加输入图片的可变性,因此目标检测模型对从不同场景下获取的图片有着更高的鲁棒性。举例来说,photometric distoitions和geometric distortions是用来数据增强方法的两个常用的手段。在处理photometric distortion中,我们会调整图像的亮度,对比度,色调,饱和度以及噪声。对于geometric distortion,我们会随机增加尺度变化,裁剪,翻转以及旋转。

    上面提及的数据增广的手段都是像素级别的调整,它保留了调整区域的所有原始像素信息。此外,一些研究者将数据增广的重点放在了②模拟目标物体遮挡问题上。他们在图像分类和目标检测上已经取得了不错的结果。具体来说,random erase和CutOut可以随机选择图像上的矩形区域,然后进行随机融合或者使用零像素值来进行融合。对于hide-and-seek和grid mask,他们随机地或者均匀地在一幅图像中选择多个矩形区域,并且使用零来代替矩形区域中的像素值。如果将相似的概念用来特征图中,出现了DropOut, DropConnect和DropBlock方法。此外,一些研究者提出一起使用多张图像进行数据增强的方法。举例来说,MixUp使用两张图片进行相乘并且使用不同的系数比进行叠加,然后使用它们的叠加比来调整标签。对于CutMix,它将裁剪的图片覆盖到其他图片的矩形区域,然后根据混合区域的大小调整标签。除了上面提及的方法,style transfer GAN也用来数据增广,CNN可以学习如何有效的减少纹理偏差。

    一些和上面所提及的不同的方法用来解决数据集中的语义分布可能存在偏差的问题。处理语义分布偏差的问题,一个非常重要的问题就是在不同类别之间存在数据不平衡,并且这个问题在two-stage目标检测器中,通常使用hard negative example mining或者online hard example mining来解决。但是example mining 方法并不适用于one-stage的目标检测器,因为这种类型的检测器属于dense prediction架构。因此focal loss算法用来解决不同类别之间数据不均衡的问题。③另外一个非常重要的问题就是使用one-hot很难描述不同类别之间关联度的关系。Label smothing提出在训练的时候,将hard label转换成soft label,这个方法可以使得模型更加的鲁棒性。为了得到一个最好的soft label, Islam引入了知识蒸馏的概念来设计标签细化网络。

    最后一个bag of freebies是④设计边界框回归的目标函数。传统的目标检测器通常使用均方根误差(MSE)在Bbox的中心坐标以及宽高上进行直接的回归预测,即\left \{ x_{center}, y_{center}, w, h \right \},或者左上角和右下角的两个点,即\left \{ x_{top-left}, y_{top-right},x_{bottom-left},y_{bottom-right} \right \}。对于anchor-based方法,去预测相应的offset,比如\left \{ x_{center-offset},y_{center-offset},w_{offset},h_{offset} \right \}\left \{ {x_{top-left-offset},y_{top-left-offset},x_{bottom-right-offset},y_{bottom-right-offset}} \right \}但是,预测Bbox每个点的坐标值是将这些点作为独立的变量,但是实际上并没有将目标物体当成一个整体进行预测。为了更好的解决这个问题,一些研究者最近提出了IoU损失函数,它能够将Bbox区域和ground truth的BBox区域的作为整体进行考虑。IoU损失函数需要计算BBox四个坐标点以及ground truth的IoU。因为IoU具有尺度不变性,它可以解决传统算法比如l_{1}, l_{2}范数计算\left \{ {x,y,w,h} \right \}存在的问题,这个损失函数会随着尺度的变化而发生变化。最近,一些研究者继续提高IoU损失函数的性能。举例来说,除了覆盖范围,GIoU还包括目标物体的形状和坐标。他们提出寻找同时包括预测的BBox和ground truth的BBox的封闭区域BBox,然后使用这个BBox作为分母去代替原来Iou损失函数中的分母。DIoU损失函数额外考虑了目标物体的中心距离,CIoU另一方面同时将覆盖区域,中心点距离和纵横比考虑在内。CIoU在BBox回归问题上可以获得最好的收敛速度和准确率。

    2.3 Bag of specials

    对于那些插件模块后处理方法,它们仅仅稍微的增加了推理成本,但是可以极大地提高目标检测的准确度,我们将其称之为“bag of specials”。一般来说,这些插件模块用来提高一个模型中特定的属性,比如增加感受野,引入注意力机制或者提高特征整合的能力等等;后处理方法是用来抑制模型预测结果的一种方法。

    可以用来提升感受野的常规的方法是SPP, ASPP和RFB。SPP模型来源于空间金字塔匹配(SPM),而且SPMs原始的方法将特征图划分成很多d*d个相等的块,其中d可以是{1,2,3,…},因此可以形成空间金字塔,然后提取bag-of-word的特征。SPP将SPM应用在CNN中,然后使用max-pooling代替bag-of-word运算。因为SPP输出的是一维的特征向量,因此它不能应用在全卷积网络(FCN)中。在YOLOv3中,Redmon和Farhadi改进了SPP模块,将max-pooling输出和内核尺寸k*k连接起来,其中k={1,5,8,13},stride=1。基于这个设计,一个相对较大的k*k的max-pooling有效地提高了backbone特征的感受野。在添加了改进后的SPP模型之后,YOLO-v3-608在COCO数据集上,虽然增加了0.5%的额外计算量,但是提高了2.7%的AP50。ASPP模块和改进的SPP模块的区别主要在:原始的k*k过滤器尺寸,从stride=1到3*3内核尺寸的max-pooling,在stride=1的碰撞卷积运算中膨胀比为k。RFB模块使用一些k*k的内核,膨胀比为k,步长为1的碰撞卷积,它比ASPP获得了更全面的空间覆盖率。RFB在MS COCO数据集上仅仅增加了7%的额外推理时间,但是得到了5.7%的AP50提升。

    目标检测上经常使用的注意力模块主要分成channel-wise注意力模块和point-wise注意力模块,这两个注意力模块主要的代表分别是Squeeze-and-Excitation(SE)和Spatial Attention Module(SAM)。尽管SE模块在ImageNet图像分类工作上仅仅增加了2%的计算量而提高了1%的top-1准确率,但是在GPU上提高了10%的推理时间,因此SE模块更适合在移动设备上使用。但是对于SAM模块来说,在ImageNet图像分类任务中,它仅仅需要0.1%的额外计算量却能够提升ResNet-SE 0.5%的top-1准确率。它在GPU上并没有有效地影响推理速度。

    关于特征融合,早期的是使用skip connection或者是hyper-column将低级的特征和高级的语义特征进行融合。因为多尺度预测方法比如FPN逐渐受到追捧,因此提出了很多将不同特征金字塔融合的轻量级模型。这类别的模型包括SFAM, ASFF和BiFPN。SFAM的主要思想是在多尺度连接特征图上使用channel-wise级别的调整。对于ASFF,它使用softmax作为point-wise级别的调整,然后将不同尺度的特征图加在一起。在BiFPN中,提出使用多输入权重残差连接去执行scale-wise级别的调整,然后将不同尺度的特征图加在一起。

    在深度学习的研究中,一些人重点关心去寻找一个优秀的激活函数。一个优秀的激活函数可以让梯度更有效的进行传播,与此同时它不会增加额外的计算量。在2010年,Nair和Hinton提出了ReLU激活函数充分地解决了梯度消失的问题,这个问题在传统的tanh和sigmoid激活函数中会经常遇到。随后,LReLU,PReLU,ReLU6,Scaled Exponential Linear Unit(SELU),Swish,hard-Swish和Mish等等相继提出,它们也用来解决梯度消失的问题。LReLU和PReLU主要用来解决当输出小于零的时候,ReLU的梯度为零的问题。ReLU6和hard-Swish主要为量化网络而设计。对于神经网络的自归一化,提出SELU激活函数去实现这个目的。需要注意的是Swish和Mish都是连续可导的激活函数。

    在基于深度学习的目标检测中使用的后处理方法是NMS,它可以用来过滤那些预测统一物体、但是效果不好的BBoxes,然后仅仅保留较好的BBoxes。优化NMS和优化目标方程的方法异曲同工。NMS提出的最初的方法并没有将上下文信息考虑在内,因此Girshick在R-CNN中添加了分类置信度作为参考,然后根据置信度得分的顺序,由高到低执行greedy NMS。对于soft NMS来说,它考虑了这样一个问题:在greedy NMS使用IoU的时候,目标遮挡可能会造成置信度得分的退化。在soft NMS基础上,DIoU NMS将重心坐标的距离信息添加到Bbox的筛选处理中了。值得一提的是,上面提到的后处理方法中都不直接引用捕获的图像特征,后续的anchor-free方法开发中不再需要后处理。

    3 方法

    我们工作基本的目标就是在生产系统和优化并行预算中加快神经网络的速度,而非降低计算量理论指标(BFLOP)。我们提供了两个实时神经网络的选择:

    (1)GPU 在卷积层中,我们使用少量的组(1-8): CSPResNeXt50 / CSPDarknet53

    (2)VPU 我们使用分组卷积,但是我们不使用Squeeze-and-excitement(SE)模块,具体包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3

    3.1 网络架构的选择

    我们的目标是寻找输入网络的分辨率卷积层的个数参数的数量(filter_size^{^{2}}*filters*channel/groups)以及输出层的个数(filters)之间的最优的平衡。举例来说,大量的研究表明:在ILSVRC2012(ImageNet)的目标检测上,CSPResNext50比CSPDarket53的效果更好,但是在MS COCO的目标检测中,两个的效果恰好相反。

    下一个目标就是选择额外的模块去增加感受野以及为不同检测器不同的backbone选择参数聚合的最佳方法。比如:FPN, PAN, ASFF, BiFPN。

    在分类任务上最优的模型在检测上未必就是最优的。和分类任务相比,检测器需要以下要求:

    (1)更好的输入尺寸(分辨率)- 为了检测多个小物体

    (2)更多网路层 - 为了获得更大的感受野去覆盖不断增大的输入尺寸

    (3)更多的参数 - 提高模型的能力从而能够在一张图片上检测到不同尺寸的多个物体。

    假设来说,我们可以认为具有更大感受野(有大量的3*3的卷积层)和具有大量参数的模型应当作为检测器的backbone。表格1展示了CSPResNetXt50, CSPDarkent53以及EfficientNet B3的相关信息。CSPResNetXt50仅仅只有16个3*3的卷积层,一个425*425的感受野和20.6M个参数,然而CSPDarkent53有29个3*3的卷积层,725*725的感受野和27.6M个参数。从理论证明和大量的实验表明在这两个模型中,CSPDarkent53是作为检测器的backbone最优的选择

            不同尺寸的感受野的影响总结如下:

    (1)等于目标物体的大小时:能够看到整个物体

    (2)等于网络的尺寸:能够看到目标物体周围的上下文信息

    (3)大于网络的尺寸:增加图像点和最终激活之间连接的数量

    我们将SPP模块添加到CSPDarknet53中,因为它极大提高了感受野,能够分离出最重要的上下文特征而且没有降低网络运行的速度。我们使用PANet作为不同检测器不同backbone训练阶段聚集参数的方法,而非YOLOv3的FPN模块。

    最后,我们选择CSPDarknet53作为backbone, SPP作为附加的模块,PANet 作为neck,使用YOLOv3作为YOLOv4架构的head。

    未来,我们计划扩展检测器的Bag of freebies,它们在理论上可以解决某些问题并且能够提高检测器的精度,后续会以实验的形式探究每个算法对检测器的影响。

    我们没有使用Cross-GPU Batch Normalization(CGBN 或者 SyncBN) 或者昂贵的定制设备。这能够使得任何人在一个GPU上就可以得到最先进的结果,比如在GTX 1080Ti或者RTX 2080Ti。

    3.2 BoF 和 BoS的选择

    为了提高目标检测的训练,CNN通常使用下面一些技巧:

    对于训练激活函数,因为PReLU和SELU难以训练,并且RELU6是专门为量化网络设计的,我们因此不考虑这这三个激活函数。在正则化方法中,提出DropBlok的学者将其算法和其他算法进行了比较,然后DropBolck效果更好。因此我们毫不犹豫的选择DropBlock作为我们的正则化方法。在归一化方法的选择中,因为我们关注在一块GPU上的训练策略,因此我们不考虑syncBN。

    3.3 额外的改进

    为了让检测器更适合在单个GPU上进行训练,我们做了以下额外的设计和改进:

    (1)我们提出了数据增广的新的方法:Mosaic和Self-Adversarial Training(SAT)

    (2)在应用遗传算法去选择最优的超参数

    (3)我们改进了一些现有的算法,让我们的设计更适合高效的训练和检测 - 改进SAM, 改进PAN以及Cross mini-Batch Normalization(CmBN)

    Mosaic是一种新型的数据增广的算法,它混合了四张训练图片。因此有四种不同的上下文进行融合,然而CutMix仅仅将两张图片进行融合。此外,batch normalization在每个网络层中计算四张不同图片的激活统计。这极大减少了一个大的mini-batch尺寸的需求。

    自适应对抗训练(SAT)也表示了一个新的数据增广的技巧,它在前后两阶段上进行操作。在第一阶段,神经网络代替原始的图片而非网络的权重。用这种方式,神经网络自己进行对抗训练,代替原始的图片去创建图片中此处没有期望物体的描述。在第二阶段,神经网络使用常规的方法进行训练,在修改之后的图片上进检测物体。

    正如图4中显示,CmBN(Cross mini-Batch Normalization)代表CBN改进的版本。它只收集了一个批次中的mini-batches之间的统计数据。

    我们将SAM的spatial-wise注意力变成了point-wise注意力机制,然后将PAN中的shortcut连接变成了concatenation连接,正如图5和图6所表示的那样。

    3.4 YOLOv4

    在这个部分,我们会详细介绍YOLOv4的细节:

    YOLOv4网络架构的细节

    网络组成

    Backbone

    Neck

    Head

    采用模块

    CSPDarknet53

    SPP, PAN

    YOLOv3

    BoF

    CutMix and Mosaic data augmentation

    DropBlock regularization

    Class label smoothing

     

    CIoU-loss

    CmBN

    DropBlock regularization

    Mosaic data augmentation

    Self-Adversarial Training

    Eliminate grid sensitivity

    Using multiple anchors for a single ground truth

    Cosine annealing scheduler

    Optimal hyperparameters

    Random training shapes

    BoS

    Mish activation

    Cross-stage partial connections(CSP)

    Multi-input weighted residual connections (MiWRC)

     

    Mish activation

    SPP-block

    SAM-block

    PAN path-aggregation block

    DIoU-NMS

    模块作用

    在ImageNet上进行预训练

    融合不同位置上的特征图

    进行预测

    4 实验

    我们测试了不同训练提升技巧在ImageNet(ILSVRC2012 val)数据集上的精度影响,然后又验证了检测器在MS COCO(test-val 2017)数据集的准确率。

    4.1 实验参数配置

    在ImageNet图像分类实验中,默认的超参数如下:训练步长为8,000,000;batch size和mini-batch size分别为128和32;polynominal decay learning rate scheduling strategy初始的学习率为0.1;warm-up步长为1000;momentum和weight decay分别设置为0.9和0.005。所有的BoS实验使用相同的、默认的超参数,在BoF实验中,我们增加了一半的训练步长。在BoF实验中,我们验证了MixUp, CutMix, Mosaic, Bluring数据增加一节label smoothing regularization方法。在BoS实验中,我们比较了LReLU,Swish和Mish激活函数的影响。所有的实验都在1080Ti或者2080Ti GPU上进行训练。

    在MS COCO目标检测实验中,默认的超参数如下:训练步长为500,500;the step decay learning rate scheduling strategy初始化学习率为0.01在步长为400,000和450,000的时候乘以0.1;momentum和weight decay分别设置为0.9和0.0005。所有的架构在一块GPU进行多尺度训练,它的batch size为64,然而它的mini-batch为8还是4取决于网络架构和GPU的内存限制。除了对寻找最优的超参数使用遗传算法之外,其他所有的实验都使用默认的设置。遗传算法和GIoU使用YOLOv3-SPP进行训练,并且为5k个min-val进行300个epochs。对我们采用搜索的学习率为0.00261,momentum为0.949,IoU阈值为设置为0.213,遗传算法实验的损失标准化为0.07。我们还验证了大量的BoF算法,包括grid sensitivity elimination, mosaic数据增广,IoU阈值化,遗传算法,class label smoothing, cross mini-batch normalization,self-adversarial training,cosine anneling scheduler, dynamic mini-batch size, DropBlock, Optimized Anchors, 不同的IoU损失函数。我们也在不同BoS算法上进行了实验,包括Mish,SPP,SAM,RFB,BiFBN以及Gaussiian YOLO。所有的实验我们仅仅使用一个GPU进行训练,因此比如syncBN的优化多个GPU的技巧我们并没有使用。

    4.2 不同算法在分类器训练上的影响

    首先,我们研究了不同算法在分类器训练上的影响;具体来说,Class label smoothing的影响,不同数据增广技巧,bilateral blurring,MixUp, CutMix和Mosaic的印象在图7中显示,以及不同激活函数的影响,比如Leaky-ReLU(默认的),Swish和Mish。

    在表2中所示,在我们的实验中,通过引入一些算法,分类器的准确率得到了提升,这些算法包括:CutMix和Mosaic数据增广,Class label smoothing和Mish激活函数。结果,我们的用于分类器训练的BoF-backbone(Bag of Freebies)包括:Cutmix 和Mosaic数据增广算法以及Class labelsmoothing。正如表2和表3所示,我们将Mish激活函数作为补充的选项。

    4.3  不同算法在检测器训练上的影响

    进一步的研究关注不同Bag-of-Freebies(BoF-detector)在检测器训练准确度的影响,正如表4所示。通过研究能够提高检测器准确度的算法,我们极大地扩展了BoF的算法选项,而且并没有影响FPS:

    • S:消除栅格的敏感度   这个方程在YOLOv3中用于评估目标物体的坐标,自重cx和cy通常是整数,因此,当bx的值非常接近cx或者cx+1的时候,tx的绝对值会非常大。我们通过给sigmoid函数乘以一个大于1的因子来解决这个问题,因此,这样就消除了栅格对不可检测物体的影响。
    • M:Mosaic数据增广 - 在训练过程中,使用四张图片而非一张进行增广处理
    • IT:IoU阈值 - 为一个ground truth的IoU使用多个anchors,ground truth IoU(truth, anchor) > IoU 阈值
    • GA:遗传算法 - 在前10%的训练时间内使用遗传算法选择最优的超参数
    • LS:Class label smoothing - 为sigmoid激活函数使用class label smoothing。
    • CBN:CmBN - 在整个批次中通过使用Cross mini-Batch Normalization收集统计数据,而非在单独的mini-batch中收集统计数据。
    • CA:Cosine annealing scheduler - 在sinusoid训练中改变学习率
    • DM:动态的mini-batch尺寸 - 在低分辨率的训练过程中,通过随机训练形状自动的改提高mini-batch的尺寸。
    • OA: 优化Anchors - 使用优化的anchors进行训练,网络的分辨率为512*512
    • GIoU, CIoU, DIoU, MSE - 为边界框回归使用不同的损失函数。

    下一步的研究关心在检测器训练准确度上,不同Bag-of-Specials(BoS-detector)的影响,包括PAN, RFB, SAM, Gaussian YOLO(G),以及ASFF,正如表5所示。在我们的实验中,当使用SPP, PAN和SAM的时候,检测器得到了最好的性能。

    4.4 不同backbones和预训练权重在检测器训练中的影响

    下一步我们研究不同backbones模型在检测器准确率上的影响,正如表6所示。我们注意到拥有最佳分类准确率的模型,检测器的准确度未必是最佳的。

    首先,尽管使用不同算法训练得到的CSPResNeXt-50模型的分类精度比CSPDarknet53模型的要高,但是CSPDarknet53模型的检测精度更高。

    再者,CSPResNeXt-50分类器训练使用BoF和Mish提高了它的分类准确率,但是检测器训练使用的预训练权重的进一步使用减少了检测器的精度。但是,CSPDarknet53分类器训练使用BoF和Mish提高了分类器和检测器的准确率,它使用分类器预训练权重。这表示CSPDarknet53比CSPResNeXt-50更适合作为检测器。

    我们观察到,由于各种改进,CSPDarknet53模型显示出了更大的提高的检测器精度的能力

    4.5 不同mini-batch尺寸在检测器训练上的影响

    最后,我们分析了不同mini-batch尺寸的训练的模型的结果,并且结果在表7中显示出来。从表7中我们发现在添加了BoF和BoS训练策略之后,mini-batch尺寸几乎对检测器的性能没有影响。结果显示在引入了BoF和BoS之后,就不需要使用昂贵的GPUs进行训练。换句话说,任何人可以仅仅使用一个GPU去训练一个优秀的检测器。

    5 结果

    使用最先进的目标检测器得到的对比结果在图8中显示(具体请看原文)。我们的YOLOv4坐落在帕累托最优曲线上,而且在精度和速度上都优于目前最快的和最准确的检测器。

    6 结论

    我们提出了一个最先进的目标检测器,它比所有检测器都要快而且更准确。这个检测器可以仅在一块8-16GB的GPU上进行训练,这使得它可以广泛的使用。One-stage的anchor-based的检测器的原始概念证明是可行的。我们已经验证了大量的特征,并且其用于提高分类器和检测器的精度。这些算法可以作为未来研究和发展的最佳实践。

    展开全文
  • 生成对抗网络(GAN)论文原文详解

    千次阅读 多人点赞 2019-12-13 16:44:48
    最近在学习生成对抗网络的相关知识,首先接触到的当然是Ian Goodfellow的原始论文,文章中作者简要的阐明了GAN的基本算法,同时也给出该算法可行的理论证明。该模型通俗点说可以利用已有的数据对模型进行训练,...

    最近在学习生成对抗网络的相关知识,首先接触到的当然是Ian Goodfellow的原始论文,文章中作者很简要的阐明了GAN的基本算法,同时也给出该算法可行的理论证明。

    该模型通俗点说,就是可以利用已知分布的数据对模型进行训练,训练完成后,该网络能够自动的生成与原始数据分布相似的数据。举例来说,给网络投喂熊猫的照片进行训练,训练完成后,网络会自动生成一组熊猫的照片。在今年的ICLR大会上,就有一篇关于GAN生成图像的文章,利用文章的算法生成的图像十分逼真,某些图片肉眼也很难分清差别。GAN生成的图像
    上图是使用改造过后的GAN算法生成的,可谓是栩栩如生。GAN算法从14年发表到现在,短短五六年,接着深度学习的东风有了长足的发展。GAN的算法很简单,但是对其可行性的证明中用到一些概率相关的数学工具,需要好好的理解。本文中很多的观点是个人的理解,难免有很多的疏漏,希望大家可以在文章下留言指正。

    1 生成模型与判别模型

    与以往经典的机器学习算法相比,GAN算法最大的创新来自于结合了生成模型和判别模型,以二者的相互对抗进而相互优化。作者将GAN比喻为警察和假币制造者的一场零和博弈,最开始罪犯制造好假币,警察通过技术手段辨认出真伪,后罪犯提高假币的制造水准,警察的辨认能力也不断地提高。就在二者的相互博弈中,罪犯制造假币的能力不断提升,警察的辨认能力也达到了顶峰。这里的罪犯便是网络中的生成器,而警察则是模型中的判别器。

    关于生成模型和判别模型不是文章的重点,Ian Goodfellow在原文中提到使用任何一种生成方法和判别方法都是可以的。但是了解生成模型和判别模型有何区别,有助于我们理解文章。

    生成模型有判别模型区别
    上图是生成模型与判别模型在机器学习中的值观体现,对于二分类问题,判别方法直接学习出决策函数(如左图的决策边界)或者条件概率,但是对于数据确切的分布情况的是未知的。例如我们熟悉的感知机、K近邻算法等。而生成方法则是学习数据的内在分布,通过概率判断分类。

    总而言之,判别方法学习得到的是一个判断数据是否属于某一类的模型,而生成方法则学习到数据的分布。

    而本文的关键就是生成一个与输入数据分布相似的分布,故核心就是训练一个好的生成器,而怎么训练呢又是一个问题。

    2 模型实体

    为了让大家对整个模型有个值观的印象,给出是Ian Goodfellow演讲PPT中的一张图,图中左下方的网络便是生成器,右上角的是判别器。我们现在无需考虑网络的内部结构,以及如何生成假的样本或是判别真假样本,这些是对应的模型该做的事情,我们将其看作一个使用误差反向传播算法的黑箱即可

    GAN模型
    判别器训练
    1.对生成器输入一段噪音,输出一个符合某一分布的假数据(如一组图片的分布);
    2.从生成的分布中抽取一些数据,标记为0,从真实样本集中抽取一些数据,标记为1;
    3.将数据喂给判别器进行训练,使判别器能够很好的分辨数据的真伪,判别器训练完成

    训练器训练
    4.将生成器与判别器进行逻辑连接,生成器产生的假数据全部标记为1喂给判别器;
    5.喂给网络的数据产生的误差,通过误差反向传播算法传递给训练器,修正生成器的参数
    此处为GAN算法的精妙之处,生成器与判别器是逻辑相连,误差仅仅修正生成器而不改变判别器的参数

    6.不断训练判别器和生成器,直到判别器无法分辨假数据和真实数据,即判别器输出结果的概率都是0.5

    GAN框架

    3 训练算法

    3.1 算法

    原文章给了一个很经典的数学公式,虽然很好理解,但是其中的数学原理却没有那么简单。让我们先从算法本身开始,现在我们已经对整个网络有了个大致直观的认识,就是两个神经网络的相互连接,相互对抗优化。神经网络中除了模型本身如网络规模的选择、激活函数的选择等,很重要的一点就是损失函数,损失函数决定着这个网络要训练成为一个什么模样,下图给出了GAN的算法。

    GAN算法

    3.2 损失函数

    算法的过程和2中描述的算法类似,其核心就是被优化的函数,在判别起的优化中,用到的是:

    判别器损失函数

    这个损失函数是不是很眼熟?对,就是我们在神经网络及逻辑斯蒂回归中常用的对数损失函数,在输入服从0-1分布时,损失函数如下:

    对数损失函数
    在算法中,D(x)为生成器,输入一些数据,输出结果为真的概率,而G(z)则输入一些数据,产生一些符合D(x)输入的特定分布的数据。x(i)为真实数据,标记为1,G(z(i))为生成器创造的假数据,标记为0。

    由于对数损失函数是很经典的损失函数,本文就不再赘述,但是可以很明显的发现,在二分类问题上的对数损失函数,若标签为1,则后半部分为零,若标签为0,则前半部分为零。因此文中给定的损失函数,就是等价于对数损失函数。由于对数损失函数良好的数学特性,可以通过梯度下降数法等优化算法很快的最小化损失函数。

    注意,文中给定的损失函数和对数损失函数相差一个负号,因此就变成了最大化损失函数,实质都是一样的,只是为了数写的统一性。

    而对于生成器,文中给出的损失函数如下:

    在这里插入图片描述

    在优化生成器时,我们将G(z(i))输出的结果,全部标记为1放入D(x)即判别器中,实质的误差由判别器产生,只是将误差传递给生成器用以修正参数。所以我们还是使用二分类问题的对数损失函数.

    但是这里就会有人奇怪,按照对数损失函数,正例不应该log(D(G(z(i))))吗?其实是一样的,此处是要最大化D(G(z(i))),让其最大限度的接近1,也等价于最小化log(1-D(G(z(i))))。作者这样做也只有一个目的,就是让公式更加优美

    3.3 优化策略

    到这里,我们对整个网络的对抗过程已经有了一定的了解,但是要让他们对抗起来,又是个问题。假如判别器一次性优化到最优,那么再优化生成器的时候就会很难,因此我们需要进一步优化其学习过程,可以慢慢的进行修正,例如可以判别器梯度下降K次,然后生成器下降一次。

    这里就不得不提一点关于判别模型和生成模型的性质。生成模型,由于直接学习的数据的联合概率分布,收敛较快,但是判别模型直接学习决策函数之类,需要不断的迭代优化,收敛较慢。因此我么使用判别器梯度下降K次,然后生成器下降一次的方法来解决二者的对抗匹配问题。

    很多朋友再这里可能都会有误解,为什么不一次性优化到最好呢?首先是模型上,我们的目的不是为了最优的判别器或者生成器,而是两者都很强大。在数学上的问题是当判别器优化到收敛后,梯度已经接近于零,再生成器优化器就很难优化了。

    4. 数学思想

    对于其数学内涵,可以看一看李宏毅老师对GAN的推导过程,讲的十分的仔细。对于网络,我们的目标是利用生成器生成一个与已知数据分布接近的数据分布,但是这具体是什么分布我们是未知的。例如给定的数据分布是一类图片的分布,我们进行形式化的描述的,但是我们可以生成一个和他近似的分布。

    这里很容易让人迷糊的,是分布这个东西,在我们一般的经典机器学习算法中,往往使用的是判别方法,例如感知机、K近邻等,都只用分开数据,而不用考察数据本身的性质。但是生成方法就需要用到数据本身了。
    文中给出了模型需要优化的值函数:

    值函数

    值函数优化目标分为两块,首先优化判别器,使之达到最大,此时生成器G(z)是固定的。再优化生成器,由于前一项中无生成器,所以直接优化后一项。有了上算法知识,应该很好理解这个值函数。

    但是此处用到了期望,原因是说有的数据都是从某个分布中抽样出来的,我们无法例举所有的数据,只能采用采样的方式计算样本的期望。那么问题就来了,为什么优化这个函数,就能使我们的生成器生成的数据分布和真实的数据分布相似?

    4.1 最优判别器

    首先我们对V(D, G)展开:

    V(G, D)

    pdata(x)和pG(x)分别代表原始数据和生成数据的概率密度,利用连续型随机变量的函数期望公式可得上式,同时利用换元法综合两个式子。第一步我们要最大化V(D, G),就等价于最大化:

    上公式中对D(x)进行求导并令其等于零(注意此处我们在优化D(x)而非x,我们可以得出上式最优解为:

    在这里插入图片描述

    4.2 最优生成器

    得到最优生成器后,我们将D*G代入V(D, G)中,再优化D,得C(G)

    在这里插入图片描述

    下面的一些技巧就需要些数学能力了,我们可以猜一下在如果给定的V(D, G)可用与衡量这个模型的优劣,那么最终在什么情况,会达到全局最优?肯定就是pdata(x)和pG(x)相等的情况(但是我们需要证明,此处仅仅是猜想),若两者相等,我们可以求的全局最小值为-log4。

    在这里插入图片描述

    有了这个简答的猜想后,我们就可以对我们现在的公式进行变形,目标是凑出一个-log4

    在这里插入图片描述

    在这里插入图片描述

    由于pdata(x)与pG(x)之和的积分为2,我们的式子可以化简为:

    在这里插入图片描述

    同时我们引进一个KL散度JSP散度的概念,在GAN中,这两个工具是很重要的,但是我们只需要知道,这个数学工具,可以用来衡量两个分布之间的相似度即可,两个分布的相似度越大,值越小,当相同时,值为0。这也和我们模型构建的目标相同,需要衡量生成的分布和真实的分布的相似度。

    在这里插入图片描述

    KL散度再转化为JSP散度,

    在这里插入图片描述
    经过数学变换C(G)变成了如上的式子,当pdata=pg时,C(G)最小,取-log4

    故可知对于给定的式子的优化V(G, D)的优化,能够使得最终pdata=pg,即生成的分布与真实数据分布是相似的。

    4.3 从数学模型到实际训练

    但在实践中,我们是没有办法利用积分求这两个数学期望的,所以一般我们能从无穷的真实数据和无穷的生成器中做采样以逼近真实的数学期望。

    这是机器之心的文章中对二者不同的解释,即数学期望是很复杂的,很难通过类似梯度下降算法的迭代对其进行优化,所以我们对其进行抽样以毕竟真实的数学期望。

    5 总结

    总而言之,该模型的核心思想就是利用一个生成器,一个判别器相互对抗、相互优化的过程。文章中还有实验部分及与其他算法比较的部分,因为不是算法的核心就略过了,最近几年GAN发展可以说是相当的迅速,各类算法层出不穷,可以很轻易的再github搜索到相关的项目。

    6 参考文献

    生成对抗网络原论文:https://arxiv.org/pdf/1406.2661.pdf
    机器之心:GAN完整理论推导与实现 https://www.jiqizhixin.com/articles/2017-10-1-1

    展开全文
  • 以为我在玩游戏?其实我在学 Java

    万次阅读 多人点赞 2021-11-10 10:59:40
    大家好,我是程序员cxuan!今天继续卷起来!和大家一起Look一个有趣的国外编程网站! "今天我们来学习 Java " 。...原文链接:这个网站,要火! 我还是不知道什么是 Java。为什么我不知道什么是 Java 呢,我想是因为我

    大家好,我是程序员cxuan!今天继续卷起来!和大家一起Look一个有趣的国外编程网站!

    "今天我们来学习 Java " 。

    “Java 是一门面向对象的编程语言” 。

    “Java 的特性有 balabalabala …”。

    “Java 与 C 的区别是 xxxxxx”。

    “Java 能用来 balabalabala @!#$$” 。

    balabalabalabalabalabalabalabala。

    原文链接:这个网站,要火!

    我还是不知道什么是 Java。为什么我不知道什么是 Java 呢,我想是因为我都不知道为什么要学习 Java ,确实,人在接触未知事物的时候,总是持有一副 90% 的拒绝、80% 的犹豫和 70% 的困惑的感觉。

    我记不清楚数学老师讲过多少次二元一次方程组求解了,我记不清楚语文老师说过多少次背诵全文了,我也记不清楚多少次物理老师说先画受力分析图了。这种硬性要求和填鸭式的教学直到现在让我想起来,仍旧打了两个哈欠。

    image-20211106211202651

    我想,为什么会这样呢?

    我突然想起来了隔壁老王家的大儿子,他家大儿子在上早教课,他家大儿子有一个兴趣,那就是拼积木。每次隔壁老王不想带孩子了,就让我带他儿子拼积木,我看到这孩子看到积木的时候,两眼放光,一拼就是一个小时,也不吵着闹着要吃糖了。

    小孩子在看到玩具的时候,是一种发自内心的开心,这种发自内心的开心也同时体现在我们打游戏这件事情上。

    为什么打游戏开心呢?因为有趣;为什么做数学题会犯困呢?因为无趣;那么我想,为什么做数学题和打游戏不能结合一下呢?

    虽然我现在不做数学题了,现在我的主业是编程,编程和数学题在某种情况下是一样的,因为都需要我们逻辑思维能力,所以编程为什么不能和做游戏结合一下呢?

    于是,我打算做一个网站,这个网站的目的就是只有一个,降低大家学习编程的门槛,采用玩游戏、讲故事的这种方式带你走入 Java 的世界,好了目的有了,说干就干。

    软件的开发原则上表明:如果有现有的轮子,最好是直接使用,而不是再开发一个。

    所以,当我在网络上遨游,搜索关于如何开发一个从零开始做游戏学 Java 轮子的时候,网站上一个你以为我在玩游戏,其实我在学 Java 的词条吸引了我,点进去,发现了一个不一样的东西。

    地址是:

    https://codegym.cc/zh/

    打开网站后,发现这是一个通过实战来学习 Java 的网站,里面有非常多的示例,这倒是没什么,因为通过实战驱动学习 Java 的网站有很多,我们继续往下走,选择中文(这里我完全是想快速搞清楚这个网站是干啥的,所以为了快餐文化,我选择了中文,大家最好还是选择英文)。

    然后它会提示我想成为一种什么类型的程序员。

    image-20211107060959716

    那必须是 Java 开发人员,然后 next ,提示我以哪种方式进行学习,诶我觉得这有点意思,我从来没尝试过通过阅读故事情节来学习 Java(难道学习 Java 还有故事背景?),而通过游戏学习 Java,这不就是我们想要的吗?

    image-20211107061041379

    然后看到了传统课堂,果断选择了游戏化的学习方式,继续 next。

    后面提示我是否想要同伴的激励和选择何种的编程背景,我果断选择了不需要激励和黑色,因为黑色才是代表着程序员的信仰。注册完成后,会提示我们是否有编程经验,考虑了一下,毕竟我们想要做从零开始,所以选择了萌新上手

    然后我们就来到了 Codegym 的主界面,迫不及待的点进了学习课程界面,从 Java 语法开始学习。

    映入眼帘的是一则有趣的故事。

    image-20211107062746552

    故事的背景是遥远的未来——3018 年,那时人类与机器人在地球上和谐相处,太空旅行已成为家常便饭。有一天,一艘名为银河系狂奔号宇宙飞船坠毁在一个未知的星球上…

    在坠落过程中,宇宙飞船撞上山腰,几乎被完全埋在碎石下。船员们努力数日,想让飞船脱离困境,但没有成功,于是失去了回家的希望,开始在这个陌生的新地方安顿下来… 飞船导航员发现未知星球上有大量的野生机器人,甚至机器狼,他们需要教会机器人编程指令,以帮助人类回家。

    如此,一个极具沉浸感的故事配合着卡通画面,Java 学习之路正式开启。图片

    图片

    在玩游戏的过程中,虚拟的导师会指导你学习各种 Java 知识点,并且分配完成各种任务。

    image-20211107063643844

    你会尝试进行编写一些 Java 代码,这些代码会在 Codegym 平台进行验证,验证成功后,突破下一关,通过这种方式来让自己不断升级,提高自己的编程能力。

    image-20211107064149730

    我想,这不就是我们想要的东西么?这还用自己造个轮子,直接用 Codegym 的就好了呀!

    除了基本的 Java 知识结构(Java 语法、Java 核心、Java 多线程、Java 集合)外,还有 SQL 和 Hibernate框架(开发中)、JSP 和 Servlet(开发中)。

    image-20211107063400051

    image-20211107063434451

    我大吃一惊,这是通过玩游戏的方式,让我把整个 Java 学习路线都掌握了呀!

    除此之外,我还在 Codegym 的左侧菜单栏发现了一些好东西。

    image-20211107074253981

    这里面是 Codegym 中的游戏,带你从创建包开始一步一步制作自己的游戏,当然你也可以查看其他用户发布的游戏。

    如果你担心你没有计划的学习,不用怕,CodeGym 网站还给你搞了个提醒时间表的功能,把自己的学习计划安排上去,到时间后,他就会通知你的邮箱。

    image-20211107074940316

    我还发现,Codegym 有自己的论坛和社区,因为它是国外的网站,所以论坛和文章有非常多的外国人一起交流技术,交流你做的游戏,交流你的学习心得。

    image-20211107074617800

    image-20211107074642088

    image-20211107074744840

    一个人学习是孤独的,而一群人学习是幸福的。

    在这里,你能够和其他人一起

    image-20211107075655317

    看到这里,我觉得我整个人都燃起来了,恨不得马上学起来!

    看的出来,这个网站做的非常用心,看得出来,这个网站的背后是一个在用心做事的团队。

    如果时光能倒流,我希望能早点知道这个网站,这样我就能够在大学中珍惜那些让我上课睡觉的日子了。

    最后,再给大家隆重的介绍一下这个网站

    https://codegym.cc/zh/

    小白可以用它轻松学 Java,Java 老手也可以去 Codegym 编写自己的游戏,分享学习经验,帮助他人,快乐自己。

    最后给大家推荐一下我自己的Github,里面有非常多的硬核文章,绝对会对你有帮助。

    展开全文
  • yolov1原文地址以及论文翻译

    万次阅读 多人点赞 2018-07-18 09:47:45
    论文原文:https://arxiv.org/pdf/1506.02640.pdf Tensorflow版本yolo v1:https://github.com/gliese581gg/YOLO_tensorflow Abstract 摘要  本文提出了一种新的物体检测方法YOLO。YOLO之前的物体检测方法主要....
  • 2019年剩1天,我从外包公司离职了

    万次阅读 多人点赞 2019-12-30 01:33:44
    这日子过的可真快啊,2019年剩1天,外包公司干了不到3个月,我离职了
  • 一个出身寒门的状元之死全文【原文

    万次阅读 多人点赞 2019-01-30 19:17:14
    一个出身寒门的状元之死全文【原文】  来源: 才华有限青年 ... 他去世的时候差4个月满25岁。  从接到他的死讯,到决定写下这篇文章,再到今天你们看到这篇文章,我前后花了半个月时间。  我提...
  • 但我想对说不是的,因为我与大家不同,在大家 20岁左右毕业之后转战大厂,意气风发的时候,我在为前途而迷茫;在大家 30 岁走向职场中层的时候,我才刚入码农的行。这就是我,一名 30 岁才开始学习开发的程序员...
  • Xtranslator是一款轻巧的文字翻译软件。但许多人并不太善于使用这款工具。用好这款工具一定会让您感觉如获至宝。今天编来告诉大家正确的使用方法:打开软件,微信扫...至少可以知道这一点:“原文区默认是隐藏的...
  • 作者:Sam哥哥聊技术原文链接:https://my.oschina.net/samgege/blog/1808622 Intellij IDEA真是越用越觉得它强大,它...
  • Martin Fowler关于微服务的原文翻译(一)

    万次阅读 多人点赞 2016-11-25 14:23:27
    原文如下:http://martinfowler.com/articles/microservices.html微服务一个新的架构术语“微服务架构”一词是在过去几年里涌现出来的,它用于描述一种独立部署的软件应用设计方式。这种架构方式并没有非常明确的...
  • 不想用百度云,那就教自建属于自己的云盘!

    万次阅读 多人点赞 2020-05-11 08:17:05
    作者:傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 文章目录一、前言二、系统环境三、工程部署1. IDEA 配置FTP和上传代码1.1 配置路径1.2 上传文件2. 云盘安装和配置2.1 ...
  • 我我们复制到word里面的时候,会出现如下情况,即依旧是按照一半的排版进行粘贴,这是不合适的。 解决方法: 以前,我们通常进行手工删除回车,然后添加空格,如下图所示: 这是繁琐低效的,我们可以尝试如下...
  • 当你无聊时可以做这15件高效的事

    万次阅读 多人点赞 2015-04-14 07:18:35
    如何面对无聊时刻,怎样有效地告别无聊,这里有15件事可以帮助……
  • 时候,那些豆子和黄瓜,可以说是的孩子——开始群起攻击,每天清晨不断地生长,急迫地要跟着走进房子,使窒息在他们的藤蔓中。 园艺也是一种有道德要求的职业,因为总是在开春时决心这一年要把菜园弄...
  • 硬核图解面试最怕的红黑树【建议反复摩擦】

    万次阅读 多人点赞 2020-11-05 09:26:58
    面试官看了人傻掉,可以这样学?
  • 不知道大家有没有经常遇到这样的一个困扰,为什么同样的算法,的程序却一直超时?大家用的都是暴力大法,为什么别人的能过所有数据,...同样都是使用dp,为什么的比别人的慢了那么多,有时候最后一个测试点都超时!
  • 面试字节跳动的一点经验

    万次阅读 2019-07-16 23:30:21
    我在 2019 年 7 月 8 日入职了字节跳动,借着这次机会想与伙伴们分享一下字节跳动的面试经验,希望对有用。 通过本篇文章将了解到: 应该抱着什么样的心态去大公司 加入字节跳动前我是如何做准备的 我在字节...
  • 原文:转载自公号菜鸟学Python作者:超昨晚家里停网了,对于互联网人,停网了,这能忍?打电话给修网络的,说太晚了,要第二天才能过来,这TM没网不是要我的命么?电脑看到隔壁姐姐的wifi信号满格哇,这让我动了...
  • 终于等到,Elasticsearch7.X视频教程发布!

    万次阅读 热门讨论 2019-06-24 22:43:33
    1、做搜索容易,做好搜索相当难。这是 Elastic 大佬 Wood 大叔在《熟练使用ES离做好搜索差多远?》的回复。当时看到回复后,感觉振聋发聩。的确,经常在涉及检...
  • 那么在数据体积激增的当下,究竟哪个数据库才会适合的场景,下面看Moshe的分享。 【编者按】随着数据的爆发性增长,NoSQL得到的关注已越来越多,然而的用例真正需要使用NoSQL数据库吗?又真的适合使用NoSQL...
  • 曾经优秀的人,怎么就突然不优秀了。

    万次阅读 多人点赞 2020-01-07 18:00:00
    职场上有多辛酸事,多合伙人出局的故事,多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
  • 从昨天晚上开始,我安装的Android Studio 3.3.2 开始抽风了,多插件都用不了,写代码也没有任何代码提示,写代码也没有任何错误提示,简直了。 强行忍了写了一晚上代码,今天实在受不了了。就从官网重新下载了一...
  • Java 开发最容易写的 10 个bug

    万次阅读 多人点赞 2021-10-09 10:56:12
    原文链接:10 个让人头疼的 bug 那个谁,今天又写 bug 了,没错,他说的好像就是我。。。。。。 作为 Java 开发,我们在写代码的过程中难免会产生各种奇思妙想的 bug ,有些 bug 就挺让人无奈的,比如说各种空指针...
  • 手把手教实现程序中的自定义组件

    万次阅读 多人点赞 2017-12-14 11:47:35
    之前做程序开发的时候,对于开发来说比较头疼的莫过于自定义组件了,当时官方对这方面的文档也只是寥寥几句,一笔带过而已,所以写起来真的是非常非常痛苦!! 好在微信程序的库从 1.6.3 开始,官方对于自定义...
  • 蘑菇街的年会,我没想到全是一群高颜值的姐姐,OMG
  • 2020=1024+996,程序员本命年,职场艰辛

    万次阅读 多人点赞 2020-01-03 00:20:28
    赞同楼主的一个想法“如果有合适的,我打算去外包公司“。 那我们要清楚什么是“合适”。 靠谱的外包公司也是可以继续去待着的。 我前同事现在在外包公司做测试开发, 拿高工资。 无论对于驻场外包和非驻场...
  • 例如,初级开发人员和高级开发人员,或者初级开发人员和入门级开发人员,而且公司有自己的标准来判断开发人员级别的时候,就更加模糊。  随着在事业上的进步,会到达一个想要跳跃到下一个阶段的地步。在每...
  • 什么是真正的程序员

    万次阅读 多人点赞 2020-10-16 10:18:10
    这篇文章的原文来自:A Little Printf Story作者仿照《小王子》中的情节,通过printf遇见的不同类型的程序员,最后悟出什么才是真正的程序员!第一次翻译有多不妥,欢迎留言指正。 文章略长,但是耐心读完,...
  • 年少的时候常常想能开一辆敞篷车又带着自己喜欢的人在满是落叶的山路上慢慢开,可是现在我发现这是难的。因为首先开着敞篷车的时候旁边没有自己喜欢的姑娘,而有自己喜欢的姑娘在边上的时候又没敞篷车,有敞篷车和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 378,328
精华内容 151,331
热门标签
关键字:

当你还很小的时候原文