热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

YOLO9000:Better,Faster,Stronger1论文学习

Abstract我们介绍了YOLO9000,一个最先进的实时目标检测系统,可以检测超过9000个对象类别。首先,我们提出了对YOLO检测方法的各种改进,既有新颖之处,也有借鉴之处。

Abstract 

我们介绍了YOLO9000,一个最先进的实时目标检测系统,可以检测超过9000个对象类别。首先,我们提出了对YOLO检测方法的各种改进,既有新颖之处,也有借鉴之处。改进后的YOLOv2模型在PASCAL VOC和COCO等标准检测任务上是最先进的。使用一种新颖的多尺度训练方法,YOLOv2模型可以以不同的大小运行,在速度和准确性之间提供了一个简单的权衡。在67fps速度下, YOLOv2在VOC 2007得到76.8 mAP。在40帧/秒的速度下,YOLOv2获得了78.6 mAP,超过了最先进的方法,如使用ResNet和SSD的Faster RCNN,但仍然运行得非常快。最后提出了一种联合训练目标检测和分类的方法。利用该方法,我们同时对YOLO9000进行了COCO检测数据集和ImageNet分类数据集的训练。我们的联合训练使YOLO9000能够预测没有标记检测数据的目标类的检测。我们在ImageNet检测任务上验证了我们的方法。YOLO9000得到了ImageNet检测验证集上19.7 mAP的结果,尽管它只有200个类中的44个的检测数据。在156个非COCO类中,YOLO9000获得了16.0 mAP的结果。但是YOLO可以检测超过200个类;它预测了9000多种不同物体类别的探测。它仍然是实时运行的。



 


1. Introduction 


通用目标检测应该快速、准确,并且能够识别各种各样的对象。随着神经网络的引入,检测框架变得越来越快速和准确。然而,大多数检测方法仍然局限于一小部分对象。
与其他任务(如分类和标记)的数据集相比,当前的目标检测数据集是有限的。最常见的检测数据集包含成千上万的图像和几十到几百个标签[3][10][2]。分类数据集拥有数以百万计的图像,其中有成千上万的类别[20][2]。
我们希望检测的规模能到目标分类的水平。但是,标记用于检测的图像要比标记用于分类或标签的图像要昂贵得多(标签通常由用户免费提供)。因此,在不久的将来,我们不太可能看到与分类数据集规模相同的检测数据集。
我们提出了一种新的方法来利用我们已经拥有的大量分类数据,并利用它来扩展当前检测系统的范围。我们的方法使用对象分类的层次视图,允许我们将不同的数据集组合在一起。



我们还提出了一个联合训练算法,使我们能够在检测和分类数据上训练目标检测器。我们的方法利用标记检测图像来学习精确定位目标,同时使用分类图像来增加其词汇量和鲁棒性。
使用这种方法,我们训练了YOLO9000,一种可以检测9000多种不同对象类别的实时目标探测器。首先,我们在YOLO检测系统的基础上进行了改进,生成了YOLOv2,一种最先进的实时检测器。然后利用数据集组合方法和联合训练算法对来自ImageNet的9000多个类和来自COCO的检测数据进行模型训练。
我们所有的代码和预先训练的模型都可以在http://pjreddie.com/yolo9000/.网上找到



 


2. Better


与最先进的检测系统相比,YOLO有很多缺点。YOLO与Fast R-CNN的错误分析表明,YOLO有大量的定位错误。可见YOLO的图:

技术分享图片

此外,与基于区域建议的方法相比,YOLO的召回率相对较低

因此,我们的重点是提高召回和定位,同时保持分类的准确性。


计算机视觉通常趋向于更大、更深的网络[6][18][17]。更好的性能通常取决于训练更大的网络或将多个模型集成在一起。但是,对于YOLOv2,我们需要一个更精确的、速度更快的探测器。我们不是扩展我们的网络,而是简化网络,然后使表示更容易学习。为了提高YOLO的表现,我们从过去的工作中收集各种想法,并结合我们自己的新理念。结果摘要见表2:

技术分享图片

