基于飞桨paddle2.6.1+cuda11.7+paddleRS开发版的目标提取-道路数据集训练和预测代码

news2024/11/15 11:55:08

基于飞桨paddle2.6.1+cuda11.7+paddleRS开发版的目标提取-道路数据集训练和预测代码
预测结果:
在这里插入图片描述

预测影像:
在这里插入图片描述

(一)准备道路数据集

下载数据集地址:

https://aistudio.baidu.com/datasetdetail/56961

mass_road.zip

—原始地址Url:
https://ai-studio-online.bj.bcebos.com/v1/41357ea3cf184439b91fa53f3f7043fbe4098d72a6af445ebeaafe312dde6753?responseContentDisposition=attachment%3Bfilename%3Dmass_road.zip&authorization=bce-auth-v1%2F5cfe9a5e1454405eb2a975c43eace6ec%2F2024-09-02T08%3A00%3A26Z%2F21600%2F%2Fb960ea800643817cef73410af3c78134882f697c4a16b7103ca1ec419d50c6b7

参考地址:https://aistudio.baidu.com/aistudio/projectdetail/3792610

(二) 数据预处理

import random
import os.path as osp
from os import listdir

import cv2
print(cv2.__version__)

# 随机数生成器种子
RNG_SEED = 56961
# 调节此参数控制训练集数据的占比
TRAIN_RATIO = 0.9
# 数据集路径
DATA_DIR = 'i://cwgis_ai/cup/mass_road'

# 分割类别
CLASSES = (
    'background',
    'road',
)

def write_rel_paths(phase, names, out_dir, prefix):
    """将文件相对路径存储在txt格式文件中"""
    with open(osp.join(out_dir, phase+'.txt'), 'w') as f:
        for name in names:
            f.write(
                ' '.join([
                    osp.join(prefix, 'input', name),
                    osp.join(prefix, 'output', name)
                ])
            )
            f.write('\n')


random.seed(RNG_SEED)

train_prefix = osp.join('road_segmentation_ideal', 'training')
test_prefix = osp.join('road_segmentation_ideal', 'testing')
train_names = listdir(osp.join(DATA_DIR, train_prefix, 'output'))
train_names = list(filter(lambda n: n.endswith('.png'), train_names))
test_names = listdir(osp.join(DATA_DIR, test_prefix, 'output'))
test_names = list(filter(lambda n: n.endswith('.png'), test_names))
# 对文件名进行排序,以确保多次运行结果一致
train_names.sort()
test_names.sort()
random.shuffle(train_names)
len_train = int(len(train_names)*TRAIN_RATIO)
write_rel_paths('train', train_names[:len_train], DATA_DIR, train_prefix)
write_rel_paths('val', train_names[len_train:], DATA_DIR, train_prefix)
write_rel_paths('test', test_names, DATA_DIR, test_prefix)

# 写入类别信息
with open(osp.join(DATA_DIR, 'labels.txt'), 'w') as f:
    for cls in CLASSES:
        f.write(cls+'\n')

print("数据集划分已完成。")

(三)将GT中的255改写为1,便于训练

import os.path as osp
from glob import glob

import cv2
from tqdm import tqdm


# 数据集路径
DATA_DIR = 'i://cwgis_ai/cup/mass_road'

train_prefix = osp.join('road_segmentation_ideal', 'training')
test_prefix = osp.join('road_segmentation_ideal', 'testing')

train_paths = glob(osp.join(DATA_DIR, train_prefix, 'output', '*.png'))
test_paths = glob(osp.join(DATA_DIR, test_prefix, 'output', '*.png'))
for path in tqdm(train_paths+test_paths):
    im = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
    im[im>0] = 1
    # 原地改写
    cv2.imwrite(path, im)

(四)查看图片尺寸大小python代码

import cv2
import os

DATA_DIR = 'i:/cwgis_ai/cup/mass_road'
image_dir = "i:/cwgis_ai/cup/mass_road/road_segmentation_ideal/testing/input"

