人工智能|深度学习——基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统

代码下载:

基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统.zip资源-CSDN文库

1.研究的背景

水下场景目标检测是水下机器人、水下无人机和水下监控等领域中的重要任务之一。然而,由于水下环境的复杂性和特殊性,水下目标检测面临着许多挑战,如光线衰减、水下散射、水下噪声等。因此,开发一种高效准确的水下场景目标检测系统对于提高水下任务的执行效果和水下资源的利用效率具有重要意义。

目前,基于深度学习的目标检测方法在陆地场景中取得了显著的成果,如YOLO (You Only Look Once)、Faster R-CNN (Region-based Convolutional Neural Networks)等。然而,这些方法在水下场景中的应用受到了一些限制。首先,由于水下环境的特殊性,水下图像的质量较差,包含大量的噪声和模糊。其次,水下目标的外观和形状与陆地目标存在较大差异,传统的目标检测算法往往难以准确地检测水下目标。因此,需要针对水下场景的特点进行改进和优化,以提高水下目标检测的准确性和鲁棒性。

全局注意力机制是一种有效的注意力机制,可以帮助模型在输入图像的不同区域上分配不同的注意力权重。在目标检测任务中,全局注意力机制可以帮助模型更好地关注目标区域,提高目标检测的准确性。因此,将全局注意力机制引入到水下场景目标检测系统中,可以有效地提高水下目标检测的性能。

本研究的主要目标是基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统。YOLOv7-AC是一种基于YOLOv3的改进版本,具有更高的检测精度和更快的检测速度。通过引入全局注意力机制,我们希望进一步提高YOLOv7-AC在水下场景中的目标检测性能。具体来说,我们将探索如何设计和训练一个全局注意力模块,以捕捉水下目标的关键特征,并将其集成到YOLOv7-AC中。我们还将研究如何优化网络结构和参数设置,以提高水下目标检测的准确性和鲁棒性。 

image.png

2.研究的意义

  1. 提高水下目标检测的准确性:通过引入全局注意力机制,我们可以使模型更加关注水下目标区域,提高目标检测的准确性。这对于水下机器人、水下无人机等任务的执行效果具有重要意义。

  2. 提高水下目标检测的鲁棒性:水下环境的复杂性和特殊性使得水下目标检测面临着许多挑战。通过优化网络结构和参数设置,我们可以提高水下目标检测的鲁棒性,使其在不同的水下环境中都能够稳定地工作。

  3. 推动水下任务的发展:水下任务的发展需要高效准确的水下目标检测系统作为基础。本研究的成果可以为水下任务的执行提供有力支持,推动水下任务的发展和应用。

总之,基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统具有重要的研究背景和意义。通过引入全局注意力机制和优化网络结构,我们可以提高水下目标检测的准确性和鲁棒性,为水下任务的执行提供有力支持。这对于提高水下任务的执行效果和水下资源的利用效率具有重要意义。

3.图片演示

2.png

3.png

4.png

5.核心代码讲解

5.1 fit.py
class CBS(nn.Module):
    """ Convolution -> BatchNorm -> SiLU """

    def __init__(self, in_channels, out_channels, kernel_size, stride):
        super(CBS, self).__init__()
        self.layer = nn.Sequential(
            nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding=kernel_size // 2),
            nn.BatchNorm2d(out_channels),
            nn.SiLU()
        )

    def forward(self, x):
        return self.layer(x)


