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

news2024/12/27 21:22:15

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].科学出版社,

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

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

相关文章

hive-3.1.2环境安装实验

1.修改hadoop相关参数 1-修改core-site.xml [bigdata@master hive]$ vim /opt/module/hadoop/etc/hadoop/core-site.xml <!-- 配置该bigdata(superUser)允许通过代理访问的主机节点 --><property><name>hadoop.proxyuser.bigdata.hosts</name><va…

FastAPI的请求体参数

FastAPI 请求体参数 所谓的请求体参数&#xff0c;就是不在url中的发送的数据&#xff0c;其实我们应该知道http协议是什么。 所谓的协议&#xff0c;就是一种格式的约定。举个生活中的简单的例子&#xff0c;你想买个早餐&#xff0c;你要问老板鸡蛋灌饼多少钱&#xff0c;老…

Python查看文件列表

os.listdir 是 Python 的一个内置函数&#xff0c;用于列出指定目录中的所有文件和子目录。它接受一个字符串参数&#xff0c;即要列出内容的目录的路径。 列出当前工作目录中的所有文件和子目录 files_and_dirs os.listdir() print(files_and_dirs) 列出指定目录中的所…

一则广告,一个故事,这就我选择学习计算机专业的两个原因

还记得当初自己为什么选择计算机&#xff1f; 现在回想起来&#xff0c;当初驱使自己选择学习计算机专业的原因&#xff0c;一共有两个&#xff1a; 一、一则长城电脑的广告。 上个世纪80年代&#xff0c;我还在读小学&#xff0c;当时在中央电视台上经常播放着的长城电脑的一则…

(NeRF学习)3D Gaussian Splatting Instant-NGP

学习参考&#xff1a; 3D Gaussian Splatting入门指南【五分钟学会渲染自己的NeRF模型&#xff0c;有手就行&#xff01;】 三维重建instant-ngp环境部署与colmap、ffmpeg的脚本参数使用 一、3D Gaussian Splatting &#xff08;一&#xff09;3D Gaussian Splatting环境配置…

(一)rtthread主线程启动流程

&#xff08;一&#xff09;rtthread主线程启动流程 声明1.启动分析2.源码分析 声明 本文主要为个人学习笔记内容总结&#xff0c;有来自网络及其他&#xff0c;如有雷同&#xff0c;请告知。 1.启动分析 基于&#xff1a;rt-thread-v5.0.1 先执行&#xff1a;汇编代码start…

一文3000字从0到1用Python进行gRPC接口测试!

gRPC 是一个高性能、通用的开源RPC框架&#xff0c;其由 Google 主要面向移动应用开发并基于HTTP/2 协议标准而设计&#xff0c;基于 ProtoBuf(Protocol Buffers) 序列化协议开发&#xff0c;且支持众多开发语言。 自gRPC推出以来&#xff0c;已经广泛应用于各种服务之中。在测…

2023新优化应用:RIME-CNN-LSTM-Attention超前24步多变量回归预测算法

程序平台&#xff1a;适用于MATLAB 2023版及以上版本。 霜冰优化算法是2023年发表于SCI、中科院二区Top期刊《Neurocomputing》上的新优化算法&#xff0c;现如今还未有RIME优化算法应用文献哦。RIME主要对霜冰的形成过程进行模拟&#xff0c;将其巧妙地应用于算法搜索领域。 …

创建第一个 Flink 项目

一、运行环境介绍 Flink执行环境主要分为本地环境和集群环境&#xff0c;本地环境主要为了方便用户编写和调试代码使用&#xff0c;而集群环境则被用于正式环境中&#xff0c;可以借助Hadoop Yarn、k8s或Mesos等不同的资源管理器部署自己的应用。 环境依赖&#xff1a; 【1】…

RTL编码(2)——模块优化

