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

PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)

PyTorch-基础

环境准备

CUDA Toolkit安装(核显跳过此步骤)

CUDA Toolkit是NVIDIA的开发工具,里面提供了各种工具、如编译器、调试器和库

首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本,如何去下载对应版本的Toolkit工具,本人下载的是Toolkit 12.2

下载地址:https://developer.nvidia.com/cuda-toolkit-archive

在这里插入图片描述

下载完毕后打开cuda_12.2.2_windows_network.exe,这里会让你指定一个临时目录这个目录用于存放临时文件的,安装Toolkit 成功后会自动卸载

注意临时目录不要和安装目录指定相同位置,假如指定了相同位置后面是无法安装的

在这里插入图片描述

选择路径时可以切换到自定义的安装路径

路径最好和工具中一致,参考路径D:\NVIDIA CUDA\NVIDIA GPU Computing Toolkit\CUDA\v版本号

在这里插入图片描述

安装完后后我们需要添加CUDA环境变量

在这里插入图片描述

在这里插入图片描述

安装完毕后通过nvcc -V测试是否安装成功

在这里插入图片描述

CUDNN安装(核显跳过此步骤)

Cudnn是NVIDIA提供的一个深度神经网络加速库,它包含了一系列高性能的基本函数和算法,用于加速深度学习任务的计算,它可以与Cuda一起使用,提供了针对深度学习任务的高效实现。

下载地址:https://developer.nvidia.com/cudnn-downloads

选择对应CUDA版本下载,这里下载压缩包

在这里插入图片描述

下载完毕后将压缩包解压,将解压内容直接复制粘贴到CUDA安装目录下,本人安装目录是D:\NVIDIA CUDA\NVIDIA GPU Computing Toolkit\CUDA\v12.1

在这里插入图片描述

粘贴完毕后打开命令行执行nvidia-smi看到如下内容表示安装成功

在这里插入图片描述

Anaconda创建虚拟环境

#创建一个名为pytorch,python版本3.8的虚拟环境
conda create -n pytroch2.3.0 python=3.8
#切换到当前环境
conda activate pytroch2.3.0
#查看本机支持的CUDA版本(核显跳过)
nvidia-smi
#安装pytorch
#官网https://pytorch.org/get-started/locally/
#下载对应CUDA版本的pytorch(独显电脑执行该命令)
#如果与下载很慢,可以分开下载
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
#下载对应CUDA版本的pytorch(核显电脑执行该命令)
conda install pytorch torchvision torchaudio cpuonly -c pytorch

测试PyTroch

在包都安装完毕后执行如下命令没有任何报错表示安装成功

#进入python命令行
python
#引入torch
import torch
#测试cuda(核显返回False,独显返回True)
torch.cuda.is_available()

编辑器选择

在开发过程中需要使用到2款编辑器,分别是PyCharm和Jupyter

PyCharm

PyCharm:https://www.jetbrains.com.cn/pycharm/download/

安装完毕后再PyCharm中Settings中找到Python Interpreter并且选择Add Interpreter将Conda添加进来,这样项目就可以选择指定Conda的环境运行

在这里插入图片描述

Jupyter

安装Anaconda时会顺便安装了Jupyter,但是Jupyter默认是Base环境,接下来我们需要在前面创建好的pytroch2.3.0环境下安装Jupyter

#切换到pytroch2.3.0
conda activate pytroch2.3.0
#安装Jupyter
conda install nb_conda
#安装完毕,
jupyter notebook

启动成功后创建一个文件,切换环境,执行测试代码

在这里插入图片描述

常用类库

Dataset

Pytroch提供Dataset用于存放数据集,使用方式很简单编写一个类继承Dataset,实现init、getitem、len方法即可简单使用Dataset,以下就是一个Dataset的简单使用

from torch.utils.data import Dataset
from PIL import Image
import osclass MyData(Dataset):#构造函数def __init__(self,root_dir,label_dir):self.root_dir = root_dirself.label_dir = label_dir#文件路径self.path = os.path.join(self.root_dir,self.label_dir)#图片列表self.img_path = os.listdir(self.path)#获取图片下标    def __getitem__(self, item):img_name = self.img_path[item]img_item_path = os.path.join(self.root_dir,self.label_dir,img_name)img = Image.open(img_item_path)label = self.label_dirreturn img,label#获取长度def __len__(self):return len(self.img_path)root_dir = 'E:\\Python-Project\\Torch-Demo\\dataset\\train'
#蚂蚁数据集
ants_label_dir = 'ants_image'
ants_dataset = MyData(root_dir,ants_label_dir)
#蜜蜂数据集
bees_label_dir = 'bees_image'
bees_dataset = MyData(root_dir,bees_label_dir)
#合并2个数据集
train_dataset = ants_dataset + bees_dataset

