YOLO NAS note 1

Git Hub: https://github.com/Deci-AI/super-gradients

Yolo-Nas 的代码比YOLO v8 还恐怖。之前的YOLO数据可以通过:
coco_detection_yolo_format_train, 和 coco_detection_yolo_format_val 自动转。

这里写目录标题

  • Train
    • 数据获取
    • 数据增强
    • 训练
      • criterion
      • params
      • EMA
      • self.training_params.batch_accumulate
      • model
      • QARepVGGBlock
    • outputs = self.net(inputs)
  • Test
  • Deci
  • Architecture
    • QARepVGG
      • reparameterizationbased models 有 quantization 困难
      • 问题1
      • 问题1的解决方案
      • 问题2
      • 问题2的解决方案
      • 总结

Train

YOLO-NAS 的使用和 YOLO v8 类似。以下是parameters:
https://docs.deci.ai/super-gradients/super_gradients.training.html

from roboflow import Roboflow
import super_gradients
from super_gradients.training import Trainer
from super_gradients.training import dataloaders
from super_gradients.training.dataloaders.dataloaders import coco_detection_yolo_format_train, coco_detection_yolo_format_val

from super_gradients.training.losses import PPYoloELoss
from super_gradients.training.metrics import DetectionMetrics_050
from super_gradients.training.models.detection_models.pp_yolo_e import PPYoloEPostPredictionCallback
from super_gradients.training import models


import os

super_gradients.setup_device(device='cuda')
CHECKPOINT_DIR = 'helmet_checkpoints'
trainer = Trainer(experiment_name='helmet', ckpt_root_dir=CHECKPOINT_DIR)



if not os.path.exists('EEP_Detection-1'):
    rf = Roboflow(api_key="IuYv6KOKs5p62rFSLvGa")
    project = rf.workspace("objet-detect-yolov5").project("eep_detection-u9bbd")
    dataset = project.version(1).download("yolov5")

# dataset_params = {
#     'data_dir':r'E:\data\alldata',
#     'train_images_dir': r'E:\data\alldata\train',
#     'train_labels_dir': r'E:\data\alldata\train',
#     'val_images_dir': r'E:\data\alldata\val',
#     'val_labels_dir': r'E:\data\alldata\val',
#     'test_images_dir': r'E:\data\alldata\val',
#     'test_labels_dir': r'E:\data\alldata\val',
#     'classes': ['helmet', 'normal']
# }

dataset_params = {
    'data_dir':r'E:\data\helmet_head_2labels',
    'train_images_dir': r'E:\data\helmet_head_2labels\train',
    'train_labels_dir': r'E:\data\helmet_head_2labels\train',
    'val_images_dir': r'E:\data\helmet_head_2labels\val',
    'val_labels_dir': r'E:\data\helmet_head_2labels\val',
    'test_images_dir': r'E:\data\helmet_head_2labels\val',
    'test_labels_dir': r'E:\data\helmet_head_2labels\val',
    'classes': ['helmet', 'normal']
}

mytransform = [{'DetectionStandardize': {'max_value': 255}},
               {'DetectionMosaic': {'input_dim': [640, 640], 'prob': 1.0}},
               {'DetectionRandomAffine': {'degrees': 10.0, 'translate': 0.1, 'scales': [0.1, 2], 'shear': 2.0, 'target_size': [640, 640], 'filter_box_candidates': True, 'wh_thr': 2, 'area_thr': 0.1, 'ar_thr': 20}},
               {'DetectionMixup': {'input_dim': [640, 640], 'mixup_scale': [0.5, 1.5], 'prob': 1.0, 'flip_prob': 0.5}},
               {'DetectionHSV': {'prob': 1.0, 'hgain': 5, 'sgain': 30, 'vgain': 30}},
               {'DetectionHorizontalFlip': {'prob': 0.5}},
               {'DetectionPaddedRescale': {'input_dim': [640, 640], 'max_targets': 120}},
               {'DetectionTargetsFormatTransform': {'input_dim': [640, 640], 'output_format': 'LABEL_CXCYWH'}}]

train_data = coco_detection_yolo_format_train(
    dataset_params={
        'data_dir': dataset_params['data_dir'],
        'images_dir': dataset_params['train_images_dir'],
        'labels_dir': dataset_params['train_labels_dir'],
        'classes': dataset_params['classes'],
        'transforms': mytransform
    },
    dataloader_params={
        'batch_size':8,
        'num_workers':2
    }
)