for image_name in os.listdir(image_dir):
    image_path = os.path.join(image_dir,image_name)
    img = cv2.imread(image_path)

    height,width = img.shape[:2]
    if  width!=1500 or height!=1500:
        print(image_name,"----------尺寸:",width,"x",height)
    else:   
        print(image_name,"尺寸:",width,"x",height)

# 修改图像尺寸  
# import cv2
#img = cv2.imread("data/INF_All_9.1/temp1/WIN_20230818_11_12_30_Pro_150.png")
#resize_img = cv2.resize(img,(640,512))    # 自定义为自己想要的图像尺寸
#cv2.imwrite("data/INF_All_9.1/temp/WIN_20230818_11_12_30_Pro_150.png",resize_img)  # 保存修改尺寸后的图像到指定路径
#height,width = resize_img.shape[:2]
#print(resize_img,"尺寸:",width,"x",height)

# 更改img-14.png图片大小为1500 X 1500
img = cv2.imread("i:/cwgis_ai/cup/mass_road/road_segmentation_ideal/testing/input/img-14-old.png")
resize_img = cv2.resize(img,(1500,1500))    # 自定义为自己想要的图像尺寸
print(resize_img.shape)   # (1500, 1500, 3)
cv2.imwrite("i:/cwgis_ai/cup/mass_road/road_segmentation_ideal/testing/input/img-14.png",resize_img)  # 保存修改尺寸后的图像到指定路径

(五)训练代码

# 导入需要用到的库

import random
import os.path as osp

import cv2
import numpy as np
import paddle
import paddlers as pdrs
from paddlers import transforms as T
from matplotlib import pyplot as plt
from PIL import Image


# 定义全局变量

# 随机种子
SEED = 56961
# 数据集存放目录
DATA_DIR = 'i:/cwgis_ai/cup/mass_road'
# 训练集`file_list`文件路径
TRAIN_FILE_LIST_PATH = 'i:/cwgis_ai/cup/mass_road/train.txt'
# 验证集`file_list`文件路径
VAL_FILE_LIST_PATH = 'i:/cwgis_ai/cup/mass_road/val.txt'
# 测试集`file_list`文件路径
TEST_FILE_LIST_PATH = 'i:/cwgis_ai/cup/mass_road/test.txt'
# 数据集类别信息文件路径
LABEL_LIST_PATH = 'i:/cwgis_ai/cup/mass_road/labels.txt'
# 实验目录,保存输出的模型权重和结果
EXP_DIR =  'i:/cwgis_ai/cup/road_model/'



# 固定随机种子,尽可能使实验结果可复现

random.seed(SEED)
np.random.seed(SEED)
paddle.seed(SEED)



# 构建数据集