class MP1(nn.Module):
    """ MP1 block """

    def __init__(self, in_channels):
        super(MP1, self).__init__()
        # Upper branch
        self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.cbs_upper = CBS(in_channels, in_channels // 2, 1, 1)

        # Lower branch
        self.cbs_lower1 = CBS(in_channels, in_channels // 2, 1, 1)
        self.cbs_lower2 = CBS(in_channels // 2, in_channels // 2, 3, 2)

    def forward(self, x):
        # Upper branch
        x_upper = self.maxpool(x)
        x_upper = self.cbs_upper(x_upper)

        # Lower branch
        x_lower = self.cbs_lower1(x)
        x_lower = self.cbs_lower2(x_lower)

        # Concatenate
        return torch.cat([x_upper, x_lower], dim=1)


class MP2(nn.Module):
    """ MP2 block, similar to MP1 but with different output channels """

    def __init__(self, in_channels):
        super(MP2, self).__init__()
        # Upper branch
        self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.cbs_upper = CBS(in_channels, in_channels, 1, 1)

        # Lower branch
        self.cbs_lower1 = CBS(in_channels, in_channels, 1, 1)
        self.cbs_lower2 = CBS(in_channels, in_channels, 3, 2)

    def forward(self, x):
        # Upper branch
        x_upper = self.maxpool(x)
        x_upper = self.cbs_upper(x_upper)

        # Lower branch
        x_lower = self.cbs_lower1(x)
        x_lower = self.cbs_lower2(x_lower)

        # Concatenate
        return torch.cat([x_upper, x_lower], dim=1)
    ......

封装的类为CBSMP1MP2,它们分别表示卷积、批归一化和SiLU激活函数的组合、MP1块和MP2块。

CBS类包含一个序列模块,其中包含一个卷积层、一个批归一化层和一个SiLU激活函数。它的forward方法将输入x传递给这个序列模块,并返回输出。

MP1类表示MP1块,它包含一个上分支和一个下分支。上分支包括一个最大池化层和一个CBS模块,下分支包括两个CBS模块。它的forward方法将输入x分别传递给上分支和下分支,并将它们的输出在通道维度上进行拼接后返回。

MP2类表示MP2块,它与MP1块类似,但输出通道数不同。它的forward方法与MP1块的forward方法相同。

这些类封装了卷积、批归一化和激活函数的组合以及MP1和MP2块的功能,可以在模型中使用它们来构建更复杂的网络结构。

该工程中的fit.py文件定义了两个模块类CBS和MP1,以及一个类MP2。其中,CBS类是一个卷积、批归一化和SiLU激活函数的组合模块,用于构建卷积层。MP1类是一个MP1块,包含了上下两个分支,上分支是一个最大池化层和一个CBS模块,下分支是两个CBS模块。MP2类与MP1类类似,但输出通道数不同。这些模块类都继承自nn.Module类,并实现了forward方法来定义前向传播过程。整个文件的功能是定义了一些用于构建神经网络的模块。

5.2 GAM.py
class ChannelAttention(nn.Module):
    """ Channel Attention Submodule for GAM """

    def __init__(self, in_channels):
        super(ChannelAttention, self).__init__()
        self.mlp = nn.Sequential(
            nn.Linear(in_channels, in_channels // 2),
            nn.SiLU(),
            nn.Linear(in_channels // 2, in_channels),
            nn.Sigmoid()
        )

    def forward(self, x):
        avg_pool = torch.mean(x, dim=[2, 3])
        return self.mlp(avg_pool).unsqueeze(2).unsqueeze(3) * x


class SpatialAttention(nn.Module):
    """ Spatial Attention Submodule for GAM """

    def __init__(self, in_channels, out_channels):
        super(SpatialAttention, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1),
            nn.SiLU(),
            nn.Conv2d(out_channels, 1, kernel_size=3, stride=1, padding=1),
            nn.Sigmoid()
        )

    def forward(self, x):
        return self.conv(x) * x


class GAM(nn.Module):
    """ Global Attention Module (GAM) """

    def __init__(self, in_channels):
        super(GAM, self).__init__()
        self.channel_attention = ChannelAttention(in_channels)
        self.spatial_attention = SpatialAttention(in_channels, in_channels // 2)

    def forward(self, x):
        x = self.channel_attention(x)
        x = self.spatial_attention(x)
        return x

这个程序文件是一个实现了全局注意力模块(GAM)的神经网络模型。它包含了三个子模块:通道注意力(ChannelAttention)、空间注意力(SpatialAttention)和全局注意力模块(GAM)。

通道注意力子模块(ChannelAttention)接收输入的通道数,并通过一个多层感知机(MLP)来计算通道注意力权重。MLP包含两个线性层和激活函数,最后输出一个sigmoid函数作为注意力权重。通道注意力子模块的前向传播过程中,首先对输入进行平均池化操作,然后通过MLP计算通道注意力权重,并将其与输入相乘得到输出。

空间注意力子模块(SpatialAttention)接收输入的通道数和输出的通道数,并通过两个卷积层来计算空间注意力权重。卷积层的核大小为3x3,步长为1,填充为1。卷积层的激活函数为SiLU(Sigmoid Linear Unit)。空间注意力子模块的前向传播过程中,首先通过两个卷积层计算空间注意力权重,然后将其与输入相乘得到输出。

全局注意力模块(GAM)接收输入的通道数,并包含了通道注意力子模块和空间注意力子模块。在前向传播过程中,首先通过通道注意力子模块计算通道注意力权重,然后通过空间注意力子模块计算空间注意力权重,最后将两者相乘得到输出。

总的来说,这个程序文件实现了一个全局注意力模块(GAM),用于增强神经网络模型的表示能力。

5.3 models\common.py
class CBS(nn.Module):
    """ Convolution -> BatchNorm -> SiLU """

    def __init__(self, in_channels, out_channels, kernel_size, stride):
        super(CBS, self).__init__()
        self.layer = nn.Sequential(
            nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding=kernel_size // 2),
            nn.BatchNorm2d(out_channels),
            nn.SiLU()
        )

    def forward(self, x):
        return self.layer(x)


class MP1(nn.Module):
    """ MP1 block """

    def __init__(self, in_channels):
        super(MP1, self).__init__()
        # Upper branch
        self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.cbs_upper = CBS(in_channels, in_channels // 2, 1, 1)

        # Lower branch
        self.cbs_lower1 = CBS(in_channels, in_channels // 2, 1, 1)
        self.cbs_lower2 = CBS(in_channels // 2, in_channels // 2, 3, 2)

    def forward(self, x):
        # Upper branch
        x_upper = self.maxpool(x)
        x_upper = self.cbs_upper(x_upper)

        # Lower branch
        x_lower = self.cbs_lower1(x)
        x_lower = self.cbs_lower2(x_lower)

        # Concatenate
        return torch.cat([x_upper, x_lower], dim=1)


class MP2(nn.Module):
    """ MP2 block, similar to MP1 but with different output channels """

    def __init__(self, in_channels):
        super(MP2, self).__init__()
        # Upper branch
        self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.cbs_upper = CBS(in_channels, in_channels, 1, 1)

        # Lower branch
        self.cbs_lower1 = CBS(in_channels, in_channels, 1, 1)
        self.cbs_lower2 = CBS(in_channels, in_channels, 3, 2)

    def forward(self, x):
        # Upper branch
        x_upper = self.maxpool(x)
        x_upper = self.cbs_upper(x_upper)

        # Lower branch
        x_lower = self.cbs_lower1(x)
        x_lower = self.cbs_lower2(x_lower)

        # Concatenate
        return torch.cat([x_upper, x_lower], dim=1)

class ChannelAttention(nn.Module):
    """ Channel Attention Submodule for GAM """

    def __init__(self, in_channels):
        super(ChannelAttention, self).__init__()
        self.mlp = nn.Sequential(
            nn.Linear(in_channels, in_channels // 2),
            nn.SiLU(),
            nn.Linear(in_channels // 2, in_channels),
            nn.Sigmoid()
        )

    def forward(self, x):
        avg_pool = torch.mean(x, dim=[2, 3])
        return self.mlp(avg_pool).unsqueeze(2).unsqueeze(3) * x


class SpatialAttention(nn.Module):
    """ Spatial Attention Submodule for GAM """

    def __init__(self, in_channels, out_channels):
        super(SpatialAttention, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1),
            nn.SiLU(),
            nn.Conv2d(out_channels, 1, kernel_size=3, stride=1, padding=1),
            nn.Sigmoid()
        )

    def forward(self, x):
        return self.conv(x) * x


class GAM(nn.Module):
    """ Global Attention Module (GAM) """

    def __init__(self, in_channels):
        super(GAM, self).__init__()
        self.channel_attention = ChannelAttention(in_channels)
        self.spatial_attention = SpatialAttention(in_channels, in_channels // 2)

    def forward(self, x):
        x = self.channel_attention(x)
        x = self.spatial_attention(x)
        return x
    ......

这个程序文件是一个YOLOv7模型的实现,用于目标检测任务。文件中定义了一些常用的模块和函数,包括卷积、批归一化、激活函数等。其中还定义了一些特殊的模块,如MP1、MP2、GAM等,用于构建YOLOv7模型的不同部分。整个程序文件的结构比较清晰,代码逻辑也比较简单易懂。

6.系统整体结构

整体功能和构架概述:

该项目是一个基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统。它使用PyTorch框架实现了一个完整的目标检测系统,包括模型的构建、训练、推理和可视化等功能。

整个项目的构架可以分为以下几个部分:

  1. 模型相关:包括模型的定义和模型相关的辅助函数和类,如卷积、批归一化、激活函数等模块的定义,以及YOLOv7模型的各个部分的定义和组合。

  2. 工具相关:包括一些常用的工具函数和类,如数据加载器的创建、损失函数的计算、模型的保存和加载等。

  3. 训练相关:包括训练脚本和训练过程中需要的辅助函数和类,如训练函数的定义、模型的优化器的选择和配置、训练指标的计算等。

  4. 用户界面相关:包括一个基于PyQt5的GUI界面,用于选择图片或视频文件进行目标检测,并显示检测结果。

  5. 其他辅助文件:包括一些辅助功能的实现,如激活函数、数据增强、自动锚框生成、自动批处理大小等。

下面是每个文件的功能整理:

文件路径功能概述
fit.py定义了卷积、批归一化和激活函数的组合模块类
GAM.py实现了全局注意力模块的神经网络模型
torch_utils.py包含了一些常用的函数和类,如设备选择、时间同步、模型性能测量等
train.py用于训练模型的脚本,包括训练函数和一些辅助函数和类
ui.py基于PyQt5的GUI界面,用于选择文件和显示检测结果
models\common.py定义了一些常用的模块和函数,用于构建YOLOv7模型
models\experimental.py包含了一些实验性的模块和函数
models\tf.py包含了一些与TensorFlow相关的模块和函数
models\yolo.py定义了YOLO模型的相关类
models_init_.py空文件
tools\activations.py定义了一些激活函数
tools\augmentations.py定义了一些数据增强函数
tools\autoanchor.py定义了自动锚框生成的函数
tools\autobatch.py定义了自动批处理大小的函数
tools\callbacks.py定义了一些回调函数
tools\datasets.py定义了数据加载器的创建函数
tools\downloads.py定义了一些用于下载数据集和权重的函数
tools\general.py定义了一些通用的辅助函数
tools\loss.py定义了一些损失函数
tools\metrics.py定义了一些评估指标的计算函数
tools\plots.py定义了一些绘图函数
tools\torch_utils.py定义了一些与PyTorch相关的辅助函数
tools_init_.py空文件
tools\aws\resume.py定义了一些用于AWS训练恢复的函数
tools\aws_init_.py空文件
tools\flask_rest_api\example_request.py定义了一些用于Flask REST API的示例请求函数
tools\flask_rest_api\restapi.py定义了Flask REST API的相关类和函数
tools\loggers_init_.py空文件
tools\loggers\wandb\log_dataset.py定义了用于记录数据集的类
tools\loggers\wandb\sweep.py定义了用于记录超参数搜索的类
tools\loggers\wandb\wandb_utils.py定义了一些与WandB日志记录相关的辅助函数
tools\loggers\wandb_init_.py空文件
utils\activations.py定义了一些激活函数
utils\augmentations.py定义了一些数据增强函数
utils\autoanchor.py定义了自动锚框生成的函数
utils\autobatch.py定义了自动批处理大小的函数
utils\callbacks.py定义了一些回调函数
utils\datasets.py定义了数据加载器的创建函数
utils\downloads.py定义了一些用于下载数据集和权重的函数
utils\general.py定义了一些通用的辅助函数
utils\loss.py定义了一些损失函数
utils\metrics.py定义了一些评估指标的计算函数
utils\plots.py定义了一些绘图函数
utils\torch_utils.py定义了一些与PyTorch相关的辅助函数
utils_init_.py空文件
utils\aws\resume.py定义了一些用于AWS训练恢复的函数
utils\aws_init_.py空文件
utils\flask_rest_api\example_request.py定义了一些用于Flask REST API的示例请求函数
utils\flask_rest_api\restapi.py定义了Flask REST API的相关类和函数
utils\loggers_init_.py空文件
utils\loggers\wandb\log_dataset.py定义了用于记录数据集的类
utils\loggers\wandb\sweep.py定义了用于记录超参数搜索的类
utils\loggers\wandb\wandb_utils.py定义了一些与WandB日志记录相关的辅助函数

7.YOLOv7简介

YOLOv7 模型 [ 2 ],由 Chien-Yao Wang 和 Alexey Bochkovskiy 等人开发。到2022年,集成E-ELAN(扩展高效层聚合网络)[ 1 ]、基于级联模型的模型缩放[ 2 ]和模型重新参数化[ 3 ]等策略,以在检测效率和精度之间实现良好的平衡。如图所示,YOLOv7网络由四个不同的模块组成:输入模块、Backbone网络、Head网络和预测网络。 

 输入模块:YOLOv7模型的预处理阶段采用了镶嵌和混合数据增强技术,并利用YOLOv5建立的自适应锚框计算方法,保证输入的彩色图像统一缩放到640×640尺寸,从而满足骨干网络输入大小的要求。 骨干网络:YOLOv7网络由三个主要组件组成:CBS、E-ELAN和MP1。CBS模块由卷积、批量归一化和SiLU激活函数组成。E-ELAN模块保持了原有的ELAN设计架构,通过引导不同的特征组计算块学习更多样的特征来增强网络的学习能力,保留原有的梯度路径。MP1由CBS和MaxPool组成,分为上下分支。上分支使用 MaxPool 将图像的长度和宽度减半,并使用具有 128 个输出通道的 CBS 将图像通道减半。下分支通过具有 1 × 1 核和步长的 CBS 将图像通道减半,通过 3 × 3 核和 2 × 2 步长的 CBS 将图像长和宽减半,最后通过串联(Cat)操作。MaxPool提取小局部区域的最大值信息,而CBS提取小局部区域的所有值信息,从而提高网络的特征提取能力。 Head网络:YOLOv7的Head网络采用特征金字塔网络(FPN)架构,采用PANet设计。该网络包含多个卷积、批量归一化和 SiLU 激活 (CBS) 块,并引入了空间金字塔池化和卷积空间金字塔池化 (Sppcspc) 结构、扩展高效层聚合网络 (E-ELAN) 和 MaxPool -2(MP2)。Sppcspc 结构通过在空间金字塔池化 (SPP) 结构中结合卷积空间金字塔 (CSP) 结构,以及帮助优化和特征提取的大剩余边缘,改善了网络的感知场。ELAN-H层是基于E-ELAN的多个特征层的融合,进一步增强了特征提取。MP2 块具有与 MP1 块类似的结构,只是输出通道的数量略有修改。 预测网络:YOLOv7的预测网络采用Rep结构来调整头部网络输出的特征的图像通道数,然后应用1×1卷积来预测置信度、类别和锚框。Rep 结构受 RepVGG [ 44 ] 的启发,引入了特殊的残差设计来帮助训练过程。这种独特的残差结构在实际预测中可以简化为简单的卷积,从而在不牺牲其预测性能的情况下降低网络复杂性。

8.改进模块

GAM

注意力机制是一种通过为神经网络中输入的各个部分分配不同的权重来改进复杂上下文中特征提取的方法。这种方法使模型能够专注于相关信息并忽略不相关信息,从而提高性能。注意力机制的例子包括像素注意力、通道注意力和多阶注意力[ 5 ]。 GAM [ 9 ]可以通过减少信息分散和放大全局交互表示来提高深度神经网络的性能。 GAM 包含通道注意力子模块和空间注意力子模块。通道注意力子模块被设计为三维变换,使其能够保留输入的三维信息。接下来是两层的多层感知(MLP),用于放大通道空间中的维度间依赖性,从而使网络能够专注于图像中更有意义的前景区域。 空间注意力子模块包含两个卷积层,可以有效地整合空间信息,使网络能够专注于图像中上下文重要的区域。

ResNet-ACmix 模块

谷歌大脑研究团队将ResNet-ACmix模块引入YOLOv7的Backbone组件中,有效地保留了提取的特征信息的一致性。该模块基于ResNet[8]的瓶颈结构,其中3×3卷积被ACmix模块替代,能够自适应聚焦不同区域并捕获更多信息特征,如图所示。输入分为主输入和残余输入,这有助于防止信息丢失,同时减少参数数量和计算要求。ResNet-ACmix模块使网络能够获得更深的深度而不会遇到梯度消失,并且学习结果对网络权重的波动更加敏感。 

AC-E-ELAN模块

AAAI对YOLOv7的E-ELAN组件提出的改进是基于先进的ELAN架构[ 4 ]。与传统ELAN网络不同,扩展E-ELAN采用扩展、洗牌和合并基数方法,能够在不破坏原始梯度流的情况下不断增强网络的学习能力,从而提高参数利用率和计算效率。YOLOv7中E-ELAN组件的特征提取模块通过合并RepVgg架构中的残差结构(即1×1卷积分支和跳跃连接分支)得到了进一步改进。这导致了AC-E-ELAN结构的发展,如图3所示,它集成了由3×3卷积块组成的ACmixBlock,ACmixBlock之间具有跳跃连接和1×1卷积结构。这种组合使网络能够受益于多分支模型训练期间获得的丰富特征以及从单路径模型获得的快速、内存高效的推理。 

image.png

10.参考文献


  1. Zhou, X.; Ding, W.; Jin, W. Microwave-assisted extraction of lipids, carotenoids, and other compounds from marine resources. In Innovative and Emerging Technologies in the Bio-Marine Food Sector; Academic Press: Cambridge, MA, USA, 2022; pp. 375–394. [Google Scholar]
  2. Liu, Y.; Anderlini, E.; Wang, S.; Ma, S.; Ding, Z. Ocean explorations using autonomy: Technologies, strategies and applications. In Offshore Robotics; Springer: Singapore, 2022; Volume I, pp. 35–58. [Google Scholar]
  3. Ghafoor, H.; Noh, Y. An overview of next-generation underwater target detection and tracking: An integrated underwater architecture. IEEE Access 2019, 7, 98841–98853. [Google Scholar] [CrossRef]
  4. Liu, K.; Liang, Y. Enhancement of underwater optical images based on background light estimation and improved adaptive transmission fusion. Opt. Express 2021, 29, 28307. [Google Scholar] [CrossRef]
  5. Shi, J.; Zhuo, X.; Zhang, C.; Bian, Y.X.; Shen, H. Research on key technologies of underwater target detection. In Seventh Symposium on Novel Photoelectronic Detection Technology and Applications; SPIE: Kunming, China, 2021; Volume 11763, pp. 1128–1137. [Google Scholar]
  6. Zhang, W.; Sun, W. Research on small moving target detection algorithm based on complex scene. J. Phys. Conf. Ser. 2021, 1738, 012093. [Google Scholar] [CrossRef]
  7. Fu, H.; Song, G.; Wang, Y. Improved YOLOv4 marine target detection combined with CBAM. Symmetry 2021, 13, 623. [Google Scholar] [CrossRef]
  8. Samantaray, S.; Deotale, R.; Chowdhary, C.L. Lane detection using sliding window for intelligent ground vehicle challenge. In Innovative Data Communication Technologies and Application: Proceedings of ICIDCA 2020; Springer: Singapore, 2021; pp. 871–881. [Google Scholar]
  9. Bakheet, S.; Al-Hamadi, A. A framework for instantaneous driver drowsiness detection based on improved HOG features and naïve Bayesian classification. Brain Sci. 2021, 11, 240. [Google Scholar] [CrossRef]
  10. Bellavia, F. SIFT matching by context exposed. IEEE Trans. Pattern Anal. Mach. Intell. 2022, 45, 2445–2457. [Google Scholar] [CrossRef] [PubMed]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度解析 Netty 架构与原理

一共 28661字,耐心看完。 在阅读本文前最好有 Java 的 IO 编程经验(知道 Java 的各种 IO 流),以及 Java 网络编程经验(用 ServerSocket 和 Socket 写过 demo),并对 Java NIO 有基本的认识&…

Etsy做什么店铺比较靠谱? 什么叫做真人店?

作为Etsy是美国最大的原创手工在线销售平台之一,以其店铺利润高、平台佣金低、平台同质化不严重的优点在跨境电商里颇具竞争力。然而Etsy开店却不是件容易事,原因是Etsy真人店对于环境以及卖家的运营操作要求较高,下面就给各位有意入局Etsy的…

计算机毕业设计 | SSM 旅游网站后台管理系统(附源码)

1,概述 1.1 背景分析 随着人们生活水平的提高和对休闲旅游的日益重视,旅游业已成为全球最大的经济产业之一。越来越多的人选择通过在线方式进行旅行预订,这种趋势为旅游网站提供了巨大的商机。用户体验是决定旅游网站成功与否的关键因素。良…

c语言贪食蛇游戏

演示视频 目录 一.概述 二.游戏开始前 修改控制台程序标题和大小 Win32 API GetStdHandle函数 GetConsoleCursorInfo函数和SetConsoleCursorInfo函数 SetConsoleCursorPosition函数 游戏开篇界面处理 创建地图 蛇身节点以及食物节点初始化 蛇身的初始化 整体蛇节点…

相机图像质量研究(5)常见问题总结:光学结构对成像的影响--景深

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

Sentiment AI:智能化加密时代的引领者

“或许在不久,通过智能化投资分析工具做投资决策,将成为加密投资者必备的手段,而Sentiment AI 正在加速智能化加密时代大门的开启。” 在加密货币领域中,只有极少一部分人购买加密货币是因为被文化所吸引,绝大多数链上…

C# CAD交互界面-自定义工具栏(二)

运行环境 vs2022 c# cad2016 调试成功 一、引用 acdbmgd.dllacmgd.dllaccoremgd.dllAutodesk.AutoCAD.Interop.Common.dllAutodesk.AutoCAD.Interop.dll using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.T…

23.HarmonyOS App(JAVA)堆叠布局StackLayout使用方法

不常用 StackLayout直接在屏幕上开辟出一块空白的区域,添加到这个布局中的视图都是以层叠的方式显示,而它会把这些视图默认放到这块区域的左上角,第一个添加到布局中的视图显示在最底层,最后一个被放在最顶层。上一层的视图会覆盖…

【蓝桥杯冲冲冲】 [SCOI2005] 骑士精神

蓝桥杯备赛 | 洛谷做题打卡day28 文章目录 蓝桥杯备赛 | 洛谷做题打卡day28[SCOI2005] 骑士精神题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示题解代码我的一些话[SCOI2005] 骑士精神 题目描述 输入格式 第一行有一个正整数 T T T( T ≤ 10

SDWAN组网一般会需要哪些设备

随着企业网络需求的不断增长和变化, SD-WAN作为一种先进的网络架构技术,需要一系列设备来构建有效的组网。以下是SD-WAN组网所需的一些关键设备清单: (1)SD-WAN路youqi: SD-WAN路youqi是SD-WAN网络的核心设…

Python Matplotlib安装过程详解

Matplotlib 是一个非常优秀的 Python 2D 绘图库,只要给出符合格式的数据,通过 Matplotlib 就可以方便地制作折线图、柱状图、散点图等各种高质量的数据图。 安装 Matplotlib 包与安装其他 Python 包没有区别,同样可以使用 pip 来安装。 启动…

专业知识库:中小型企业必备的高效工具

在如今这个信息爆炸的时代,知识管理已经成为了企业运营的重要环节。特别是对于中小型企业来说,如何有效地管理公司内部的知识,提高工作效率,已经成为了一个亟待解决的问题。在这篇文章中,我将向大家介绍一种能够帮助企…

计算机服务器中了halo勒索病毒如何处理,halo勒索病毒解密数据恢复

网络技术的不断发展与应用,为企业的生产生活提供了极大便利,但网络数据安全威胁无处不在,近日,云天数据恢复中心接到某连锁超市求助,企业计算机服务器被halo勒索病毒攻击,导致计算机系统瘫痪,无…

2024初始Spring(并使用idea创建springweb项目)

前言 spring呢,以前一直是简单的了解,并没有利用空闲时间去进行对应的深入的学习,今天呢原本是打算好好学的,然后后来呢感觉还是太早了接触,打算把前面知识在过一编之后再开始 Spring介绍 Spring | Home 大家想要访…

探索Web API SpeechSynthesis:给你的网页增添声音

Web API SpeechSynthesis是一项强大的浏览器功能,它允许开发者将文本转换为语音,并通过浏览器播放出来。本文将深入探讨SpeechSynthesis的控制接口,包括其功能、用法和一个完整的JavaScript示例。 参考资料:SpeechSynthesis - Web…

鸿蒙实战开发-全局UI方法的功能

主要开发内容 时间调节 使用全局UI的方法定义日期滑动选择器弹窗并弹出。 操作说明:首先创建一个包含按钮的用户界面,当用户点击“时间设置”按钮时,会弹出调用TimePickerDialog组件的show方法,显示一个时间选择对话框&#xff…

C++二维数组

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家好,我是PingdiGuo_guo,今天我们来学习二维数组。 文章目录 1.二维数组的概念与思想 2.二维数组和一维数组的区别 3.二维数组的特点 4.二维数组的操作 1.定义 2.初始化 1.直…

Java Character源码剖析

Character类除了封装了一个char外,还封装了Unicode字符级别的各种操作,是Java文本处理的基础。下面结合源码分析Character的贡献。 Unicode 也许你没听过Unicode,但应该见过UTF-8。UTF-8(8-bit Unicode Transformation Format&a…

记一次VulnStack渗透

信息收集 netdiscover的主机发现部分不再详解,通过访问端口得知20001-2003端口都为web端口,所以优先考虑从此方向下手 外网渗透 GetShell Struct漏洞 访问2001端口后,插件Wappalyzer爬取得知这是一个基于Struct的web站点,直接…

微软Windows生态是怎么打造成功的?

(1)2015年Windows10:兼容性 我不得不再次佩服一下微软,Windows10是2015年出品的,但是仍然能正常运行绝大多数的Windows95软件,不用做任何的适配修改,连重新编译都不用,运行照样正常。…