我的编程空间,编程开发者的网络收藏夹
学习永远不晚

无卷积步长或池化:用于低分辨率图像和小物体的新 CNN 模块SPD-Conv

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

无卷积步长或池化:用于低分辨率图像和小物体的新 CNN 模块SPD-Conv

No More Strided Convolutions or Pooling:A New CNN Building Block for Low-Resolution Images and Small Objects

原文地址:
https://arxiv.org/pdf/2208.03641v1.pdf

 pdf下载:

(67条消息) 无卷积步长或池化:用于低分辨率图像和小物体的新CNN模块SPD-Conv-行业报告文档类资源-CSDN文库icon-default.png?t=M85Bhttps://download.csdn.net/download/weixin_53660567/86737435

无卷积步长或池化:用于低分辨率图像和小物体的新 CNN 模块SPD-Conv

摘要

卷积神经网络(CNNs)在图像分类和目标检测等计算机视觉任务中取得了显著的成功。然而,当图像分辨率较低或物体较小时,它们的性能会迅速下降。在本文中,我们指出这根源为现有CNN常见的设计体系结构中一个有缺陷,即使用卷积步长和/或池化层,这导致了细粒度信息的丢失和较低效的特征表示的学习。为此,我们提出了一个名为SPD-Conv的新的CNN构建块来代替每个卷积步长和每个池化层(因此完全消除了它们)SPD-Conv由一个空间到深度(SPD)层和一个无卷积步长(Conv)层组成,可以应用于大多数CNN体系结构(如果不是全部的话)。我们从两个最具代表性的计算机视觉任务:目标检测和图像分类来解释这个新设计。然后,我们将SPD-Conv应用于YOLOv5ResNet,创建了新的CNN架构,并通过经验证明,我们的方法明显优于最先进的深度学习模型,特别是在处理低分辨率图像和小物体等更困难的任务时。我们在https://github.com/LabSAINT/SPD-Conv上开放了源代码。

1.介绍

AlexNet[18]以来,卷积神经网络(CNNs)在许多计算机视觉任务中表现出色。例如在图像分类方面,CNN的知名模型有AlexNetVGGNet[30]ResNet[13];在目标检测中,包括R-CNN系列[9,28]YOLO系列[26,4]SSD [24]EfficientDet [34],等等。然而,所有这样的CNN模型在训练和推理中都需要高质量的输入(精细图像、中型到大型对象)。例如,AlexNet最初在227×227清晰图像上进行训练和推理,但在将图像分辨率降低到1/41/8后,其分类准确率分别下降了14%30%[16]VGGNetResNet too[16]上也有类似的情况。在目标检测的情况下,SSD1/4分辨率的图像或相当于1/4较小尺寸的目标上受到显著的mAP损失34.1,如文献[11]所描述的那样。事实上,小物体检测是一项非常具有挑战性的任务,因为小物体固有的分辨率较低,而且可供模型学习的背景信息也有限。此外,它们经常(不幸地)与同一图像中的大型目标共存,而大型目标往往会主导特征学习过程,从而使小型目标无法被检测到。

在本文中,我们认为这种性能下降的根源在于现有CNN的一个常见的设计缺陷。也就是说,使用卷积步长和/或池化,特别是在CNN体系结构的早期层中。这种设计的负面影响通常不会表现出来,因为大多数被研究的场景都是和蔼可亲的,图像有良好的分辨率,物体的大小也适中; 因此,存在大量的冗余像素信息,跨跃卷积和池化可以方便地跳过,模型仍然可以很好地学习特征。然而,在图像模糊或物体很小的更困难的任务中,冗余信息的大量假设不再成立,当前的设计开始遭受细粒度信息丢失和学习特征不足的影响。

