吊打一切:YOLOv4的tricks汇总
来源 | AI算法与图像处理(ID:AI_study)
即使是目标检测在过去几年开始成熟,竞争仍然很激烈。如下所示,YOLOv4声称拥有最先进的精度,同时保持高处理帧速率。它在 MS COCO数据集上,使用Tesla V100以接近65 FPS推理速度获得精度43.5% AP (65.7% AP₅₀)。在目标检测中,高精度不再是唯一的基准。我们希望模型在边缘设备中平稳运行。如何用低成本的硬件对输入视频进行实时处理也变得非常重要。
https://medium.com/@jonathan_hui/yolov4-c9901eaa8e61
YOLOv4引用论文汇总:
链接: https://pan.baidu.com/s/1a2IoSFQnFDE8Q5--5BpqMg
提取码: scei
阅读 YOLOv4 过程中有趣的部分是新技术已经应用来评估、修改并集成到YOLOv4中。而且它还做了一些改变,使检测器更适合在单个GPU上训练。
Bag of freebies (Bof) & Bag of specials (BoS)
在训练过程中可以进行的优化(like data augmentation, class imbalance, cost function, soft labeling etc…),以提高精度。这些改进对推理速度没有影响,被称为“bag of freebies”。然后,还有“bag of specials”,它对推理时间有轻微的影响,在性能上有良好的反馈。这些改善包括增大感受野,注意力机制的使用,特征整合,如跳跃连接和 FPN,以及后处理,如非最大值抑制。在本文中,我们将讨论如何设计特性提取器和 neck 以及所有这些 Bof 和 BoS 好东西。
Backbone
Dense Block & DenseNet
为了提高模型的准确性,我们可以设计一个更深的网络来增大感受野,增加模型的复杂度。为了减轻训练难度,可以使用skip-connections 。我们可以用密集互联的层来进一步扩展这个概念。
一个Dense Block包含多个卷积层,每层 Hi 由 batch normalization(BN)、ReLU 和卷积组成。Hi 并不是只使用最后一层的输出,而是将之前所有层的输出以及原始层的输出作为输入。即x₀x₁,…, xᵢ₋₁。下面的每个Hi输出4个feature map。因此,在每一层,feature map的数量增加了4 -增长率。
在由卷积和池化组成的transition之间加上多个Dense Block,就可以形成DenseNet 。
下面是网络架构设计的细节
Cross-Stage-Partial-connections (CSP)
CSPNet将DenseBlock输入的feature map分为两部分。第一部分 x₀’ 绕过DenseBlock和成为下一个transition的输入。第二部分x₀”会经过Dense block如下。
这种新的设计通过将输入分成两部分来降低计算复杂度——只有一部分通过Dense Block.。
CSPDarknet53
YOLOv4利用上面的CSP连接,下面的Darknet-53作为提取特征的骨干。
与基于ResNet的设计相比(尽管ResNet模型具有更好的分类性能),CSPDarknet53模型具有更高的目标检测精度。但Mish等技术可以提高CSPDarknet53的分类精度。因此,YOLOv4的最终选择是CSPDarknet53。
Neck
目标检测器由特征提取的backbone和用于目标检测的head(下面最右边的块)组成。为了在不同尺度上检测物体,在不同的空间分辨率下通过head探测feature map来生成层次结构。
为了丰富head的信息,在送入head之前,输入经过自底向上和自顶向下的,相邻特征图被按元素顺序添加到一起或连接起来(如上图所示)。因此,head的输入将包含自底向上的空间丰富信息和自上而下的语义丰富信息。这部分被称为 neck。让我们了解它设计的更多细节。
Feature Pyramid Networks (FPN)
YOLOv3采用与FPN类似的方法在不同尺度级别上进行目标检测预测。
在对某一特定尺度上进行预测时,FPN将之前的自顶向下的上采样(2倍),并将其与自底向上流的相邻层相加(见下图)。将结果传递到一个3×3的卷积中,以减少上采样的伪影,并为head 创建下面的feature map P4。
SPP (spatial pyramid pooling layer)
SPP在检测不同尺度的物体时采用的策略有所不同。它将最后一个池化层(在最后一个卷积层之后)替换为一个空间金字塔池化层。将feature map在空间上划分为m×m个bin,设m分别为1、2、4。然后对每个通道的每个容器应用最大值池化。这形成了固定长度的表示,可以用fc层进一步分析。
许多基于cnn的模型包含fc层,因此只接受特定尺寸的输入图像。相反,SPP接受不同大小的图像。不过,也有一些技术,比如全卷积网络(FCN),它们不包含fc层,并且接受不同维度的图像。这种类型的设计对于空间信息重要的图像分割特别有用。因此,对于YOLO来说,将二维特征映射转换为固定大小的一维矢量不一定是可取的。
YOLO with SPP
在YOLO中,SPP被修改以保留输出空间维度。最大值池化应用于大小为1×1、5×5、9×9、13×13的卷积核。空间维度被保留。然后,将来自不同内核大小的feature map 连接在一起作为输出。
下图演示了如何将SPP集成到YOLO中。
Path Aggregation Network (PAN)
在早期DL中,模型设计相对简单。每一层从前一层获取输入。浅层提取局部纹理和模式信息,建立后续层所需的语义信息。然而,当我们向右移动时,微调预测结果时所需的局部信息可能会丢失。
在后来的DL发展中,层之间的互相连接变得越来越复杂。在DenseNet,它走到了极致。每一层都与之前的所有层相连。
在FPN中,自底向上和自顶向下的流将相邻层的信息组合在一起。
层之间的信息流成为模型设计中的另一个关键决策。
下图是用于目标检测中的Path Aggregation Network(PAN)。增加了自底向上的路径(b),使低层信息更容易传播到顶层。在FPN中,局部空间信息在红色箭头处向上传递。虽然图中没有清楚地显示,但红色的路径经过了大约100多个层。PAN引入了 short-cut 路径(绿色通道),只需要大约10层去顶部的N₅层。这种short-circui的概念使得最上层可以获得精确的局部信息。
作为一个注解,neck设计可以可视化如下:
但是,在YOLOv4中,features maps是连接在一起的,而不是相邻的层相加的。
在FPN中,目标是在不同尺度上分别独立地进行检测的。这可能会产生重复的预测,而不能利用来自其他特征图的信息。PAN首先使用element-wise max操作将所有层的信息融合在一起(这里我们将跳过细节)。
https://arxiv.org/pdf/1803.01534.pdf
Spatial Attention Module (SAM)
注意力机制在 DL 设计中被广泛采用。在SAM中,最大值池化和平均池化分别用于输入feature map,创建两组feature map。结果被输入到一个卷积层,接着是一个 Sigmoid 函数来创建空间注意力。
将空间注意掩模应用于输入特征,输出精细的特征图。
在YOLOv4中,使用修改后的SAM而不应用最大值池化和平均池化。
在YOLOv4中,FPN概念逐渐被实现/替换为经过修改的SPP、PAN和PAN。
Bag of Freebies (BoF) for backbone
YOLOv4中backbone的BoF功能包括:
CutMix and Mosaic data augmentation,
DropBlock regularization, and
Class label smoothing
CutMix data augmentation
Cutout data augmentation 去除图像的一个区域(见下图)。这迫使模型在进行分类时不能对特定的特征过于自信。然而,图像的一部分充满了无用的信息,这是一种浪费。在CutMix中,将图像的一部分剪切并粘贴到另一个图像上。ground truth标签会根据 patch 的面积按比例进行调整,比如0.6像狗,0.4像猫。
从概念上讲,CutMix对于一个对象可以由什么组成有更广的视野。裁剪区域迫使模型学习不同特征集的对象分类。这可以避免过度自信(overconfidence)。由于将该区域替换为另一幅图像,图像中的信息量和训练效率也不会受到显著影响。
Mosaic data augmentation
Mosaic是一种将4张训练图像合并成一张进行训练的数据增强方法(而不是 CutMix 中的2张)。这增强了对正常背景(context)之外的对象的检测。此外,每个小批包含一个大的变化图像(4倍),因此,减少了估计均值和方差的时需要大mini-batch的要求。
DropBlock regularization
在全连接的层中,我们可以使用dropoff来迫使模型从各种特征中学习,而不是对少数特征过于自信。但是,这可能对卷积层不起作用。相邻位置高度相关。因此,即使一些像素被删除(下面中间的图),空间信息仍然可以被检测到。DropBlock正则化建立在一个类似的概念上,工作在卷积层。
不是删除单个像素,而是删除大小为 block_size×block_size 像素块 。
Class label smoothing
当你感觉绝对正确的时候,你可能就大错特错了。对预测有100%的信心可能表明模型是在记忆数据,而不是在学习。标签平滑调整预测的目标上限为一个较低的值,比如0.9。它将使用这个值而不是1.0来计算损失。这个概念缓解了过度拟合。
p = tf.placeholder(tf.float32, shape=[None, 10])# Use 0.9 instead of 1.0.feed_dict = { p: [[0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0]] # Image with label "3"}# logits_real_image is the logits calculated by # the discriminator for real images.d_real_loss = tf.nn.sigmoid_cross_entropy_with_logits( labels=p, logits=logits_real_image)
Bag of Specials (BoS) for backbone
Mish activation,
Cross-stage partial connections (CSP), and
Multi-input weighted residual connections (MiWRC)
Mish activation
我们假设激活函数是
对于一元或二元运算符有不同的候选函数(如余弦函数)。我们可以根据不同的任务(如分类)和数据集对这些函数进行随机猜测,并评估相应的模型性能。最后,我们可以选择一个性能最好的激活函数。
应用强化学习,可以更有效地搜索求解空间。
通过实验使用这种方法,下面新的激活函数Swish比ReLU和许多其他激活函数表现出更好的性能。
(Swish activation function with different values of β)
Mish是另一个与ReLU和Swish非常相似的激活函数。正如论文所宣称的那样,Mish可以在不同数据集的许多深度网络中胜过它们。
Mish:https://arxiv.org/pdf/1908.08681.pdf
对CSPDarknet53和检测器使用Mish,可以提高YOLOv4中的精确性。
Multi-input weighted residual connections (MiWRC)
在过去的几年里,研究人员对将哪些feature map 添加到一个层上给予了很大的关注。有时,我们打破了只使用前一层的传统。
层之间如何连接现在变得更加重要,特别是对于目标检测器来说。我们已经讨论了 FPN 和 PAN 作为例子。下面的图(d)显示了另一种被称为 BiFPN 的neck设计,根据 BiFPN 的论文,该设计具有更好的准确性和效率权衡。
BiFPN :https://arxiv.org/pdf/1911.09070.pdf
在YOLOv4中,它将其性能与YOLOv4认为的 state-of-the-art 之一的 EfficientDet 进行了比较。我们来花点时间研究一下。如下图所示,EfficientDet使用EfficientNet作为主干特征提取器,BiFPN作为颈部。
作为参考,下面的图表是 EfficientNet 的架构,它建立在由反向残差块( inverted residual block)组成的MBConv层上。
如下面论文中所述,反向残块由
https://arxiv.org/pdf/1801.04381.pdf
The first layer is called a depthwise convolution, it performs lightweight filtering by applying a single convolutional filter per input channel. The second layer is a 1 × 1 convolution, called a pointwise convolution, which is responsible for building new features through computing linear combinations of the input channels.
第一层称为深度卷积( depthwise convolution),它通过对每个输入通道应用一个卷积滤波器来进行轻量级滤波。第二层是1×1卷积,称为pointwise convolution,它负责通过计算输入通道的线性组合来构建新的特征。
假设输入的尺寸 hᵢ × wᵢ × dᵢ.。它适用于 dᵢ 个 k × k 卷积过滤器的 ——在每个通道上一个。然后1×1卷积过滤器用于所有通道产生一个输出 hᵢ × wᵢ × dⱼ.ⱼ。所以总计算复杂度为:
与传统的卷积层相比,其关键优点是计算量小得多。
在很多ML和DL问题中,我们学习输入的低维表示。我们通过创建一个“信息” bottleneck来提取数据的核心信息。这迫使我们发现最重要的信息,这是学习的核心原则。根据这一原则,反向残差块以低维表示作为输入,通过卷积(线性操作)和非线性操作对其进行操作。但是对于像ReLU这样的非线性部件有一个主要的问题。非线性操作会不按比例地拉伸或压缩区域。在这种压缩中,输入可以映射到相同的区域/点。例如,ReLU可能会使这个低维空间中的信道崩溃,从而不可避免地丢失信息。从论文上引用:
It is important to remove non-linearities in the narrow layersin order to maintain representational power.
为了保持代表性,在狭窄的层中消除非线性是很重要的。
为了解决这个问题,我们可以暂时扩展这个维度(通道的数量)。希望我们现在有大量的通道,经过非线性操作后,仍然可以在一些通道中保留信息。下面是反向残块的细节:
如图所示,低维表示首先扩展到 tk 通道。然后采用3×3的轻量级depthwise convolution。随后,在模块的末尾,特征被还原为低维的。当它仍然存在于高维空间时,非线性运算被加入。
从模块的开始到结束添加一个残差连接。图中左侧为传统残差块,右侧为所述反向残差块。
理解 EfficientDet 的关键概念是很好的。但EfficientDet对YOLOv4的主要贡献是多输入权重残差连接。在 EfficientDet 论文中,观察到不同的输入特征在不同的分辨率下对输出特征的贡献是不相等的。但在前面的讨论中,我们统一添加了这些特性。在EfficientDet中,输入特征的权重不同,组成输出为:
其中 wᵢ 将训练和学习像其他可训练的参数。
Bag of Freebies (BoF) for detector
YOLOv4检测器的BoF特性包括:
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, and
Random training shapes
CIoU-loss
损失函数给出了如何调整权重以降低loss的信号。所以在我们做出错误预测的情况下,我们期望它能给我们指明前进的方向。但如果使用IoU和ground truth box并且预测没有重叠,就不会发生这种情况。考虑两个预测都不与ground truth 重叠,IoU损失函数不能告诉哪一个是更好的,甚至一个可能比另一个更接近ground truth。
Generalized IoU (GIoU) 通过将损失细化为:
但是这个损失函数倾向于首先扩展预测的边界框,直到它与 ground truth重叠。然后它收缩增加IoU。这个过程需要比理论上更多的迭代。
首先,引入 Distance-IoU Loss (DIoU) 如下:
它引入了一个新的目标来减少两个框之间的中心点分离。
最后,引入Complete IoU Loss (CIoU) :
增加ground truth框与预测框的重叠区域,
使它们的中心点距离最小
保持框的高宽比的一致性。
这是最后的定义:
CmBN
原始的 Batch normalization 收集一个 mini-batch 内样本的均值和方差,以白化(whiten)作为层输入。然而,如果小批量尺寸是小的,这些估计将是有噪声的。一个解决方案是在许多小批量中估算它们。然而,随着权重在每次迭代中变化,在这些权重下收集的统计信息在新的权重下可能会变得不准确。一个简单的平均数将是错误的。幸运的是,权重是逐渐变化的。在交叉迭代批处理归一化(Cross-Iteration Batch Normalization,CBM)中,它通过下面的调整从前k次迭代中估计这些统计信息。
CmBN是一个修改后的选项,它只收集单个batch内mini-batch之间的统计信息。
Self-Adversarial Training (SAT)
SAT是一种数据增强技术。首先,它对一个训练样本执行前向传递。在传统的反向传播中,我们通过调整模型权重来改进检测器对图像中目标的检测。这里是相反的方向。它改变了图像,使它可以降低检测器的性能。也就是说,它创建了一个针对当前模型的对抗性攻击,即使新图像在视觉上看起来是一样的。接下来,用带有原始边界框和类标签的新图像对模型进行训练。这有助于推广模型和减少过拟合。
Eliminate grid sensitivity
边界框b计算为:
对于 bₓ = cₓ 和 bₓ = cₓ+1, 我们需要 tₓ 产生大量的正值和负值,分别。但是我们可以用一个比例因子(>1.0)来使这个过程更简单。这里是源代码的变化:
Multiple anchors for a single ground truth
如果IoU(ground truth, anchor) > IoU阈值,为一个ground truth使用多个anchor。(注意,在确定它在YOLOv4中的角色方面,我还没有足够的信息。)
Cosine annealing scheduler
cosine schedule根据余弦函数调整学习率。它开始缓慢地降低大的学习率。然后它在中途迅速降低了学习率,最终在降低学习率方面出现了一个小斜坡。
该图显示了学习速率是如何衰减的(下面的图中也应用了学习率warmup)以及它对 mAP 的影响。这可能不是很明显,新的方案有更加平稳的前进,而不是停滞了很长一段时间才再次取得进展。
Hyperparameter selection using genetic algorithms (Evolutionary Algorithms)
Evolutionary Algorithms 是一种有根据的猜测方法。它遵循的是适者生存的概念。例如,我们随机选择100组超参数。然后,我们用它们来训练100个模型。之后,我们选择了前10个执行模型。对于每个选择的模型,我们根据其原始创建10个微小差异的超参数。我们用新的超参数重新训练模型,并再次选择最佳模型。当我们保持迭代时,我们应该找到最佳的超参数集。或者,我们可以从默认的超参数开始,然后开始突变。从论文上引用,
https://arxiv.org/pdf/2004.10934.pdf
Genetic algorithm used YOLOv3-SPP to train with GIoU loss and search 300 epochs for min-val 5k sets. We adopt searched learning rate 0.00261, momentum 0.949, IoU threshold for assigning ground truth 0.213, and loss normalizer 0.07 for genetic algorithm experiments.
遗传算法采用YOLOv3-SPP算法进行GIoU缺失训练,最小5k集搜索300个epoch。遗传算法实验采用搜索学习率0.00261,动量0.949,IoU阈值分配ground truth 0.213, loss normalizer 0.07。
Random Training Shapes
许多单阶段目标检测器是在固定的输入图像形状下训练的。为了提高泛化效果,我们可以对不同图像大小的模型进行训练。(在YOLO中进行多尺度训练)
Bag of Specials (BoS) for detector
针对YOLOv4检测器的BoS特性包括:
Mish activation,
modified SPP-block,
modified SAM-block,
modified PAN path-aggregation block &
DIoU-NMS
DIoU-NMS
NMS过滤掉预测相同对象的其他边界框,并保留具有最高可信度的边界框。
DIoU(前面讨论过的) 被用作非最大值抑制(NMS)的一个因素。该方法在抑制冗余框的同时,采用IoU和两个边界盒中心点之间的距离。这使得它在有遮挡的情况下更加健壮。
Technology evaluated
虽然本文介绍了在YOLOv4中集成了哪些技术,但YOLOv4在评估其他技术方面花费了大量精力。为了结束本文,下面的图表列出了YOLOv4考虑的技术。
Credits & References
1YOLOv4: Optimal Speed and Accuracy of Object Detection2Github for YOLOv4:https://github.com/AlexeyAB/darknet3Densely Connected Convolutional Networks4CSPNet: A New Backbone that can Enhance Learning Capability of CNN5Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition6Path Aggregation Network for Instance Segmentation7Mish: A Self Regularized Non-Monotonic Neural Activation Function8Searching for Activation Functions (Swish)9DC-SPP-YOLO: Dense Connection and Spatial Pyramid Pooling Based YOLO for Object Detection
10Path Aggregation Network for Instance Segmentation
11CBAM: Convolutional Block Attention Module (SAM)
12Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression
13Cross-Iteration Batch Normalization
14CutMix: Regularization Strategy to Train Strong
15DropBlock: A regularization method for convolutional networks
16Rethinking the Inception Architecture for Computer Vision (Class label smoothing)
17Distance-IoU Loss: Faster and better learning for bounding box regression
18SGDR: Stochastic gradient descent with warm restarts (Cosine annealing scheduler)
19Bag of Freebies for Training Object Detection Neural Networks
20EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
21EfficientDet: Scalable and Efficient Object Detection
22MobileNetV2: Inverted Residuals and Linear Bottlenecks
推荐阅读
空间-角度信息交互用于光场图像超分辨重构,性能达到最新SOTA | ECCV 2020
阿里巴巴副总裁司罗:达摩院如何搭建NLP技术体系?
Python 编程语言的核心是什么?
Python轻松搞定Excel中的20个常用操作
2020 活久见:欧美主流 app「熔断」了
赠书 | DeFi沉思录:历史、中国与未来
你点的每个“在看”,我都认真当成了AI
相关文章:

如何播放RM文件?
<EMBED SRC"MY_LIFE.RPM" WIDTH300 HEIGHT134 >Tip:SRC是可以省略的,当mime Type 参数如下时:<EMBED ...,TYPE"audio/x-pn-realaudio-plugin",...>,这样做会产生不可预料的结果,因此强烈推荐你包…

mongodb地理位置索引实现原理
地理位置索引支持是MongoDB的一大亮点,这也是全球最流行的LBS服务foursquare 选择MongoDB的原因之一。我们知道,通常的数据库索引结构是B Tree,如何将地理位置转化为可建立BTree的形式,下文将为你描述。 首先假设我们将需要索引的…

NSMakeRange基础函数应用
NSRange NSMakeRange (NSUInteger loc,NSUInteger len );这是官方得接口描述。loc 为location缩写,len 表示长度。作用:在loc指定得位置开始往后获取len长度个得元素。示例程序使用这个函数来为指定数组得某个位置向后指定长度得元素集合。如NSRange NSM…

上传图片,要求图片200100象素,大小小于2M
作者:网际浪子专栏(曾用名littlehb) http://blog.csdn.net/littlehb/上传图片,要求图片200100象素,大小小于2M,如果图片不符合要求,不能上传,否则上传图片,上传以后对图…
炸裂!这些大厂跪求的人才太牛了!
今年所有的互联网公司都在ALL in AI,百度、腾讯、阿里巴巴、京东等互联网巨头都在四处挖掘AI人才。AI的岗位需求很多,几乎每天都有数百个JD放出。而亿欧智库发布的《2020全球人工智能人才培养研究报告》提到,近4年AI人才的需求量以每年74%的速…

