MMSegmentation筆記

如何訓練自制數據集?

首先需要在 mmsegmentation/mmseg/datasets 目錄下創建一個自制數據集的配置文件,以我的蘋果葉片病害分割數據集為例,創建了mmsegmentation/mmseg/datasets/appleleafseg.py

可以看到,這個配置文件主要定義了自制數據集中的 METAINFO , 包括標簽的類別,以及對應的 palette 調色板色彩數值,還定義了原始圖像和標簽圖像的文件后綴,分別是 jpg 和 png,以及設置 reduce_zero_label 屬性 (是否忽略背景)

from mmseg.registry import DATASETS
from .basesegdataset import BaseSegDataset@DATASETS.register_module()
class AppleLeafSegDataset(BaseSegDataset):METAINFO = dict(classes=('background', 'Alternaria_Boltch', 'Brown_spot', 'Frogeye_leaf_spot', 'Grey_spot', 'Mosaic', 'Powdery_mildew', 'Rust', 'Scab', 'Health'),palette=[[0, 0, 0], [170, 0, 0], [99, 102, 129], [249, 193, 0], [160, 180, 0],[115, 82, 59], [217, 213, 180], [51, 142, 137], [218, 147, 70], [234, 132, 163]])def __init__(self,img_suffix='.jpg',seg_map_suffix='.png',reduce_zero_label=False,# 因為上面METAINFO已經將背景0作為一種類別并且設置掩碼色彩為0,0,0所以這里的reduce_zero_label需要設置為false**kwargs) -> None:super().__init__(img_suffix=img_suffix,seg_map_suffix=seg_map_suffix,reduce_zero_label=reduce_zero_label,**kwargs)

然后將 AppleLeafSegDataset 添加到 mmseg/datasets/__init__.py 中的__all__

__all__ = ['BaseSegDataset', 'BioMedical3DRandomCrop', 'BioMedical3DRandomFlip','CityscapesDataset', 'PascalVOCDataset', 'ADE20KDataset','PascalContextDataset', 'PascalContextDataset59', 'ChaseDB1Dataset','DRIVEDataset', 'HRFDataset', 'STAREDataset', 'DarkZurichDataset','NightDrivingDataset', 'COCOStuffDataset', 'LoveDADataset','MultiImageMixDataset', 'iSAIDDataset', 'ISPRSDataset', 'PotsdamDataset','LoadAnnotations', 'RandomCrop', 'SegRescale', 'PhotoMetricDistortion','RandomRotate', 'AdjustGamma', 'CLAHE', 'Rerange', 'RGB2Gray','RandomCutOut', 'RandomMosaic', 'PackSegInputs', 'ResizeToMultiple','LoadImageFromNDArray', 'LoadBiomedicalImageFromFile','LoadBiomedicalAnnotation', 'LoadBiomedicalData', 'GenerateEdge','DecathlonDataset', 'LIPDataset', 'ResizeShortestEdge','BioMedicalGaussianNoise', 'BioMedicalGaussianBlur','BioMedicalRandomGamma', 'BioMedical3DPad', 'RandomRotFlip','SynapseDataset', 'REFUGEDataset', 'MapillaryDataset_v1','MapillaryDataset_v2', 'Albu', 'LEVIRCDDataset','LoadMultipleRSImageFromFile', 'LoadSingleRSImageFromFile','ConcatCDInput', 'BaseCDDataset', 'DSDLSegDataset', 'BDD100KDataset','NYUDataset', 'HSIDrive20Dataset', 'AppleLeafSegDataset'
]

接下來,需要在 mmsegmentation/mmseg/utils/class_names.py 中補充數據集元信息

我的蘋果樹葉病害數據集相關片段如下:

def appleleafdiseases_classes():"""BDD100K class names for external use(the class name is compatible withCityscapes )."""return ['background', 'Alternaria_Boltch', 'Brown_spot', 'Frogeye_leaf_spot', 'Grey_spot', 'Mosaic','Powdery_mildew', 'Rust', 'Scab', 'Health']def appleleafdiseases_palette():"""bdd100k palette for external use(same with cityscapes)"""return [[0, 0, 0], [170, 0, 0], [99, 102, 129], [249, 193, 0], [160, 180, 0],[115, 82, 59], [217, 213, 180], [51, 142, 137], [218, 147, 70], [234, 132, 163]]dataset_aliases = {'cityscapes': ['cityscapes'],'ade': ['ade', 'ade20k'],'voc': ['voc', 'pascal_voc', 'voc12', 'voc12aug'],'pcontext': ['pcontext', 'pascal_context', 'voc2010'],'loveda': ['loveda'],'potsdam': ['potsdam'],'vaihingen': ['vaihingen'],'cocostuff': ['cocostuff', 'cocostuff10k', 'cocostuff164k', 'coco-stuff','coco-stuff10k', 'coco-stuff164k', 'coco_stuff', 'coco_stuff10k','coco_stuff164k'],'isaid': ['isaid', 'iSAID'],'stare': ['stare', 'STARE'],'lip': ['LIP', 'lip'],'mapillary_v1': ['mapillary_v1'],'mapillary_v2': ['mapillary_v2'],'bdd100k': ['bdd100k'],'hsidrive': ['hsidrive', 'HSIDrive', 'HSI-Drive', 'hsidrive20', 'HSIDrive20','HSI-Drive20'],'appleleafdiseases': ['appleleafdiseases']
}

然后,需要在mmsegmentation/configs/_base_/datasets/目錄下創建一個新的數據集配置文件 mmsegmentation/configs/_base_/datasets/apple.py

這個數據集配置文件代碼如下,可以看到,主要是告訴模型訓練和測試的一些配置信息,包括數據集類和數據集路徑,訓練,測試的pipiline數據增強,不同的dataloader(訓練集,驗證集,測試集),驗證集測試集的評價指標計算。

# dataset settings
dataset_type = 'AppleLeafSegDataset'
data_root = 'AppleLeafSegDataset/' # 自己數據集所在位置
img_scale = (320, 640) # img_scale是指圖像在處理管道中將被調整到的尺寸
crop_size = (160, 320)
train_pipeline = [dict(type='LoadImageFromFile'),dict(type='LoadAnnotations', reduce_zero_label=False), # 不忽略背景dict(type='RandomResize',scale=img_scale,ratio_range=(0.5, 2.0),keep_ratio=True),dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75),dict(type='RandomFlip', prob=0.5),dict(type='PhotoMetricDistortion'),dict(type='PackSegInputs')
]
test_pipeline = [dict(type='LoadImageFromFile'),dict(type='Resize', scale=img_scale, keep_ratio=True),# add loading annotation after ``Resize`` because ground truth# does not need to do resize data transformdict(type='LoadAnnotations', reduce_zero_label=False),dict(type='PackSegInputs')
]
img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75]
# 測試時增強 (TTA) 是一種在測試階段使用的數據增強策略。它對同一張圖片應用不同的增強,例如翻轉和縮放,用于模型推理,然后將每個增強后的圖像的預測結果合并,以獲得更準確的預測結果。
tta_pipeline = [dict(type='LoadImageFromFile', backend_args=None),dict(type='TestTimeAug',transforms=[[dict(type='Resize', scale_factor=r, keep_ratio=True)for r in img_ratios],[dict(type='RandomFlip', prob=0., direction='horizontal'),dict(type='RandomFlip', prob=1., direction='horizontal')], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')]])
]
train_dataloader = dict(batch_size=4,num_workers=4,persistent_workers=True,sampler=dict(type='InfiniteSampler', shuffle=True),dataset=dict(type=dataset_type,data_root=data_root,data_prefix=dict(img_path='images/training', seg_map_path='annotations/training'),pipeline=train_pipeline))
val_dataloader = dict(batch_size=1,num_workers=4,persistent_workers=True,sampler=dict(type='DefaultSampler', shuffle=False),dataset=dict(type=dataset_type,data_root=data_root,data_prefix=dict(img_path='images/validation',seg_map_path='annotations/validation'),pipeline=test_pipeline))
test_dataloader = val_dataloaderval_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU'])
test_evaluator = val_evaluator

最后,我們需要創建一個總的配置文件,mmsegmentation/configs/unet/unet_s5-d16_deeplabv3_4xb4-40k_appleleafdiseases-320×640.py

這里可以選擇mmsegmentation/configs/目錄下的不同模型進行實驗,這里以unet為例,我創建的這個文件代碼如下:
可以看到,_base_定義了模型配置,數據集配置,調度策略配置,運行時配置。
然后也定義了裁剪大小,數據預處理。

_base_ = ['../_base_/models/apple_deeplabv3_unet_s5-d16.py', '../_base_/datasets/apple.py','../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py'
]
crop_size = (160, 320)
data_preprocessor = dict(size=crop_size)
model = dict(data_preprocessor=data_preprocessor,test_cfg=dict(crop_size=(160, 320), stride=(85, 85)))

然后,創建一個mmsegmentation/configs/_base_/models/apple_deeplabv3_unet_s5-d16.py

代碼如下, 可以看到定義了數據預處理,模型結構,backbone類型,解碼器頭和輔助解碼器頭:

# model settings
norm_cfg = dict(type='BN', requires_grad=True)
data_preprocessor = dict(type='SegDataPreProcessor',mean=[123.675, 116.28, 103.53],std=[58.395, 57.12, 57.375],bgr_to_rgb=True,pad_val=0,seg_pad_val=255)
model = dict(type='EncoderDecoder',data_preprocessor=data_preprocessor,pretrained=None,backbone=dict(type='UNet',in_channels=3,base_channels=64,num_stages=5,strides=(1, 1, 1, 1, 1),enc_num_convs=(2, 2, 2, 2, 2),dec_num_convs=(2, 2, 2, 2),downsamples=(True, True, True, True),enc_dilations=(1, 1, 1, 1, 1),dec_dilations=(1, 1, 1, 1),with_cp=False,conv_cfg=None,norm_cfg=norm_cfg,act_cfg=dict(type='ReLU'),upsample_cfg=dict(type='InterpConv'),norm_eval=False),decode_head=dict(type='ASPPHead',in_channels=64,in_index=4,channels=16,dilations=(1, 12, 24, 36),dropout_ratio=0.1,num_classes=10,norm_cfg=norm_cfg,align_corners=False,loss_decode=dict(type='LovaszLoss', reduction='none', loss_weight=1.0)),auxiliary_head=dict(type='FCNHead',in_channels=128,in_index=3,channels=64,num_convs=1,concat_input=False,dropout_ratio=0.1,num_classes=10,norm_cfg=norm_cfg,align_corners=False,loss_decode=dict(type='LovaszLoss', reduction='none', loss_weight=0.4)),# model training and testing settingstrain_cfg=dict(),test_cfg=dict(mode='slide', crop_size=128, stride=85))

然后,重新啟動

python setup.py install
pip install -v -e .

開始訓練

python tools/train.py configs/unet/unet_s5-d16_deeplabv3_4xb4-40k_appleleafdiseases-320×640.py --work-dir mmseg_log

如何添加訓練過程中日志所打印的評價指標?

默認的只打印 IoU ,Acc,mIoU,mAcc,aAcc,如果還想打印 Fscore ,Precision, Recall,mFscore ,mPrecision, mRecall,只需要在數據集配置文件中mmsegmentation/configs/_base_/datasets/apple.py,在這行代碼中添加 mFscore

val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU', 'mFscore'])

下面的打印信息如何解讀?

+-------------------+-------+-------+--------+-----------+--------+
|       Class       |  IoU  |  Acc  | Fscore | Precision | Recall |
+-------------------+-------+-------+--------+-----------+--------+
|     background    | 94.07 | 96.16 | 96.95  |   97.74   | 96.16  |
| Alternaria_Boltch |  58.0 | 72.75 | 73.42  |    74.1   | 72.75  |
|     Brown_spot    | 64.19 | 82.51 | 78.19  |   74.29   | 82.51  |
| Frogeye_leaf_spot | 44.46 | 55.28 | 61.55  |   69.43   | 55.28  |
|     Grey_spot     | 53.24 | 67.83 | 69.49  |   71.23   | 67.83  |
|       Mosaic      |  50.3 | 81.06 | 66.93  |   56.99   | 81.06  |
|   Powdery_mildew  | 59.52 | 93.42 | 74.63  |   62.13   | 93.42  |
|        Rust       | 61.07 | 71.43 | 75.83  |   80.82   | 71.43  |
|        Scab       | 28.49 | 50.39 | 44.35  |   39.61   | 50.39  |
|       Health      | 84.84 | 91.07 |  91.8  |   92.55   | 91.07  |
+-------------------+-------+-------+--------+-----------+--------+
07/11 18:55:19 - mmengine - INFO - Iter(val) [169/169]    aAcc: 94.1500  mIoU: 59.8200  mAcc: 76.1900  mFscore: 73.3100  mPrecision: 71.8900  mRecall: 76.1900  data_time: 0.0196  time: 0.0292

在這個表格中,每個類別的 Acc 表示的是該類別的分類準確率(Accuracy),也稱為像素準確率(PA)。具體來說,Acc 是每個類別中被正確分類的像素數占該類別總像素數的比例。公式如下: Acc = TP TP + FN \text{Acc} = \frac{\text{TP}}{\text{TP} + \text{FN}} Acc=TP+FNTP?其中:

  • TP \text{TP} TP 是該類別的真陽性像素數(正確分類為該類別的像素數)。
  • FN \text{FN} FN 是該類別的假陰性像素數(實際為該類別但被錯誤分類為其他類別的像素數)。

這個準確率反映了模型在特定類別上的預測準確度,表示模型有多少比例的該類別像素被正確識別。每個類別都有一個單獨的 Acc 值,用于衡量該類別的分類性能。

總結:

  • 表格中的 Acc 表示的是每個類別的分類準確率,衡量模型在該類別上的預測準確度。

在 mmsegmentation 訓練模型時,aAcc 和 mAcc 分別表示:

  1. aAcc(Overall Accuracy or Pixel Accuracy): 表示所有像素分類正確的比例。它是通過將所有類別的像素預測正確的數量除以總的像素數量來計算的。公式如下:

aAcc = ∑ i = 1 N TP i ∑ i = 1 N ( TP i + FP i + FN i + TN i ) \text{aAcc} = \frac{\sum_{i=1}^{N} \text{TP}_i}{\sum_{i=1}^{N} (\text{TP}_i + \text{FP}_i + \text{FN}_i + \text{TN}_i)} aAcc=i=1N?(TPi?+FPi?+FNi?+TNi?)i=1N?TPi??

其中, TP \text{TP} TP 是真陽性, FP \text{FP} FP 是假陽性, FN \text{FN} FN 是假陰性, TN \text{TN} TN 是真陰性, N N N 是類別數量。

  1. mAcc(Mean Accuracy): 表示每個類別的平均準確率。它是對每個類別的準確率的平均值。公式如下:

mAcc = 1 N ∑ i = 1 N TP i TP i + FN i \text{mAcc} = \frac{1}{N} \sum_{i=1}^{N} \frac{\text{TP}_i}{\text{TP}_i + \text{FN}_i} mAcc=N1?i=1N?TPi?+FNi?TPi??

其中, TP \text{TP} TP FN \text{FN} FN 是每個類別的真陽性和假陰性, N N N 是類別數量。

總結:

  • aAcc 表示所有像素分類正確的總體準確率。
  • mAcc 表示每個類別的平均準確率。

怎么使用mmsegmentation的tool/test.py

首先看一下命令行參數部分的代碼

def parse_args():parser = argparse.ArgumentParser(description='MMSeg test (and eval) a model')parser.add_argument('config', help='train config file path')parser.add_argument('checkpoint', help='checkpoint file')parser.add_argument('--work-dir', help=('if specified, the evaluation metric results will be dumped into the directory as json'))parser.add_argument('--out', type=str, help='The directory to save output prediction for offline evaluation')parser.add_argument('--show', action='store_true', help='show prediction results')parser.add_argument('--show-dir', help='directory where painted images will be saved. If specified, it will be automatically saved to the work_dir/timestamp/show_dir')parser.add_argument('--wait-time', type=float, default=2, help='the interval of show (s)')parser.add_argument('--cfg-options', nargs='+', action=DictAction, help='override some settings in the used config, the key-value pair in xxx=yyy format will be merged into config file. If the value to be overwritten is a list, it should be like key="[a,b]" or key=a,b It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" Note that the quotation marks are necessary and that no white space is allowed.')parser.add_argument('--launcher', choices=['none', 'pytorch', 'slurm', 'mpi'], default='none', help='job launcher')parser.add_argument('--tta', action='store_true', help='Test time augmentation')parser.add_argument('--local_rank', '--local-rank', type=int, default=0)args = parser.parse_args()if 'LOCAL_RANK' not in os.environ:os.environ['LOCAL_RANK'] = str(args.local_rank)return args
  • config:訓練配置文件路徑。
  • checkpoint:模型檢查點文件路徑。
  • work-dir:指定工作目錄,評估結果會保存為 JSON。
  • out:保存預測結果的目錄,用于離線評估。
  • show:顯示預測結果。
  • show-dir:保存繪制圖像的目錄。
  • wait-time:顯示間隔時間(秒)。
  • cfg-options:覆蓋配置文件中的一些設置。
  • launcher:選擇作業啟動器。
  • tta:啟用測試時增強。
  • local_rank:本地排名。

這里的 config 是指模型的整體配置文件,而不是訓練結束后保存到 --work-dir 目錄下的配置文件。

最終我執行測試的命令是

python tools/test.py 
configs/segformer/apple_segformer_mit-b0_8xb2-160k_appleleaf-512x512.py 
mmseg_log/iter_20000.pth 
--work-dir mmseg_log --out outputs --show-dir outputs

第一個參數是模型配置文件,第二個參數是訓練過程保存的權重文件,這里以最后一次iter保存的為例,–work-dir 會將測試集的評估結果和日志保存到我指定的mmseg_log目錄下,–out和–show-dir我都指定為outputs目錄下,測試結束后,會在outputs目錄下得到測試所得到的結果圖像,一種是灰度圖像,看起來是純黑色的,另一種是可視化的彩色對比圖像,如下圖:
在這里插入圖片描述
左邊是Ground Truth,右邊是模型預測的結果。

將outputs目錄下模型測試所得到的灰度圖像轉換為偽彩色圖像

下面這段代碼保存為convert_to_pseudo_color.py,然后執行python convert_to_pseudo_color.py 后就會將outputs目錄下模型測試所得到的灰度圖像轉換為偽彩色圖像并保存到 outputs/Pseudo/ 目錄下了

import os
from PIL import Image
import numpy as np# METAINFO
METAINFO = dict(classes=('background', 'Alternaria_Boltch', 'Brown_spot', 'Frogeye_leaf_spot', 'Grey_spot', 'Mosaic', 'Powdery_mildew', 'Rust', 'Scab', 'Health'),palette=[[0, 0, 0], [170, 0, 0], [99, 102, 129], [249, 193, 0], [160, 180, 0],[115, 82, 59], [217, 213, 180], [51, 142, 137], [218, 147, 70], [234, 132, 163]]
)# Ensure output directory exists
output_dir = 'outputs/Pseudo/'
os.makedirs(output_dir, exist_ok=True)# Get the palette from METAINFO
palette = METAINFO['palette']
palette = np.array(palette, dtype=np.uint8)def convert_to_pseudo_color(image_path, save_path):"""Convert a grayscale image to pseudo color using the given palette."""gray_image = Image.open(image_path).convert('L')gray_array = np.array(gray_image)color_image = np.zeros((gray_array.shape[0], gray_array.shape[1], 3), dtype=np.uint8)for i in range(len(palette)):color_image[gray_array == i] = palette[i]color_image = Image.fromarray(color_image)color_image.save(save_path)# Process all .png files in the outputs directory
for file_name in os.listdir('outputs'):if file_name.endswith('.png'):file_path = os.path.join('outputs', file_name)save_path = os.path.join(output_dir, file_name)convert_to_pseudo_color(file_path, save_path)print("Pseudo color images have been saved to", output_dir)

怎么打印模型 flops 和參數量?

執行這個命令,第一個參數是模型配置文件,第二個參數–shape是可選項,表示測試的圖像大小

python tools/analysis_tools/get_flops.py
configs/segformer/apple_segformer_mit-b0_8xb2-160k_appleleaf-512x512.py 
--shape 1024 512

打印輸出的結果如下:

==============================
Compute type: direct: randomly generate a picture
Input shape: (1024, 512)
Flops: 17.917G
Params: 3.718M
==============================

怎么打印模型 fps?

怎么按照epoch訓練,而非iter?

首先我重新編寫了一個../_base_/schedules/schedule_20k_by_epoch.py

可以看到需要將 train_cfg 中的 type 設置為 EpochBasedTrainLoop,下面的默認hooks也需要調整為按epoch方式訓練的

# optimizer
optimizer = dict(type='SGD', lr=0.001, momentum=0.9, weight_decay=0.0005)
optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None)# learning policy
param_scheduler = [dict(type='PolyLR',eta_min=1e-4,power=0.9,begin=0,end=200,by_epoch=True)
]# training schedule for 20 epochs
train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=200, val_interval=1)
val_cfg = dict(type='ValLoop')
test_cfg = dict(type='TestLoop')default_hooks = dict(timer=dict(type='IterTimerHook'),logger=dict(type='LoggerHook', interval=1, log_metric_by_epoch=True),param_scheduler=dict(type='ParamSchedulerHook'),checkpoint=dict(type='CheckpointHook', by_epoch=True, interval=20),sampler_seed=dict(type='DistSamplerSeedHook'),visualization=dict(type='SegVisualizationHook'))

然后需要修改整體配置文件mmsegmentation/configs/segformer/apple_segformer_mit-b0_8xb2-160k_appleleaf-512x512.py

_base_ = ['../_base_/models/apple_segformer_mit-b0.py', '../_base_/datasets/apple.py','../_base_/default_runtime.py', '../_base_/schedules/schedule_20k_by_epoch.py'
]

我將原先的../_base_/schedules/schedule_20k.py替換成了重新編寫的../_base_/schedules/schedule_20k_by_epoch.py
然后還需要將整體配置文件中的param_scheduler進行修改,如下所示,前5個epoch按照LinearLR進行學習率調整,5-200按照PolyLR

param_scheduler = [dict(type='LinearLR', start_factor=0.1, by_epoch=True, begin=0, end=5),dict(type='PolyLR',eta_min=0.0,power=1.0,begin=5,end=200,by_epoch=True,)
]

然后我執行訓練命令,發現訓練期間,log所打印的仍然是按 iter 訓練的信息,問題是../_base_/default_runtime.py的代碼有覆蓋,
需要將下面這行代碼修改

log_processor = dict(by_epoch=True) # 修改為按 epoch 打印日志

此時遇到了第二個問題,雖然按照epoch打印了,但是在第一個 epoch 陷入了無限循環,解決辦法是需要修改數據集配置文件../_base_/datasets/apple.py,需要將下面這一行代碼修改為

sampler=dict(type='DefaultSampler', shuffle=True),  # 更改為 DefaultSampler

原先的 InfiniteSampler 導致無限循環

運行segmenter遇到的問題

需要升級 pytorch版本到 1.13.1 cuda117,然后我在虛擬環境升級之后,遇到mmcv版本不匹配的問題,解決辦法是卸載 mmcv,然后安裝mmcv 次最新版,問題得到解決。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44791.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python:使用matplotlib庫繪制圖像(四)

作者是跟著http://t.csdnimg.cn/4fVW0學習的,matplotlib系列文章是http://t.csdnimg.cn/4fVW0的自己學習過程中整理的詳細說明版本,對小白更友好哦! 四、條形圖 1. 一個數據樣本的條形圖 條形圖:常用于比較不同類別的數量或值&…

3dmax-vray5大常用材質設置方法

3dmax云渲染平臺——渲染100 以高性價比著稱,是預算有限的小伙伴首選。 15分鐘0.2,60分鐘內0.8;注冊填邀請碼【7788】可領30元禮包和免費渲染券 提供了多種機器配置選擇(可以自行匹配環境)最高256G大內存機器,滿足不同用戶需求。 木紋材質 肌理調整&…

函數語意學(The Sematics of Function)

1、非靜態成員函數轉化為非成員函數 c 設計準則之一就是:非靜態成員函數至少和非成員函數有相同的效率。 也就是說下面兩個函數具有相同的效率: float magnitude(const Point3d * this){...}; float Point3d::magnitude(){...};以 float Point3d::mag…

練習9.5 彩票分析

練習 9.14:彩票 創建?個列表或元素,其中包含 10 個數和 5 個字 ?。從這個列表或元組中隨機選擇 4 個數或字?,并打印?條消息, 指出只要彩票上是這 4 個數或字?,就中?獎了。 練習 9.15:彩票分析 可以使…

面試題 05. 替換空格

05. 替換空格 題目描述示例 題解 題目描述 請實現一個函數,把字符串 s 中的每個空格替換成"%20"。 示例 示例1 輸入:s “We are happy.” 輸出:“We%20are%20happy.” 題解 class Solution { public:string replaceSpace(stri…

jQuery 元素選擇器集合

jQuery 提供了一套非常強大的元素選擇器,它們可以以各種方式定位和操作網頁文檔中的元素。 以下是 jQuery 中的一些常用選擇器: 1、基本選擇器 #id:選擇 ID 為 id 的元素。.(類選擇器):選擇具有特定類的…

2.5 OJ 網站的使用與作業全解

目錄 1 OJ 網站如何使用 1.1 注冊賬戶 1.2 登錄賬戶 1.3 做題步驟 2 本節課的 OJ 作業說明 3 章節綜合判斷題 4 課時2作業1 5 課時2作業2 6 課時2作業3 1 OJ 網站如何使用 〇J 是英文 Online Judge 的縮寫,中文翻譯過來是在線判題。當用戶將自己編寫的代碼…

基于XC7VX690T FPGA+ZU15EG SOC的6U VPX總線實時信號處理平臺(支持4路光纖)

6U VPX架構,符合VITA46規范板載高性能FPGA處理器:XC7VX690T-2FFG1927I板載1片高性能MPSOC:XCZU15EG-2FFVB1156I板載1片MCU,進行健康管理、時鐘配置等V7 FPGA外掛2個FMC接口兩片FPGA之間通過高速GTH進行互聯 基于6U VPX總線架構的通…

從零開始做題:神奇的棋盤

題目 打開得到一副adfgvx加密棋盤 觀察txt數據只有1-5,猜測是數字字母坐標轉換,用notepad批量操作一下 解題 AGAXXDAGGVGGVDVADAVXDGADVGDVAADDDDFXAFAFDGDVXXDGGDGGDXDDFDDXVGXADGVDFXVVAADDXDXXADDVGGGXGXXXXGXXGGXGDVVVGGGAGAAAAGAAGGAGDDDAGAGGG…

解釋如單例、工廠、觀察者等常見設計模式在Android開發中的應用。

在Android開發中,設計模式的應用是提升代碼質量、增強可維護性和可擴展性的重要手段。單例模式(Singleton)、工廠模式(Factory)、觀察者模式(Observer)等是其中最為常見且實用的設計模式。下面我…

如何對已經存在的表進行加分區方案分區函數

我參考網上的,寫了2給存儲過程,一個初始創建文分區方案分區函數;一個可以通過作業新增文件組文件件; 但是初始沒有綁定表,網上的都是在創建表是綁定分區方案,但是我的表是已經存在的,怎么綁定 …

Python實現網站IP地址查詢

使用socket庫實現網站的ip地址查詢,以便于使用CC攻擊和DDoS攻擊(鬧著玩的) import socket def get_website_ip(website): try: ip socket.gethostbyname(website) return ip except socket.gaierror: retur…

最小數字游戲(Lc2974)——模擬+優先隊列(小根堆)、排序+交換

你有一個下標從 0 開始、長度為 偶數 的整數數組 nums ,同時還有一個空數組 arr 。Alice 和 Bob 決定玩一個游戲,游戲中每一輪 Alice 和 Bob 都會各自執行一次操作。游戲規則如下: 每一輪,Alice 先從 nums 中移除一個 最小 元素&…

力扣 383贖金信

思路,用unordered_map存儲magazine中字符以及字符出現的次數 遍歷ransomNote中每個字符,如果能在map中找到,則對應value減一,如果字符對應的value小于零,意味著magazine中找不到與ransomNote里這個字符對應的字符&…

翁愷-C語言程序設計-05-3. 求a的連續和

05-3. 求a的連續和 輸入兩個整數a和n,a的范圍是[0,9],n的范圍是[1,8],求數列之和S aaaaaa…aaa…a(n個a)。如a為2、n為8時輸出的是222222…22222222的和。 輸入格式: 輸入在一行中給出兩個整數&#xf…

VUE_TypeError: Cannot convert a BigInt value to a number at Math.pow 解決方法

錯誤信息 TypeError: Cannot convert a BigInt value to a number at Math.pow vue 或 react package.json添加 "browserslist": {"production": ["chrome > 67","edge > 79","firefox > 68","opera >…

實戰演練-2021年電賽國一之三端口DC-DC變換器

文章目錄 前言一、題目二、題目分析1、題目要求解析2、題目方案選定方案一(使用buck-boost電路+雙向DC-DC電路(前端))方案二(使用同步整流Boost升壓電路+雙向DC-DC電路(前端))方案三(使用同步整流Boost升壓…

實時聊天 Vue + Vuex + sockjs-client + stompjs進行websocket連接

實時聊天 知識點WebSocket介紹SockJSSTOMP 開發環境功能實現安裝應用在vuex中創建vue中的引入、監聽、實例化與收發、訂閱消息引入組件實例化與訂閱計算屬性監聽收到消息封裝的發送消息的公共方法發送消息 完整的代碼 知識點 WebSocket介紹 WebSocket 是一種在 Web 應用中實現…

二叉搜索樹大冒險:尋找-插入-刪除

OK,看我們題目就可知道啦,今天要分享學習的一種數據結構就是二叉搜索樹。 內容題目也說了三個大概的,分別是尋找、插入、刪除。 講這個之前呢,那么就先講講這個二叉搜索樹是何方神圣呢? 二叉搜索樹: 又…

【學習筆記】無人機(UAV)在3GPP系統中的增強支持(五)-同時支持無人機和eMBB用戶數據傳輸的用例

引言 本文是3GPP TR 22.829 V17.1.0技術報告,專注于無人機(UAV)在3GPP系統中的增強支持。文章提出了多個無人機應用場景,分析了相應的能力要求,并建議了新的服務級別要求和關鍵性能指標(KPIs)。…