基于深度学习的遥感图像变化差异可视化系统

1.研究背景与意义

项目参考AAAI Association for the Advancement of Artificial Intelligence

研究背景与意义

遥感图像变化差异可视化是遥感图像处理和分析的重要研究领域之一。随着遥感技术的快速发展和遥感数据的广泛应用,遥感图像的获取和处理变得越来越容易。然而,遥感图像通常具有大规模、高维度和复杂的特征,对于人类来说很难直观地理解和分析。因此,开发一种基于深度学习的遥感图像变化差异可视化系统具有重要的理论和实际意义。

首先,遥感图像变化差异可视化系统可以帮助人们更好地理解和分析遥感图像的变化情况。遥感图像的变化通常包括地表覆盖变化、建筑物变化、植被变化等。通过可视化系统,用户可以直观地观察到图像之间的差异,进而深入分析变化的原因和影响。这对于城市规划、环境监测、农业管理等领域具有重要的应用价值。

其次,基于深度学习的遥感图像变化差异可视化系统可以提高遥感图像处理和分析的效率和准确性。传统的遥感图像处理方法通常需要人工提取特征和进行分类,这个过程费时费力且容易出错。而深度学习技术可以自动学习图像的特征表示和分类模型,大大减少了人工干预的需求。通过将深度学习应用于遥感图像变化差异可视化系统中,可以实现自动化的图像处理和分析,提高工作效率和准确性。

此外,基于深度学习的遥感图像变化差异可视化系统还可以促进遥感技术与其他学科的交叉应用。深度学习技术在计算机视觉、模式识别、人工智能等领域取得了巨大的成功,而遥感技术在地理信息系统、环境科学、农业科学等领域也有广泛的应用。将深度学习与遥感图像变化差异可视化相结合,可以为这些领域提供更强大的工具和方法,推动相关学科的发展。

综上所述,基于深度学习的遥感图像变化差异可视化系统具有重要的研究背景和意义。它可以帮助人们更好地理解和分析遥感图像的变化情况,提高遥感图像处理和分析的效率和准确性,促进遥感技术与其他学科的交叉应用。随着深度学习技术的不断发展和遥感数据的不断增加,基于深度学习的遥感图像变化差异可视化系统将在未来得到更广泛的应用和研究。

2.图片演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.视频演示

基于深度学习的遥感图像变化差异可视化系统_哔哩哔哩_bilibili

4.Unet简介

  1. UNet 简介
    UNet 属于 FCN 的一种变体,它可以说是最常用、最简单的一种分割模型,它简单、高效、易懂、容易构建,且可以从小数据集中训练。2015 年,UNet 在论文 U-Net: Convolutional Networks for Biomedical Image Segmentation 中被提出 。UNet 的初衷是为了解决医学图像分割的问题,在解决细胞层面的分割的任务方面,其在 2015 年的 ISBI cell tracking 比赛中获得了多个第一。之后,UNet 凭借其突出的分割效果而被广泛应用在语义分割的各个方向(如卫星图像分割,工业瑕疵检测等)。

  2. UNet 详解
    在这里插入图片描述

UNet 网络结构如上图所示,其网络结构是对称的,形似英文字母 U,故而被称为 UNet 。就整体而言,UNet 是一个Encoder-Decoder的结构(与 FCN 相同),前半部分是特征提取,后半部分是上采样。

Encoder:左半部分,由两个 3x3 的卷积层(ReLU)+ 一个 2x2 的 maxpooling 层组成一个下采样模块;
Decoder:右半部分,由一个上采样的卷积层 + 特征拼接 concat + 两个 3x3 的卷积层(ReLU)构成一个上采样模块。
Encoder 由卷积操作和下采样操作组成,所用卷积结构统一为 3x3 的卷积核,padding=0 ,striding=1。没有 padding 所以每次卷积之后特征图的 H 和 W 变小了,在跳层连接(Skip connection)时需注意特征图的维度。

