来源 | 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

吊打一切:YOLOv4的tricks汇总相关推荐

  1. 吊打一切的YOLOv4的tricks汇总!

    即使是目标检测在过去几年开始成熟,竞争仍然很激烈.如下所示,YOLOv4声称拥有最先进的精度,同时保持高处理帧速率.它在 MS COCO数据集上,使用Tesla V100以接近65 FPS推理速度获得 ...

  2. 吊打一切的YOLOv4的tricks汇总!附参考论文下载

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 即使是目标检测在过去几年开始成熟,竞争仍然很激烈.如下所示,YOLOv4声称拥有最先进的精度,同时保持 ...

  3. YOLO在升级 | PP-YOLO v2开源致敬YOLOV4携带Tricks又准又快地归来(附论文与源码)...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 表现SOTA!AP和速度的综合性能优于YOLOv5.EfficientDet等网络,其中一版本可达50 ...

  4. AI大视觉(二十) | 小目标检测的tricks汇总

    本文来自公众号"AI大道理". 这里既有AI,又有生活大道理,无数渺小的思考填满了一生. 在计算机视觉中,检测小目标是最有挑战的问题之一. 本文汇总了一些有效的策略. 为何小目标 ...

  5. 应用YOLOV4 - DeepSort 实现目标跟踪

    转载自 https://cloud.tencent.com/developer/article/1706259 本文分享利用yolov4+deepsort实现目标跟踪,主要是讲解如何使用,具体原理可以 ...

  6. 机器学习算法易受攻击?阿里“安全基建”这样应对AI的不安全

    出品 | AI科技大本营(ID:rgznai100) 数字基建的浪潮之下,诸多行业领域都在加速融合5G.大数据中心.AI等新技术,向数字化转型.近日,多位全国政协委员.院士和安全行业专家提出,应尽快出 ...

  7. 代码恒久远,GitHub 永流传

    作者 | 唐小引 题图 | GitHub 来源 | CSDN(ID:CSDNnews) 这两天,在 GitHub 上积极贡献代码的许多开发者都收到了「Arctic Code Vault Contrib ...

  8. 盖茨、奥巴马、马斯克账号被黑,推特遭大规模黑客攻击

    据外媒报道,推特(Twitter)遭遇"史诗级"大规模黑客攻击,比尔·盖茨.马斯克.奥巴马.贝索斯.苹果公司等账号集体被黑,他们的账号均发布了相同的诈骗信息,让大家在接下来的30分 ...

  9. 2020 年德国 IT 薪酬大揭秘!

    作者 | 德国IT那些事 来源 | 欧盟IT那些事(europe-it-news) 责编 | 王晓曼 一般来说IT行业公司,资历是按等级划分的.级别越高,员工拥有的权力和承担的责任越大,同时他们得到的 ...

最新文章

  1. C#调用DataV token代码
  2. android studio 插件开发 FindByTag插件 局部情况下取代ButterKnife插件
  3. ST CUBEMX 修改MCU型号
  4. 关于expres模板引擎,Function,with
  5. vs 2019 社区版许可证过期_Switch版《最终幻想12:黄道时代》对比PS4版 就没差
  6. 很多人理解互联网是“年轻化”
  7. Window下MySQL 8.0重新设置密码
  8. 没有钱到底要不要创业?
  9. php 短信验证码过期时间,php下发短信验证码60秒简单验证
  10. Logstash 时区问题
  11. ASUS 华硕 NX580V 飞行堡垒 安装WIN7系统教程
  12. 【学习总结】《Unity3D网络游戏》Part 1
  13. zemax---GEO Radius and RMS Radius
  14. General information (1)
  15. hdu6305(笛卡尔树/分治)
  16. 【华为oj】计票统计
  17. 春运动车组穿越在祁连山兰新高铁线上
  18. AP微积分全方位解析
  19. ESP8266-Arduino编程实例-TM1637-驱动4位7段数码管
  20. 口才训练,简单、易行、见效的训练方法大全!

热门文章

  1. 《Redis入门指南(第2版)》一第2章 准备
  2. 《Photoshop Lab修色圣典(修订版)》—第1课1.7节言归正传
  3. mysql 开启慢查询命令【转】
  4. linux下IPython的安装方法
  5. WebGL光栅化流水线
  6. Latex中数学公式中常用符号(持续更新)
  7. Go 系列教程 —— 20. 并发入门
  8. SQL Server使用侦听器IP访问时遇到The target principal name is incorrect. Cannot generate SSPI context...
  9. iOS测试基础(命令篇)-iPhone型号及其他信息
  10. 使用locate 的正则查询 查找所有main.c