一、顶层模块的划分 在RTL编码中&#xff0c;我们是以模块为单位进行设计的&#xff0c;模块之间的连接和嵌套关系对于电路结构有着很大的影响。一个好的系统设计中&#xff0c;我们应该使得模块尽量满足以下两个标准&#xff1a; 顶层模块扁平化内部模块层次化 1.1 顶层模块扁…

基于springboot + vue的社区医院信息系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

排序:快速排序(hoare版本)

目录 快速排序&#xff1a; 概念&#xff1a; 动画分析&#xff1a; 代码实现&#xff1a; 代码分析&#xff1a; 代码特性&#xff1a; 常见问题&#xff1a; 快速排序&#xff1a; 概念&#xff1a; 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&a…

LNMP网站架构分布式搭建部署(编译安装)

目录 一、数据库编译安装 二、nginx编译安装 三、php编译安装 三、通过nfs将三台不同的主机资源共享 四、基础测试 五、完成WordPress站点部署 六、完成bbs论坛站点部署 一、数据库编译安装 1、先下载安装包到/opt目录中&#xff0c;最好选择mysql-boost-5.7.44.tar.gz版…

Linux操作系统 中的用户管理,也就是关于用户的相关的操作与理解

目录 1 概念2 用户管理的类型3、模板目录4 查看历史命令5 相关文件6 创建用户useradd7 命令passwd 存储及shadow命令下的用户密码8 usermod命令&#xff08;修改属性&#xff09;9 密码设置10 删除命令userdel11 用户组的操作12 用户权限13 创建一个用户组&#xff0c;并且将这…

短视频账号矩阵系统源码搭建步骤包括以下几个方面:

短视频账号矩阵系统源码搭建步骤包括以下几个方面&#xff1a; 1. 确定账号类型和目标受众&#xff1a;确定要运营的短视频账号类型&#xff0c;如搞笑、美食、美妆等&#xff0c;并明确目标受众和定位。 2. 准备账号资料&#xff1a;准备相关资质和资料&#xff0c;如营业执照…

在Windows 11中,把iPhone照片和视频导出来又快又简单,无需第三方软件

如果你想将照片和视频从iPhone传输到Windows 11 PC&#xff0c;最快、最简单的方法是插入手机并执行自动导入。以下是操作方法。 如何将照片和视频从iPhone导入Windows 如果你用USB数据线将iPhone插入Windows PC&#xff0c;Windows 11可以像标准数码相机一样连接到它&#x…

nacos在win11无法正常启动,一闪而过,pause也不停止。【已解决】

问题一闪而过&#xff0c;无法抓屏。 1.首先排除配置文件和数据库问题&#xff1b; 2.问题及解决方法&#xff1a; 分析&#xff1a;startup.cmd在执行时&#xff0c;无法找到jdk&#xff1b; 解决方法&#xff1a;配置jdk到环境变量&#xff1b; 再次启动正常&#xff1b;

用Pandas轻松进行7项基本数据检查

大家好&#xff0c;作为一名数据工程师&#xff0c;面对糟糕的数据质量&#xff0c;可以使用Pandas执行快捷的数据质量检查。本文使用scikit-learn提供的California Housing数据集&#xff0c;进行基本数据检查。 一、California Housing数据集概述 【数据集】&#xff1a; …

黑苹果之显卡篇

一、什么是显卡 显卡GPU&#xff08;Video card、Display card、Graphics card、Video adapter&#xff09;是个人计算机基础的组成部分之一&#xff0c;将计算机系统需要的显示信息进行转换驱动显示器&#xff0c;并向显示器提供逐行或隔行扫描信号&#xff0c;控制显示器的正…

关键字volatile作用和用法

目录 一、多线程编程中的volatile关键字 二、嵌入式编程中的volatile关键字 三、 优化编译器优化 四、 指针类型转换 一个定义为volatile的变量是说这变量可能会被意想不到地改变&#xff0c;这样&#xff0c;编译器就不会去假设这个变量的值了。 精确地说就是&#xff0c;…