Decoder 用以恢复特征图的原始分辨率,除了卷积以外,该过程的关键步骤就是上采样与跳层连接。上采样常用转置卷积和插值两种方式实现。在插值实现方式中,双线性插值(bilinear)的综合表现较好也较为常见 。要想网络获得好的效果,跳层连接基本必不可少。UNet 中的跳层连接通过拼接将底层的位置信息与深层的语义信息相融合。

5.核心代码讲解

5.1 change-detection-quick-start.py
import torch
from torch import nn


class double_conv(nn.Module):
    def __init__(self, in_ch, out_ch):
        super(double_conv, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(in_ch, out_ch, 3, padding=1),
            nn.BatchNorm2d(out_ch),
            nn.ReLU(inplace=True),
            nn.Conv2d(out_ch, out_ch, 3, padding=1),
            nn.BatchNorm2d(out_ch),
            nn.ReLU(inplace=True)
        )

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


class up(nn.Module):
    def __init__(self, in_ch, out_ch, bilinear=True):
        super(up, self).__init__()
        self.conv = double_conv(in_ch, out_ch)

    def forward(self, x1, x2):
        x1 = nn.functional.interpolate(x1, scale_factor=2)
        x = torch.cat([x2, x1], dim=1)
        x = self.conv(x)
        return x


class UNet(nn.Module):
    def __init__(self, n_channels, n_classes):
        super(UNet, self).__init__()
        self.inc = double_conv(n_channels, 64)
        self.down1 = nn.Sequential(nn.MaxPool2d(2), double_conv(64, 128))
        self.down2 = nn.Sequential(nn.MaxPool2d(2), double_conv(128, 256))
        self.down3 = nn.Sequential(nn.MaxPool2d(2), double_conv(256, 512))
        self.down4 = nn.Sequential(nn.MaxPool2d(2), double_conv(512, 512))

        self.up1 = up(1024, 256)
        self.up2 = up(512, 128)
        self.up3 = up(256, 64)
        self.up4 = up(128, 64)
        self.outc = nn.Conv2d(64, n_classes, 1)

    def forward(self, x1, x2):
        x = torch.cat([x1, x2], dim=1)
        x1 = self.inc(x)
        x2 = self.down1(x1)
        x3 = self.down2(x2)
        x4 = self.down3(x3)
        x5 = self.down4(x4)
        x = self.up1(x5, x4)
        x = self.up2(x, x3)
        x = self.up3(x, x2)
        x = self.up4(x, x1)
        x = self.outc(x)
        return x
import itertools
import glob
from libtiff import TIFF
import numpy as np
from torch.utils.data import Dataset

from skimage.transform import match_histograms
import torch
class SctDataset(Dataset):
    def __init__(self, root, size=512, slide=256):
        image_path_list_2018 = glob.glob(root + '/img_2018' + '/*.tif')
        image_path_list_2018.sort()
        image_path_list_2017 = glob.glob(root + '/img_2017' + '/*.tif')
        image_path_list_2017.sort()
        image_path_list_mask = glob.glob(root + '/mask' + '/*.tif')
        image_path_list_mask.sort()
        self.image_path_list_2018 = image_path_list_2018
        self.image_path_list_2017 = image_path_list_2017
        self.image_path_list_mask = image_path_list_mask

    def __getitem__(self, idx):

        image1 = TIFF.open(self.image_path_list_2017[idx], mode='r').read_image()[:, :, [2, 1, 0]].transpose((2, 0, 1))
        image2 = TIFF.open(self.image_path_list_2018[idx], mode='r').read_image()[:, :, [2, 1, 0]].transpose((2, 0, 1))
        image2 = match_histograms(image2, image1, multichannel=True)
        label = TIFF.open(self.image_path_list_mask[idx], mode='r').read_image()
        label = (label / 255).astype(np.uint8)

        return torch.from_numpy(image1.astype(np.float32)), torch.from_numpy(image2.astype(np.float32)), torch.from_numpy(label).long()

    def __len__(self):
        return len(self.image_path_list_2018)