为了解决这个问题,我们为CNN提出了一个新的构建模块,称为SPD-Conv,完全替代(从而消除)卷积步长和池化层。SPD- conv是一个空间到深度(SPD)层,后面跟着一个无步长卷积层。SPD层对特征映射X进行下采样,但保留了通道维度中的所有信息,因此没有信息丢失。我们受到了图像转换技术[29]的启发,该技术在将原始图像输入神经网络之前将其缩放,但我们基本上将其推广到整个网络内部和整个网络中的下采样特征映射;此外,我们在每个SPD之后添加了一个无步长卷积操作,以在增加的卷积层中使用可学习参数减少(增加的)通道数量。我们提出的方法既通用又统一,因为SPD-Conv (i)可以应用于大多数(如果不是所有)CNN架构,并且(ii)以相同的方式替代卷积步长和池化。综上所述,本文的贡献如下:

  1. 我们在现有的CNN体系结构中发现了一个常见的设计缺陷,并提出了一个名为SPD-Conv的新构建块来代替旧的设计。SPD-Conv下采样不丢失可学习信息,完全摒弃了目前广泛使用的步长卷积和池化操作。
  2. SPD-Conv代表了一种通用和统一的方法,可以很容易地应用于大多数(如果不是所有)基于深度学习的计算机视觉任务。
  3. 利用目标检测和图像分类这两个最具代表性的计算机视觉任务,对SPD-Conv的性能进行了评价。具体而言,我们构建了YOLOv5-SPDResNet18-SPDResNet50-SPD,并在COCO-2017Tiny ImageNetCIFAR-10数据集上对它们进行了评估,并与几种最先进的深度学习模型进行了比较。结果表明,该算法在AP方面有显著提高,并获得了top-1精度,特别是在小物体和低分辨率图像上。如图1所示。
  4. SPD-Conv可以很容易地集成到流行的深度学习库中,如PyTorchTensorFlow,有可能产生更大的影响。我们的源代码可在https://github.com/LabSAINT/SPD-Conv获得。

1:比较AP中的小目标(APS)“SPD”表示我们的方法。

本文的其余部分组织如下。第2节介绍了背景并回顾了相关工作。第3节描述了我们提出的方法,第4节介绍了两个使用目标检测和图像分类的案例研究。第5节提供了性能评估。本文的结论在第6部分。

2 前期工作及相关工作

我们首先提供这个领域的概述,更多地关注目标检测,因为它包含了图像分类。

目前最先进的目标检测模型是基于CNN的,可以分为一级和二级检测器,或基于锚框的或无锚框检测器。两阶段检测器首先生成粗区域提取,然后使用一个head(全连接网络)对每个提取进行分类和细化。相比之下,一级检测器跳过区域提取步骤,直接在密集的位置采样上运行检测。基于锚框的方法使用锚框盒,锚框盒是一个预定义的盒子集合,匹配训练数据中对象的宽度和高度,以提高训练过程中的损失收敛性。我们提供了表1,它对一些众所周知的模型进行了分类。

一般而言,一级检测器比二级检测器速度快,基于锚框的模型比无锚框的模型更精确。因此,在后面的案例研究和实验中,我们更多地关注单级和基于锚框的模型,即表1中的第一个行。一个典型的单阶段目标检测模型如图2所示。它由一个基于CNN的视觉特征提取backbone和一个预测每个包含对象的类别和边界框的检测头组成。在这两者之间,添加一个额外的NECK来组合多个尺度的特征,以产生语义上强的特征,用于检测不同大小的目标。

1:OD模型的分类

2:一级目标检测通道

2.1小目标检测

传统上,检测小物体和大物体都被视为一个多尺度的物体检测问题。一种经典的方法是图像金字塔[3],它将输入图像调整为多个尺度,并为每个尺度训练专用检测器。为了提高精度,提出了SNIP[31],它根据每个探测器中不同的物体大小进行选择性反向传播。SNIPER[32]提高了SNIP的效率,它只处理每个目标实例周围的背景区域,而不是图像金字塔中的每个像素,从而减少了训练时间。采用另一种提高效率的方法,特征金字塔网络FPN[20]在卷积层中利用横向连接将固有的多尺度特征联系在一起,并使用自顶向下的结构将这些特征结合起来。随后引入PANet[22]BiFPN[34],利用较短的路径改善FPN的特征信息流。此外,引入SAN[15]将多尺度特征映射到尺度不变换子空间,使检测器对尺度变化具有更强的鲁棒性。所有这些模型都一致使用卷积步长和最大池化,我们完全摆脱了这一点。