# 定义训练和验证时使用的数据变换(数据增强、预处理等)
train_transforms = T.Compose([
    T.DecodeImg(),
    # 随机裁剪
    T.RandomCrop(crop_size=512),
    # 以50%的概率实施随机水平翻转
    T.RandomHorizontalFlip(prob=0.5),
    # 以50%的概率实施随机垂直翻转
    T.RandomVerticalFlip(prob=0.5),
    # 将数据归一化到[-1,1]
    T.Normalize(
        mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
    T.ArrangeSegmenter('train')
])

eval_transforms = T.Compose([
    T.DecodeImg(),
    T.Resize(target_size=1500),
    # 验证阶段与训练阶段的数据归一化方式必须相同  target_size=1488
    T.Normalize(
        mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
    T.ArrangeSegmenter('eval')
])

# 分别构建训练和验证所用的数据集
train_dataset = pdrs.datasets.SegDataset(
    data_dir=DATA_DIR,
    file_list=TRAIN_FILE_LIST_PATH,
    label_list=LABEL_LIST_PATH,
    transforms=train_transforms,
    num_workers=4,
    shuffle=True
)

val_dataset = pdrs.datasets.SegDataset(
    data_dir=DATA_DIR,
    file_list=VAL_FILE_LIST_PATH,
    label_list=LABEL_LIST_PATH,
    transforms=eval_transforms,
    num_workers=0,
    shuffle=False
)

# 构建DeepLab V3+模型,使用ResNet-50作为backbone= ResNet50_vd    ResNet101_vd
model = pdrs.tasks.seg.DeepLabV3P(
    in_channels=3,
    num_classes=len(train_dataset.labels),
    backbone='ResNet50_vd'
)
model.initialize_net(
    pretrain_weights='CITYSCAPES',
    save_dir=osp.join(EXP_DIR, 'pretrain'),
    resume_checkpoint=None,
    is_backbone_weights=False
)

# 构建优化器
optimizer = paddle.optimizer.Adam(
    learning_rate=0.001, 
    parameters=model.net.parameters()
)


# 执行模型训练 原参数:num_epochs=100,train_batch_size=8
model.train(
    num_epochs=10,
    train_dataset=train_dataset,
    train_batch_size=2,
    eval_dataset=val_dataset,
    optimizer=optimizer,
    save_interval_epochs=2,
    # 每多少次迭代记录一次日志
    log_interval_steps=30,
    save_dir=EXP_DIR,
    # 是否使用early stopping策略,当精度不再改善时提前终止训练
    early_stop=False,
    # 是否启用VisualDL日志功能
    use_vdl=True,
    # 指定从某个检查点继续训练
    resume_checkpoint=None
)
#-----the----end-------
'''

(六) 训练过程信息

'''
(rs) PS G:\app2024\MyProject深度学习AI项目\web> & C:/Users/Administrator/.conda/envs/rs/python.exe g:/app2024/MyProject深度学习AI项目/web/cup_trans.py
Can not use `conditional_random_field`. Please install pydensecrf first.
Warning: import ppdet from source directory without installing, run 'python setup.py install' to install ppdet firstly
2024-09-03 14:18:45,486-WARNING: post-quant-hpo is not support in system other than linux
2024-09-03 14:18:45 [WARNING]   Including an `Arrange` object in the transformation operator list is deprecated and will not take effect.
2024-09-03 14:18:45 [WARNING]   Including an `Arrange` object in the transformation operator list is deprecated and will not take effect.
2024-09-03 14:18:45 [INFO]      723 samples in file i:/cwgis_ai/cup/mass_road/train.txt
2024-09-03 14:18:45 [INFO]      81 samples in file i:/cwgis_ai/cup/mass_road/val.txt
W0903 14:18:45.873943  4776 gpu_resources.cc:119] Please NOTE: device: 0, GPU Compute Capability: 6.1, Driver API Version: 12.6, Runtime API Version: 11.7
W0903 14:18:45.881899  4776 gpu_resources.cc:164] device: 0, cuDNN Version: 8.4.
2024-09-03 14:18:46 [INFO]      Loading pretrained model from i:/cwgis_ai/cup/road_model/pretrain\model.pdparams
2024-09-03 14:18:47 [WARNING]   [SKIP] Shape of parameters head.decoder.conv.weight do not match. (pretrained: [19, 256, 1, 1] vs actual: [2, 256, 1, 1])
2024-09-03 14:18:47 [WARNING]   [SKIP] Shape of parameters head.decoder.conv.bias do not match. (pretrained: [19] vs actual: [2])
2024-09-03 14:18:47 [INFO]      There are 358/360 variables loaded into DeepLabV3P.
2024-09-03 14:18:47 [INFO]      Loading pretrained model from i:/cwgis_ai/cup/road_model/pretrain\model.pdparams
2024-09-03 14:18:48 [WARNING]   [SKIP] Shape of parameters head.decoder.conv.weight do not match. (pretrained: [19, 256, 1, 1] vs actual: [2, 256, 1, 1])
2024-09-03 14:18:48 [WARNING]   [SKIP] Shape of parameters head.decoder.conv.bias do not match. (pretrained: [19] vs actual: [2])
2024-09-03 14:18:48 [INFO]      There are 358/360 variables loaded into DeepLabV3P.
2024-09-03 14:19:36 [INFO]      [TRAIN] Epoch=1/6, Step=30/361, loss=0.189093, lr=0.001000, time_each_step=1.57s, eta=0:57:4
2024-09-03 14:20:24 [INFO]      [TRAIN] Epoch=1/6, Step=60/361, loss=0.093886, lr=0.001000, time_each_step=1.59s, eta=0:56:47
2024-09-03 14:21:11 [INFO]      [TRAIN] Epoch=1/6, Step=90/361, loss=0.106614, lr=0.001000, time_each_step=1.59s, eta=0:56:1
2024-09-03 14:21:59 [INFO]      [TRAIN] Epoch=1/6, Step=120/361, loss=0.170390, lr=0.001000, time_each_step=1.59s, eta=0:55:24
2024-09-03 14:22:47 [INFO]      [TRAIN] Epoch=1/6, Step=150/361, loss=0.079456, lr=0.001000, time_each_step=1.59s, eta=0:54:31
2024-09-03 14:23:34 [INFO]      [TRAIN] Epoch=1/6, Step=180/361, loss=0.161471, lr=0.001000, time_each_step=1.58s, eta=0:53:30
2024-09-03 14:24:22 [INFO]      [TRAIN] Epoch=1/6, Step=210/361, loss=0.075722, lr=0.001000, time_each_step=1.59s, eta=0:53:2
2024-09-03 14:25:10 [INFO]      [TRAIN] Epoch=1/6, Step=240/361, loss=0.117546, lr=0.001000, time_each_step=1.59s, eta=0:51:58
2024-09-03 14:25:57 [INFO]      [TRAIN] Epoch=1/6, Step=270/361, loss=0.101394, lr=0.001000, time_each_step=1.59s, eta=0:51:11
2024-09-03 14:26:45 [INFO]      [TRAIN] Epoch=1/6, Step=300/361, loss=0.057541, lr=0.001000, time_each_step=1.59s, eta=0:50:27
2024-09-03 14:27:33 [INFO]      [TRAIN] Epoch=1/6, Step=330/361, loss=0.070874, lr=0.001000, time_each_step=1.59s, eta=0:49:38
2024-09-03 14:28:20 [INFO]      [TRAIN] Epoch=1/6, Step=360/361, loss=0.132143, lr=0.001000, time_each_step=1.59s, eta=0:48:49
2024-09-03 14:28:22 [INFO]      [TRAIN] Epoch 1 finished, loss=0.1463401052491982 .
2024-09-03 14:29:08 [INFO]      [TRAIN] Epoch=2/6, Step=29/361, loss=0.049420, lr=0.001000, time_each_step=1.6s, eta=0:48:18
2024-09-03 14:29:56 [INFO]      [TRAIN] Epoch=2/6, Step=59/361, loss=0.265671, lr=0.001000, time_each_step=1.59s, eta=0:47:24
2024-09-03 14:30:44 [INFO]      [TRAIN] Epoch=2/6, Step=89/361, loss=0.110936, lr=0.001000, time_each_step=1.59s, eta=0:46:37
2024-09-03 14:31:31 [INFO]      [TRAIN] Epoch=2/6, Step=119/361, loss=0.108888, lr=0.001000, time_each_step=1.59s, eta=0:45:49
2024-09-03 14:32:19 [INFO]      [TRAIN] Epoch=2/6, Step=149/361, loss=0.065547, lr=0.001000, time_each_step=1.59s, eta=0:45:3
2024-09-03 14:33:07 [INFO]      [TRAIN] Epoch=2/6, Step=179/361, loss=0.057928, lr=0.001000, time_each_step=1.59s, eta=0:44:15
2024-09-03 14:33:55 [INFO]      [TRAIN] Epoch=2/6, Step=209/361, loss=0.055898, lr=0.001000, time_each_step=1.59s, eta=0:43:28
2024-09-03 14:34:43 [INFO]      [TRAIN] Epoch=2/6, Step=239/361, loss=0.135333, lr=0.001000, time_each_step=1.61s, eta=0:43:0
2024-09-03 14:35:31 [INFO]      [TRAIN] Epoch=2/6, Step=269/361, loss=0.048581, lr=0.001000, time_each_step=1.6s, eta=0:41:55