import torch
import torch.nn as nn
import torch.nn.functional as F


class TverskyLoss(nn.Module):
    def __init__(self, alpha=0.5, beta=0.5, eps=1e-7, size_average=True):
        super(TverskyLoss, self).__init__()
        self.alpha = alpha
        self.beta = beta
        self.size_average = size_average
        self.eps = eps

    def forward(self, logits, true):
        """Computes the Tversky loss [1].
        Args:
            true: a tensor of shape [B, H, W] or [B, 1, H, W].
            logits: a tensor of shape [B, C, H, W]. Corresponds to
                the raw output or logits of the model.
            alpha: controls the penalty for false positives.
            beta: controls the penalty for false negatives.
            eps: added to the denominator for numerical stability.
        Returns:
            tversky_loss: the Tversky loss.
        Notes:
            alpha = beta = 0.5 => dice coeff
            alpha = beta = 1 => tanimoto coeff
            alpha + beta = 1 => F beta coeff
        References:
            [1]: https://arxiv.org/abs/1706.05721
        """
        num_classes = logits.shape[1]
        if num_classes == 1:
            true_1_hot = torch.eye(num_classes + 1)[true.squeeze(1)]
            true_1_hot = true_1_hot.permute(0, 3, 1, 2).float()
            true_1_hot_f = true_1_hot[:, 0:1, :, :]
            true_1_hot_s = true_1_hot[:, 1:2, :, :]
            true_1_hot = torch.cat([true_1_hot_s, true_1_hot_f], dim=1)
            pos_prob = torch.sigmoid(logits)
            neg_prob = 1 - pos_prob
            probas = torch.cat([pos_prob, neg_prob], dim=1)
        else:
            true_1_hot = torch.eye(num_classes)[true.squeeze(1)]
            true_1_hot = true_1_hot.permute(0, 3, 1, 2).float()
            probas = F.softmax(logits, dim=1)

        true_1_hot = true_1_hot.type(logits.type())
        dims = (0,) + tuple(range(2, true.ndimension()))
        intersection = torch.sum(probas * true_1_hot, dims)
        fps = torch.sum(probas * (1 - true_1_hot), dims)
        fns = torch.sum((1 - probas) * true_1_hot, dims)
        num = intersection

这个程序文件主要分为以下几个部分:

  1. 导入所需的库,包括matplotlib、numpy、os等。
  2. 定义了一个normalize函数,用于将图像进行归一化处理。
  3. 定义了一个root变量,表示数据集的根目录。
  4. 使用glob库获取数据集中的图像文件路径,并按照文件名进行排序。
  5. 使用libtiff库读取图像文件,并使用match_histograms函数将2018年的图像进行直方图匹配。
  6. 使用matplotlib库显示图像。
  7. 定义了一个UNet类,表示一个U-Net模型,包括双卷积层、上采样层和输出层。
  8. 使用torchsummary库打印出模型的结构。
  9. 定义了一个SctDataset类,表示数据集,包括获取图像和标签的方法。
  10. 使用torch.utils.data库定义了一个DataLoader对象,用于加载数据集。
  11. 定义了一个TverskyLoss类,表示Tversky损失函数,用于计算模型的损失。
  12. 使用torch.nn.functional库定义了一个sigmoid函数,用于将模型的输出转化为概率值。

6.系统整体结构

整体功能和构架概述:
该程序是一个基于深度学习的遥感图像变化差异可视化系统。它使用U-Net模型对2018年和2019年的遥感图像进行对比,以检测和可视化图像之间的变化差异。

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