transforms

transforms是神经网络中一个非常重要的库,它提供了将数据转换为Tensor类型数据,Tensor包装了神经网络的数据参数如数据网络的数据格式、梯度、梯度方法等,并且transforms包含了很多操作数据的库可以对Tensor数据进行各种修改

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter('logs')img_path = "data/train/ants_image/0013035.jpg"
img = Image.open(img_path)
#将图片转换为tensor类型
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor", img_tensor)#对tensor进行进行归一化,减少不同图片的色彩的差值,提升训练效果
#规划的计算公式 output[channel] = (input[channel] - mean[channel]) / std[channel]
print(img_tensor[0][0][0])
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image("Normalize", img_norm)#对PIL图片大小修改
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(img)
img_resize = trans_totensor(img_resize)
writer.add_image("Resize", img_resize)#对PIL图片进行整体缩放
trans_resize_2 = transforms.Resize(512)
trans_compose = transforms.Compose([trans_resize_2,trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2,1)#对PIL图片进行随机裁剪
trans_random = transforms.RandomCrop((128,128))
trans_compose_2 = transforms.Compose([trans_random,trans_totensor])
for i in range(10):img_crop = trans_compose_2(img)writer.add_image("RandomCrop", img_crop,i)writer.close()

tensorboard

tensorboard提供训练可视化工具,通过图标的方式可以跟踪实验中不同阶段下的指标用于对比

依赖安装
#安装tensorboard可视化工具
conda install tensorboard
启动tensorboard
#--logdir 指定读取的文件目录
#--port 指定服务启动的端口
tensorboard --logdir=logs --port=6007
简单使用案例

以下创建1个函数y=2x,并且将内容输出到tensorboard

from torch.utils.tensorboard import SummaryWriter
#指定日志生成的目录
writer = SummaryWriter("logs")
#往writer写入数据
#参数1:图表名称
#参数2:Y轴值
#参数3:X轴值
for i in range(100):writer.add_scalar("y=2x", 2 * i, i)
#关闭流
writer.close()

在项目目录下使用tensorboard --logdir=logs启动tensorboard

常见问题:

多次重复执行时刷新tensorboard会发现图标很乱,解决方法有2种:

1、将logs下文件生成重新代码重新启动tensorboard

2、每次执行都创建一个新的logs文件,将图标写入新logs文件下

在这里插入图片描述

Dataset下载与转换

结合Dataset和Transforms对数据集进行下载并且转换,PyTorch提供了一些用于练习的数据集可以通过Dataset进行下载,一下就是一个案例

import torchvision
from torch.utils.tensorboard import SummaryWriter#定义一个转换操作,对dataset中的数据集进行操作
dataset_transform = torchvision.transforms.Compose([torchvision.transforms.ToTensor(),
])#训练数据集,CIFAR10是PyTorch提供的一个数据集,会自动去下载
#https://www.cs.toronto.edu/~kriz/cifar.html
train_set = torchvision.datasets.CIFAR10(root="./dataset",train=True,transform=dataset_transform,download=True)
#测试数据集
test_set = torchvision.datasets.CIFAR10(root="./dataset",train=False,transform=dataset_transform,download=True)#使用tensorboard显示数据集合,显示前面10张
writer = SummaryWriter("p10")
for i in range(10):img,target = test_set[i]writer.add_image("test_set",img,i)writer.close()

DataLoader

Dataset是数据集,那么需要获取数据集的数据那么就需要用到DataLoader,DataLoader可以将数据集安装指定规则分批、打乱后重新组合成一批一批的数据

import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter#测试数据集
test_data = torchvision.datasets.CIFAR10(root="./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
#加载数据集,batch_size=4每获取4张数据为一组,shuffle=True乱序获取
#加载完毕后元组(图片集合,标签集合)
test_loader = DataLoader(dataset=test_data,batch_size=4,shuffle=True,num_workers=0,drop_last=False)#打印Dataloader
writer = SummaryWriter("dataloder")
step = 0
for data in test_loader:imgs,targets = datawriter.add_images("test_data",imgs,step)step = step + 1
writer.close()

使用tensorboard --logdir=dataloder在控制台查看加载好的数据集

在这里插入图片描述

神经网络

PyTorch封装了很多神经网络的类库,文档地址 https://pytorch.org/docs/stable/nn.html

卷积神经网络(NN)

卷积层

卷积神经网络具体的计算过程可以参考:https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md

在这里插入图片描述

结合上图与参考地址中的动图案例可以总结出在计算过程中有几个重要参数:

  1. 输入(二维数组)
  2. 卷积核每次计算后移动的步长(stride)
  3. 是否对图像边填充,而增加图像大小(padding)
  4. 输出(二维数组)
import torch
import torch.nn.functional as F
#输入图像
input = torch.tensor([[1,2,0,3,1],[0,1,2,3,1],[1,2,1,0,0],[5,2,3,1,1],[2,1,0,1,1]
])
#卷积核
kernel = torch.tensor([[1,2,1],[0,1,0],[2,1,0]
])
#尺寸切换
input = torch.reshape(input,(1,1,5,5))
kernel = torch.reshape(kernel,(1,1,3,3))
#使用卷积核对图像进行卷积,卷积和在图像中滑动的步长1,可获得一个3X3输出
output = F.conv2d(input,kernel,stride=1,padding=0)
print(output)#使用卷积核对图像进行卷积,卷积和在图像中滑动的步长2,可获得一个3X3输出
output2 = F.conv2d(input,kernel,stride=2,padding=0)
print(output2)#使用卷积核对图像进行卷积,卷积和在图像中滑动的步长1,对图像外面填充一圈0的数据图像将变成7X7,可获得一个5X5输出
# [0, 0, 0, 0, 0, 0, 0]
# [0, 1, 2, 0, 3, 1, 0]
# [0, 0, 1, 2, 3, 1, 0]
# [0, 1, 2, 1, 0, 0, 0]
# [0, 5, 2, 3, 1, 1, 0]
# [0, 2, 1, 0, 1, 1, 0]
# [0, 0, 0, 0, 0, 0, 0]
output3 = F.conv2d(input,kernel,stride=1,padding=1)
print(output3)

案例

将PyTorch测试数据集CIFAR10下载下来,利用Conv2d对数据集中的图片进行卷积,卷积核大小为3x3,步长为1,输出6通道

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter#使用测试集训练,以为训练集合数据太多了
dataset = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor(),download=True)
#加载数据
dataloader = DataLoader(dataset,batch_size=64)
#定义一个训练模型
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()#定义一个的卷积方法#参数1:输入3个通道的数据(图片又RBG 3个通道组成)#参数2:输出为6个通道的数据(进行6次卷积计算结果集堆叠在一起)#参数3:卷积核大小3X3#参数4:卷积核每次计算后移动步长1#参数5:不对图像边进行填充self.conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3,stride=1,padding=0)def forward(self, x):#对数据进行卷积x = self.conv1(x)return xmy_model = MyModel()writer = SummaryWriter('./logs_conv2d')
step = 0
#计算DataLoader中的每一组数据
for data in dataloader:imgs,targets = dataoutput = my_model(imgs)#torch.Size([64, 3, 32, 32])# print(imgs.shape)#torch.Size([64, 6, 30, 30])# print(output.shape)writer.add_images("input",imgs,step)#由于6个通道在tensorboard无法显示,强行转换为3个通道,参数1填写-1会根据后面的数自动推算output = torch.reshape(output,(-1,3,30,30))writer.add_images("output",output,step)step = step + 1writer.close()
最大池化核心层

最大池化的目的是将图像中的特质保留将图像缩小,比如一张5x5的图片池化后变成2x2的这样可以缩小图片提高计算过程

最大池化核,在每一片被池化核覆盖的区域内获取一个最大的值作为结果写入到结果集中,默认没获取完后池化核移动步长等于池化核大小

  1. Ceil_model=True:池化核覆盖区域超出图像范围时也要获取最大值
  2. Ceil_model=False:只获取池化核覆盖区域在图像范围内的最大值,超出范围的值丢弃

在这里插入图片描述

案例

将PyTorch测试数据集CIFAR10下载下来,对数据集进行池化

import torchvision
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
#使用测试集训练,以为训练集合数据太多了
dataset = torchvision.datasets.CIFAR10(root='./dataset', train=False, download=True, transform=torchvision.transforms.ToTensor())
#加载数据
dataloader = DataLoader(dataset,batch_size=64)
#定义一个训练模型
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()#定义最大池化的规则#参数1:池化核3x3#参数2:磁化核溢出部分是否保留self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)def forward(self, input):#对数据进行池化output = self.maxpool1(input)return outputmy_model = MyModel()writer = SummaryWriter('./logs_maxpool')
step = 0
#计算DataLoader中的每一组数据
for data in dataloader:imgs,targets = datawriter.add_images("input",imgs,step)output = my_model(imgs)writer.add_images("output",output,step)step += 1writer.close()
非线性激活

默认的图像都是线性的训练出来的模型就很死版,对数据集进行非线性集合后训练模型可以训练出符合各种曲线各种特征的模型

import torchvision
from torch import nn
from torch.nn import ReLU, Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdataset = torchvision.datasets.CIFAR10(root='./dataset', train=False, download=True, transform=torchvision.transforms.ToTensor())
#加载数据
dataloader = DataLoader(dataset,batch_size=64)
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()#最简单的非线性激活,把数据中负数变为0(图像场景下不明显)self.relu1 = ReLU()#Sigmoid函数计算,输出值介于0-1之间self.sigmoid1 = Sigmoid()def forward(self, input):output = self.sigmoid1(input)return outputmy_model = MyModel()writer = SummaryWriter('./logs_relu')
step = 0
#计算DataLoader中的每一组数据
for data in dataloader:imgs,targets = dataoutput = my_model(imgs)writer.add_images("input",imgs,step)writer.add_images("output",output,step)step = step + 1writer.close()

网络模型搭建

PyTorch中的模型

PyTorch中提供了很多以实现的模型有的时候直接使用PyTorch的模型就可完成我们的需求,不需要直接去编写模型,官方文档中包含了完整的实例,例如图像处理模型地址如下:https://pytorch.org/vision/stable/models.html#classification

基于VGG16修改模型

在很多的需求的实现过程都拿vgg16作为前置的模型,在vgg16的基础上进行修改,以下就是基于vgg16模型修改适应CIFAR10数据集

import torchvision.datasets
from torch import nndataset = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor(),download=True)#获取一个已经训练过的vgg16模型,这会下载一个包
vgg16_true = torchvision.models.vgg16(pretrained=True)
#获取一个没有训练过的vgg16模型
vgg16_false = torchvision.models.vgg16(pretrained=False)
#打印vgg16模型
print(vgg16_true)#vgg16默认是输出1000个结果,CIFAR10数据集结果只有10类,让vgg16模型适应CIFAR10,操作方式有2种
#1. 在vgg16基础上添加一层线性层
vgg16_true.classifier.add_module("add_linear", nn.Linear(1000, 10))
print(vgg16_true)
#2. 直接修改第六层的逻辑
vgg16_false.classifier[6] = nn.Linear(4096, 10)
print(vgg16_false)