2.2低分辨率图像分类

解决这一挑战的早期尝试之一是[6],它提出了一个端到端CNN模型,在分类之前添加一个超分辨率步骤。随后,[25]提出将从高分辨率训练图像中获得的细粒度知识转移到低分辨率测试图像中。然而,这种方法需要对应于特定应用程序(例如,类)的高分辨率训练图像,而这些图像并不总是可用的。

其他一些研究,如[37],也需要对高分辨率训练图像的同样要求。最近,[33]提出了一个包含属性级可分离性(属性表示细粒度、分层的类标签)的损失函数,以便模型能够学习特定于类的鉴别特征。然而,细粒度(分层)类标签很难获得,因此限制了该方法的采用。

3.一个新的构建模块:SPD-Conv

SPD- conv由一个空间到深度(SPD)层和一个非跨步卷积层组成。本节将对此进行详细描述。

我们的SPD组件推广了一种(原始)图像转换技术[29]来对CNN内部和整个CNN的特征映射进行下采样,如下所示。

考虑任意大小为S × S × C1的中间特征映射X,将子特征映射序列切片为:

一般来说,给定任何(原始)特征映射X,子映射fx,y由所有特征映射组成特征图X(i, j) ,i + xj + y可以被比例整除。因此,每个子图按一个比例因子向下采样X。图3(a)(b)(c)给出了一个例子,当scale = 2时,我们得到四个子映射f0,0,f1,0,f0,1,f1,1,它们的形状为(S/2,S/2,C1)并对X进行2倍的下采样。

接下来,我们沿着通道维度将这些子特征映射连接起来,从而得到一个特征映射X’,它的空间维度减少了一个比例因子,通道维度增加了一个比例因子2  

3:scale = 2SPD-Conv的图解(详见文本)

 

3.2 Non-strided卷积