val_data = coco_detection_yolo_format_val(
    dataset_params={
        'data_dir': dataset_params['data_dir'],
        'images_dir': dataset_params['val_images_dir'],
        'labels_dir': dataset_params['val_labels_dir'],
        'classes': dataset_params['classes'],
        #'transforms': [{'DetectionStandardize': {'max_value': 255}},
          #             {'DetectionPaddedRescale':{'input_dim': [640, 640], 'max_targets': 120}},
              #         {'DetectionTargetsFormatTransform': {'input_dim': [640, 640], 'output_format': 'LABEL_CXCYWH'}}
                       ]
    },
    dataloader_params={
        'batch_size':8,
        'num_workers':2
    }
)

test_data = coco_detection_yolo_format_val(
    dataset_params={
        'data_dir': dataset_params['data_dir'],
        'images_dir': dataset_params['test_images_dir'],
        'labels_dir': dataset_params['test_labels_dir'],
        'classes': dataset_params['classes'],
        #'transforms': [{'DetectionStandardize': {'max_value': 255}},
                      # {'DetectionPaddedRescale':{'input_dim': [640, 640], 'max_targets': 120}},
                      # {'DetectionTargetsFormatTransform': {'input_dim': [640, 640], 'output_format': 'LABEL_CXCYWH'}}
                       ]
    },
    dataloader_params={
        'batch_size':8,
        'num_workers':2
    }
)
print(train_data.dataset.transforms)
print(train_data.dataset.dataset_params['transforms'][2])
train_data.dataset.dataset_params['transforms'][2]['DetectionRandomAffine']['degrees'] = 10.42
# train_data.dataset.plot()
model = models.get('yolo_nas_s', 
                   num_classes=len(dataset_params['classes']), 
                   pretrained_weights="coco"
                   )
train_params = {
    # ENABLING SILENT MODE
    'silent_mode': False,
    "average_best_models":True,
    "warmup_mode": "linear_epoch_step",
    "warmup_initial_lr": 1e-6,
    "lr_warmup_epochs": 3,
    "initial_lr": 5e-4,
    "lr_mode": "cosine",
    "cosine_final_lr_ratio": 0.1,
    "optimizer": "Adam",
    "optimizer_params": {"weight_decay": 0.0001},
    "zero_weight_decay_on_bias_and_bn": True,
    "ema": True,
    "ema_params": {"decay": 0.9, "decay_type": "threshold"},
    # ONLY TRAINING FOR 10 EPOCHS FOR THIS EXAMPLE NOTEBOOK
    "max_epochs": 3,
    "mixed_precision": False,
    "loss": PPYoloELoss(
        use_static_assigner=False,
        # NOTE: num_classes needs to be defined here
        num_classes=len(dataset_params['classes']),
        reg_max=16
    ),
    "valid_metrics_list": [
        DetectionMetrics_050(
            score_thres=0.1,
            top_k_predictions=30,
            # NOTE: num_classes needs to be defined here
            num_cls=len(dataset_params['classes']),
            normalize_targets=True,
            post_prediction_callback=PPYoloEPostPredictionCallback(
                score_threshold=0.01,
                nms_top_k=1000,
                max_predictions=30,
                nms_threshold=0.7
            )
        )
    ],
    "metric_to_watch": 'mAP@0.50'
}
if __name__ == '__main__':
    trainer.train(model=model,
                training_params=train_params, 
                train_loader=train_data, 
                valid_loader=val_data)
    best_model = models.get('yolo_nas_s',
                            num_classes=len(dataset_params['classes']),
                            checkpoint_path="helmet_checkpoints/helmet/ckpt_best.pth")
    trainer.test(model=best_model,
                test_loader=test_data,
                test_metrics_list=DetectionMetrics_050(score_thres=0.1, 
                                                    top_k_predictions=300, 
                                                    num_cls=len(dataset_params['classes']), 
                                                    normalize_targets=True, 
                                                    post_prediction_callback=PPYoloEPostPredictionCallback(score_threshold=0.01, 
                                                                                                            nms_top_k=1000, 
                                                                                                            max_predictions=300,                                                                              
                                                                                                            nms_threshold=0.7)
                                                    ))

