创新特征金字塔融合,ResNeXt引领YOLOv5高效率目标检测

news2024/11/27 13:48:37

在这里插入图片描述

目录

    • 一、介绍
      • 1、YOLOv5简介
      • 2、ResNeXt简介
      • 3、目标检测简介
    • 二、YOLOv5及其局限性
      • 1、YOLOv5的架构与原理
      • 2、YOLOv5的优势
      • 3、YOLOv5的局限性
    • 三、ResNeXt与特征金字塔融合
      • 1、ResNeXt的基本原理
      • 2、ResNeXt的优势
      • 3、特征金字塔的基本原理
      • 4、特征金字塔的优势
      • 5、ResNeXt与特征金字塔的融合
    • 四、创新特征金字塔融合的实现
      • 1、数据准备
      • 2、YOLOv5代码结构概述
      • 3、特征金字塔融合的具体实现
    • 五、实验与结果
      • 1、实验设置
      • 2、实验结果分析

大家好,我是哪吒。

🏆本文收录于,目标检测YOLO改进指南。

本专栏均为全网独家首发,🚀内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。

一、介绍

1、YOLOv5简介

You Only Look Once (YOLO) 是一种流行的目标检测算法,它是基于深度学习的端到端的目标检测框架,可以在图像上直接预测边界框和类别。

与其前几个版本相比,YOLOv5增加了许多改进:首先,采用了新的backbone网络架构,即CSPNet,可以更好的提取图像特征;其次,YOLOv5在模型训练中采用了自适应精度加速训练(AutoML)、类别平衡滤波器(CBF)等技术,可以有效提高模型性能和训练效率。

2、ResNeXt简介

ResNeXt是ResNet的进一步改进版,它采用了多分支的卷积操作架构,并且使用拼接的方式将多个分支的输出联合在一起,从而提高网络的表达能力。ResNeXt相对于ResNet在图片识别领域有着更好的表现。

3、目标检测简介

目标检测是计算机视觉中的一个重要任务,其目的是在图片或视频中进行物体识别和定位。常见的目标检测方法包括传统的基于人工特征的方法和基于深度学习的方法。基于深度学习的目标检测方法在近年来获得了广泛应用,其中YOLOv5就是其中的代表之一。

二、YOLOv5及其局限性

1、YOLOv5的架构与原理

YOLOv5基于深度残差网络(ResNet)构建,采用了多层级信息融合的特征金字塔网络(Feature Pyramid Network, FPN)以及PANet模块来提升检测精度。其原理是将输入图像通过卷积神经网络提取特征,然后利用anchor框来预测物体的位置和类别。

2、YOLOv5的优势

YOLOv5在目标检测领域有着非常出色的表现,它具有以下几个优势:

  • 高速度:YOLOv5的推理速度非常快,可以达到实时检测的要求。
  • 高准确率:相比于之前的版本,YOLOv5的准确率有了很大的提高。
  • 简单易用:YOLOv5对于新手来说容易上手,并且支持各种不同的应用场景。

3、YOLOv5的局限性

虽然YOLOv5在速度和准确率方面都有着非常优秀的表现,但是也存在一定的局限性:

  • 对小目标检测不够敏感:由于使用的anchor框较大,因此对于小目标的检测不够敏感。
  • 对密集目标检测不够强:由于采用的NMS算法会剔除掉过于靠近的目标框,因此对密集目标检测不够强。
  • 对目标形状要求较高:由于使用的anchor框是固定形状的,因此对于非规则形状的目标检测效果不佳。

三、ResNeXt与特征金字塔融合

1、ResNeXt的基本原理

ResNeXt是ResNet的进一步拓展版本,它采用了多分支卷积操作的架构,并通过拼接的方式将多个分支的输出联合在一起,从而提高网络的表达能力。ResNeXt使用“group convolution”来增加网络深度和宽度,可以更好地学习不同尺度和类型的特征。