Batch Normalization. 批处理规范化在收敛性方面有显著的改进,同时消除了对其他形式的正则化[7]的需要。通过在YOLO中所有的卷积层上添加批量归一化,我们得到了超过2%的mAP改进。批处理规范化还有助于对模型进行规范化。通过批量归一化,我们可以在不进行过拟合的情况下从模型中删除dropout。
High Resolution Classifier. 所有最先进的检测方法都使用在ImageNet[16]上预先训练的分类器。从AlexNet开始,大多数分类器对小于256×256[8]的输入图像进行操作。原始的YOLO以224×224训练分类器网络,然后再将将检测分辨率提高到448。这意味着网络必须同时切换到学习对象检测并调整到新的输入分辨,这样不好,更改如下:
对于YOLOv2,我们首先在ImageNet上以448×448的分辨率对分类网络进行10个epoch的微调。这就给了网络时间来调整它的过滤器,以便在更高分辨率的输入上更好地工作。然后在检测时对结果网络进行微调。这个高分辨率的分类网络使我们的mAP增加了近4%。



Convolutional With Anchor Boxes. YOLO直接使用卷积特征提取器上的全连接层来预测边界框的坐标。代替直接预测坐标,Faster R-CNN使用手工挑选的先验[15]来预测边界框。在Faster R-CNN中,区域建议网络(RPN)仅使用卷积层预测anchor boxes的偏移量和置信度。由于预测层是卷积的,RPN在特征图的每个位置预测这些偏移量。预测偏移量而不是坐标简化了问题,使网络更容易学习。
我们从YOLO中移除全连接层,并使用anchor boxes来预测边界框。首先,我们消除一个池化层,使网络的卷积层的输出具有更高的分辨率。我们还缩小了网络操作的输入图像为416,而不是448×448。我们这样做是因为我们想要在我们的feature map中有奇数个位置,这样就只有一个中心单元格。物体,尤其是大的物体,往往占据图像的中心,所以最好在中心有一个单独的位置来预测这些物体,而不是四个位置都在附近。YOLO的卷积层将图像采样率降低了32倍,因此通过使用416大小的输入图像,我们得到了13×13的输出特征图。
当我们移动到anchor boxes时,我们也将类预测机制与空间位置解耦,取而代之的是为每个anchor boxes预测类和对象。遵循YOLO,对象预测仍然预测真实框和所提议的框之间的IOU,而类预测则预测给定一个对象的类的条件概率。
使用anchor boxes,我们得到一个小的准确性下降。YOLO只预测了每幅图像的98个框,而我们的模型预测了1000多个。如果没有anchor boxes,我们的中间模型将得到召回率为81%的69.5 mAP
。使用anchor boxes,我们的模型获得了69.2 mAP,召回率为88%。即使mAP减少了,召回率的增加意味着我们的模型有更多的改进空间。

Dimension Clusters. 在与YOLO一起使用anchor boxes时,我们会遇到两个问题。首先,框的尺寸是手工挑选的。网络可以学会适当地调整方框,但如果我们为网络选择更好的先验,我们可以使网络更容易学会预测良好的检测。
我们不是手工选择先验,而是在训练集的边界框上运行k-means集群来自动找到好的先验。如果我们使用标准的k-均值和欧几里得距离,较大的盒子比较小的盒子产生更多的误差。然而,我们真正想要的是导致良好的IOU分数的先验,这是独立于框的大小的。因此,对于我们的距离度量,我们使用:

技术分享图片

 

我们对不同的k值运行k-means,并用最接近的质心绘制平均IOU,见图2:

技术分享图片

我们选择k = 5作为模型复杂度和高召回率之间的折衷。集群质心与手动选择的anchor boxes有显著不同。框中少数是短宽的,更多是的高薄的。

将我们的集群策略得到的最近先验和手动选择的anchor boxes的平均IOU进行比较,如表1:

技术分享图片

在只有5个先验时,质心的表现与9个anchor boxes相似,平均IOU为61.0和60.9。如果我们使用9个质心,我们会看到一个更高的平均IOU。这表明,使用k-means来生成我们的边界框(用来确定框的尺寸)将使模型具有更好的表示,并使任务更容易学习。

Direct location prediction.在使用YOLO的anchor boxes时,我们会遇到第二个问题:模型不稳定,特别是在早期迭代期间。大多数不稳定性来自于对框(x, y)位置的预测。在区域建议网络中,网络预测tx和ty值,(x, y)中心坐标计算为:

技术分享图片