模型的保存与加载

import torch
import torchvision#获取一个没有训练过的vgg16模型
vgg16 = torchvision.models.vgg16(pretrained=False)
#保存方式1:保存模型结构+参数文件
torch.save(vgg16,"vgg16_method1.pth")
#保存方式2:保存模型的参数(官方推荐)
torch.save(vgg16.state_dict(),"vgg16_method2.pth")#加载模型结构+参数文件(方式1加载时要有该网络模型的对象才能加载成功)
model = torch.load("vgg16_method1.pth")
print(model)
#加载模型的参数(官方推荐)
dict = torch.load("vgg16_method2.pth")
vgg16 = torchvision.models.vgg16(pretrained=False)
vgg16.load_state_dict(dict)
print(model)

CIFAR10分类模型案例

编写一段网络模型对CIFAR10中的数据集进行分类,最后输入一张图片得到分类,模型的搭建流程图像

在这里插入图片描述

import torchvision
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterfrom model import *
#定义训练的设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
#准备数据集
train_data = torchvision.datasets.CIFAR10(root='./dataset', train=True, download=True,transform=torchvision.transforms.ToTensor())
test_data = torchvision.datasets.CIFAR10(root='./dataset', train=False, download=True,transform=torchvision.transforms.ToTensor())#获得数据集的长度
train_data_size = len(train_data)
test_data_size = len(test_data)
print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))#利用DataLoader加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)#创建网络模型
my_model = MyModel()
my_model = my_model.to(device)  #使用GPU训练
#损失函数
loss_fn = nn.CrossEntropyLoss()
loss_fn = loss_fn.to(device) #使用GPU训练
#优化器
learning_rate = 0.001
optimizer = torch.optim.SGD(my_model.parameters(), learning_rate)#设置训练网络的参数
total_train_step = 0 #训练的次数
total_test_step = 0  #测试的测试
epochs = 10          #训练轮数#添加tensorboard
writer = SummaryWriter('./logs_train')for i in range(epochs):print("--------------------第{}轮训练开始--------------------".format(i+1))#训练集数据my_model.train()for data in train_dataloader:imgs,targets = dataimgs = imgs.to(device) #使用GPU训练targets = targets.to(device) #使用GPU训练outputs = my_model(imgs)#计算损失函数loss = loss_fn(outputs, targets)#使用优化器优化模型optimizer.zero_grad()loss.backward()optimizer.step()#记录训练次数total_train_step += 1if total_train_step % 100 == 0: #每逢100才打印print("训练次数:{},Loss:{}".format(total_train_step, loss.item()))writer.add_scalar("train_loss",loss.item(),total_train_step)#测试步骤开始my_model.eval()total_test_loss = 0total_accuracy = 0with torch.no_grad():for data in test_dataloader:imgs,targets = dataimgs = imgs.to(device)  # 使用GPU训练targets = targets.to(device)  # 使用GPU训练outputs = my_model(imgs)loss = loss_fn(outputs, targets)total_test_loss += loss.item()accuracy = (outputs.argmax(1) == targets).sum()total_accuracy += accuracy.item()print("整体测试集上的Loss:{}".format(total_test_loss))print("整体测试集上的准确率:{}".format(total_accuracy/test_data_size))writer.add_scalar("test_loss", total_test_loss, total_test_step)writer.add_scalar("test_accuracy", total_accuracy/test_data_size, total_test_step)total_test_step += 1#保存每一轮的训练结果torch.save(my_model,"./pth/my_model_{}.pth".format(i))print("模型已保存")writer.close()