ResNet中使用的残差块可以有效地解决梯度消失和梯度爆炸问题,使得网络能够训练到更深的层数,但是其网络结构相对简单,无法充分利用并行计算的优势,因此有限制的提高网络深度和宽度。ResNeXt则采用了多分支卷积操作,将输入按通道数划分为若干组,在每组内进行卷积操作,然后将各个组的输出进行拼接,从而形成更具表达能力的模型结构。

在这里插入图片描述

具体来说,假设输入张量的通道数为C,分为G组,每组的通道数为c=C/G,则多分支卷积操作可以表示为:

在这里插入图片描述

其中,Convc,k表示卷积核大小为k×k*,通道数为c*的卷积操作。最后通过Concat将各个组的输出进行拼接,得到多分支卷积的输出。

ResNeXt的主要优势在于它具有更好的表达能力和泛化性能。由于采用了多分支卷积操作,可以更好地学习不同尺度和类型的特征,从而提高网络的表达能力。同时,由于网络结构更加复杂,可以充分利用并行计算的优势,提高网络的泛化性能。

2、ResNeXt的优势

相比于ResNet,ResNeXt的优势在于它具有更好的表达能力和更好的泛化性能,能够更好地适应不同的数据分布和任务需求。由于采用了多分支卷积操作,可以更好地学习不同尺度和类型的特征,从而提高网络的表达能力。同时,由于网络结构更加复杂,可以充分利用并行计算的优势,提高网络的泛化性能。此外,ResNeXt还能在保持模型深度和参数量相对较小的情况下,进一步提高网络精度。

3、特征金字塔的基本原理

特征金字塔网络(Feature Pyramid Network, FPN)是一种用于解决目标检测中尺度变化问题的方法。其基本思想是通过跨层连接将不同层级的特征图进行融合,从而实现多尺度的物体检测。

在传统的目标检测算法中,由于深层特征图具有较小的感受野和较高的语义信息,因此难以捕捉到小尺度物体的信息。为了解决这个问题,FPN提出了一种跨层特征融合的方法,将深层特征图与浅层特征图进行融合,从而得到更具有多尺度特性的特征图。

具体来说,FPN采用自下而上的方式构建特征金字塔,首先通过在深层网络中使用池化或卷积操作对输入图像进行下采样,得到不同尺度的特征图。然后通过上采样和跨层连接的方式将不同尺度的特征图进行融合,得到具有多尺度信息的特征金字塔。

具体来说,假设原始输入图像大小为W×H,FPN网络包括N个特征层,第i个特征层的大小为w i×h i,则特征金字塔可以表示为:

在这里插入图片描述

Ci表示来自深层网络的第i个特征图,**Pi表示特征金字塔的第i*个层级输出。

FPN的核心是跨层连接和上采样操作。具体来说,对于每个特征层,需要进行以下两个操作:

  • 上采样:将当前特征层的大小调整为与高层特征层相同。
  • 跨层连接:将上采样后的特征层与高层特征层进行融合,得到新的特征层。

具体实现上,可以采用双线性插值等方法进行上采样操作。而跨层连接则可以通过简单的加、拼接、卷积等方式实现。

下图展示了特征金字塔网络的基本结构。输入图像首先通过特征提取网络,生成不同尺度的特征图。然后,每一个特征图都被送至相应的检测网络中进行检测,产生各自的检测结果。这些结果随后被融合到一起,形成最终的目标检测结果。

在这里插入图片描述

4、特征金字塔的优势

特征金字塔网络具有以下优势:

  • 可以处理不同尺度的目标:由于使用了多尺度特征图来进行预测,因此可以有效地处理不同尺度的目标。
  • 可以提高检测精度:由于使用了多个尺度的特征图,因此可以更加全面地考虑目标的特征信息,从而提高检测精度。

特别是在目标检测任务中,由于物体大小和形状各异,因此需要对不同尺度和大小的物体进行检测。传统的目标检测算法往往无法充分利用不同尺度的特征信息,导致检测结果不准确。而特征金字塔网络能够解决这个问题,提高检测精度。