(七)预测代码

# 导入需要用到的库

import random
import os.path as osp

import cv2
import numpy as np
import paddle
import paddlers as pdrs
from paddlers import transforms as T
from matplotlib import pyplot as plt
from PIL import Image

# 定义全局变量

# 随机种子
SEED = 56961
# 数据集存放目录
DATA_DIR = 'i:/cwgis_ai/cup/mass_road'
# 训练集`file_list`文件路径
TRAIN_FILE_LIST_PATH = 'i:/cwgis_ai/cup/mass_road/train.txt'
# 验证集`file_list`文件路径
VAL_FILE_LIST_PATH = 'i:/cwgis_ai/cup/mass_road/val.txt'
# 测试集`file_list`文件路径
TEST_FILE_LIST_PATH = 'i:/cwgis_ai/cup/mass_road/test.txt'
# 数据集类别信息文件路径
LABEL_LIST_PATH = 'i:/cwgis_ai/cup/mass_road/labels.txt'
# 实验目录,保存输出的模型权重和结果
EXP_DIR =  'i:/cwgis_ai/cup/road_model/'

eval_transforms = T.Compose([
    T.DecodeImg(),
    T.Resize(target_size=1500),
    # 验证阶段与训练阶段的数据归一化方式必须相同  target_size=1488
    T.Normalize(
        mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
    T.ArrangeSegmenter('eval')
])

# 固定随机种子,尽可能使实验结果可复现

random.seed(SEED)
np.random.seed(SEED)
paddle.seed(SEED)

# 构建测试集
test_dataset = pdrs.datasets.SegDataset(
    data_dir=DATA_DIR,
    file_list=TEST_FILE_LIST_PATH,
    label_list=LABEL_LIST_PATH,
    transforms=eval_transforms,
    num_workers=0,
    shuffle=False
)

# 构建DeepLab V3+模型,使用ResNet-50作为backbone= ResNet50_vd    ResNet101_vd
model = pdrs.tasks.seg.DeepLabV3P(
    in_channels=3,
    num_classes=2,
    backbone='ResNet50_vd'
)
model.initialize_net(
    pretrain_weights='CITYSCAPES',
    save_dir=osp.join(EXP_DIR, 'pretrain'),
    resume_checkpoint=None,
    is_backbone_weights=False
)

# 构建优化器
optimizer = paddle.optimizer.Adam(
    learning_rate=0.001, 
    parameters=model.net.parameters()
)


# 为模型加载历史最佳权重
state_dict = paddle.load(osp.join(EXP_DIR, 'best_model/model.pdparams'))
model.net.set_state_dict(state_dict)

# 执行测试
test_result = model.evaluate(test_dataset)
print(
    "测试集上指标:IoU为{:.2f},Acc为{:.2f},Kappa系数为{:.2f}, F1为{:.2f}".format(
        test_result['category_iou'][1], 
        test_result['category_acc'][1],
        test_result['kappa'],
        test_result['category_F1-score'][1]
    )
)

(八)单张图片预测代码

# 导入需要用到的库

import random
import os.path as osp


import cv2
import numpy as np
import paddle
import paddlers as pdrs
from paddlers import transforms as T
from matplotlib import pyplot as plt
from matplotlib.image import imread
from PIL import Image

# 定义全局变量

# 随机种子
#SEED = 56961
SEED = 22961
# 数据集存放目录
DATA_DIR = 'i:/cwgis_ai/cup/mass_road'
# 训练集`file_list`文件路径
TRAIN_FILE_LIST_PATH = 'i:/cwgis_ai/cup/mass_road/train.txt'
# 验证集`file_list`文件路径
VAL_FILE_LIST_PATH = 'i:/cwgis_ai/cup/mass_road/val.txt'
# 测试集`file_list`文件路径
TEST_FILE_LIST_PATH = 'i:/cwgis_ai/cup/mass_road/test.txt'
# 数据集类别信息文件路径
LABEL_LIST_PATH = 'i:/cwgis_ai/cup/mass_road/labels.txt'
# 实验目录,保存输出的模型权重和结果
EXP_DIR =  'i:/cwgis_ai/cup/road_model/'

eval_transforms = T.Compose([
    T.DecodeImg(),
    T.Resize(target_size=1500),
    # 验证阶段与训练阶段的数据归一化方式必须相同  target_size=1488
    T.Normalize(
        mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
    T.ArrangeSegmenter('eval')
])

# 固定随机种子,尽可能使实验结果可复现

random.seed(SEED)
np.random.seed(SEED)
paddle.seed(SEED)

#====================================================================

# 构建测试集
test_dataset = pdrs.datasets.SegDataset(
    data_dir=DATA_DIR,
    file_list=TEST_FILE_LIST_PATH,
    label_list=LABEL_LIST_PATH,
    transforms=eval_transforms,
    num_workers=0,
    shuffle=False
)

# 构建DeepLab V3+模型,使用ResNet-50作为backbone= ResNet50_vd    ResNet101_vd
model = pdrs.tasks.seg.DeepLabV3P(
    in_channels=3,
    num_classes=2,
    backbone='ResNet50_vd'
)
model.initialize_net(
    pretrain_weights='CITYSCAPES',
    save_dir=osp.join(EXP_DIR, 'pretrain'),
    resume_checkpoint=None,
    is_backbone_weights=False
)

# 构建优化器
optimizer = paddle.optimizer.Adam(
    learning_rate=0.001, 
    parameters=model.net.parameters()
)


# 为模型加载历史最佳权重
state_dict = paddle.load(osp.join(EXP_DIR, 'best_model/model.pdparams'))
model.net.set_state_dict(state_dict)


# 预测结果可视化
# 重复运行本单元可以查看不同结果

def read_image(path):
    im = cv2.imread(path)
    return im[...,::-1]


def show_images_in_row(ims, fig, title='', quantize=False):
    n = len(ims)
    fig.suptitle(title)
    axs = fig.subplots(nrows=1, ncols=n)
    for idx, (im, ax) in enumerate(zip(ims, axs)):
        # 去掉刻度线和边框
        ax.spines['top'].set_visible(False)
        ax.spines['right'].set_visible(False)
        ax.spines['bottom'].set_visible(False)
        ax.spines['left'].set_visible(False)
        ax.get_xaxis().set_ticks([])
        ax.get_yaxis().set_ticks([])

        if isinstance(im, str):
            im = read_image(im)
        if quantize:
            im = (im*255).astype('uint8')
        if im.ndim == 2:
            im = np.tile(im[...,np.newaxis], [1,1,3])
        ax.imshow(im)        


# 需要展示的样本个数
num_imgs_to_show = 20
# 随机抽取样本
chosen_indices = random.choices(range(len(test_dataset)), k=num_imgs_to_show)

# 参考 https://stackoverflow.com/a/68209152
#fig = plt.figure(constrained_layout=True)
#fig.suptitle("Test Results")

#subfigs = fig.subfigures(nrows=3, ncols=1)

# 读取输入影像并显示
im_paths = [test_dataset.file_list[idx]['image'] for idx in chosen_indices]
#show_images_in_row(im_paths, subfigs[0], title='Image')
# print(im_paths[0])
#im = cv2.imread(im_paths[0], cv2.IMREAD_GRAYSCALE)
#print(im)
#plt.imshow(im)
#plt.show()


# 获取模型预测输出
with paddle.no_grad():
    model.net.eval()
    preds = []
    for idx in chosen_indices:  
        input = test_dataset.file_list[idx]['image']     # i:/cwgis_ai/cup/mass_road\road_segmentation_ideal\testing\input\img-5.png
        #mask = test_dataset.file_list[idx]['mask']       # i:/cwgis_ai/cup/mass_road\road_segmentation_ideal\testing\output\img-5.png
        print(input)
        filename=osp.basename(input)
        if(filename=="img-10.png"):           
           input, mask = test_dataset[idx]
           print("idx="+str(idx))
           #print(input["image"])
           #print('-------------------')
           #print(mask)
           input = paddle.to_tensor(input["image"]).unsqueeze(0)
           logits, *_ = model.net(input)
           pred = paddle.argmax(logits[0], axis=0)
           preds.append(pred.numpy())        
           out_path="i:/cwgis_ai/cup/out10.png"
           im=pred.numpy()
           im[im>0] = 255
           cv2.imwrite(out_path, im)

#show_images_in_row(preds, subfigs[1], title='Pred', quantize=True)
#plt.figure(figsize=(1500, 1500))
#print(preds[0])
#plt.imshow(preds[0])
#plt.show()

# 读取真值标签并显示
#m_paths = [test_dataset.file_list[idx]['mask'] for idx in chosen_indices]
#show_images_in_row(im_paths, subfigs[2], title='GT', quantize=True)

# 渲染结果
#fig.canvas.draw()
#Image.frombytes('RGB', fig.canvas.get_width_height(), fig.canvas.tostring_rgb())



本blog地址:https://blog.csdn.net/hsg77

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

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

相关文章

国际标准图像分辨率测试ISO12233 - 2017中文翻译

参考:https://blog.csdn.net/jgw2008/article/details/116519404?spm1035.2023.3001.6557&utm_mediumdistribute.pc_relevant_bbs_down_v2.none-task-blog-2~default~OPENSEARCH~Rate-2-116519404-bbs-392397517.264^v3^pc_relevant_bbs_down_v2_default&d…

SpringBoot与Minio的极速之旅:解锁文件切片上传新境界

目录 一、前言 二、对象存储(Object Storage)介绍 (1)对象存储的特点 (2)Minio 与对象存储 (3)对象存储其他存储方式的区别 (4)对象存储的应用场景 三、…

万龙觉醒辅助:VMOS云手机助力资源采集!挂机升级!

《万龙觉醒》是一款策略型游戏,玩家需要合理规划资源采集、建筑升级、科技研发等来提升实力。在本文中,我们将为您提供一篇详细的游戏辅助攻略,并介绍如何使用VMOS云手机来提升您的游戏体验,实现24小时的自动化管理。 使用VMOS云…

R3M: A Universal Visual Representation for Robot Manipulation

R3M [25] explores how visual representations obtained by training on diverse human video data using time-contrastive learning and video-language can enable data-efficient learning(实际上就是小样本学习) of downstream robotic manipulati…

【FreeRTOS】事件组实验-改进姿态控制

目录 0 前言1 事件组实验_改进姿态控制2 改进思路2.1 创建事件2.2 等待事件2.3 设置事件2.4 Debug2.5 设置MPU6050寄存器 3 总结 0 前言 学习视频: 【FreeRTOS 入门与工程实践 --由浅入深带你学习 FreeRTOS(FreeRTOS 教程 基于 STM32,以实际项…

pdf文件怎么编辑?6个pdf编辑方法学起来(图文教程)

pdf文件怎么编辑?现今的互联网时代,我们的办公也趋向于数字化办公。PDF文件已经成为我们日常工作和学习中不可或缺的格式文件。然而,编辑PDF文档不是一件容易的事。很多人会因为编辑pdf文档感到非常苦恼,尤其是当需要对PDF进行内容…

Linux内核编程(十五)网络设备驱动

本文目录 一、常见的网络协议二、传输介质三、RJ-45接口 对于网络知识不太熟悉的同学可以查看这篇文章:计算机网络知识点详情总结。 一、常见的网络协议 TCP、UDP协议:详情查看-TCP、UDP系统编程。DNS协议:是互联网中用于将域名&#xff08…

【刷题笔记】删除并获取最大点数粉刷房子

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 题目一 题目链接&#xff1a;删除并获取最大点数 思路&#xff1a; 预处理状态表示 状态转移方程 代码如下&#xff1a; class Solution { public:int deleteAndEarn(vector<int>& nums) {int N1…

八股(7)——Redis

八股&#xff08;7&#xff09;——Redis 4.3 RedisRedis 基础简单介绍一下 Redis!分布式缓存常见的技术选型方案有哪些&#xff1f;说一下 Redis 和 Memcached 的区别和共同点缓存数据的处理流程是怎样的&#xff1f;为什么要用 Redis/为什么要用缓存&#xff1f;Redis 除了做…

2024 年全国大学生数学建模竞赛(国赛)浅析

需要完整资料&#xff0c;请关注WX&#xff1a;“小何数模”&#xff01; &#xff08;需要完整B、C和E题资料请关注WX&#xff1a;“小何数模”&#xff0c;获取资料链接&#xff01;&#xff09; 本次万众瞩目的全国大学生数学建模赛题已正式出炉&#xff0c;无论是赛题难度…

Floorp Browser:开源自由,打造更个性化的浏览环境!

前言 "技术引领未来&#xff0c;创新改变世界。" 在这个日新月异的数字化时代&#xff0c;网络浏览器作为我们探索互联网世界的窗口&#xff0c;其重要性不言而喻。正是在这样的背景下&#xff0c;Floorp浏览器应运而生&#xff0c;它不仅继承了Mozilla Firefox的强…

基于SpringBoot的外卖点餐系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootJSP 工具&#xff1a;IDEA/Eclipse、Navicat、Maven、Tomcat 系统展示 首页 用户管理界…

超强台风“摩羯”来临:EasyCVR平台如何汇聚城市视频资源,构建应急监测网

一、背景概述 2024年第11号台风“摩羯”自生成以来&#xff0c;迅速加强为超强台风级别&#xff0c;预计将在海南琼海到广东电白一带沿海登陆&#xff0c;带来16-17级的强风和巨浪。我国作为自然灾害多发的国家&#xff0c;每年夏季都面临着山洪、泥石流、洪涝、飓风、地震等多…

摸鱼 | 图片转Excel单元格脚本

依赖安装 pip install Pillow tqdm源码&#xff1a; import argparse from PIL import Image import openpyxl from openpyxl.styles import PatternFill from tqdm import tqdmdef image_to_excel(image_path, excel_path, cell_size20, sample_ratio1, output_widthNone, o…

C++(十五)继承 part1

一、继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许我们在保持原有类特性的基础上进行扩展&#xff0c;增加方法(成员函数)和属性(成员变量)&#xff0c;这样产生新的类&#xff0c;称子类。继承呈现了面向对象程序设计的…

Restful风格接口开发

一、项目搭建 安装nestjs脚手架 // 安装nestjs脚手架 npm i nestjs/cli// 新建 nest new [名字]//选择要用的工具 npm / yarn / pnpm 文件信息&#xff1a; 【main.ts】&#xff1a; 入口文件&#xff0c;通过NestFactory&#xff08;由nestjs/core库抛出的对象&#x…

【深度学习】softmax 回归的从零开始实现与简洁实现

前言 小时候听过一个小孩练琴的故事&#xff0c;老师让他先弹最简单的第一小节&#xff0c;小孩练了两天后弹不出。接着&#xff0c;老师让他直接去练更难的第二小节&#xff0c;小孩练习了几天后还是弹不出&#xff0c;开始感觉到挫败和烦躁了。 小孩以为老师之后会让他从简…

数据链路层认识以太网

我们前面学习到的传输层&#xff0c;网络层&#xff0c;传输层是保证数据可靠传输。而网络层是实现在复杂的网络环境中确定一个合适的路径。我们接下来所说的数据链路层其实就是用于两个设备(同一种数据链路节点)之间进行传递。其实也就是如数次的局域网中设备之间的转发过程。…

Pytest-@pytest.fixture夹具篇(一)

一、定义 在Python的pytest测试框架中&#xff0c;pytest.fixture是一个&#xff08;不是唯一&#xff09;装饰器&#xff0c;用于定义一个测试夹具。 二、简单实例 使用参数autouserTrue pytest.fixture(autouseTrue) def my_fixture():print("Setup: 准备测试环境&q…

华为软件测试笔试真题,抓紧收藏不然就看不到了

软件测试工程师笔试题目 一&#xff0e;填空 1、 系统测试使用&#xff08; C &#xff09;技术, 主要测试被测应用的高级互操作性需求, 而无需考虑被测试应用的内部结构。 A、 单元测试 B、 集成测试 C、 黑盒测试 D、白盒测试 2、单元测试主要的测试技术不包括&#xff08…