文件名功能
change-detection-quick-start.py主程序文件,包含了整个系统的主要逻辑和流程
normalize.py定义了一个normalize函数,用于将图像进行归一化处理
UNet.py定义了一个UNet类,表示一个U-Net模型,包括双卷积层、上采样层和输出层
dataset.py定义了一个SctDataset类,表示数据集,包括获取图像和标签的方法
loss.py定义了一个TverskyLoss类,表示Tversky损失函数,用于计算模型的损失
utils.py包含一些辅助函数,如读取图像文件、显示图像等
上述代码均合并为ipynb以ipynb代码为准

以上文件共同构成了该系统的功能和架构。主程序文件change-detection-quick-start.py负责整个系统的流程控制,调用其他文件中定义的函数和类来完成图像处理、模型训练和可视化等任务。其他文件中定义的函数和类则提供了具体的功能实现,如图像归一化、模型定义、数据集加载和损失计算等。

7.影像预处理

为提高图像分析精度,需要在实际变化检测之前,对两个时期的卫星遥感影像进行预处理,主要目的是纠正遥感影像中的几何及辐射变形,包括去薄雾、图像精配准、裁剪和辐射归一化等。
(1)几何纠正
分别对两期全色卫星遥感影像采用基于地面控制点的多项式方法进行几何纠正,灰度重采样方法为双线性内插。对单景多光谐卫星遥感影像采用多项式方法,并与几何纠正后的全色卫星遥感影像进行配准纠正。
(2)几何配准
研究结果表明,对于变化检测来说,两期影像之间的配准误差(平均均方误差)应小于半个像元[1]。对于未达到配准精度的两期卫星遥感影像可以采用最小二乘法实现影像精配准,达到要求的配准精度。
(3)去薄雾
对于较模糊的影像,应用遥感处理软件如ER-DAS实现去薄雾处理。处理后,图像目视效果良好,纹理清晰。
(4)裁剪
对两时相影像按同区域范围裁切,使得两时相影像区域大小完全一致,便于变化检测。
(5)辐射归一化
采用线性回归法进行辐射纠正,该方法假设两时相影像中相同位置采集的无变化地物的灰度值呈线性相关。

8.几类变化检测方法

基于多光谱影像变化向量分析法