SPD特征转换层之后,我们添加一个带有C2过滤器的(stride=1)无卷积步长层,其中 C2scale2C1,并进一步进行转换X'Sscale  , Sscale, scale2C1X'' (Sscale  , Sscale, C2)。我们使用无步长卷积的原因是为了尽可能地保留 所有的判别特征信息。否则,例如,使用stride=33 × 3过滤器,特征图将缩小,但每个像素 只采样一次;如果stride=2,将发生非对称采样,其中偶数行/列和奇数行/列将被采样不同的次数。一般来说,大于1的步长会导致信息的非歧视性损失,尽管在表面上,它转换特征映射X'Sscale  , Sscale, scale2C1X'' (Sscale  , Sscale,C2)(但没有X')。

4.如何使用SPD-Conv:案例研究

为了解释如何应用我们提出的方法来重新设计CNN架构,我们使用了两个最具代表性的计算机视觉模型类别:目标检测和图像分类。这几乎没有丧失普遍性,CNN架构使用步长卷积和/或池化操作来下采样特征图。

4.1目标检测

YOLO是一系列非常流行的目标检测模型,其中我们选择最新的YOLOv5[14]进行演示。YOLOv5使用CSPDarknet53[4],其中SPP[12]模块作为骨干,PANet[23]作为neckYOLOv3 head[26]作为检测头。此外,它还使用了各种数据增强方法和YOLOv4 [4]中的一些模块进行性能优化。它采用带sigmoid层的交叉熵损失计算目标性和分类损失,使用CIoU损失函数[38]计算定位损失。CIoU损耗比IoU损耗考虑的细节更多,如边缘重叠、中心距离和宽高比

YOLOv5-SPD.我们将第3节中描述的方法应用到YOLOv5,只需更换YOLOv5 stride-2卷积层即可得到YOLOv5- SPD (4)SPD-Conv构建块取代原有卷积。有7个这样的替换实例,因为YOLOv5在主干中使用5stride-2卷积层对特征图进行25倍的下采样,在neck使用2stride-2卷积层。在YOLOv5 neck中,每一次步长卷积后都有一个连接层;这并没有改变我们的方法,我们只是将其保持在SPDConv之间。

可伸缩性.YOLOv5- SPD可以满足不同的应用程序或硬件需求,以与YOLOv5相同的方式轻松放大和缩小。具体来说,我们可以简单地调整(1)每个无步长卷积层中的滤波器数量和/(2)C3模块的重复次数(如图4所示),得到不同版本的YOLOv5-SPD。第一种方法称为宽度缩放,它将原始宽度nw (通道数量)更改为[nw × width_factor]8  (四舍四入到8的最接近倍数)。第二种被称为深度缩放,它改变了原来的深度nd (重复C3模块的次数,例如,图49 × C3中的9)[nd × depth_factor]。这样,通过选择不同的宽度/深度系数,我们得到了nano, small, medium, 和largeYOLOv5- SPD,如表2所示,其中系数值的选择与YOLOv5相同,以便我们在后面的实验中进行比较。

2:扩展YOLOv5-SPD以获得适合不同案例的不同版本.

3:我们的ResNet18-SPDResNet50-SPD架构.

4.2图像分类

分类CNN通常从一个stem单元开始,该单元由一个stride-2卷积和一个池化层组成,以降低四倍的图像分辨率。一个流行的模型是ResNet[13],它赢得了ILSVRC 2015年的挑战赛。ResNet引入了残差连接,允许训练多达152层的网络。它还通过仅使用单个全连接层显著减少了参数的总数。最后采用softmax层对类预测进行规范化。

ResNet18-SPD ResNet50-SPDResNet-18ResNet-50都使用了总共4stride-2卷积和一个最大池化的stride-2对每个输入图像进行25倍的采样。应用我们提出的构建块,我们用SPD-Conv替换了四个跨步卷积;但另一方面,我们只是删除了最大池化层,因为我们的主要目标是低分辨率的图像,在我们的实验中使用的数据集是相当小的图像(Tiny ImageNet64 × 64,在CIFAR-1032 × 32),因此池化是不必要的。对于较大的图像,这样的最大池化层仍然可以用SPD-Conv以同样的方式替换。这两个新的网络结构如表3所示。

5.实验

本节使用两个代表性的计算机视觉任务(目标检测和图像分类)评估我们提出的SPD-Conv方法。

5.1目标检测

数据集和设置.我们使用COCO-2017数据集[1],它分为train2017(118,287张图像)val2017(5000张图像;也称为minival)用于验证,test2017(40,670张图像)用于测试。我们使用了广泛的最先进的基准模型,如表4和表5所示。我们给出了val2017在不同情况下的平均精度(AP)标准度量IoU阈值[0.5:0.95]和目标大小(小、中、大)。我们还给出了test-dev2017(20288张图片)上的AP指标,它是test2017的一个子集,具有可访问的标签。然而,这些标签并没有公开发布,但需要将所有预测的标签在JSON文件中提交给CodaLab COCO Detection要求[2]检索已计算的指标,我们这样做了。

训练.我们训练不同版本(nano, small, medium, and large)YOLOv5-SPDtrain2017上的所有基准模型。与大多数其他研究不同的是,我们从头开始训练,不使用迁移学习。这是因为我们希望检查每个模型的真正学习能力,而不被从理想(高质量)数据集(ImageNet)的迁移学习继承的丰富特征表示所掩盖。这是在我们自己的模型(-SPD-n/s/m/l)和所有现有的YOLO系列模型(v5, X, v4,以及它们的缩放版本,如nano, small, large)上进行的。其他基准模型仍然使用迁移学习,因为我们缺乏资源(从头开始训练消耗大量GPU时间)。然而,请注意,这仅仅意味着这些基准被置于比我们自己的模型更有利的位置,因为它们受益于高质量的数据集。

我们选择momentum0.937,权值衰减为0.0005SGD优化器。在三个热身阶段,学习率从0.0033线性增加到0.01,随后使用余弦衰减策略降低到最终值0.001nanosmall模型训练在4V-100 32GB GPU上,batch size128medium large训练在batch size32目标和分类损失函数采用CIoU损失[38]和交叉熵损失。我们还采用了几种数据增强技术来减轻过拟合,并提高所有模型的性能;这些技术包括(i)色调、饱和度和值的光度失真,(ii)几何失真,如平移、缩放、剪切、左右翻转fliplr和上下翻转flipup,以及(iii)多图像增强技术,如马赛克和切割混合cutmix。注意,在推断时不使用数据增强。超参数采用YOLOv5,无需重新调优。

 结果4给出了val2017上的结果,表5给出了test-dev上的结果。两个表中的APS, APM, APL指的是小型/中型/大型目标的AP,不应与模型比例(nano, small,medium, large)混淆。两个表中所示的图像分辨率640 × 640在目标检测(与图像分类相反)中并不被认为是高的,因为实际物体上的分辨率要低得多,特别是当目标很小的时候。

4:MS-COCO验证数据集(val2017)的比较.

val2017结果.4按模型比例表示,用水平线分隔(最后一组是大目标检测模型)。在第一类nano模型中,我们的YOLOv5-SPD-nAPAPS性能都是最好:APS比第二YOLOv5n13.15%,整体AP比第二名YOLOv5n10.7%

在第二类small中,我们的YOLOv5-SPD-sAPAPS上的表现都是最好的,尽管这次YOLOX-SAP上是第二好的。

在第三种medium中,虽然我们的YOLOv5-SPD-m仍然优于其他型号,但AP性能非常接近。另一方面,我们的APS比第二名有更大的获胜优势(高出8.6%),这是一个好迹象,因为SPD-Conv对于较小的物体和较低的分辨率尤其有利。

最后,对于large模型,YOLOX-L获得了最好的AP,而我们的YOLOv5-SPD-l仅略低(3%)(但比底部组中的其他基准模型要好得多)。另一方面,我们的APS仍然是最高的,这与SPD-Conv的上述优势相呼应。

5:MS-COCO测试数据集的比较(test-dev2017).

 

test-dev2017结果.如表5所示,我们的YOLOv5-SPD-n再次成为APSnano模型类别的明显赢家,领先YOLOv5n 19%对于平均AP,虽然看起来似乎EfficientDet-D0比我们的表现更好,这是因为EfficientDet的参数几乎是我们的两倍,并且使用高分辨率图像进行训练(通过转移学习,如单元中的“Trf”所示)AP值与分辨率高度相关。这种训练的好处也同样反映在小模型类别中。

尽管其他基准模型获得了这种好处,但我们的方法在下一个类别中,即在APAPS上的中型模型中重新获得了最高排名。最后,在large类别中,我们YOLOv5-SPD-l APS也是性能最好的,在AP上的YOLOX-L非常接近。

总结.很明显,通过简单地用我们提出的SPD-Conv构建块替换卷积步长和池化层,神经网络可以显著提高其精度,同时保持相同的参数大小水平。当目标很小时,这种改进更加突出,这很好地满足了我们的目标。尽管我们并不是在所有情况下都能够占据第一名的位置,但SPD-Conv是唯一能够始终保持良好表现的方法;如果不是表现最好的话,它只是偶尔会成为(非常接近的)亚军,而在我们的主要目标指标APS上,它总是赢家。

最后,回想一下,我们采用了YOLOv5超参数而没有进行返回调优,这意味着我们的模型在进行专门的超参数调优后可能会表现得更好。还记得所有非YOLO基准模型(PP-YOLO)使用迁移学习进行训练,因此受益于高质量的图像,而我们的没有。

视觉对比。为了视觉和直观的理解,我们使用随机选择的两幅图像提供了两个真实的例子,如图5所示。我们比较YOLOv5-SPD-mYOLOv5m,因为后者是相应(中等)类别中所有基准模型中性能最好的。图5(a)(b)表明YOLOv5-SPD-m能够检测到被遮挡的长颈鹿,YOLOv5m没有检测到,图5(c)(d)显示YOLOv5-SPD-m检测到非常小的目标(一张脸和两个长凳),而YOLOv5m检测不到。

图5:val2017的目标检测示例。蓝框表示ground truth。红色箭头强调了差异。

5.2图像分类

数据集和设置。对于图像分类任务,我们使用了Tiny ImageNet[19]CIFAR-10数据集[17]Tiny ImageNet是一个ILSVRC-2012分类数据集子集,包含200个类。每个类都有500张训练图,50张验证图,50张测试图。每张图片的分辨率为64×64×3像素。CIFAR-10包含6万张分辨率32 × 32 × 3的图像,包括5万张训练图像和1万张测试图像。有10个类,每个类有6000张图片。我们使用准确率第一作为评价分类性能的指标。

训练。我们在Tiny ImageNet上训练ReseNet18-SPD模型。我们执行随机网格搜索来优化超参数,包括学习率、批大小、动量、优化器和权值衰减。图6展示了使用wandb MLOPs生成的样本超参数扫描图。结果是选择SGD优化器,学习率为0.01793,动量为0.9447,最小批大小为256,权值衰减正则化为0.002113,训练轮次为200。接下来,我们CIFAR-10上训练我们的ResNet50-SPD模型。超参数采用ResNet50论文中的超参数,其中SGD优化器的初始学习率为0.1,动量为0.9,批大小为128,权值衰减正则化0.0001,训练轮次为200。对于ReseNet18-SPDReseNet50-SPD,我们使用与ResNet中相同的衰减函数,随着epoch数的增加而降低学习率。

6:图像分类中的超参数调节:使用wandb的扫描图。

测试Tiny ImageNet上的准确性是在验证数据集上评估的,因为测试数据集中的基本ground truth是不可用的。在测试数据集上计算CIFAR-10的精度。

结果。表6总结了top-1精度的结果。结果表明,我们的模型ResNet18-SPDResNet50-SPD明显优于所有其他基准模型。

最后,我们在图7中提供了一个使用Tiny ImageNet的可视化插图。给出了8个被ResNet18错误分类和被ResNet18-SPD正确分类的例子这些图像的共同特征是分辨率较低,因此对标准ResNet提出了挑战,后者在卷积步长和池化操作中丢失了细粒度信息。

 

6:图像分类性能比较

7:绿色标签:ground truth。蓝色标签:ResNet18-SPD预测。红色标签:ResNet-18预测

6.结论

本文指出了现有CNN体系结构中一个常见但有缺陷的设计,即使用卷积步长和/或池化层。这将导致细粒度特征信息的丢失,特别是在低分辨率图像和小物体上。然后,我们提出了一个名为SPD-Conv的新的CNN构建块,它完全消除了步长和池化操作,取而代之的是一个空间到深度卷积和一个无步长卷积。这种新设计在保留判别特征信息的同时,具有向下采样特征图的优点。它还代表了一种通用的统一方法,可以很容易地应用于任何CNN体系结构,也可以以同样的方式应用于跨步转换和池。我们提供了两个最具代表性的用例,目标检测和图像分类,并通过广泛的评估证明SPD-Conv在检测和分类精度方面带来了显著的性能改进。我们预计它将广泛惠及研究社区,因为它可以很容易地集成到现有的深度学习框架中,如PyTorch和TensorFlow。

百度网盘链接:

链接:https://pan.baidu.com/s/1-YnmEU6d_x0N7S1xspUFeA 
提取码:yyds

来源地址:https://blog.csdn.net/weixin_53660567/article/details/127184416

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

无卷积步长或池化:用于低分辨率图像和小物体的新 CNN 模块SPD-Conv

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录