编写测试程序加载训练好的模型,识别

在这里插入图片描述

相关文章:

PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)

PyTorch-基础 环境准备 CUDA Toolkit安装(核显跳过此步骤) CUDA Toolkit是NVIDIA的开发工具,里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本,如何去下载对应版本的Toolkit工…...

Linux(centos)系统安装部署MySQL8.0数据库(GLIBC版本)

安装前检查服务器glibc版本,下载对应版本包 rpm -qa | grep glibc mysql安装包及依赖包已整理好,下载地址:https://pan.quark.cn/s/3137acc814c0,下载即可安装 一、下载MySQL mysql安装包及依赖包已整理好,下载地址…...

Transformer解析——(四)Decoder

本系列已完结,全部文章地址为: Transformer解析——(一)概述-CSDN博客 Transformer解析——(二)Attention注意力机制-CSDN博客 Transformer解析——(三)Encoder-CSDN博客 Transforme…...

TypeScript 中 type 和 interface 深度对比分析

一、核心概念对比 特性interfacetype本质声明式类型契约(面向对象范式)类型别名(函数式编程思维)可扩展性支持声明合并(多次声明自动合并)不可合并基础类型支持只能描述对象/函数类型可描述任意类型&#…...

unplugin-vue-components,unplugin-auto-import,借用ai去学习