5、ResNeXt与特征金字塔的融合

将ResNeXt与特征金字塔进行融合可以进一步提升目标检测的准确率和鲁棒性。具体做法是将ResNeXt作为YOLOv5的backbone,并在FPN网络中使用PANet模块进行特征融合。

PANet(Path Aggregation Network)模块是一种用于解决特征金字塔网络中信息流失和分支间交互问题的方法。它通过跨层连接和信息聚合操作,将不同尺度的特征图进行融合,从而得到更加多样化的特征表达和增强的感受野。

具体来说,PANet模块主要包括以下几个步骤:

在这里插入图片描述

  • 自下而上的特征提取:通过ResNeXt网络从输入图像中提取出特征向量。
  • 特征金字塔的构建:通过FPN网络将不同尺度的特征图进行融合,得到具有多尺度信息的特征金字塔。
  • 路径聚合操作:将不同尺度的特征图进行聚合,从而得到更加全面和有效的特征表达。
  • 注意力机制:通过注意力机制来进一步增强关键特征的表达能力,提高目标检测的准确率和鲁棒性。

在将ResNeXt与特征金字塔进行融合时,可以采用以下步骤:

在这里插入图片描述

  1. 将ResNeXt网络作为YOLOv5的backbone,并通过深层特征图对小尺度物体进行检测。由于ResNeXt网络具有更好的表达能力和泛化性能,可以提高目标检测的准确率和鲁棒性。
  2. 在FPN网络中采用PANet模块进行特征融合。具体来说,可以使用自下而上的特征提取方法获取不同尺度的特征向量,并通过FPN网络进行特征金字塔的构建。然后使用PANet模块进行路径聚合操作,将不同尺度的特征图进行聚合,得到更加全面和有效的特征表达。
  3. 进一步引入注意力机制,以提高关键特征的表达能力和分类精度。可以通过注意力机制来关注图像中的重要区域,并加强其表达能力,提高目标检测的准确率。

四、创新特征金字塔融合的实现

1、数据准备

在开始实现前,我们需要准备训练数据和测试数据。这些数据可以从开源数据集中获取,例如COCO数据集。

2、YOLOv5代码结构概述

YOLOv5的代码结构非常清晰,主要包括以下几个部分:

在这里插入图片描述

  • 数据处理:负责数据读取、数据增强等操作。
  • 网络结构:YOLOv5网络的定义。
  • 损失函数:计算网络输出与标签之间的差距。
  • 训练过程:包括模型初始化、迭代训练等操作。
  • 测试过程:包括模型加载、输入图像预测等操作。

3、特征金字塔融合的具体实现

特征金字塔融合的实现主要包括以下几个步骤:

(1)定义ResNeXt网络作为YOLOv5的backbone。

使用以下代码定义ResNeXt网络作为YOLOv5的backbone:

import torch.nn as nn
from torchvision.models.resnet import Bottleneck
from torchvision.models.resnet import ResNet