例如,tx = 1的预测将使框向右移动相当于anchor boxes的宽度的长度,tx = -1的预测将使框向左移动相同的宽度。
这个公式是不受约束的,所以任何anchor boxes都可以在图像中的任意点结束,不管预测的anchor boxes的位置是什么。在随机初始化的情况下,模型需要很长时间才能稳定地预测出合理的偏移量。
代替预测偏移量,我们采用YOLO方法,预测相对于网格单元位置的位置坐标。这将真实框值限定在0和1之间。我们使用逻辑激活函数来限制网络的预测落在这个范围内。
在输出特征图中,网络预测每个单元的5个边界框。该网络预测每个边界框的5个坐标,分别是tx、ty、tw、th和to。如果单元格从图像左上角偏移(cx, cy),边界框先验有宽度和高度pw, ph,则预测对应:

技术分享图片

 

技术分享图片

由于我们对位置预测进行了约束,使得参数化更容易学习,使网络更加稳定。与使用anchor boxes的版本相比,使用维度集群和直接预测边界框中心位置可以将YOLO提高近5%。

Fine-Grained Features. 这种改进的YOLO可以在13×13大小的特征图上进行检测。虽然这对于大型对象来说已经足够了,但它可能会受益于用于定位较小对象的细粒度特性。Faster R-CNN和SSD都在网络的不同特征图上运行它们的proposal 网络,以获得一系列的分辨率。我们采取了一种不同的方法,简单地添加一个传递层,带来先前层26×26的分辨率的特性。
传递层通过将相邻的特征叠加到不同的通道而不是空间位置来将高分辨率的特征与低分辨率的特征连接起来,类似于ResNet中的identity映射。将26×26×512的特性图转换为13×13×2048的特征图,并与原有的13*13的特征图进行拼接。我们的检测器运行在这个扩展的功能映射之上,因此它可以访问细粒度的功能。这带来了1%的性能提升。

Multi-Scale Training. 原始的YOLO使用448×448的输入分辨率。通过加上anchor boxes,我们将分辨率改为416×416。但是,由于我们的模型只使用了卷积和池化层,所以它可以动态调整大小(没使用全连接层,不限制输入图像大小)。我们希望YOLOv2能够健壮地运行在不同大小的图像上,因此我们将其训练到模型中。
我们每隔几次迭代就改变网络,而不是固定输入图像的大小。我们的网络每10批随机选择一个新的图像尺寸大小。由于我们的模型下降了32倍,我们从以下32的倍数中提取图像大小:{320,352,…608}。因此最小的选择是320×320,最大的选择是608×608。我们将网络调整到那个维度并继续训练。
这种机制迫使网络学会在各种输入维度上进行良好的预测。这意味着同一个网络可以预测不同分辨率的检测。网络在较小的尺寸下运行得更快,因此YOLOv2在速度和准确性之间获得了一个简单的权衡。
在低分辨率下,YOLOv2是一种廉价、相当精确的探测器。在288×288,它运行在超过90 FPS的速度时,mAP几乎与Fast R-CNN一样。这使得它成为更小的gpu,高帧率视频,或多个视频流的理想选择。
高分辨率的YOLOv2是一个在VOC 2007中获得mAP为78.6的最先进的探测器,并且仍然运行高于实时速度。YOLOv2与其他框架在VOC 2007上的比较见表3和图4:

技术分享图片

 

技术分享图片

Further Experiments. 我们训练YOLOv2检测VOC 2012。表4显示了YOLOv2与其他最先进的检测系统的性能对比。YOLOv2实现了73.4 mAP,但运行速度远远快于竞争对手的方法:

技术分享图片

我们还对COCO进行了训练,并与表5中的其他方法进行了比较。在VOC度量(IOU = .5)上,YOLOv2得到44.0 mAP,可与SSD和FasterR-CNN相比。

技术分享图片

 


3. Faster 

我们希望检测是准确的,但我们也希望它是快速的。大多数探测应用,如机器人或自动驾驶汽车,都依赖于低延迟预测。为了使性能最大化,我们设计了YOLOv2。
大多数检测框架依赖于VGG-16作为基本的特征提取器[17]。VGG-16是一个强大的、精确的分类网络,但是它过于复杂。VGG-16的卷积层需要在一张224×224分辨率的图像上进行306.9亿个浮点运算。
YOLO框架使用基于Googlenet架构[19]的自定义网络。这个网络比VGG-16要快,只使用了85.2亿个向前传递操作。然而,它的准确性略低于VGG-16。对于single-crop,计算在224×224图像上的top-5精度,YOLO的自定义模型在ImageNet获得了88.0%的精度,而VGG-16的精度为90.0%。