数据获取

  • YoloDarknetFormatDetectionDataset (super-gradients-master\src\super_gradients\training\datasets\detection_datasets)
    - _setup_data_source:获取路径里的所有数据list

数据增强

增强的内容在transforms.py (super-gradients-master\src\super_gradients\training\transforms)
Nas 支持很多个大方向的内容,下面是例子:

DetectionMosaic('additional_samples_count': 3, 'non_empty_targets': False, 'prob': 1.0, 'input_dim': [640, 640], 'enable_mosaic': True, 'border_value': 114)
DetectionRandomAffine('additional_samples_count': 0, 'non_empty_targets': False, 'degrees': 10.0, 'translate': 0.1, 'scale': [0.1, 2], 'shear': 2.0, 'target_size': [640, 640], 'enable': True, 'filter_box_candidates': True, 'wh_thr': 2, 'ar_thr': 20, 'area_thr': 0.1, 'border_value': 114)
DetectionMixup('additional_samples_count': 1, 'non_empty_targets': True, 'input_dim': [640, 640], 'mixup_scale': [0.5, 1.5], 'prob': 1.0, 'enable_mixup': True, 'flip_prob': 0.5, 'border_value': 114)
DetectionHSV('additional_samples_count': 0, 'non_empty_targets': False, 'prob': 1.0, 'hgain': 5, 'sgain': 30, 'vgain': 30, 'bgr_channels': (0, 1, 2), '_additional_channels_warned': False)
DetectionHorizontalFlip('additional_samples_count': 0, 'non_empty_targets': False, 'prob': 0.5, 'max_targets': 120)
DetectionPaddedRescale('swap': (2, 0, 1), 'input_dim': [640, 640], 'max_targets': 120, 'pad_value': 114) 
DetectionTargetsFormatTransform('additional_samples_count': 0, 'non_empty_targets': False, 'input_format': OrderedDict([('bboxes', name=bboxes length=4 format=<super_gradients.training.datasets.data_formats.bbox_formats.xyxy.XYXYCoordinateFormat object at 0x000001D80A2BE100>), ('labels', name=labels length=1)]), 'output_format': OrderedDict([('labels', name=labels length=1), ('bboxes', name=bboxes length=4 format=<super_gradients.training.datasets.data_formats.bbox_formats.cxcywh.CXCYWHCoordinateFormat object at 0x000001D80A2E92B0>)]), 'max_targets': 120, 'min_bbox_edge_size': 1, 'input_dim': [640, 640], 'targets_format_converter': <super_gradients.training.datasets.data_formats.format_converter.ConcatenatedTensorFormatConverter object at 0x000001D834D18C70>)

> * 比如我想要数据集做下 standardisation: 仅 ‘/255’, 那么在test,val里都得加上和train一样的standardisation, 让进model的数据值的分布一致(0-1之间)和yolo 之前操作一样,我需要一个letterbox, 辣么 train,val, test 的letterbox做法要一致(尺寸大小得一致,但是letterbox是居中还是如yolo nas 是放在上方,这几个过程要不要一致,其实看你啦)
*还有一个是格式转换:DetectionTargetsFormatTransform,这个在train里有的,在val, test 也必须加上。

训练

Trainer (super-gradients-master\src\super_gradients\training\sg_trainer)

criterion

这里的 DFL 从 YOLO v8 延续到NAS, 但是 YOLO v8 使用 CIOU
DFL + GIOU
class loss 同 yolov8 支持 varifocal loss

params

{'silent_mode': True, 
 'average_best_models': True, 
 'warmup_mode': 'linear_epoch_step', 
 'warmup_initial_lr': 1e-06, 
 'lr_warmup_epochs': 3, 
 'initial_lr': 0.0005, 
 'lr_mode': 'cosine', 'cosine_final_lr_ratio': 0.1, 
 'optimizer': 'Adam', 'optimizer_params': {'weight_decay': 0.0001},     
 'zero_weight_decay_on_bias_and_bn': True,
 'ema': True, 'ema_params': {'decay': 0.9, 'decay_type': 'threshold'}, 
 'max_epochs': 3, 
 'mixed_precision': False, 
 'loss': PPYoloELoss((static_assigner): ATSSAssigner()(assigner): TaskAlignedAssigner()), 
 'valid_metrics_list': [DetectionMetrics_050((post_prediction_callback): PPYoloEPostPredictionCallback())], 
 'metric_to_watch': 'mAP@0.50'}