变化向量是描述从时相1到时相⒉变化的方向和大小的光谱变化向量,如图(a)。
设时相t1,t2图像的灰度矢量分别为G=(gl. g2… , g>和H =(h1,h2,… . ,h)T,则变化向量为:

在这里插入图片描述
按照变化强度AG 的定义,不难发现△G |l越大,表明图像的差异越大,变化发生的可能性越大。因此,检测变化和非变化像元,可根据变化强度△G的大小,设定阈值来实现。即像元△G l超过某一阈值时,即可判定为发生变化的像元。变化的类型可由△G的指向确定,如图1(b)说明变化没有发生或不能被探测到,因为变化强度没有超过阈值;而图1©.(d)则说明不同类型的变化已经发生。
在这里插入图片描述
变化向量分析方法的技术流程见图2。
在这里插入图片描述

9.差值主成分分析法

图像的主成分变换(PCA)是在统计特征基础上进行的一种多波段正交变换,进行的线性变换如公式(3),将原始分布在各个波段上的信息集中到少数几个互补相关的变化结果分量中,从而达到冗余压缩和信息集中的目的。差值主成分分析法实质是基于主分量变换的变化检测方法,先求两时相影像间的差值,再对多元差值影像做主成分变换,在得到的差值主成分图像上进行阈值提取,提取变化信息。
在这里插入图片描述

是原始图像,¥是变化后的图像,T为正交变化矩阵,由原图像协方差矩阵或者相关矩阵的特征向量组成。
差值主成分分析法的变化检测能分离变化信息,将信息量集中到少数几个主分量中。较之直接差值法,减少了波段数量,并且更能突出变化信息。差值主成分分析法的技术流程见图3。

在这里插入图片描述

全色影像差值法变化检测

全色影像差值法直接利用像元亮度值来进行变化检测,对经过预处理后的两时相全色影像做差值,后一时相影像减去前一时相影像,得到差值图像,在此差值图像的基础上选取适当的阈值提取变化信息。
全色影像差值法的技术流程见图4。
在这里插入图片描述

ERDAS的 DELTCUE自动检测

ERDAS的 DELTCUE自动检测是一套封装完整的变化检测模块,利用该模块进行变化检测简单方便快速。在对两期影像进行配准等预处理后,首先利用该模块对两期影像根据需要进行裁切、归一化预处理,然后选择合适的变化检测策略进行检测并生成掩膜,选择合适的过滤法则进行伪变化的剔除,最后获取变化信息,并可以根据需要选择输出的格式。
ERDAS的 DELTCUE检测其技术流程见图5。
在这里插入图片描述

10.遥感图像变化差异检测

该方法的优点是可以利用全部的波段来探测变化像元,从而避免了单一波段比较带来的信息不完整,而且可以通过变化向量的方向提供变化类型的信息。此方法对于新增建筑物、新增道路以及水系变其他的变化非常敏感,对于其他变水系的变化遗漏较多,存在以下难点:
①阈值的选取。通过选取典型变化区域的训练样本,应用变步长阈值搜索的方法来确定阈值。阈值选取的关键在于典型变化区域的选取以及步长的确定。阈值的确定需要经过多次搜索。
②变化类型的准确确定。符号编码对应的变化类型难以判断,存在“一对多”(一个编码对应多个类型)或“多对一”(一个类型对应多个编码)的情况,使得提取的变化类型遗漏或者包含其他类型信息。
③伪变化信息难于有效去除。该方法获得的道路变化检测存在的伪变化信息较多,主要原因为前后期影像上道路表面覆盖物发生变化,使得前后期影像波谱变化较大。由于云层的存在造成的伪变化未能有效去除。
④漏检率高。由于该方案在全图范围使用的是单个阈值,在进行变化检测时发生漏检的情况较多,主要是因为有些地物变化前后光谱变化未在该阈值范围之内造成。

差值主成分分析法

差值主成分分析法变化信息提取效果见图。
在这里插入图片描述

图7差值主成分分析变化信息提取效果图
利用该方法能够检测出ALOS卫星遥感影像大部分的变化信息。对于变化类型的确定存在困难,需要进行人工干预,存在以下难点:
①变化类型难以自动区分。4种变化信息基本能提取出来,但提取后变化类型的自动确定困难,需进行人工干预。
②阈值的选取。阈值选取通过人工选取变化区域样本,进行统计分析,确定阈值。阈值的选择依据个人经验。
③漏检率高。该方法漏检率高,主要原因是对水系的变化不太敏感。

全色影像变化检测法

全色影像差值法变化信息提取效果见图8.
在这里插入图片描述

ALOS全色影像对于建筑物以及道路的变化信息非常敏感,提取出的此两类变化信息的精度非常高。但存在以下难点:
①建筑物与道路的变化类型难以区分。两种变化类型的灰度特性类似,提取的变化类型图中混淆严重。
②阈值需人工选取,受个人经验影响。
③城市场景中复杂的生态环境和各种人造目标的复杂性,使得该方法很难有效地描述和比较这些复杂的对象。
④各种原因(遮挡和阴影造成信息损失以及地物表面覆盖物变化等)引起的伪变化,降低变化检测精度。

ERDAS的DELTCUE变化检测

ERDAS的 DELTCUE变化检测法的变化信息提取效果见图9。

在这里插入图片描述

11.系统整合

下图完整源码&数据集&环境部署视频教程&自定义UI界面

在这里插入图片描述

参考博客《基于深度学习的遥感图像变化差异可视化系统》

12.参考文献


[1]钟凯文,孙彩歌,解靓.基于GIS的广州市土地利用遥感动态监测与变化分析[J].地球信息科学学报.2009,(1).DOI:10.3969/j.issn.1560-8999.2009.01.017 .

[2]李淼,张永红,张继贤.绿地信息提取研究[J].测绘科学.2007,(2).DOI:10.3771/j.issn.1009-2307.2007.02.047 .

[3]朱运海,张百平,曹银璇,等.土地利用/覆被变化遥感检测方法与应用分析[J].地球信息科学.2007,(3).DOI:10.3969/j.issn.1560-8999.2007.03.022 .

[4]韩振镖,胡珂,李成名.基于IKONOS影像监测城市变化方法研究[J].测绘通报.2007,(5).DOI:10.3969/j.issn.0494-0911.2007.05.016 .

[5]刘玉芳,刘定生.利用纹理特征提取城市用地信息方法探索[J].测绘科学.2005,(4).46-47,56.

[6]唐德可,付琨,王宏琦.基于光谱和空域信息的城区变化检测方法研究[J].测绘科学.2005,(6).DOI:10.3771/j.issn.1009-2307.2005.06.012 .

[7]孙晓霞,张继贤.土地利用动态遥感监测的误差分析[J].测绘科学.2003,(4).DOI:10.3771/j.issn.1009-2307.2003.04.015 .

[8]陈晋,何春阳,史培军,等.基于变化向量分析的土地利用/覆盖变化动态监测(Ⅰ)–变化阈值的确定方法[J].遥感学报.2001,(4).DOI:10.3321/j.issn:1007-4619.2001.04.004 .

[9]张路.基于多元统计分析的遥感影像变化检测方法研究[J].武汉大学.2004.

[10]赵英时等编著. 遥感应用分析原理与方法 [M].科学出版社,

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

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

相关文章

Javaweb | Servlet编程

目录: 1.认识Servlet2.编写Servlet3.Servlet的运行机制4.Servlet的生命周期4.1 Servlet生命周期图init()方法doGet()doPost()service()destroy()方法 5.解决“控制台”打印中文乱码问题6.Servlet 和 JSP内置对象 (常用对象)获得out对象获得request 和 response对象获得session对…

KeePass开源密码管理器

KeePass开源密码管理器 KeePass 是一款免费的开源密码管理器,KeePass 将密码存储为一个数据库,而这个数据库由一个主密码或密码文件锁住,也就是说我们只需要记住一个主密码,或使用一个密码文件,就可以解开这个数据库&a…

每日一题:LeetCode-11.盛水最多的容器

每日一题系列(day 13) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50e…

服务器安装JDK17 版本显示JDK8

服务器之前安装的是JDK8,后面升级JDK17后,发现执行 java -vsrsion 显示的是此时我的环境变量已经换成了JAVA17的路径 输入: vim /etc/profile 解决办法: 1.更新自己环境变量 bash export JAVA_HOME/usr/local/jdk-17.0.7 …

【科普】什么是电子印章? PS抠的印章能用吗?

各类扣章教程一搜一大堆,说明大家对于电子印章使用需求很高。不过要谨记,不要随便抠印章用于公文、证明书、合同协议、收据发票等电子文件,否则可能会吃牢饭。 单是一张电子化的图片是不具备合法性的。那有的人就要问了,我见到的…

读书笔记-《数据结构与算法》-摘要4[插入排序]

插入排序 核心:通过构建有序序列,对于未排序序列,在已排序序列中从后向前扫描(对于单向链表则只能从前往后遍历),找到相应位置并插入。实现上通常使用in-place排序(需用到O(1)的额外空间) 从第一个元素开始,该元素可…

【微服务】springboot整合quartz使用详解

目录 一、前言 二、quartz介绍 2.1 quartz概述 2.2 quartz优缺点 2.3 quartz核心概念 2.3.1 Scheduler 2.3.2 Trigger 2.3.3 Job 2.3.4 JobDetail 2.4 Quartz作业存储类型 2.5 适用场景 三、Cron表达式 3.1 Cron表达式语法 3.2 Cron表达式各元素说明 3.3 Cron表达…

封装PoiExcelUtils

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 为什么要封装PoiExcelU…

Openfire CVE-2023-32315(metasploit版)

step1:用docker搭建环境 Step2:docker查看映射端口 Step3:打开mysql和apache2,访问特定端口,然后靶标应用。 Step4:用metasploit进行攻击: 首先,打开metasploit,然…

Java (JDK 21) 调用 OpenCV (4.8.0)

Java 调用 OpenCV 一.OpenCV 下载和安装二.创建 Java Maven 项目三.其他测试 一.OpenCV 下载和安装 Open CV 官网 可以下载编译好的包,也可以下载源码自行编译 双击安装 opencv-4.8.0-windows.exe 默认为当前目录 安装即解压缩 根据系统位数选择 将 x64 目录下 op…

数据结构 | 查漏补缺之求叶子结点,分离链接法、最小生成树、DFS、BFS

求叶子结点的个数 参考博文: 树中的叶子结点的个数 计算方法_求树的叶子节点个数-CSDN博客 分离链接法 参考博文 数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)_线性…