Darknet-19。提出了一种新的分类模型作为YOLOv2的基础。我们的模型建立在网络设计的前期工作和该领域的常识基础上。与VGG模型类似,我们主要使用3×3的过滤器,并在每个池化步骤[17]后加倍通道数。在网络中的网络(NIN)工作的基础上,我们使用全局平均池进行预测,并使用1×1过滤器压缩3×3卷积[9]之间的特征表示。我们使用批处理规范化来稳定训练,加速收敛,并对模型[7]进行正则化。
我们最后的模型,叫做Darknet-19,有19个卷积层和5个maxpooling层。完整的描述见表6:

技术分享图片

Darknet-19只需要55.8亿次操作来处理一幅图像,但在ImageNet上却达到了72.9%的top-1精度和91.2%的top-5精度。
Training for classification. 我们在标准ImageNet 1000类分类数据集上对网络进行160个epochs的训练,使用的是初始学习率为0.1的随机梯度下降法、4倍的多项式率衰减法、0.0005的权值衰减和0.9的动量衰减,使用的是Darknet神经网络框架[13]。在训练中,我们使用标准的数据增强技巧,包括随机的裁剪、旋转、色相、饱和度和曝光变化。
如上所述,在我们最初的224×224图像训练之后,我们将网络调整到更大的尺寸448。对于这种微调,我们使用上面的参数进行训练,但只训练10个epoch,并以10-3的学习率开始。在这种高分辨率下,我们的网络达到了最高的精确度
正确率为76.5%,top-5正确率为93.3%。

Training for detection. 我们对这个网络进行了修改,去掉了最后一个卷积层,增加了3个3×3个卷积层,每个层有1024个滤波器,且每一层后面都接一个1×1个卷积层,每个卷积层有我们检测需要的输出。对于VOC,我们预测5个框,每个框有5个坐标,每个框对应20个等级,所以有125(=5*5+5*20)个过滤器。我们还增加了一个从最后的3×3×512层到第二个到最后一个卷积层的传递层,这样我们的模型可以使用细粒度的特征。
我们以10-3的起始学习率对网络进行160个epoch的训练,并在60和90个epoch时将其除以10。我们使用的权重衰减为0.0005,动量为0.9。我们使用了与YOLO和SSD相似的数据扩展,包括随机裁剪、颜色变化等。我们对COCO和VOC采用相同的训练策略。

所以这个模型到底是什么样的,看代码?????

 


4. Stronger

提出了一种分类与检测数据联合训练的机制。我们的方法使用标记检测的图像来学习检测特定的信息,如边界框坐标预测和对象,以及如何对常见对象进行分类。它使用只有类标签的图像来扩展它可以检测的类别数量。
在训练中,我们混合来自检测和分类数据集的图像。当我们的网络看到用于检测的标记图像时,我们可以基于完整的YOLOv2损失函数进行反向传播。当它看到一个分类图像时,我们只从体系结构的特定分类部分反向传播损失。
这种方法提出了一些挑战。检测数据集只有通用对象和通用标签,如“dog”或“boat”。分类数据集有更广泛和更深的标签范围。ImageNet有一百多种狗,包括“Norfolk terrier”、“Yorkshire terrier”和“Bedlington terrier”。如果我们想训练这两个数据集,我们需要一个连贯的方式来合并这些标签。
大多数分类方法都使用一个跨所有可能类别的softmax层来计算最终的概率分布。使用softmax假设这些类是互斥的。这为组合数据集带来了问题,例如,您不希望使用此模型组合ImageNet和COCO,因为“Norfolk terrier”和“dog”类不是互斥的。
相反,我们可以使用一个多标签模型来组合数据集,而不是假设互斥。这种方法忽略了我们所知道的关于数据的所有结构,例如,所有的COCO类都是互斥的。

Hierarchical classification. ImageNet标签取自WordNet,这是一个语言数据库,用于构造概念及其与[12]的关系。在WordNet中,“Norfolk terrier”和“Yorkshire terrier”都是“terrier”的下义词,“terrier”是“猎狗”的一种,“猎狗”是“dog”的一种,“犬科动物”等等。大多数分类方法都采用标签的扁平化结构,但对于组合数据集来说,这种结构正是我们所需要的。
WordNet的结构是一个有向图,而不是一棵树,因为语言是复杂的。例如,“dog”既是“canine”的一种,也是“domestic animal”的一种,两者在WordNet中都是同步的。我们没有使用完整的图结构,而是通过从ImageNet中的概念构建层次树来简化问题。
为了构建这棵树,我们检查了ImageNet中的可视名词,并查看它们通过WordNet图到根节点(在本例中为“physical object”)的路径。许多synset在图中只有一条路径,因此首先我们将所有这些路径添加到树中。然后我们迭代地检查剩下的概念,并尽可能少地增长树地去添加路径。所以如果一个概念有两条到根的路径,其中一条路径会给树增加三条边,而另一条只会增加一条边,那我们就选择较短的(只增加一条边的)路径。
最后的结果是WordTree,一个视觉概念的层次模型。为了使用WordTree进行分类,我们预测每个节点的条件概率,即给定该synset的每个次元的概率。例如,在“terrier”节点,我们预测:

技术分享图片

 

如果我们想计算某个特定节点的绝对概率,只需沿着树的路径到达根节点,然后乘以条件概率。因此,如果我们想知道一张照片是否是Norfolk terrier,我们计算:

技术分享图片

为了分类,我们假设图像包含一个对象:Pr(physical object)= 1。
为了验证这种方法,我们在使用1000类ImageNet构建的WordTree上训练了Darknet-19模型。为了构建WordTree1k,我们添加了所有中间节点,将标签空间从1000扩展到1369。在训练过程中,我们在树上传播真实值标签,这样,如果一个图像被标记为“Norfolk terrier”,它也会被标记为“dog”和“mammal”,等等。为了计算条件概率,我们的模型预测了一个值为1369的向量,并计算了所有sysnset上的softmax,这些sysnset都是相同概念的次元,参见图5:

技术分享图片

使用与之前相同的训练参数,我们的分级Darknet-19达到了71.9%的top-1精度和90.4%的top-5精度。尽管增加了369个额外的概念,并让我们的网络预测树形结构,我们的准确性只是略有下降。以这种方式执行分类也有一些好处。在新的或未知的对象类别上,性能会优雅地下降。例如,如果网络看到一张狗的图片,但不确定它是什么类型的狗,它仍然会有很高的置信度预测“狗”,但有较低的置信度分散在上下词之间。
这种配公式也适用于检测。现在,我们不再假设每个图像都有一个对象,而是使用YOLOv2的对象预测器来给出Pr(physical object)的值(即不再假设Pr(physical object)=1)。探测器预测一个边界框和概率树。我们沿着树向下遍历,在每一个分界处取最高的置信路径,直到达到某个阈值,然后预测该对象类

Dataset combination with WordTree. 我们可以使用WordTree以一种合理的方式将多个数据集组合在一起。我们只需将数据集中的类别映射到树中的synsets。图6显示了一个使用WordTree合并来自ImageNet和COCO的标签的示例。WordNet是非常多样化的,所以我们可以使用这种技术与大多数数据集:

技术分享图片

Joint classification and detection. 现在我们可以使用WordTree组合数据集,我们可以训练我们的联合模型进行分类和检测。我们想要训练一个超大规模的探测器,所以我们使用COCO检测数据集和来自完整ImageNet版本的top 9000类来创建我们的组合数据集。我们还需要评估我们的方法,因此我们添加了来自ImageNet检测挑战的任何类,这些类还没有包括在内。这个数据集对应的WordTree有9418个类。ImageNet是一个更大的数据集,所以我们通过对COCO进行过采样来平衡数据集,因此ImageNet与COCO数据的比例为4:1。
我们使用这个数据集来训练YOLO9000。我们使用基本的YOLOv2架构,但是只有3个先验(框的尺寸)而不是5个先验来限制输出大小。当我们的网络看到检测图像时,我们正常地反向传播损失。对于分类损失,我们只后向传播损失到标签对应的水平或以上。例如,如果标签是“dog”,我们会把任何错误分配给树更向下的预测,如“German Shepherd”和“Golden Retriever”,因为我们没有这些信息。

