【计算机视觉基础CV-图像分类】03-深度学习图像分类实战:鲜花数据集加载与预处理详解
本文将深入介绍鲜花分类数据集的加载与处理方式,同时详细解释代码的每一步骤并给出更丰富的实践建议和拓展思路。以实用为导向,为读者提供从数据组织、预处理、加载到可视化展示的完整过程,并为后续模型训练打下基础。
前言
在计算机视觉的深度学习实践中,数据加载和预处理是至关重要的一步。无论你是初学者,还是有一定经验的从业者,都需要深刻理解如何将原始数据转化为神经网络可接受的输入。PyTorch中的torchvision.datasets
和torchvision.transforms
为我们提供了极大的便利,使图像数据的加载和处理更加高效与简洁。
本文将以“鲜花分类数据集”(一个包含5种不同花卉类别的图像数据集)为例,详细讲述如何使用ImageFolder
类进行数据加载,并通过transforms
对图像进行预处理和数据增强。我们还会深入讨论数据集结构、训练/验证集划分、代码注释和实践建议,并给出详细说明。
数据集简介与结构
本例使用的鲜花分类数据集共包含5种花:雏菊(daisy)、蒲公英(dandelion)、玫瑰(roses)、向日葵(sunflowers)和郁金香(tulips)。数据量约为:
-
训练集(train):3306张图像
-
验证集(val):364张图像
数据已按类别分好目录,每个类别对应一个文件夹,文件夹中存放若干图片文件。结构示意如下:
dataset/flower_datas/├─ train/│ ├─ daisy/ # 雏菊类图像若干张│ ├─ dandelion/ # 蒲公英类图像若干张│ ├─ roses/ # 玫瑰类图像若干张│ ├─ sunflowers/ # 向日葵类图像若干张│ └─ tulips/ # 郁金香类图像若干张└─ val/├─ daisy/├─ dandelion/├─ roses/├─ sunflowers/└─ tulips/
这种目录结构非常适合ImageFolder
数据集类,它会根据子文件夹的名称自动分配类别标签,从0开始编号。例如:
-
daisy -> 0
-
dandelion -> 1
-
roses -> 2
-
sunflowers -> 3
-
tulips -> 4
这样无需手动编码类别映射,简化了流程。
ImageFolder和transform
ImageFolder简介
ImageFolder
是torchvision.datasets
中的一个实用数据类,它假设数据按如下规则组织:
-
root/class_x/xxx.png
-
root/class_x/xxy.png
-
root/class_y/xxz.png
-
...
其中class_x
和class_y
是类名(字符串),ImageFolder
会根据这些类名自动生成类别索引。加载后,每个样本是一个(image, label)
二元组,image
通常会通过transform
转换为Tensor
,label
为整数索引。
transforms的数据预处理功能
torchvision.transforms
提供多种图像处理方法,用来改变图像格式、尺寸、颜色空间和进行数据增强。例如:
-
ToTensor()
:将PIL图像或Numpy数组转换为(C,H,W)
格式的张量,并将像素值归一化到[0,1]之间。 -
Resize((224,224))
:将图像缩放到224x224大小,这通常是预训练模型如ResNet、VGG的标准输入尺寸。 -
RandomHorizontalFlip()
:随机水平翻转图像,用于数据增强,提高模型对翻转不敏感。 -
Normalize(mean, std)
:对图像的每个通道进行归一化,使训练更稳定。
你可以根据需求灵活组合多个变换操作,使用transforms.Compose
将其串联成流水线。
加载鲜花分类数据集的示例代码
下面的代码示例中,我将详细注释每个步骤,为读者提供清晰的思路。该示例以最基本的ToTensor和Resize为主,读者可按需添加更多transform。
import torch
import torchvision
from torchvision.datasets import ImageFolder
from torchvision import transforms
import matplotlib.pyplot as plt# 数据集存放路径,根据实际情况修改
flowers_train_path = '../01.图像分类/dataset/flower_datas/train/'
flowers_val_path = '../01.图像分类/dataset/flower_datas/val/'# 定义数据预处理
# 这里的transforms主要包括:
# 1. ToTensor():将PIL图片或numpy数组转为Tensor,并将像素值归一化到[0,1]区间。
# 2. Resize((224,224)):将所有图片大小统一为224x224,以匹配后续卷积神经网络的输入要求。
# 对于实际训练,更建议加入数据增强手段(如随机裁剪、翻转、归一化等),
# 但本例先展示基本流程。
dataset_transform = transforms.Compose([transforms.ToTensor(),transforms.Resize((224,224))
])# 使用ImageFolder加载训练集和验证集
# ImageFolder会扫描指定目录下的子文件夹,并以子文件夹名称作为类别。
flowers_train = ImageFolder(root=flowers_train_path, transform=dataset_transform)
flowers_val = ImageFolder(root=flowers_val_path, transform=dataset_transform)# 打印样本数量
print("训练集样本数:", len(flowers_train))
print("验证集样本数:", len(flowers_val))# flowers_train.classes属性包含类别名称列表,如['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']
print("类别名称列表:", flowers_train.classes)# 获取单个样本进行查看
# __getitem__(index)返回(img, label),img是Tensor,label是int
sample_index = 3000
sample_img, sample_label = flowers_train[sample_index]print("样本索引:", sample_index)
print("类别标签索引:", sample_label, "类别名称:", flowers_train.classes[sample_label])
print("图像Tensor尺寸:", sample_img.shape) # 期望为[3,224,224]# 可视化图像
# Matplotlib的imshow要求图像为(H,W,C),而Tensor是(C,H,W),需要permute调整维度顺序。
plt.imshow(sample_img.permute(1,2,0))
plt.title(flowers_train.classes[sample_label])
plt.show()
代码输出:
关于训练集、验证集和测试集的说明
本数据集中已提前将数据分为train
和val
两个目录:
-
train/
:训练集,用于模型训练过程中反向传播和参数更新。 -
val/
:验证集,用于在训练中间进行性能评估,不参与参数更新,仅用于选择超参数或判断训练是否过拟合。
有些数据集还会提供test/
测试集,用于最终评估模型在未知数据上的表现,但本例中未提供,如有需要可自行分割数据或从其他来源获取。
DataLoader的引入
仅有ImageFolder
还不够,为了在训练时批量读取数据并进行迭代,我们通常会将数据集对象传入DataLoader
中。
DataLoader
的作用是:
-
按指定的batch_size从Dataset中抽取样本构成mini-batch。
-
可设置
shuffle=True
来随机打乱样本顺序,防止模型记住样本顺序。 -
使用
num_workers
参数并行加速数据加载。
示例(可选代码):
from torch.utils.data import DataLoaderbatch_size = 32
# 定义训练集和验证集的DataLoader
train_loader = DataLoader(flowers_train, batch_size=batch_size, shuffle=True, num_workers=2)
val_loader = DataLoader(flowers_val, batch_size=batch_size, shuffle=False, num_workers=2)# 测试一下加载结果
images, labels = next(iter(train_loader))
print("一个batch的图像尺寸:", images.shape) # [batch_size, 3, 224, 224]
print("对应的标签:", labels) # 张量形式,如tensor([0, 1, 3, ...])
有了DataLoader,我们在训练模型时,就可以轻松迭代数据:
for epoch in range(1):for batch_images, batch_labels in train_loader:# 在这里将batch_images, batch_labels输入模型进行训练print("一个batch的图像尺寸:", batch_images.shape) # [batch_size, 3, 224, 224]print("对应的标签:", batch_labels) # 张量形式,如tensor([0, 1, 3, ...])passbreak
我们可以打印一下第一个batch 和最后一个batch的标签
batch_count = 0
first_batch_images, first_batch_labels = None, None
last_batch_images, last_batch_labels = None, Nonefor epoch in range(1):for batch_images, batch_labels in train_loader:batch_count += 1# 保存第一个batchif batch_count == 1:first_batch_images, first_batch_labels = batch_images, batch_labelsprint("第一个batch的图像尺寸:", batch_images.shape)print("第一个batch的标签:", batch_labels)# 每次循环都会更新last_batchlast_batch_images, last_batch_labels = batch_images, batch_labelsbreak # 只进行一次epoch的训练,移除这行会进行多个epoch的训练# 打印最后一个batch
print("最后一个batch的图像尺寸:", last_batch_images.shape)
print("最后一个batch的标签:", last_batch_labels)# 打印总共的batch数量
print("总共的batch数量:", batch_count)
数据增强策略的拓展
实际训练中,为提高模型的泛化能力,我们常加入数据增强操作。这些操作对训练集图像进行随机变换,如随机剪裁、翻转、颜色抖动、归一化等。这样模型不会过度记忆特定图像的像素分布,而会学习更有泛化性的特征。
一个常用的transform示例:
# 定义训练集的图像预处理流程
train_transform = transforms.Compose([# 随机裁剪并缩放图像到224x224的尺寸,裁剪的区域大小是随机的transforms.RandomResizedCrop(224), # 随机进行水平翻转,用于数据增强,提升模型的泛化能力transforms.RandomHorizontalFlip(),# 将图像转换为Tensor类型,PyTorch要求输入为Tensor格式transforms.ToTensor(),# 进行图像的标准化处理。根据ImageNet数据集的均值和标准差进行归一化,# 使得不同的通道(RGB)具有相同的尺度,便于训练。transforms.Normalize(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225])
])# 定义验证集的图像预处理流程
val_transform = transforms.Compose([# 将图像的最短边缩放到256像素,保持长宽比例不变transforms.Resize(256), # 从缩放后的图像中进行中心裁剪,裁剪出224x224的区域,这样图像的尺寸就一致了transforms.CenterCrop(224),# 将图像转换为Tensor类型,PyTorch要求输入为Tensor格式transforms.ToTensor(),# 进行图像的标准化处理。根据ImageNet数据集的均值和标准差进行归一化,# 使得不同的通道(RGB)具有相同的尺度,便于训练。transforms.Normalize(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225])
])# 使用定义的transform对训练集和验证集进行图像预处理
# flowers_train_path和flowers_val_path是训练集和验证集图像所在的路径
flowers_train = ImageFolder(flowers_train_path, transform=train_transform) # 训练集
flowers_val = ImageFolder(flowers_val_path, transform=val_transform) # 验证集
在此示例中,Normalize
的参数是使用ImageNet数据集的均值和标准差,这在使用ImageNet预训练模型时是常规操作。对于自定义数据集,你也可以先统计本数据集的均值和方差,再进行归一化。
我们可以打印一下变化前后的图像区别
import os
import random
import numpy as np # 需要导入numpy
import matplotlib.pyplot as plt
from PIL import Image
from torchvision import transforms
from torchvision.datasets import ImageFolder# 定义训练集的图像预处理流程
train_transform = transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])# 定义图像数据集路径
train_image_folder = '/Users/coyi/PycharmProjects/coyi_pythonProject/01.图像分类/dataset/flower_datas/train/'# 使用ImageFolder加载数据集
dataset = ImageFolder(train_image_folder, transform=None)# 随机选取一张图片
random_idx = random.randint(0, len(dataset) - 1)
image, label = dataset[random_idx]# 显示原始图像
plt.figure(figsize=(5,5))
plt.title("Original Image")
plt.imshow(image)
plt.axis('off') # 不显示坐标轴
plt.show()# 应用train_transform变换
transformed_image = train_transform(image)# 反标准化(Undo normalization)以恢复图片的原始视觉效果,因为训练的时候需要标准化
inv_normalize = transforms.Normalize(mean=[-0.485, -0.456, -0.406], std=[1/0.229, 1/0.224, 1/0.225])
unnormalized_image = inv_normalize(transformed_image)# 将Tensor转回PIL图像进行显示
unnormalized_image = unnormalized_image.permute(1, 2, 0).numpy() # 转换为HWC格式
unnormalized_image = np.clip(unnormalized_image, 0, 1) # 限制值在[0, 1]之间,以符合视觉输出# 显示变换后的图像
plt.figure(figsize=(5,5))
plt.title("Transformed Image")
plt.imshow(unnormalized_image)
plt.axis('off') # 不显示坐标轴
plt.show()
输出:
备注: 为了显示图片,我对处理后的图片进行了反标准化,实际上训练的时候是不需要反标准化的
为什么要反标准化?
标准化是一个常见的预处理步骤,目的是让模型训练时更稳定,通常是将像素值转换到均值为0、标准差为1的范围。这可以帮助模型更好地收敛,并且消除不同通道(例如RGB)的尺度差异。
然而,标准化后的图像不适合直接用于可视化,因为它们的像素值已经不在[0, 1]的范围内,可能会变成负数或大于1。反标准化的目的是恢复图像的原始视觉效果,让它们的像素值回到原始的视觉范围。
不反标准化可以吗?
在可视化时不反标准化是可以的,但你会看到经过标准化后的图像没有直观的可视化效果,因为图像的像素值会偏离 [0, 1] 的可视化范围。这会导致显示的图像看起来可能是“失真”的,例如图像会变得非常暗、非常亮,或者有一些不自然的颜色。
简而言之:
• 反标准化是为了恢复图像的原始视觉效果,使得图像显示更符合人类的感知。
• **np.clip()**是为了确保图像的像素值在[0, 1]范围内,符合图像显示的要求。
示例:
假设标准化之后,你得到了一个像素值为 -0.5 或 1.5 的图像像素。这时,如果不进行 np.clip(),直接用 matplotlib 显示,可能会看到图像出现异常的颜色或显示不出来。而通过 np.clip(),将这些像素值限制在[0, 1]的范围内,可以确保图像能正确显示。
类别分布与标签可解释性
flowers_train.classes
或flowers_val.classes
可以查看类名列表。例如:
这意味着模型预测结果中的label=0代表daisy,label=1代表dandelion,以此类推。当我们预测模型输出为label=3
时,就可以将其解释为sunflowers。这种可读性非常有助于后期分析和调试。
如果想查看具体每类样本数量,可手动统计,例如:
通过查看类别分布,我们可了解数据是否偏斜(某些类样本过多或过少),从而采取相应措施(如类均衡采样、权重平衡等)。
实战建议和下一步计划
-
数据准备完成后做什么? 通常下一步就是定义和加载模型(如预训练的ResNet18),然后编写训练循环对模型进行微调或从头训练。在训练循环中,
train_loader
提供批数据,val_loader
则用于评估模型在验证集上的表现。 -
调试DataLoader是否正确工作: 在正式训练前,尝试可视化几个batch的数据样本,确保图像大小、颜色正确,标签映射无误。如果出现图像显示不正确或标签偏移,及时检查目录结构和transform流程。
-
善用数据增强: 当验证集精度停滞不前或出现过拟合时,尝试加入更多数据增强手段(如
RandomRotation
、ColorJitter
、RandomGrayscale
等)提升泛化性能。 -
硬件加速: 在加载大规模数据时,合理增加
num_workers
可以提高数据读取速度(依赖操作系统和硬件条件)。同时,如果是分布式训练,也需考虑分布式Sampler和合适的数据划分策略。 -
定制Dataset: 如果你的数据不遵循
ImageFolder
的结构,也可以自行定义Dataset
类,通过实现__len__
和__getitem__
方法来自定义数据加载流程。但对像本例这样已按类分文件夹的数据集,ImageFolder
无疑是最简单高效的方案。
小结
在本文中,我们从零出发,详细介绍了如何使用PyTorch的ImageFolder
和transforms
加载和预处理鲜花分类数据集。主要点包括:
-
数据集组织结构:子文件夹命名为类名,便于ImageFolder自动识别类别。
-
使用transforms对图像进行ToTensor和Resize等变换,以满足神经网络输入要求。
-
通过可视化样本和打印类别信息确认数据加载的正确性。
-
引入DataLoader批量采样和迭代数据,为后续训练循环奠定基础。
-
展望数据增强、Normalize以及预训练模型迁移学习等实战技巧。
数据加载与预处理是深度学习项目不可或缺的步骤。掌握这些技能,能够让你在模型开发和实验中更加得心应手。未来你可以尝试更多高级技巧,如自定义transforms、对数据集进行统计分析、探索更复杂的增强策略和分布式数据加载方法。
达成这些基础后,你就可以开始定义模型(如使用torchvision.models.resnet18(pretrained=True)
加载预训练模型)、设置损失函数(如CrossEntropyLoss)、选择优化器(如Adam或SGD),并在训练循环中快速迭代提升模型性能。
希望本文介绍,能为你对CV数据加载与预处理的理解添砖加瓦,帮助你在图像分类任务中迈出稳健的一步。
如果你遇到了什么问题,或者想了解某些方面的知识,欢迎在评论区留言
相关文章:
【计算机视觉基础CV-图像分类】03-深度学习图像分类实战:鲜花数据集加载与预处理详解
本文将深入介绍鲜花分类数据集的加载与处理方式,同时详细解释代码的每一步骤并给出更丰富的实践建议和拓展思路。以实用为导向,为读者提供从数据组织、预处理、加载到可视化展示的完整过程,并为后续模型训练打下基础。 前言 在计算机视觉的深…...
ubuntu 如何重装你的apt【apt-get报错: symbol lookup error/undefined symbol】
副标题:解决error:apt-get: symbol lookup error: /lib/x86_64-linux-gnu/libapt-private.so.0.0: undefined symbol: _ZNK13pkgTagSection7FindULLENS_3KeyERKy, version APTPKG_6.0 文章目录 问题描述报错分析解决方案:重装你的apt1、查看你的ubuntu版本2、下载适配你的ap…...
Unity 上好用的插件
PlayerMaker BehaviorDesigner Cinemachine Timeline Hybrid Addressable AssetBundle Blower Simple Zoom 大地图上缩放和平移使用ScrollRect的好效果实现...
大数据机器学习算法和计算机视觉应用07:机器学习
Machine Learning Goal of Machine LearningLinear ClassificationSolutionNumerical output example: linear regressionStochastic Gradient DescentMatrix Acceleration Goal of Machine Learning 机器学习的目标 假设现在有一组数据 x i , y i {x_i,y_i} xi,yi&…...
Godot RPG 游戏开发指南
Godot RPG 游戏开发指南 一、基础准备 1. 开发环境 下载并安装最新版 Godot 4.x选择使用 GDScript 或 C# 作为开发语言准备基础美术资源(角色、地图、道具等) 2. 项目结构 project/ ├── scenes/ # 场景文件 ├── scripts/ # 脚…...
c++ 找第一个只出现一次的字符
【题目描述】 给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。 【输入】 一个字符串,长度小于100000。 【输出】 输出第一个仅出现一次的字符,若没有则输出no。 【输入样例】 abcabd【输出样…...
时空信息平台架构搭建:基于netty封装TCP通讯模块(IdleStateHandler网络连接监测,处理假死)
文章目录 引言I 异步TCP连接操作II 心跳机制:空闲检测(读空闲和写空闲)基于Netty的IdleStateHandler类实现心跳机制(网络连接监测)常规的处理假死健壮性的处理假死方案获取心跳指令引言 基于netty实现TCP客户端:封装断线重连、连接保持 https://blog.csdn.net/z92911896…...
【Rust自学】3.6. 控制流:循环
3.6.0. 写在正文之前 欢迎来到Rust自学的第三章,一共有6个小节,分别是: 变量与可变性数据类型:标量类型数据类型:复合类型函数和注释控制流:if else控制流:循环(本文) 通过第二章…...
如何正确计算显示器带宽需求
1. 对显示器的基本认识 一个显示器的参数主要有这些: 分辨率:显示器屏幕上像素点的总数,通常用横向像素和纵向像素的数量来表示,比如19201080(即1080p)。 刷新率:显示器每秒钟画面更新的次数&…...
mysql 基于chunk机制是如何支持运行期间,动态调整buffer pool大小的
mysql 基于chunk机制是如何支持运行期间,动态调整buffer pool大小的 MySQL 的 InnoDB 存储引擎确实支持在运行期间动态调整缓冲池(buffer pool)的大小,但其机制与自定义缓存系统有所不同。InnoDB 通过内部优化和配置参数来实现这…...
梳理你的思路(从OOP到架构设计)_简介设计模式
目录 1、 模式(Pattern) 是较大的结构编辑 2、 结构形式愈大 通用性愈小编辑 3、 从EIT造形 组合出设计模式 1、 模式(Pattern) 是较大的结构 组合与创新 達芬奇說:簡單是複雜的終極形式 (Simplicity is the ultimate form of sophistication) —Leonardo d…...
【Redis】缓存
什么是缓存 https://tech.meituan.com/2017/03/17/cache-about.html Spring Data Redis Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能。 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>sp…...
基于 PyCharm 和 Navicat 的新闻管理系统
# 用于创建连接池 pip3 install mysql-connector-python # 改变终端打印颜色 pip3 install colorama 1.创建连接池 文件地址:db/mysql_db.py 首先建立一个与 MySQL 数据库的连接池,以便在应用程序中复用连接,提高性能。 如果连接池创建失败…...
<QNAP 453D QTS-5.x> 日志记录: 优化性能 内存管理 修改swap优先顺序 swap放在ssd 网络稳定性 进程出错管理
起因 几个月前,开始重学编程,往 NAS 的 docker 里放了些 containers ,每一个用来跑练习的 App。为了放更多的app,上个月加了 4GB 内存。最近只放了两个,NAS 就会时不时的闪断。codes 全存在网络驱动器上,当…...
一区牛顿-拉夫逊算法+分解+深度学习!VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测
一区牛顿-拉夫逊算法分解深度学习!VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测 目录 一区牛顿-拉夫逊算法分解深度学习!VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院一区…...
本地部署webrtc应用怎么把http协议改成https协议?
环境: WSL2 Ubuntu22.04 webrtc视频聊天应用 问题描述: 本地部署webrtc应用怎么把http协议改成https协议? http协议在安卓手机浏览器上用不了麦克风本,来地应用webrtc 本来是http协议,在安卓手机上浏览器不支持使…...
React简单了解
原理简化了解 import React from "react" import { createRoot } form "react-dom/client"const element React.createElement(p,{id: hello},Hello World! )const container document.querySelector(#root) const root createRoot(container) root.r…...
基于LabVIEW的USRP信道测量开发
随着无线通信技术的不断发展,基于软件无线电的设备(如USRP)在信道测量、无线通信测试等领域扮演着重要角色。通过LabVIEW与USRP的结合,开发者可以实现信号生成、接收及信道估计等功能。尽管LabVIEW提供了丰富的信号处理工具和图形…...
Docker挂载
目录 数据卷挂载 本地目录挂载 数据卷挂载 宿主机默认的存放所有容器数据卷的目录:/var/lib/docker/volumes nginx容器 静态文件目录:/usr/share/nginx/html 配置文件目录:/etc/nginx/nginx.conf 修改宿主机的内容,进入到容器查…...
使用Java结合经纬度位置计算目标点的日出日落时间
目录 前言 一、应用示例 1、天安门升旗时间 2、湖南省日出日落信息 二、JAVA日出日落计算 1、在线API 2、使用Java进行计算 三、总结 前言 随着城市化进程的加速,城市环境与人类生活的联系日益紧密。城市不仅承载着居住、工作、休闲等多种功能,也…...
八字精批api接口_php获取生成八字和批注的方法研究
八字算命 API 介绍 这个八字算命 API 提供了一种便捷的方式,让用户通过 GET 或 POST 请求获取详细的八字信息。API 返回的数据格式为 JSON,包含多种命理分析和建议,适合对传统命理学感兴趣的用户。 API 功能 五行分析: 提供用户…...
docker run 命令参数
user docker run -it --nameubn18 --gpus all --privilegedtrue --shm-size 8G ubuntu:18.04 /bin/bash-it 是什么意思 4o 在运行 docker run 命令时,-it 是两个选项的组合,用于更好地与容器进行交互: -i 或 --interactive:这个选…...
智能外呼技术如何改变企业营销方式
智能外呼技术如何改变企业营销方式 作者:开源大模型智能呼叫中心系统FreeAICC,Github:https://github.com/FreeIPCC/FreeAICC 在数字化时代,企业营销方式正经历着前所未有的变革。其中,智能外呼技术作为一项前沿的人…...
redis数据转移
可能有时候因为硬件的原因我们我们需要更换服务器,如果更换服务器的话,那我们redis的数据该怎样转移呢,按照一下步骤即可完成redis数据的转移 1.进入redis客户端 2.使用 bgsave命令进行数据的备份,此命令完成后会在你的redis安装目…...
STM32-笔记5-按键点灯(中断方法)
1、复制03-流水灯项目,重命名06-按键点灯(中断法) 在\Drivers\BSP目录下创建一个文件夹exti,在该文件夹下,创建两个文件exti.c和exti.h文件,并且把这两个文件加载到项目中,打开项目工程文件 加载…...
DotNetBrowser 3.0.0 正式发布!
🛠️ 重要消息:DotNetBrowser 3.0.0 正式发布! 我们很高兴向您介绍全新的 DotNetBrowser 3.0.0 版本。此次更新带来了多项重要功能与优化,进一步提升了 Web 开发的效率和体验。 📢 DotNetBrowser 3.0.0 包含哪些新功…...
MySQL基础笔记(三)
在此特别感谢尚硅谷-康师傅的MySQL精品教程 获取更好的阅读体验请前往我的博客主站! 如果本文对你的学习有帮助,请多多点赞、评论、收藏,你们的反馈是我更新最大的动力! 创建和管理表 1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数…...
SEO初学者-搜索引擎如何工作
搜索引擎基础搜索引擎是如何建立索引的搜索引擎如何对网页进行排名搜索引擎是如何个性化搜索结果的 搜索引擎的工作方式是使用网络爬虫抓取数十亿个页面。爬虫也称为蜘蛛或机器人,它们在网络上导航并跟踪链接以查找新页面。然后,这些页面会被添加到搜索引…...
在Ubuntu下运行QEMU仿真FreeBSD riscv64系统
在Ubuntu下运行QEMU仿真FreeBSD riscv64系统 突发奇想,尝试在Ubuntu下运行QEMU仿真FreeBSD riscv64系统, 参考这篇文档:手把手教你在QEMU上运行RISC-V Linux_qemu 运行 .bin-CSDN博客 并参考FreeBSD的Wiki:riscv - FreeBSD Wik…...
SQL 使用带聚集函数的联结
聚集函数用于汇总数据,通常用于从一个表中计算统计信息,但也可以与联结一起使用。以下是一个例子,展示如何使用聚集函数统计每个顾客的订单数。 示例 1:使用 COUNT() 函数与 INNER JOIN 假设我们需要检索所有顾客及每个顾客所下…...
Linux网络功能 - 服务和客户端程序CS架构和简单web服务示例
By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述准备工作扫描服务端有那些开放端口创建客户端-服务器设置启动服务器和客户端进程双向发送数据保持服务器进程处于活动状态设置最小…...
爬取Q房二手房房源信息
文章目录 1. 实战概述2. 网站页面分析3. 编写代码爬取Q房二手房房源信息3.1 创建项目与程序3.2 运行程序,查看结果 4. 实战小结 1. 实战概述 本次实战项目旨在通过编写Python爬虫程序,抓取深圳Q房网上的二手房房源信息。我们将分析网页结构,…...
【JavaEE初阶】线程 和 thread
本节⽬标 认识多线程 掌握多线程程序的编写 掌握多线程的状态 一. 认识线程(Thread) 1概念 1) 线程是什么 ⼀个线程就是⼀个 "执⾏流". 每个线程之间都可以按照顺序执⾏⾃⼰的代码. 多个线程之间 "同时" 执⾏着多份代码. 还…...
【IMU:视觉惯性SLAM系统】
视觉惯性SLAM系统简介 相机(单目/双目/RGBD)与IMU结合起来就是视觉惯性,通常以单目/双目IMU为主。 IMU里面有个小芯片可以测量角速度与加速度,可分为6轴(6个自由度)和9轴(9个自由度)IMU,具体的关于IMU的介…...
【python实现烟花】
可以使用 Python 的 turtle 模块来实现烟花效果。下面是一个简单的示例代码,展示如何用 turtle 绘制烟花: import turtle import random# 设置屏幕 screen turtle.Screen() screen.bgcolor("black")# 创建烟花函数 def draw_firework(x, y):…...
OpenCV学习——图像融合
import cv2 as cv import cv2 as cvbg cv.imread("test_images/background.jpg", cv.IMREAD_COLOR) fg cv.imread("test_images/forground.png", cv.IMREAD_COLOR)# 打印图片尺寸 print(bg.shape) print(fg.shape)resize_size (1200, 800)bg cv.resize…...
CS 144 check6: buiding an IP router
Lecture Notes Exercises 路由器的任务是根据路由表转发接收到的数据报:路由表是一系列规则,用于指导路由器针对任何给定的数据报应如何进行转发。 发送出什么接口。下一跳的IP地址。 这个check的工作是实现一个路由器,它可以为任何给定的…...
Pytorch | 从零构建ResNet对CIFAR10进行分类
Pytorch | 从零构建ResNet对CIFAR10进行分类 CIFAR10数据集ResNet核心思想网络结构创新点优点应用 ResNet结构代码详解结构代码代码详解BasicBlock 类ResNet 类ResNet18、ResNet34、ResNet50、ResNet101、ResNet152函数 训练过程和测试结果代码汇总resnet.pytrain.pytest.py 前…...
Spring整合Redis基本操作步骤
Spring 整合 Redis 操作步骤总结 1. 添加依赖 首先,在 pom.xml 文件中添加必要的 Maven 依赖。Redis 相关的依赖包括 Spring Boot 的 Redis 启动器和 fastjson(如果需要使用 Fastjson 作为序列化工具): <!-- Spring Boot Re…...
java中的方法的重载和重写、构造器
目录 方法的重载和重写、构造器1.java的修饰符:2.普通方法3.构造器(也叫构造方法/构造函数)4.方法的重载5.补充6.方法的重写7.类的执行顺序8.再看方法的重写 方法的重载和重写、构造器 1.java的修饰符: public修饰的代码…...
Vite 系列课程|1课程道路,2什么是构建工具
Vite 系列课程 1. 课程导论 1.1 为什么要学习 Vite? 1.1.1 Webpack vs. Vite:新旧霸主的交替? Webpack 长期以来一直是前端构建工具的事实标准,拥有庞大的用户群体、成熟的生态系统和丰富的学习资源。然而,随着前端技术…...
【蓝桥杯选拔赛真题96】Scratch风车旋转 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析
目录 scratch风车旋转 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 scratc…...
SQL血缘解析
Druid 作为使用率特别高的的数据库连接池工具,在具备完善的连接池管理功能外,同时Druid 的 SQL解析功能可以用来防止 SQL注入等安全风险。通过对 SQL 语句进行解析和检查,Druid 可以识别并阻止潜在的恶意 SQL 语句执行,黑名单(阻止特定的 SQL 语句执行)、白名单(仅允许特…...
Docker 部署机器学习模型
1.编写机器学习代码 (1)新建一个 mlmodel.py import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sk…...
leetcode 面试经典 150 题:无重复字符的最长子串
链接无重复字符的最长子串题序号3类型字符串解题方法滑动窗口难度中等 题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 …...
LeetCode 283. 移动零 (C++实现)
1. 题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 …...
基于Spring Boot的个人财务系统
一、系统背景与目的 随着全球经济的发展和人们生活水平的提高,个人财务管理变得越来越重要。传统的个人财务软件存在操作复杂、用户体验差、数据不安全等问题,无法满足用户的个性化需求。因此,开发一种基于Spring Boot的个人财务系统&#x…...
【计算机网络2】计算机网络的性能能指标
目录 一 、计算机网络的性能指标 二、具体介绍 1、速 率 2、带 宽 3、吞 吐 量 4、时 延 5、时延带宽积 6、往 返 时 延 7、信道利用率 一 、计算机网络的性能指标 计算机网络的性能指标就是从不同方面度量计算机网络的性能,有如下7个指标: 速…...
Axure RP9 的详细安装及Axure入门应用
文章目录 一、Axure 是什么?二、Axure 的应用场景三、Axure 安装1. 下载安装2. 汉化授权 附:下载链接 一、Axure 是什么? 1、Axure 是一种强大的原型设计工具,它可以帮助设计师和产品经理快速创建交互式的、高保真度的原型,并进行用户体验…...
Scala学习记录 如何打印输出
在Scala中,打印输出可以通过多种方式实现,以下是一些常见的打印输出方法: 1.使用printf()方法: 这是一种传统的C语言风格的打印方式,通过格式化字符串来控制输出的格式。例如,printf("整数:…...