新春祝福必杀计之发送短信攻略
新的一年就要到了,陆陆续续的收到很多同事们的短信祝福,哎,不能欠人家的人情债啊,但是我实在是个懒人啊,这个祝福短信还是要回复的啊,我的手机里有超过百位联系人,全是和工作有关的,…
centos6.5环境DNS-本地DNS主从服务器bind的搭建
centos6.5环境DNS-本地DNS主从服务器bind的搭建在上一篇博客中我已经搭建好了一个本地DNS服务器,能够实现正向反向解析,那么我们只需要加入一台从DNS服务器即可完成,我们来开始配置主从服务器:一.主DNS服务器上面的额外…
再见,Python!
结合我最近这些年的 Python 学习、开发经验,发现近90%的程序员在学 Python 时都会遇到下面这3个问题:1.想学Python,但不知从何学起,应用方向太多了也不知道该选择什么方向...2.基础入门看似简单,但是进阶实战就举步维艰…

如何更新父窗体
Response.Write("<script languagejavascript>window.opener.locationwindow.opener.location.href;</script>") 第一种方案是:file a.htm function OpenDialog(url,param){return window.open(url,param, "DialogWidth:450px;DialogH…

文件体积单位的换算
单位转换(参考): 1bit(这个比特表示一个二进制数字) 1Byte(这个单词音译过来也叫“比特”但是表示一个十六进制的数字) 1B1Byte8bit 1 kB 1024 B (kB - kilobyte) 千 1 MB 1024 kB (MB - mega…

防止盗链下载问题
经常在网络上四处载东西,有时碰到直接拷贝一个类似 http://193.100.100.56/TestWebSolution/WebApplication1/test.rar地址准备下载test.rar文件时,却被告知没有登录或者直接跳转到其他页面的情况,然后等登录后直接下载该文件。要实现上面情况…
中国人工智能市场破 50 亿!你还不了解 AI 云服务吗?
作者 | 马超责编 | 伍杏玲出品 | CSDN(ID:CSDNnews)从AI的发展趋势来看,最新的人工智能模型对于算力的要求往往较高,如谷歌的T5,其整个模型的参数数量达到了惊人的 110 亿,谷歌科学家更在T5的论…

Java中数据存储方式
2019独角兽企业重金招聘Python工程师标准>>> 1. 寄存器(register)。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你…

Oracle与JCP执行委员会分享了他们的Java EE策略
Anil Gaur是Oracle集团负责Java EE和WebLogic Server的副总裁。他受邀在上一次的JCP执行委员会会议上发表了演讲,透露了有关Java EE未来发展的一些信息。他所传达的信息和Oracle之前的说法一致:企业编程正在发生变化,Oracle希望适应这种变化。…
5G:新基建的压舱石,如何为新基建按下“加速键”?
受访嘉宾 | 广和通 CEO 应凌鹏记者 | 邓晓娟2019 年,伴随着 5G 的浪潮,5G、AI、AIoT等新兴技术得到了全面的爆发,过去人们认为遥不可及的「高科技」,也逐渐走下“神坛”来进入大家的生活。5G 时代的万物互联,在本次疫情…

no argument specified with option /LIBPATH:错误的解决
作者:朱金灿来源:http://blog.csdn.net/clever101下午使用VS2005编译工程碰到一个链接错误:no argument specified with option "/LIBPATH:"。检查了链接库的文件路径,发现某个路径是非法的(即不存在该文件路…

Animation 模拟纸盒的爆破
用简单的Animation动作模拟爆破的瞬间,仔细的调整各种参数效果会更像 原理:用定义好的纸张从onTouch中心点向四面八方散开,散开过程中,使用不用的速度、大小、方向、旋转角度、透明度(这里纸张可以加上火焰,…
代码恒久远,GitHub 永流传
作者 | 唐小引题图 | GitHub来源 | CSDN(ID:CSDNnews)这两天,在 GitHub 上积极贡献代码的许多开发者都收到了「Arctic Code Vault Contributor」的荣誉勋章的通知,并非常兴奋地晒起了朋友圈。因为这标志着自己在 GitHu…

不允许后退的方法
由于项目的需要不允许系统在提交之后,按IE的后退按钮进行再次提交。试试了一下在 .NET中通过如下语句 Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);就可以使页面的缓存失效,每次都需要获取新页面。 <script>history.for…

3个题目熟悉类和对象基础
1、按要求编写Java应用程序: (1)编写西游记人物类(XiYouJiRenWu)其中属性有:身高(height),名字(name),武器(weapon&#x…

按下回车表示确定提交
<body οnkeydοwn"if (event.keyCode13) {document.all.button2.click()}"> 下面的五种方法都可以帮你解决这种问题1.<script languagejavascript>function document.onkeydown(){ if (event.keyCode 13) { if (event.srcElement docum…
A股暴跌,户均亏2万!刚写好的辞职信又撕了……
仅用1天,A股市值单日蒸发达到3.5万亿,人均亏了超2万!“芯片龙头”企业中芯国际正式登陆科创板,使得半导体板块整体跌幅较小。中芯国际上市首日涨幅超200%,收报82.92元,总市值达6137.57亿元,成为…

DataList在无数据记录时显示类似GridView空模板(EmptyDataTemplate)
在FooterTemplate加个Label并根据repeater.Items.Count判断是否有记录。HTML代码: <FooterTemplate> <asp:Label ID"lblEmpty" Text"No data recprd exist !" runat"server" Visible<%#bool.Parse((DataList1.I…

QButtonGroup 的使用
1、3以后尽量手写,因为没有现在的控件了 2、 1 // lyy : 2016/8/26 12:17:41 说明:存放radioButton2 QButtonGroup *buttonGroup;3 // lyy : 2016/8/26 11:11:55 说明:radioButton4 buttonGroup new QButtonGroup();5 buttonGroup->addButt…
机器学习算法易受攻击?阿里“安全基建”这样应对AI的不安全
出品 | AI科技大本营(ID:rgznai100)数字基建的浪潮之下,诸多行业领域都在加速融合5G、大数据中心、AI等新技术,向数字化转型。近日,多位全国政协委员、院士和安全行业专家提出,应尽快出台安全基建国家标准&…

不可以输入中文
function checkCH() {var strtxtPwd.value;var c /[/u4e00-/u9fa5]/;if(c.test(str)){alert("不能输入中文。");return false;}return true; }

tomcat虚拟路径的几种配置方法
tomcat配置虚拟路径的4种方法在tomcat中,webapp文件夹默认为web应用的根目录。1.在tomcat\conf\server.xml中找到 host标签,在host标签中增加新的元素<Context/>并设置 Context的元素,其中path元素所设置的值就是在浏览器中所要访问的虚…

hi35183e增加exfat文件系统的支持
64G-128G的tf卡文件系统格式为exfat,而hi3518e默认只支持fat32格式的tf卡。为了挂载64G以上的tf卡,只能将sd卡先格式化成FAT32。鉴于exfat性能比FAT32强,因此考虑移植exfat驱动到海思3518e平台,这样就不用强制格式化tf卡。 拷贝驱动源码到内核…

XML的简单读取与写入
作者:网际浪子专栏(曾用名littlehb) http://blog.csdn.net/littlehb/我用的是一种很笨的方法,但可以帮助初学者了解访问XML节点的过程。已知有一个XML文件(bookstore.xml)如下: <?xml ver…
美国 AI 博士一针见血:Python 这样学最容易成为高手!
我见过市面上很多的 Python 讲解教程和书籍,他们大都这样讲 Python 的:先从 Python 的发展历史开始,介绍 Python 的基本语法规则,Python 的 list, dict, tuple 等数据结构,然后再介绍字符串处理和正则表达式࿰…