好的,我现在需要帮助用户理解他们提供的这段Vite配置代码。用户之前已经询问过关于ElementPlusResolver的导入问题,现在他们展示了在vite.config.ts中使用该解析器的具体配置。我需要逐步分析这段代码,并解释每个部分的作用。 首先&#xff…...

Nginx学习笔记:常用命令端口占用报错解决Nginx核心配置文件解读

Nginx 1. 基础命令1.1 重新加载systemd配置1.2 停止Nginx服务1.3 启动Nginx服务1.4 重启Nginx服务1.5 查看Nginx服务状态1.6 测试配置和重载Nginx 2. 额外命令2.1 启用开机自启2.2 禁用开机自启2.3 强制关闭所有Nginx进程 3. Nginx端口占用解决方案3.1 查找占用端口8090的进程3…...

C++ ——继承

体现的是代码复用的思想 1、子类继承父类,子类就拥有了父类的特性(成员方法和成员属性) 2、已存在的类被称为“基类”或者“父类”或者“超类”;新创建的类被称为“派生类”或者“子类” 注意: (1&#…...

正则表达式常用记录

1. 定义 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),它是一种文本模式,同时也是计算机科学的一个概念,其中包括普通字符(例如&#xff0c…...

redis的应用,缓存,分布式锁

1.应用 1.1可以用作缓存 作用:提交数据的查询效率,减少对数据库的访问频率 什么数据适合放入缓存 1.查询频率高,修改频率低 2.对安全系数比较低 如何实现 Service public class DeptServer {Autowiredprivate DeptMapper deptMapper;Auto…...

qt5实现表盘的旋转效果,通过提升QLabel类

因为工作需要,需要实现温度的表盘展示效果 实现思路: 通过提示声QLabel控价类,实现报盘的旋转和展示效果 1. 编写一个QLabel的类MyQLabel,实现两个方法 1. void paintEvent(QPaintEvent *event); //重绘函数 2. void valueChanged(int va…...

Flutter项目中设置安卓启动页

AndroidManifest.xml 设置 android:theme“style/LaunchTheme” <applicationandroid:label"string/app_name"android:name"${applicationName}"android:icon"mipmap/ic_launcher"android:roundIcon"mipmap/ic_launcher"android:t…...

人工智能之目标追踪DeepSort源码解读(yolov5目标检测,代价矩阵,余弦相似度,马氏距离,匹配与预测更新)

要想做好目标追踪,须做好目标检测,所以这里就是基于yolov5检测基础上进行DeepSort,叫它为Yolov5_DeepSort。整体思路是先检测再追踪,基于检测结果进行预测与匹配。 一.参数与演示 这里用到的是coco预训练人的数据集&#xff1a; 二.针对检测结果初始化track 对每一帧数据都输出…...

C语言之枚举类型

目录 前言 一、enum&#xff08;枚举 总结 前言 在C语言中&#xff0c;枚举类型是一种用户自定义的数据类型&#xff0c;用于定义一组具名的常量集合。枚举类型可以提高代码的可读性和可维护性&#xff0c;同时也能够帮助程序员避免使用魔法数字。通过枚举类型&#xff0c;我们…...

【Python爬虫(12)】正则表达式:Python爬虫的进阶利刃

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

推荐一款AI大模型托管平台-OpenWebUI

推荐一款AI大模型托管平台-OpenWebUI 1. OpenWebUI 1. OpenWebUI什么? 官网地址&#xff1a;https://openwebui.com/ GitHub地址&#xff1a; https://github.com/open-webui/open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离…...

复习dddddddd

1. 思路&#xff1a;用队列先进先出的特性 #include <iostream> #include <vector> #include <stack> #include <cstdio> #include <algorithm> #include <cstring> #include <climits> #include <cstdlib> #include <cma…...

【3.5JavaScript】JavaScript字符串对象

文章目录 1.获取字符串长度2.大小写转换3.获取某一个字符4.截取字符串5.替换字符串6.分割字符串7.检索字符串位置8.例题&#xff1a;统计某一个字符的个数 在 JavaScript 中&#xff0c;对象是非常重要的知识点。对象分为两种&#xff1a;一种是 ”自定义对象“&#xff0c;另…...

消息队列-持续更新中

消息队列 0、消息队列官方参考文档 MQ官方参考文档 RocketMQ 官方文档&#xff1a; https://rocketmq.apache.org/docs/quick-start/ RocketMQ 中国开发者中心&#xff1a;http://rocketmq.cloud/zh-cn/ Kafka 官方文档&#xff1a; http://kafka.apache.org/documentation/ …...

创建一个简单的spring boot+vue前后端分离项目

一、环境准备 此次实验需要的环境&#xff1a; jdk、maven、nvm和node.js 开发工具&#xff1a;idea或者Spring Tool Suite 4&#xff0c;前端可使用HBuilder X&#xff0c;数据库Mysql 下面提供maven安装与配置步骤和nvm安装与配置步骤&#xff1a; 1、maven安装与配置 1…...

已知点矩阵的三个顶点坐标、行列数和行列的间距,计算得出剩余所有点的坐标

已知点矩阵的三个顶点坐标、行列数和行列的间距&#xff0c;计算得出剩余所有点的坐标 计算矩阵中每个点的坐标代码实现案例图调用验证 计算矩阵中每个点的坐标 给定左上角、左下角和右上角三个点的坐标&#xff0c;以及矩阵的行数、列数、行间距和列间距&#xff0c;我们可以…...

视频mp4垂直拼接 水平拼接

视频mp4垂直拼接 水平拼接 pinjie_v.py import imageio import numpy as np import os import cv2def pinjie_v(dir1,dir2,out_dir):os.makedirs(out_dir, exist_okTrue)# 获取目录下的所有视频文件video_files_1 [f for f in os.listdir(dir1) if f.endswith(.mp4)]video_fi…...

【记录54】渐变色 linear-gradient / radial-gradient

linear-gradient 线性渐变&#xff1a;是以直线条渐变 radial-gradient 径向渐变&#xff1a;是以图型形状渐变 <!-- 线性渐变&#xff08;从一个方向到另一个方向 --><div style" background: linear-gradient(to right, red, blue);"></div><…...

一周学会Flask3 Python Web开发-response响应格式

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在HTTP响应中&#xff0c;数据可以通过多种格式传输。大多数情况下&#xff0c;我们会使用HTML格式&#xff0c;这也是Flask中…...

二级公共基础之数据结构与算法篇(八)排序技术

目录 前言 一、交换类排序 1.冒泡排序法 1. 冒泡排序的思想 2. 冒泡排序的实现步骤 3. 示例 4. 冒泡排序的特点 2.快速排序 1. 快速排序的核心思想 2. 快速排序的实现步骤 3. 示例代码(C语言) 4. 快速排序的特点 二、插入类排序 1. 简单插入排序 1.简单插入排…...

以ChatGPT为例解析大模型背后的技术

目录 1、大模型分类 2、为什么自然语言处理可计算&#xff1f; 2.1、One-hot分类编码&#xff08;传统词表示方法&#xff09; 2.2、词向量 3、Transformer架构 3.1、何为注意力机制&#xff1f; 3.2、注意力机制在 Transformer 模型中有何意义&#xff1f; 3.3、位置编…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cpuinfo 函数

ngx_cpuinfo 声明在 src/core/ngx_core.h void ngx_cpuinfo(void); 定义在 src/core/ngx_cpuinfo.c 这里 ngx_cpuinfo 的定义可以找到 2 个 使用 gcc -E 处理一下来确认当下环境中使用的是哪一个 gcc -E src/core/ngx_cpuinfo.c \-I src/core \-I src/event \-I src/event/modu…...

python小项目编程-中级(1、图像处理)

目录 图像处理 实现 测试 unittest pytest 图像处理 实现界面化操作&#xff0c;使用PIL库实现简单的图像处理功能&#xff0c;如缩放&#xff08;设置缩放比例&#xff09;、旋转和滤镜、对比度调整、亮度调整、灰度图、二值化图&#xff08;二值图如果使用的是彩色图片需…...

EasyExcel实现excel导入(模版上传)

目录 效果pom.xmlapplication.ymlcontrollerservice依赖类前台vue代码某个功能如果需要添加大量的数据,通过一条条的方式添加的方式,肯定不合理,本文通过excel导入的方式来实现该功能,100条数据导入成功85条,失败15条,肯定需要返回一个表格给前台或者返回1个错误excel给前…...

AI工作流+专业知识库+系统API的全流程任务自动化

我有点悲观&#xff0c;甚至很沮丧&#xff0c;因为AI留给普通人的机会不多了&#xff0c;这既是人类之间权力的斗争&#xff0c;也是硅基生命和碳基生命的斗争。AI自动化是无法避免的趋势&#xff0c;如果人类不能平权&#xff0c;那就只能跪下接受审判。 通过整合AI工作流、专…...

【C/C++】合并两个有序链表 (leetcode T21)

核心考点预览&#xff1a;链表 &#xff08;双指针&#xff09; 技巧&#xff1a;虚拟头结点 题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入输出示例1l1 [1,2,4], l2 [1…...

C语言进阶习题【2】(4结构体进阶)——通讯录的实现3

1. 本节在动态版本通讯录的基础上实现存储功能 在动态版本的基础上&#xff0c;对于通讯录的新增了存储到文件中&#xff0c;可以从文件中打开我们存储的通信录功能。新增函数&#xff1a;saveContatc()和loadContact&#xff08;&#xff09; 2. 具体实现 2.1 contact.h /…...

Linux系统编程之无名管道

概述 在Linux系统中&#xff0c;无名管道是一种简单的进程间通信机制。它允许一个进程创建一对文件描述符&#xff0c;其中一个用于读取&#xff0c;另一个用于写入。当一个进程通过系统调用创建了一个无名管道后&#xff0c;便可以将这两个文件描述符传递给它的子进程&#xf…...

deepseek与其他大模型配合组合

DeepSeek与其他大模型的配合组合&#xff0c;展现了其在多个领域中的强大应用潜力和灵活性。以下是对DeepSeek与其他大模型配合组合的详细分析&#xff1a; 一、DeepSeek与华知大模型的组合 背景介绍&#xff1a; 华知大模型是同方知网与华为联手打造的&#xff0c;具备全学科…...

ASP.NET Core Clean Architecture

文章目录 项目地址一、1. 重点1.1 Repository数据库接口1.2 GetEventDetail 完整的Query流程1.3 创建Command并使用validation 项目地址 教程作者&#xff1a;ASP.NET Core Clean Architecture 2022-12 教程地址&#xff1a; https://www.bilibili.com/video/BV1YZ421M7UA?…...

DeepSeek安装部署笔记(一)

Ollamaopen-WebUI部署 DeepSeek安装部署笔记第一步 Ollama安装1.安装ollama&#xff1a;官网https://ollama.com/下载2.上面安装完成&#xff0c;在cmd命令行&#xff1a; 第二步 给DeepSeek添加OpenWebUI界面&#xff08;重点&#xff09;1.安装conda&#xff1a;用它来管理py…...

ProfiNet转EtherNet/IP罗克韦尔PLC与监控系统通讯案例

一、案例背景 在新能源产业蓬勃发展的当下&#xff0c;大型光伏电站作为绿色能源的重要输出地&#xff0c;其稳定高效的运行至关重要。某大型光伏电站占地面积广阔&#xff0c;内部设备众多&#xff0c;要保障电站的稳定运行&#xff0c;对站内各类设备进行集中监控与管理必不可…...

23.2 HtmlDocument类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 HtmlDocument类提供了HTML文档的顶级编程访问&#xff0c;配合WebBrowser的 Document属性使用&#xff0c;可以获得WebBrowser当前页…...

wordpress adrotate插件 文件上传漏洞

当你爆破进wordpress后台但权限不是管理员的时&#xff0c;如果你有adrotate插件操作权限可以用adrotate的文件上传功能get webshell 该漏洞需要AdRotate版本 < 5.13.3 第一步按顺序点击上传文件 在这里文件一定要压缩成zip格式&#xff0c;上传的时候也是上传这个zip 上…...

数据分析和数据挖掘的工作内容

基本的数据分析工作通常包含以下几个方面的内容&#xff1a; 确定目标&#xff08;输入&#xff09;&#xff1a;理解业务&#xff0c;确定指标口径。获取数据&#xff1a;数据仓库&#xff08;SQL提数&#xff09;、电子表格、三方接口、网络爬虫、开放数据集等。清洗数据&am…...

【Pandas】pandas Series sample

Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐&#xff0c;使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值Series.drop([lab…...

qt + opengl 给立方体增加阴影

在前几篇文章里面学会了通过opengl实现一个立方体&#xff0c;那么这篇我们来学习光照。 风氏光照模型的主要结构由3个分量组成&#xff1a;环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子&#xff1a; 1 环境光照(Ambient …...

buuctf-[极客大挑战 2019]Knife题解

一个很简单的web题&#xff0c;进入界面 网页名还加白给的shell&#xff0c;并且给的提示也很明显&#xff0c;给了一个一句话木马再加上菜刀&#xff0c;很怀疑是一个webshell题&#xff0c;那么直接打开蚁剑测试连接拿shell 用提示的一句话木马的密码&#xff0c;测试链接发现…...

常用电脑,护眼软件推荐 f.lux 3400K | 撰写论文 paper

常用电脑&#xff1f;平均每天用 5 个小时&#xff1f;你就要考虑用一个护眼软件了&#xff0c;对皮肤也好。因为电脑屏幕有辐射&#xff0c;比如蓝光。 f.lux 作为一款专业护眼软件&#xff0c;值得使用。之前用了三年的 Iris Pro&#xff0c;现在 f.lux 做的更好了。 使用…...

【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致

业务场景 发布信息&#xff0c;更新到数据库MySQLCOS操作&#xff0c;更新JSON文件 不过可能存在幂等性和数据一致性的问题。 // 批量存MySQL entityPublishService.saveOrUpdateBatch(entityPublishList); // 遍历批量存COS对象存储searchEntitys.forEach(req -> {//删除…...

[答疑]领域建模:邓丽君、周杰伦和少女时代

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 第五元素 2025-2-18 17:12 潘老师&#xff0c;画线的这句话&#xff0c;在这个类图中怎么体现呢&#xff1f; &#xff08;回答者补注&#xff1a;问题的素材来自《邓丽君的领域建模》…...

【鸿蒙开发】第四十三章 Notification Kit(用户通知服务)

目录​​​​​​​ 1 简介 1.1 使用场景 1.2 能力范围 1.3 业务流程 1.4 通知样式 1.5 约束限制 1.6 与相关Kit的关系 2 请求通知授权 2.1 接口说明 2.2 开发步骤 3 管理通知角标 3.1 接口说明 3.2 开发步骤 4 管理通知渠道 4.1 通知渠道类型说明 4.2 接口说明…...

Ubuntu 20.04源码安装opencv 4.5.0

安装依赖项 sudo apt install -y g sudo apt install -y cmake sudo apt install -y make sudo apt install -y wget unzip安装opencv依赖库 sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev l…...

buu-get_started_3dsctf_2016-好久不见39

栈溢出外平栈 1外平栈与内平栈的区别 外平栈&#xff1a; 栈帧的局部变量和返回地址之间没有额外的对齐或填充。返回地址直接位于局部变量的上方&#xff08;即栈顶方向&#xff09;。在计算偏移时&#xff0c;不需要额外加 4&#xff08;因为返回地址紧邻局部变量&#xff09…...

一周学会Flask3 Python Web开发-客户端状态信息Cookie以及加密

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili HTTP是无状态&#xff08;stateless)协议。也就是说&#xff0c;在一次请求响应结束后&#xff0c;服务器不会留下任何关于对…...

深入解析Qt事件循环

在Qt开发中&#xff0c;QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作&#xff1f;为何耗时操作会导致界面冻结&#xff1f;本文将以事件循环为核心&#xff0c;揭示Qt高效运转的底层逻辑&#xff0c;探讨其设计哲学与最…...