EMA

Exponential Moving Average , 随时间移动而平滑函数让其接近真实值。越是近期的数据,权重越大。不单纯只是exponential (在这一点上比moving mean/sum 好)。SGD 里可以加入 EMA 帮助优化。
EMA 不适用于 non-stable function. 虽然模型在训练中,weight一直在变化,但它最终的期望还是使得model converge 到某个分布, 所以针对weight,这个依然是可以用EMA的。
但是,训练中的changing gradients, loss values, and model performance 都是 non-stable 的。当然,EMA是给weight用的,和这些内容无关。

self.training_params.batch_accumulate

内存友好,积累到一定数量,统一更新

model

super-gradients-master\src\super_gradients\training\utils
wrappednet ⇒ CustomizableDetector

def forward(self, x):
     x = self.backbone(x)
     x = self.neck(x)
     return self.heads(x)

QARepVGGBlock

Make RepVGG Greater Again: A Quantization-aware Approach

outputs = self.net(inputs)

outputs总的6个值

> 0:pred_scores    	(8,8400,2)	:Tensor
> 1:pred_distri		(8,8400,68)	:Tensor
> 2:anchors			(8400,4)	: Tensor
> 3:anchor_points		(8400,2)    : Tensor
> 4:num_anchors_list   	3       :list => [64001600400]
> 5:stride_tensor		(8400,1)    :Tensor
self._get_losses(outputs, targets) #target (138,6)

target 包含3个值