Linux存储软件栈到底有多复杂,存储软件栈全景概览

从今天开始,我们将介绍一下Linux的存储软件栈,也称为IO栈。今天我们先从整体上了解一下Linux的整个IO栈,后续再深入介绍每个组件。我们很难说清楚Linux的存储软件栈到底有多复杂,但thomas-krenn的一张图可能可以给大家一个比较直观…

堆的相关时间复杂度计算(C语言)

目录 前言 建堆的时间复杂度 向上调整建堆的时间复杂度 向下调整建堆的时间复杂度 维护堆的时间复杂度 top K问题的时间复杂度 前言 在前面的三篇文章中我们成功的实现了堆排序的升降序以及基于堆的top K问题,现在我们来解决它们的时间复杂度问题 建堆的时间…

查看Linux的Ubuntu的版本

我的Ubuntu版本是 Jammy x86_64,即 Ubuntu 22.04.3 LTS,代号为"Jammy Jellyfish",架构是 x86_64(64位)。

UEC++ 探索虚幻5笔记 day11

虚幻5.2.1探索 项目目录探索 C工程一定不能是中文路径,中文项目名,最好全部不要用中文,蓝图项目可以是中文浅浅创建一个空项目,讲解一下之前UE4没有讲解的项目目录文件的分布组成 .vs:文件夹一般是项目编译缓存文件夹…