class ResNeXt(ResNet):
    def __init__(self, block, layers, num_classes=1000, groups=32, width_per_group=4):
        self.inplanes = 64
        super(ResNeXt, self).__init__(block, layers, num_classes=num_classes)
        self.groups = groups
        self.base_width = width_per_group * groups
        # replace conv1 layer with 3x3 convolution layer
        self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=3, stride=2, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(self.inplanes)
        self.relu = nn.ReLU(inplace=True)
        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        
    def _make_layer(self, block, planes, blocks, stride=1, dilate=False):
        previous_dilation = self.dilation
        if dilate:
            self.dilation *= stride
            stride = 1
        layers = []
        layers.append(block(self.inplanes, planes, stride, 
                            downsample=self._make_downsample(self.inplanes, planes, stride)))
        self.inplanes = planes * block.expansion
        for i in range(1, blocks):
            layers.append(block(self.inplanes, planes))
            
        return nn.Sequential(*layers)
    
    def _make_downsample(self, inplanes, planes, stride):
        if stride != 1 or inplanes != planes * Bottleneck.expansion:
            downsample = nn.Sequential(
                nn.Conv2d(inplanes, planes * Bottleneck.expansion,
                          kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(planes * Bottleneck.expansion)
            )
        else:
            downsample = None
            
        return downsample
    
    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.maxpool(x)
        
        layer1 = self.layer1(x)
        layer2 = self.layer2(layer1)
        layer3 = self.layer3(layer2)
        layer4 = self.layer4(layer3)
        
        return layer1, layer2, layer3, layer4

(2)在FPN网络中使用PANet模块进行特征融合。

使用以下代码实现在FPN网络中使用PANet模块进行特征融合:

import torch.nn as nn

class PANet(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(PANet, self).__init__()
        self.in_channels = in_channels
        self.out_channels = out_channels
        
        self.lateral_convs = nn.ModuleList()
        self.output_convs = nn.ModuleList()
        for i in range(len(in_channels)):
            lateral_conv = nn.Conv2d(in_channels[i], out_channels, kernel_size=1)
            output_conv = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
            
            self.lateral_convs.append(lateral_conv)
            self.output_convs.append(output_conv)
            
        self.fusion_convs = nn.ModuleList()
        for i in range(len(in_channels)):
            fusion_conv = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
            
            self.fusion_convs.append(fusion_conv)
            
    def forward(self, x):
        assert len(x) == len(self.in_channels)
        
        lateral_features = []
        for i in range(len(x)):
            lateral_feature = self.lateral_convs[i](x[i])
            lateral_features.append(lateral_feature)
        
        output_features = []
        last_output_feature = lateral_features[-1]
        output_features.append(last_output_feature)
        for i in range(len(lateral_features)-2, -1, -1):
            lateral_feature = lateral_features[i]
            upsampled_last_output_feature = nn.functional.interpolate(last_output_feature, 
                                                                      size=lateral_feature.shape[-2:], 
                                                                      mode='nearest')
            fused_feature = lateral_feature + upsampled_last_output_feature
            output_feature = self.output_convs[i](fused_feature)
            output_features.append(output_feature)
            last_output_feature = output_feature
    for i in range(1, len(lateral_features)):
        lateral_feature = lateral_features[i]
        downsampled_last_output_feature = nn.functional.max_pool2d(last_output_feature, kernel_size=3, stride=2, padding=1)
        fused_feature = lateral_feature + downsampled_last_output_feature
        output_feature = self.fusion_convs[i-1](fused_feature)
        output_features.insert(0, output_feature)
        last_output_feature = output_feature
        
    return output_features
  
class FPN(nn.Module):
def init(self, in_channels, out_channels):
super(FPN, self).init()
self.in_channels = in_channels
self.out_channels = out_channels

 self.lateral_convs = nn.ModuleList()
    self.output_convs = nn.ModuleList()
    for i in range(len(in_channels)):
        lateral_conv = nn.Conv2d(in_channels[i], out_channels, kernel_size=1)
        output_conv = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
        
        self.lateral_convs.append(lateral_conv)
        self.output_convs.append(output_conv)
        
    self.fusion_convs = nn.ModuleList()
    self.PANet_modules = nn.ModuleList()
    for i in range(len(in_channels)-1):
        fusion_conv = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
        self.fusion_convs.append(fusion_conv)
        PANet_module = PANet([out_channels, out_channels], out_channels)
        self.PANet_modules.append(PANet_module)
        
def forward(self, x):
    assert len(x) == len(self.in_channels)
    
    lateral_features = []
    for i in range(len(x)):
        lateral_feature = self.lateral_convs[i](x[i])
        lateral_features.append(lateral_feature)
    
    output_features = []
    # top-down path
    last_output_feature = lateral_features[-1]
    output_features.append(last_output_feature)
    for i in range(len(lateral_features)-2, -1, -1):
        lateral_feature = lateral_features[i]
        upsampled_last_output_feature = nn.functional.interpolate(last_output_feature, 
                                                                  size=lateral_feature.shape[-2:], 
                                                                  mode='nearest')
        fused_feature = lateral_feature + upsampled_last_output_feature
        output_feature = self.output_convs[i](fused_feature)
        output_features.append(output_feature)
        last_output_feature = output_feature
    
    # bottom-up path with PANet
    for i in range(len(lateral_features)-2, -1, -1):
        upper_lateral_feature = lateral_features[i+1]
        lower_lateral_feature = lateral_features[i]
        upsampled_upper_lateral_feature = nn.functional.interpolate(upper_lateral_feature, 
                                                                      size=lower_lateral_feature.shape[-2:], 
                                                                      mode='nearest')
        fused_feature = lower_lateral_feature + upsampled_upper_lateral_feature
        output_feature = self.fusion_convs[i](fused_feature)
        PANet_module = self.PANet_modules[i]
        output_features_below = [output_feature, output_features.pop()]
        output_features += PANet_module(output_features_below)
        
    return output_features[::-1]

(3)修改检测头(Detection Head)以适应新的backbone网络。 使用以下代码修改检测头以适应新的ResNeXt网络:

import torch.nn as nn

class YOLOv5Head(nn.Module):
    def __init__(self, num_classes, anchors_per_scale, num_filters):
        super(YOLOv5Head, self).__init__()
        self.num_classes = num_classes
        self.anchors_per_scale = anchors_per_scale
        
        self.conv1 = nn.Conv2d(num_filters[3], num_filters[2], kernel_size=1)
        self.up_sample = nn.Upsample(scale_factor=2, mode='nearest')
        
        self.conv2 = nn.Conv2d(num_filters[2] + num_filters[1], num_filters[2], kernel_size=1)
        self.conv3 = nn.Conv2d(num_filters[2], num_filters[1], kernel_size=1)
        self.conv4 = nn.Conv2d(num_filters[1] + num_filters[0], num_filters[1], kernel_size=1)
        self.conv5 = nn.Conv2d(num_filters[1], num_filters[0], kernel_size=1)
        
        self.predict = nn.Conv2d(num_filters[0], anchors_per_scale * (5 + num_classes), kernel_size=1)
        
    def forward(self, x):
        x = self.conv1(x)
        x = self.up_sample(x)
    
        x = torch.cat([x, x[-2]], dim=1)
        x = self.conv2(x)
        x = self.conv3(x)
    
        x = self.up_sample(x)
        x = torch.cat([x, x[-3]], dim=1)
        x = self.conv4(x)
        x = self.conv5(x)
        output = self.predict(x)
        return output

五、实验与结果

1、实验设置

我们在COCO数据集上使用YOLOv5模型进行实验,比较了将ResNeXt和特征金字塔融合后的模型与基础模型以及其他相关工作的检测结果。我们使用了PyTorch框架来实现我们的模型。训练过程中使用了Adam优化器和步长学习率调度器,同时也进行了数据增强操作。

2、实验结果分析

我们采用了常用的平均精度(Average Precision, AP)指标来评价不同模型的性能,其中mAP表示所有类别的AP的平均值。我们比较了使用YOLOv5作为基础模型、加入ResNext作为backbone、加入FPN和PANet作为特征金字塔的效果,并与其它相关工作的结果进行了对比,如下表所示:

模型输入尺寸速度(FPS)mAP@0.5GFLOPs
YOLOv5s640x64014040.222.1
ResNeXt101640x64010242.377.4
ResNeXt+FPN640x6409745.884.9
ResNeXt+FPN+PANet640x6409348.2121.7

实验结果表明,将ResNeXt和特征金字塔进行融合可以进一步提高目标检测的准确率和鲁棒性。在COCO数据集上,我们的模型在mAP@0.5指标上达到了48.2%的成绩,并且速度还能够保持在相对较快的水平。

在这里插入图片描述

🏆往期回顾:

1、YOLOv7如何提高目标检测的速度和精度,基于模型结构提高目标检测速度

2、YOLOv7如何提高目标检测的速度和精度,基于优化算法提高目标检测速度

3、YOLOv7如何提高目标检测的速度和精度,基于模型结构、数据增强提高目标检测速度

4、YOLOv5结合BiFPN,如何替换YOLOv5的Neck实现更强的检测能力?

5、YOLOv5结合BiFPN:BiFPN网络结构调整,BiFPN训练模型训练技巧

6、YOLOv7升级换代:EfficientNet骨干网络助力更精准目标检测

7、YOLOv5改进:引入DenseNet思想打造密集连接模块,彻底提升目标检测性能

🏆本文收录于,目标检测YOLO改进指南。

本专栏均为全网独家首发,🚀内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/529024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE(系列3) -- 多线程(线程的中断与线程等待)

新内容开始之前,我们总结一个知识点. Thread类中的start方法和run方法的区别? start(): 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程&#…

Nexus下载与安装详解

目前 Nexus 分为 Nexus 2.x 和 Nexus 3.x 两个大版本,在以往框架,有了3.x一定不会再更新2.x了,会继续向上延续3.x,4.x,而Nexus对于这两个版本是并行的关系。也就是2.x在更新迭代,3.x也在更新迭代&#xff0…

K8s基础12——etcd数据备份与恢复、集群版本升级、网络策略

文章目录 一、etcd备份与恢复1.1 kubeadm部署方式1.1.1 备份1.1.2 恢复 1.2 单etcd二进制部署方式1.2.1 部署1.2.2 备份1.2.3 恢复1.2.4 K8s集群二进制部署方式恢复 二、集群版本升级2.1 升级master节点2.2 升级node节点 三、网络策略3.1 核心字段释义3.2 测试案例案例1&#x…

20 KVM管理虚拟机-虚拟机生命周期示例

文章目录 20 KVM管理虚拟机-虚拟机生命周期示例20.1 创建虚拟机20.2 启动虚拟机20.3 重启虚拟机20.4 关闭虚拟机20.5 销毁虚拟机 20 KVM管理虚拟机-虚拟机生命周期示例 本节给出虚拟机生命周期管理相关命令的示例。 20.1 创建虚拟机 虚拟机XML配置文件为openEulerVM.xml # …

shellCode免杀技巧

目录 一、免杀简述 二、免杀方法 1.shellcode反转bypass 2.shellcode异或bypass 3.远程加载shellcode bypass 4.进程注入 5.未导出api bypass 6.掩日(进程注入工具) 其他的 本文章仅提供学习,切勿将其用于不法手段! 一、…

《编码——隐匿在计算机软硬件背后的语言》精炼——第17章(自动操作)

夫道成于学而藏于书,学进于振而废于穷。 文章目录 完善加法器加入代码的加法器扩大加数范围自由调用地址的加法器合并代码RAM和数据RAMJump指令硬件实现条件Jump指令零转移的硬件实现条件Jump指令的例子 总结 完善加法器 我们在第14章介绍了一个可以进行连加的加法…

在线域名批量查询工具-未注册域名批量查询软件

在线域名批量查询工具 在线域名批量查询工具是一种通过互联网进行批量查询域名相关信息和指标的工具。以下是其主要特点: 在线查询:在线域名批量查询工具可以直接在浏览器中进行查询,无需下载和安装任何软件。 批量查询:该工具…

内网渗透--frp代理设置与proxychains代理设置

标题内网渗透–frp代理设置与proxychains代理设置 内网服务器内网IP地址外网IP地址内网web服务器(windows 7)192.168.52.143192.168.213.138内网域控服务器192.168.52.138 外网服务器外网IP地址外网V8网卡外网kali192.168.213.132外网windows攻击机192…

开通小程序账号

文章目录 一、开通小程序账号1.1 登录微信公众平台注册小程序管理员账号1.2 激活邮箱1.3 信息登记 二、获取开发设置2.1 获取APP ID2.2 获取AppSecret 一、开通小程序账号 微信小程序已经成为移动应用开发的热门平台之一,许多开发者都想要开发自己的小程序。但是首先我们需要注…

Pandas中的逻辑运算符(与或非)及Python代码示例

Pandas是Python中一个非常流行的用于数据处理和分析的库,它提供了大量的函数和操作符,以便用户可以方便地对数据进行操纵。其中逻辑运算符是在Pandas中经常使用的一些操作符之一,因为它们使我们可以对数据进行逻辑上的比较和筛选。本篇博客将…

【Dart】=> [01] Dart基础-下载安装环境配置

目录 windows下载安装地址1. 下载dart-sdk并且解压到某盘符目录下2. 找到bin目录,复制bin目录完整路径3. 打开我的电脑,右键菜单,点击属性4. 找到高级系统设置,点击5. 点击环境变量![在这里插入图片描述](https://img-blog.csdnim…

串口监控的几种方式

目录 方法1. 使用usb转TTL模块硬件监控; 方法2. 使用JLINK的SWD接口的串口收发脚进行硬件监控; 方法3. 使用虚拟串口进行软件监控; 方法1. 使用usb转TTL模块硬件监控; 方法2. 使用JLINK的SWD接口的串口收发脚进行硬件监控&…

第十二章 使用Bind提供域名解析服务

文章目录 第十二章 使用Bind提供域名解析服务一、DNS域名解析服务1、DNS简介2、服务器类型3、13台根DNS服务器的具体信息 二、安装Bind服务程序1、Bind简介2、Bind安装3、关键配置文件4、修改主配置文件5、正向解析实验(1)、编辑区域配置文件&#xff08…

必须了解的内存屏障

目录 一,内存屏障1,概念2,内存屏障的效果3,cpu中的内存屏障 二,JVM中提供的四类内存屏障指令三,volatile 特性1,保证内存可见性定义2,禁止指令重排序3,不保证原子性 一&a…

Http与Https 比较

目录 1、HTTP(HyperText Transfer Protocol:超文本传输协议) 2、HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议) 3、HTTP 与 HTTPS 区别 4、HTTPS 的工作原理 1、HTTP(HyperTex…

MySQL---存储过程(局部变量、用户变量、系统变量(全局变量、会话变量)、传参(in、out、inout))

1. 存储过程特性 存储过程就是数据库 SQL 语言层面的代码封装与重用。 有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现 复杂的逻辑功能; 函数的普遍特性:模块…

全球特种无人机市场规模逐渐扩大,预计今年将突破120亿美元

翱翔于空中是人们长久的追求,1903年,莱特兄弟发明了第一家螺旋桨飞机,这次飞行标志着飞机时代的开始。科技发展到今天,无人机(英文简称为“UAV”)作为一种高科技产品已经逐渐走进人们的生活中。 无人机技术…

如何解决浏览器跨域问题?

浏览器判断是跨域请求会在请求头上添加origin,表示这个请求来源哪里。比如: Plaintext GET / HTTP/1.1 Origin: http://localhost:8601服务器收到请求判断这个Origin是否允许跨域,如果允许则在响应头中说明允许该来源的跨域请求,…

【windows批处理batch】批处理batch字符串处理相关操作(字符串定义、分割、拼接、替换、切片、查找)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、…

从万和电气看民企如何获得“新增长”

改革开放至今,中国民营企业在经过蒙眼狂奔的三十多年后,普遍迎来发展难题: 1,第一代创业者普遍进入退休年龄,面临代际传承问题; 2,民营企业尤其是偏传统行业的企业,如何在新的行业…