当前位置: 首页 > news >正文

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

基于飞桨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 listdirimport 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 globimport 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 osDATA_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 ospimport 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=1488T.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 ospimport 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=1488T.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 ospimport 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=1488T.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.pngprint(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] = 255cv2.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

相关文章:

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

基于飞桨paddle2.6.1cuda11.7paddleRS开发版的目标提取-道路数据集训练和预测代码 预测结果: 预测影像: (一)准备道路数据集 下载数据集地址: https://aistudio.baidu.com/datasetdetail/56961 mass_road.zip …...

数学建模笔记—— 整数规划和0-1规划

数学建模笔记—— 整数规划和0-1规划 整数规划和0-1规划1. 模型原理1.1 基本概念1.2 线性整数规划求解1.3 线性0-1规划的求解 2. 典型例题2.1 背包问题2.2 指派问题 3. matlab代码实现3.1 背包问题3.2 指派问题 整数规划和0-1规划 1. 模型原理 1.1 基本概念 在规划问题中&am…...

[001-03-007].第26节:分布式锁迭代3->优化基于setnx命令实现的分布式锁-防锁的误删

我的博客大纲 我的后端学习大纲 1、问题分析: 1.1.问题: 1.锁的超时释放,可能会释放其他服务器的锁 1.2.场景: 1.如果业务逻辑的执行时间是7s。执行流程如下 1.index1业务逻辑没执行完,3秒后锁被自动释放。2.index…...

【Unity踩坑】为什么有Rigidbody的物体运行时位置会变化

先上图,不知你有没有注意过这个现象呢? 一个物体加上了Rigidbody组件,当勾选上Use Gravity时,运行后,这个物体的位置的值会有变化。这是为什么呢? 刚体由物理系统处理,因此它会对重力、碰撞等做…...

NGINX开启HTTP3,给web应用提个速

环境说明 linuxdockernginx版本:1.27 HTTP3/QUIC介绍 HTTP3是由IETF于2022年发布的一个标准,文档地址为:https://datatracker.ietf.org/doc/html/rfc9114 如rfc9114所述,http3主要基于QUIC协议实现,在具备高性能的同时又兼备了…...

秋招季!别浮躁!

好久没写了,今天兴致来了,众所周知我一旦想说话,就来这里疯狂写。 最近,我去了一家国企的研究院,听着是不是贼高大上,呵——这玩意儿把我分配到三级机构,我一个学计算机的,它不把我…...

Java的时间复杂度和空间复杂度和常见排序

目录 一丶时间复杂度 二丶空间复杂度 三丶Java常见排序 1. 冒泡排序(Bubble Sort) 2.插入排序(Insertion Sort) 3.希尔排序(Shell Sort) 4.选择排序(Selection Sort) 5.堆排序&am…...

Qt 学习第十天:标准对话框 页面布局

系统标准对话框 错误对话框 //错误对话框connect(createPro, &QAction::triggered, this, []{//参数1 父亲 参数2 标题 参数3 对话框内显示文本内容 。。。QMessageBox::critical(this, "报错!", "没加头文件!");}); 【运行结果】 信息对话框 co…...

体育数据API纳米足球数据API:足球数据接口文档API示例⑩

纳米体育数据的数据接口通过JSON拉流方式获取200多个国家的体育赛事实时数据或历史数据的编程接口,无请求次数限制,可按需购买,接口稳定高效; 覆盖项目包括足球、篮球、网球、电子竞技、奥运等专题、数据内容。纳米数据API2.0版本…...

[数据集][目标检测]高铁受电弓检测数据集VOC+YOLO格式1245张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1245 标注数量(xml文件个数):1245 标注数量(txt文件个数):1245 标注…...

Vuex:深入理解所涉及的几个问题

你好,我是沐爸,欢迎点赞、收藏、评论和关注。 一、Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 二、Vu…...

vue原理分析(六)研究new Vue()

今天我们来分析使用new Vue() 之前研究时,只是说是在创建一个实例。并没有深入进行研究 在vue的源码中找下Vue的构造函数 function Vue(options) {if (!(this instanceof Vue)) {warn$2(Vue is a constructor and should be called with the new keyword);}this.…...

滑动窗口+动态规划

前言:分析这个题目的时候,就知道要这两个线段要分开,但是要保证得到最优解,那么我们在选取第二根线段的时候,要保证我们第一根线段是左边最优解 并且我们选的两根线段的右端点一定是我们的数组的点(贪心思…...

vscode配置django环境并创建django项目

1、创建文件夹 创建文件夹 并在vscode打开 终端输入命令 “ python -m venv env ” 查看目录结构 2、创建项目 在终端输入 django-admin startproject 文件名(这里以myshop为例) 3、创建应用 在myshop打开终端 在终端输入 django-admin startapp 应用名 这里以app1为例…...

WebGL系列教程四(绘制彩色三角形)

目录 1 前言2 varying变量介绍3 开始绘制3.1 声明顶点着色器3.2 声明片元着色器3.3 创建顶点和颜色的缓冲区3.4 指定变量从缓冲区获取值3.5 效果3.6 varying的内涵3.7 完整代码 4 总结 1 前言 上一篇中我们介绍了如何使用缓冲区来绘制三角形,这一篇我们来讲讲如何给…...

通过mxGraph在ARMxy边缘计算网关上实现工业物联网

在当今的工业4.0时代,工业物联网(IIoT)已经成为制造业转型升级的关键技术之一。ARMxy边缘计算网关作为工业自动化和物联网的重要组成部分,能够为工厂车间提供实时的数据处理能力和智能化服务。而mxGraph作为一种流行的JavaScript库…...

GEE案例:利用sentinel-1数据进行洪水监测分析(直方图统计)

目录 简介 数据 函数 ee.Filter.calendarRange(start, end, field) Arguments: Returns: Filter updateMask(mask) Arguments: Returns: Image 代码 结果 简介 利用sentinel-1数据进行洪水监测分析 数据 COPERNICUS/S1_GRD数据是由欧洲空间局(ESA)的Copernicus项…...

QT 联合opencv 易错点

https://blog.csdn.net/qq_51699436/article/details/135777911 网上已经有大量优秀切详尽的文章来讲述QT联合opencv了,我把容易出错的点列出来备忘 1、在进行opencv进行编译时,要确认好是32位还是64位,因为在创建QT项目的时候QT和opencv要匹…...

例如/举例的使用方法 ,e.g., 以及etc的使用方法

e.g. 例如 for example for the sake of example such as 1 e.g. 是拉丁语 exempli gratia 的缩写意思是“举个例子,比如”,等同于for example、 for the sake of example、such as,使用 e.g. 的目的是用几个例子来说明前面的观点。 2 例…...

20240902-VSCode-1.19.1-部署vcpkg-win10-22h2

20240902-VSCode-1.19.1-部署vcpkg-win10-22h2 软件环境 标签:C++ VSCode mingw gcc13 vcpkg cmake分栏:C++操作系统:Windows10 x64 22h2一、安装VScode-1.19.1 请参考另一篇文章《20240717-VSCode-1.91.1-部署gcc13-C++23-win10-22h2》。 二、安装cmake 本文流程需要安…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程

基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...