> 0:gt_class			(8,41,1)	:Tensor
> 1:gt_bbox            (8,41,4)	:Tensor
> 2:pad_gt_mask		(8,41,1:Tensor (bool)

Test

from roboflow import Roboflow
import super_gradients
from super_gradients.training import Trainer
from super_gradients.training import dataloaders
from super_gradients.training.dataloaders.dataloaders import coco_detection_yolo_format_train, coco_detection_yolo_format_val

from super_gradients.training.losses import PPYoloELoss
from super_gradients.training.metrics import DetectionMetrics_050
from super_gradients.training.models.detection_models.pp_yolo_e import PPYoloEPostPredictionCallback
from super_gradients.training import models

import glob
from pathlib import Path
import os
import torch

dataset_params = {
    'data_dir':r'E:\data\alldata',
    'train_images_dir': r'E:\data\alldata\train',
    'train_labels_dir': r'E:\data\alldata\train',
    'val_images_dir': r'E:\data\alldata\val',
    'val_labels_dir': r'E:\data\alldata\val',
    'test_images_dir': r'E:\data\alldata\val',
    'test_labels_dir': r'E:\data\alldata\val',
    'classes': ['helmet', 'normal']
}
super_gradients.setup_device(device='cuda')
CHECKPOINT_DIR = 'helmet_checkpoints'
trainer = Trainer(experiment_name='helmet', ckpt_root_dir=CHECKPOINT_DIR)

if __name__ == '__main__':
    best_model = models.get('yolo_nas_s',
                            num_classes=len(dataset_params['classes']),
                            checkpoint_path="helmet_checkpoints/helmet/ckpt_best.pth")
    device = 'cuda' if torch.cuda.is_available() else "cpu"
    import matplotlib
    matplotlib.use('TkAgg', force=True)
    imgfiles = glob.glob(str(Path('testImgs')/'*.*'),recursive=True)[13]
    outfolder = 'testresultss'
    os.makedirs(outfolder,exist_ok=True)
    predictions = best_model.predict(imgfiles)
    predictions.show()
    # predictions.save(output_folder="testresultss")  # Save in working directory
    # models.convert_to_onnx(model=best_model, input_shape=(3, 640, 640), out_path="yolo_nas_s.onnx")

Deci

不支持windows 和 MacOS

Architecture

yolo v8 与 yolo nas 主要的框架改编自YOLO v6, 大的框架不变,都是先backbone, 再Neck, 后Head.
可以说 v6开始,就和v5 有很大不同了. 在 v6 中:
改动最多的是backbone,虽然套路依然延续CSP时期的yolo v5, 但是内核已经从 CSP 变成了 RepVGG.
Top-Down 中的的 CSPPlayer 都替换成了 RepVGG.
Head 中,虽然依然贴心的分出3个分支做尺寸友好的检测增强,但是,比起v5, v6 有了更多的conv去继续提取特征。

QARepVGG

RepVGG 在 yolo v6 里用了。
yolo v6

reparameterizationbased models 有 quantization 困难

hmmmm… 之前的VAE, 有使用reparameterization 做 Gaussian distribution 的latent space 表示。也有用reparameterization 中 SVD技术做matrix分解的。这些方法一定程度上缓解了计算效率和节省内存。RepVGG 类似的用了multi-branch的结构。这些方式更多注重在训练时候。而PTQ更加强调是训练后,也就是inference 时。
reparameterization 会牺牲一定精度换取计算效率。如果在reparameterization 基础上做 PTQ,那相当于在误差里做更误差的事情。在reparameterization 的基础上,至少按常理来说,数值精度越高越保险。

Post Training Quantization (PTQ) is a technique to reduce the required computational resources for inference while still preserving the accuracy of your model by mapping the traditional FP32 activation space to a reduced INT8 space.

针对 PTQ这一点,QARepVGG 好过 RepVGG. 而且这个模型也是 “INT8”的来源。

文中提到:our models are comparable to RepVGG in terms of FP32 accuracy
Weight & Activation 是主要优化的地方

问题1

作者发现 BN中的mean 没有什么影响(集中于0附近,约为0),但是variance不是。
在这里插入图片描述(凡是斜杠的block都是BN,凡是实心的都是各种kernel)

在这里插入图片描述
M2 是第一层加法的结果。 Y3, Y1, Y0 分别代表上面 3x3, 1x1, Identity 的 kernels的BN后的结果。

以 kernels 3x3的为例子:

在这里插入图片描述
因为 D ( λ X ) = λ 2 D ( X ) D(λX) = λ^2D(X) D(λX)=λ2D(X), 假设 X ( 3 ) = M ( 1 ) W ( 3 ) X(3) = M(1)W(3) X(3)=M(1)W(3), 代入式子, D ( λ X ) D(λX) D(λX) = D ( Y ( 3 ) ) D(Y(3)) D(Y(3)), D ( X ) D(X) D(X) = D ( X ( 3 ) ) D(X(3)) D(X(3)):
在这里插入图片描述
以上内容证明了variance影响巨大,除此之外,RepVGG 里的loss L2,放大了上面的部分来减少loss,也使得因改变variance of activation,让PTQ在这里失败。

问题1的解决方案

作者的解决方案很直接,把有影响的地方直接去除:
在这里插入图片描述
在这里插入图片描述
目前,去除分母的做法能够使得在INT8 精度下,改进的方式的model 成绩优于 RepVGG 里的。

问题2

作者发现based在问题1的做法上,导致了layers中有些格格不入的outliers.
在这里插入图片描述
在这里插入图片描述
将问题1中的两个公式融合在一起为上面的M2,作者认为,前半部分的 γ / ϵ + σ 2 \gamma / \sqrt { \epsilon + \sigma ^2} γ/ϵ+σ2 如果本身值就大(特别是对于Y0, 因为它是identity的matrix,那么这个部分就会是1, 即 1*W0),它会把这个巨大的值贡献给经过fusion后的 同等 kernels。
作者后续,证明了 β 1 \beta _1 β1 = β 3 \beta _3 β3, 为 Expectation。(虽然这是个很标准的inductive的过程,但是对于 l k + 1 ∗ l^{k+1}* lk+1partial derivation 的部分有点懵)

作者还注意到RepVGG 使用的是 Relu, 但是基于常理: modern high-performance CNN models with BN often have zero means。 因此,为了防止 dead Relu, 全部相加在一起:
在这里插入图片描述

addition of the three branches introduces the covariate shift issue

问题2的解决方案

根据outlier 的layer锁定问题还是在variance of activation上,想要放大variance,并且证明了branch 1branch 3的期望结果一致,将三个branch的BN结果相加,来抵消dead Relu. 又因为考虑到 直接相加BN会导致 BN 的 方差位移,因此最终解决方案为在相加后的BN结果上再进行一次BN。

最终 S4 为整个 QARepVGG 的方案,并且达到了 PTQ!
在这里插入图片描述

总结

  • PTQ 是保障在FP32,INT8 上都要优于baseline model
  • BN 操作时,如果遇到Relu, 可以用文中技巧: B N ( ∑ 0 n B N ) BN(\sum_0^n BN) BN(0nBN)
  • BN 操作时,如果遇到模型不ok, 可以尝试去看一下每层layer BN的 mean 与 Variance
  • 应该可以放弃RepVGG 了,直接上QARepVGG

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

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

相关文章

ChatGPT 提问,软件杂项部分

堆内存与栈内存一般分别 有多少 ChatGPT 堆内存和栈内存的大小取决于操作系统和编译器的限制以及程序的运行环境。以下是一些常见的默认大小范围&#xff0c;但请注意这些值可以因环境而异&#xff1a; 栈内存大小&#xff1a; Windows平台&#xff1a;默认情况下&#xff…

CNN实现手写数字识别(Pytorch)

CNN结构 CNN&#xff08;卷积神经网络&#xff09;主要包括卷积层、池化层和全连接层。输入数据经过多个卷积层和池化层提取图片信息后&#xff0c;最后经过若干个全连接层获得最终的输出。 CNN的实现主要包括以下步骤&#xff1a; 数据加载与预处理模型搭建定义损失函数、优…

应用现代化中的弹性伸缩

作者&#xff1a;马伟&#xff0c;青云科技容器顾问&#xff0c;云原生爱好者&#xff0c;目前专注于云原生技术&#xff0c;云原生领域技术栈涉及 Kubernetes、KubeSphere、KubeKey 等。 2019 年&#xff0c;我在给很多企业部署虚拟化&#xff0c;介绍虚拟网络和虚拟存储。 2…

微服务架构初探

大家好&#xff0c;我是易安&#xff01;我们今天来谈一谈微服务架构的前世今生。 我们先来看看维基百科是如何定义微服务的。微服务的概念最早是在2014年由Martin Fowler和James Lewis共同提出&#xff0c;他们定义了微服务是由单一应用程序构成的小服务&#xff0c;拥有自己的…

建立在Safe生态的—GameFi SocialFi双赛道项目No.1头号玩家

最近大家关注的重点在BRC-20和MEME项目&#xff0c;人们似乎更在意短期的投机回报。而在这之外&#xff0c;一个web3的游戏——No.1头号玩家却得到了大量的玩家支持。 据了解&#xff0c;No.1是一个GameFi & SocialFi的双赛道web3游戏&#xff0c;中文名称为头号玩家。它是…

光纤衰减器作用及使用说明

在光纤通信中&#xff0c;光信号的强度过大或过小都会对信号的传输和接收产生不良的影响&#xff0c;因此光衰减器在光通信系统中起到了重要的作用。那什么是光衰减器呢&#xff1f;它又有什么作用呢&#xff1f;下面跟着小易一起来了解一下吧&#xff01; 一、什么是光纤衰减…

HUSTOJ中添加初赛练习系统

文章目录 0. 基于hustoj二开的初赛练习系统&#xff0c;QQ4705852261. 主界面2. 练习界面3. 模拟考试界面4. 查看试卷回放5. 后台操作界面6. 后台试题分类-列表7.后台试题-列表8. 后台试题-添加9. 后台试卷结构-设置 0. 基于hustoj二开的初赛练习系统&#xff0c;QQ470585226 …

[笔记]渗透测试工具Burpsuit《一》Burpsuit介绍

文章目录 前言一、安装配置1.1 环境1.2 安装过程1.3 科技过程 二、常用功能2.1 Manual penetration testing features2.2 Advanced/custom automated attacks2.3 Automated scanning for vulnerabilities2.4 Productivity tools2.5 Extensions 三、拓展功能 前言 Burp Suite(b…

一、预约挂号微服务模块搭建

文章目录 一、预约挂号微服务模块搭建1、项目模块构建2、sql资源3、构建父工程&#xff08;yygh-parent&#xff09;3.1、添加配置pom.xml 4、搭建common父模块4.1、搭建common4.2、修改配置pom.xml 5、搭建common-util模块5.1、搭建common-util5.2、修改配置pom.xml5.3、添加公…

ELK的安装部署与使用

ELK的安装与使用 安装部署 部署环境&#xff1a;Elasticsearch-7.17.3 Logstash-7.17.3 Kibana-7.17.3 一、安装部署Elasticsearch 解压目录&#xff0c;进入conf目录下编辑elasticsearch.yml文件&#xff0c;输入以下内容并保存 network.host: 127.0.0.1 http.port: 9200…

计算机网络实验(ensp)-实验10:三层交换机实现VLAN间路由

目录 实验报告&#xff1a; 实验操作 1.建立网络拓扑图并开启设备 2.配置主机 1.打开PC机 配置IP地址和子网掩码 2.配置完成后点击“应用”退出 3.重复步骤1和2配置每台PC 3.配置交换机VLAN 1.点开交换机 2.输入命名&#xff1a;sys 从用户视图切换到系统视图…

Jenkins版本升级

Jenkins版本过低的时候&#xff0c;一些插件无法升级&#xff0c;会引发一系列错误&#xff0c;这个时候我们就要升级版本了 一、下载更新包 第一种方式&#xff1a;Jenkins页面下载最新包 第二种官网上下载war包(Jenkins官网) 二、打开服务器搜索jenkins.war路径 1、如果Jenk…

SQL Backup Master 6.3.6 Crack

SQL Backup Master 能够为用户将 SQL Server 数据库备份到一些简单的云存储服务中&#xff0c;例如 Dropbox、OneDrive、Amazon S3、Microsoft Azure、box&#xff0c;最后是 Google Drive。它能够将数据库备份到用户和开发者的FTP服务器上&#xff0c;甚至本地机器甚至网络服务…

这几款实用的电脑软件推荐给你

软件一&#xff1a;TeamViewer TeamViewer是一款跨平台的远程控制软件&#xff0c;它可以帮助用户远程访问和控制其他计算机、服务器、移动设备等&#xff0c;并且支持文件传输、会议功能等。 TeamViewer的主要功能包括&#xff1a; 远程控制&#xff1a;支持远程访问和控制…

HANTS时间序列滤波算法的MATLAB实现

本文介绍在MATLAB中&#xff0c;实现基于HANTS算法&#xff08;时间序列谐波分析法&#xff09;的长时间序列数据去噪、重建、填补的详细方法。 HANTS&#xff08;Harmonic Analysis of Time Series&#xff09;是一种用于时间序列分析和插值的算法。它基于谐波分析原理&#x…

自学黑客(网络安全)有哪些技巧——初学者篇

很多人说&#xff0c;要想学好黑客技术&#xff0c;首先你得真正热爱它。 热爱&#xff0c;听着多么让人激情澎湃&#xff0c;甚至热泪盈眶。 但很可惜&#xff0c;“热爱”这个词对还没入门的小白完全不管用。 如果一个人还没了解过你就说爱你&#xff0c;不是骗财就是骗色…

asp.net高校运动会管理系统的设计与实现

本高校运动会管理系统是针对我院当前运动会工作需要而开发的B/S模式的网络系统&#xff0c;涉及到运动会赛前的报名录入准备与分组编排、赛中的成绩处理、赛后的成绩汇总与团体总分的统计。它将是一个完整统一、技术先进、高效稳定、安全可靠的基于Internet/Intranet的高校运动…

Word怎么生成目录?4个方法快速生成目录!

案例&#xff1a;Word怎么生成目录 【想问下大家在使用Word时是怎么生成目录的呀&#xff1f;正在写毕业论文的我真的很急&#xff01;感谢&#xff01;】 Word作为我们常用的办公软件&#xff0c;为我们的提供了很多便利。生成目录是在Word文档中创建一个方便导航的索引。 …

Word怎么转换成PDF免费?分享适合你的Word转PDF方法

随着数字化时代的到来&#xff0c;将文件转换为PDF格式已经成为一个常见的需求。PDF文件格式的广泛应用使其在各个领域都非常重要&#xff0c;而Word文档则是最常见的文件类型之一。因此&#xff0c;将Word转换为PDF的方法备受关注。在下面&#xff0c;我将分享一种适合任何人使…

Android Service 使用

在Android应用开发中&#xff0c;Service是一种非常重要的组件。Service可以在后台执行长时间运行的任务&#xff0c;例如播放音乐、下载文件等。在本文中&#xff0c;我将会介绍如何使用Service组件&#xff0c;并通过代码实现来说明它的作用。 Android Service概述 在Androi…
最新文章