当它看到一个分类图像时,我们只是反向传播分类损失。要做到这一点,我们只需找到预测类的最高概率的边界框,然后计算其预测树的损失。我们还假设,预测框与真实框标签至少有0.3 IOU的重叠,并基于此假设反向传播对象损失。
通过这种联合训练,YOLO9000学会使用从COCO中的检测数据在图像中找到目标,并使用ImageNet中的数据对各种目标进行分类。
我们评估了YOLO9000在ImageNet检测任务中的作用。ImageNet的检测任务与COCO共享44个对象类别,这意味着YOLO9000只看到大部分测试图像的分类数据,而没有检测数据。YOLO9000总共得到19.7 mAP,其中16.0 mAP是它从未见过任何标记检测数据的156个独立对象类。这个mAP比DPM得到的结果要高,但是YOLO9000是在不同的数据集上训练的,只有部分监督[4]。它还同时检测9000个其他对象类别,所有都是实时的。
当我们分析YOLO9000在ImageNet上的表现时,我们看到它能很好地学习新的动物物种,但在学习衣服和装备等类别时却很吃力。新的动物更容易学习,因为对象预测很好的概括了在COCO中的动物。相反,COCO没有任何服装类型的的边框标签,只有人的边框标签,所以YOLO9000很难模仿“太阳镜”或“泳裤”等类别。

技术分享图片

 

 


5. Conclusion 

我们介绍YOLOv2和YOLO9000这两个实时检测系统。YOLOv2是最先进的,相比其他检测系统,其在各种检测数据集中是更快的。此外,它可以运行在各种图像大小,以提供一个平稳的权衡速度和准确性。

YOLO9000是一个通过联合优化检测和分类来检测9000多个目标类别的实时框架。我们使用WordTree来组合来自不同来源的数据,同时使用我们的联合优化技术在ImageNet和COCO上进行训练。YOLO9000是缩小检测和分类之间数据集大小差距的有力一步
我们的许多技术可以推广到对象检测之外。ImageNet的WordTree表示为图像分类提供了更丰富、更详细的输出空间。使用层次分类的数据集组合在分类和分割领域将是有用的。像多尺度训练这样的训练技术可以为各种视觉任务提供帮助。
对于未来的工作,我们希望使用类似的技术来进行弱监督图像分割。我们还计划使用更强大的匹配策略来改进检测结果,以便在训练期间为分类数据分配弱标签。计算机视觉拥有大量的标记数据。我们将继续寻找将不同的数据来源和结构结合在一起的方法,从而构建更强大的可视化世界模型。

 

 



推荐阅读
  • 网络流24题——试题库问题
    题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • Awk是一款功能强大的文本分析与处理工具,尤其在数据解析和报告生成方面表现突出。它通过读取由换行符分隔的记录,并按照指定的字段分隔符来划分和处理这些记录,从而实现复杂的数据操作。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 本文探讨了使用普通生成函数和指数生成函数解决组合与排列问题的方法,特别是在处理特定路径计数问题时的应用。文章通过详细分析和代码实现,展示了如何高效地计算在给定条件下不相邻相同元素的排列数量。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 本文探讨了一种常见的C++面试题目——实现自己的String类。通过此过程,不仅能够检验开发者对C++基础知识的掌握程度,还能加深对其高级特性的理解。文章详细介绍了如何实现基本的功能,如构造函数、析构函数、拷贝构造函数及赋值运算符重载等。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • [附源码]计算机毕业设计JAVAjsp医药管理信息系统
    [附源码]计算机毕业设计JAVAjsp医药管理信息系统项目运行环境配置:Jdk1.8Tomcat7.0MysqlHBuilderX(Webstor ... [详细]
  • 3DSMAX制作超现实的体育馆模型
    这篇教程是向脚本之家的朋友介绍3DSMAX制作超现实的体育馆模型方法,教程制作出来的体育馆模型非常地不错,不过教程有点难度,需要有一定基础的朋友学习,推荐到脚本之家,喜欢的朋友可 ... [详细]
  • 本文介绍了如何在AngularJS应用中使用ng-repeat指令创建可单独点击选中的列表项,并详细描述了实现这一功能的具体步骤和代码示例。 ... [详细]
  • 在项目冲刺的最后一天,团队专注于软件用户界面的细节优化,包括调整控件布局和字体设置,以确保界面的简洁性和用户友好性。 ... [详细]
  • JavaScript 页面卸载事件详解 (onunload)
    当用户从页面离开时(如关闭页面或刷新页面),会触发 onunload 事件,此时可以执行预设的脚本。需要注意的是,不同的浏览器对 onunload 事件的支持程度可能有所不同。 ... [详细]
  • 默认情况下,Git 使用 Nano 编辑器进行提交信息的编辑,但如果您更喜欢使用 Vim,可以通过简单的配置更改来实现这一变化。本文将指导您如何通过修改全局配置文件来设置 Vim 作为默认的 Git 提交编辑器。 ... [详细]
author-avatar
大佬銘銘銘銘銘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有