linux安装mysql5.7(一遍过)

之前安装的时候遇到了很多问题,浪费了一些时间。整理出这份教程,照着做基本一遍过。 这是安装包: 链接:https://pan.baidu.com/s/1gBuQBjA4R5qRYZKPKN3uXw?pwd1nuz 1.下载安装包,上传到linux。我这里就放到downloads目录下面…

游戏盾的防御原理以及为什么程序类型更适合接入游戏盾。

游戏盾是一种专门用于游戏服务器的安全防护服务,旨在抵御各种网络攻击。它的原理主要包括以下几个方面: 流量清洗和过滤:游戏盾会对进入游戏服务器的流量进行实时监测、分析和过滤。它通过识别恶意流量和攻击流量,过滤掉其中的攻击…

多种混沌映射初始化种群MATLAB代码(开源代码)

五种混沌映射改进鲸鱼算法(自行切换): clc clear close allSearchAgents_no30; % Number of search agents %种群数量Function_nameF1; % Name of the test function that can be from F1 to F23 (Table 1,2,3 in the paper) %使用方程的名…

【java设计模式】——代理设计模式,两种举例说明

代理设计模式 1.介绍 Spring 框架中AOP底层使用动态代理设计模式。通过学习动态代理设计模式可以很好的理解Spring框架AOP底层 代理模式(Proxy)是GoF23种设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理&am…

浅谈https

1.网络传输的安全性 http 协议:不安全,未加密https 协议:安全,对请求报文和响应报文做加密 2.对称加密与非对称加密 2.1 对称加密 特点: 加解密使用 相同 秘钥 高效,适用于大量数据的加密场景 算法公开&a…