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

计算机视觉:卷积神经网络(CNN)基本概念(一)

第一章:计算机视觉中图像的基础认知
第二章:计算机视觉:卷积神经网络(CNN)基本概念(一)
第三章:计算机视觉:卷积神经网络(CNN)基本概念(二)
第四章:搭建一个经典的LeNet5神经网络

一、引言

卷积神经网络(Convolutional Neural Network, CNN)是一种专门设计用于处理图像数据的深度学习模型,是计算机视觉领域的核心技术,从人脸识别到自动驾驶,它的应用无处不在。

它在图像识别、分类、目标检测等领域表现出色,通过一系列组件如卷积层、池化层和全连接层等,能够自动从图像中学习有用的特征,而无需手动设计。

它是如何从图像中“看见”并理解世界的?本文将解析CNN的核心组件、特征抽取原理,并通过代码展示其强大能力。

二、图像特征

在理解卷积神经网络概念之前,先理解图像中的特征是什么?这个很重要。

1. 什么是特征?
定义:特征是图像中可辨识的模式或结构,例如边缘角点纹理颜色分布等。

类比:假设你看到一只猫,你会注意到它的耳朵形状(边缘)、胡须(纹理)、眼睛位置(角点)——这些就是“特征”。

2. 特征分几个层次
低层特征:边缘、角点、颜色(由浅层卷积核提取),定位物体轮廓,区分前景与背景。
中层特征:纹理、简单形状(如圆形、线条组合),
高层特征:物体部件(如车轮、猫耳)或完整物体,检测复杂物体部件(如眼睛、鼻子)。

低层特征:边缘与角点检测示例(使用 OpenCV 的 Canny 算法):
边缘特征是指图像中灰度值变化较大的区域,通常表示物体的边界。
角点特征是指图像中两条边缘相交的点,通常表示物体的角点。

import cv2
import matplotlib.pyplot as plt# 读取图像并转灰度
img = cv2.imread("boy.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Canny 边缘检测
edges = cv2.Canny(gray, threshold1=100, threshold2=200)# 显示结果
plt.subplot(131), plt.imshow(img), plt.title('Original')
plt.subplot(132), plt.imshow(gray, cmap='gray'), plt.title('Original gray')
plt.subplot(133), plt.imshow(edges, cmap='gray'), plt.title('Edges')
plt.show()

效果:左侧为原图,中间为灰度图,右侧为边缘检测结果,白色线条表示边缘。
在这里插入图片描述
中层特征:纹理与形状,纹理提取示例:
纹理特征描述了图像中像素的排列方式,反映了表面的粗糙度、平滑度等特性
形状特征描述了物体的轮廓和几何形状。

from skimage.feature import local_binary_pattern
import numpy as np# 计算 LBP 纹理特征
radius = 3
n_points = 8 * radius
lbp = local_binary_pattern(gray, n_points, radius, method='uniform')# 显示纹理
plt.imshow(lbp, cmap='jet'), plt.title('LBP Texture')
plt.colorbar()
plt.show()

效果:不同颜色表示不同纹理模式,例如重复的斑纹或平滑区域。

cmap=‘jet’cmap=‘gray’
在这里插入图片描述在这里插入图片描述

高层特征:物体部件(以 CNN 特征图为例)可视化 CNN 卷积层的特征图(使用 PyTorch):

import torch
import torchvision.models as models
import torchvision.transforms as transforms
from PIL import Image# 加载预训练的 VGG16 模型
model = models.vgg16(pretrained=True).features[:4]  # 取前4层(第一个卷积块)
model.eval()# 读取图像并预处理
img = Image.open("boy.jpg")
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
input_tensor = transform(img).unsqueeze(0)# 提取特征图
with torch.no_grad():features = model(input_tensor)# 可视化第1个卷积核的输出(第0通道)
plt.imshow(features[0, 0, :, :], cmap='viridis')
plt.title('CNN Feature Map (Channel 0)')
plt.colorbar()
plt.show()

在这里插入图片描述

三、什么是卷积神经网络?

3.1 CNN基本概念

卷积神经网络(CNN)是一种特别适用于图像处理任务的深度学习架构。其主要优势在于能够自动提取图像中的特征(边缘、纹理、形状等),而不是依赖于手工设计的特征提取方法。CNN包括卷积层、池化层和全连接层等关键组件,每个组件都有特定的功能和作用。

3.2 主要组件

  1. 卷积层(Convolutional Layer)
    • 功能:卷积层通过应用一系列卷积核(也称为滤波器)来提取图像的局部特征。
    • 工作原理:每个卷积核在输入图像上滑动,计算局部区域的加权和,生成一个特征图(Feature Map)。这些特征图捕捉了图像的边缘、纹理、形状等低级特征。
    • 关键参数
      • 卷积核尺寸(如3×3)
      • 步长(Stride):滑动步长(影响输出尺寸)
      • 填充(Padding):边缘补零(控制输出尺寸)

使用一个形象一点的动图来展示卷积,蓝色边框组成的矩阵,就代表一张图片,因为一张图片可以转换成为一个矩阵,红色的矩阵就是卷积核,卷积核就是一个矩阵,取名叫卷积核,红色的矩阵在蓝色图片矩阵上滑动,每滑动一步,就做一次矩阵乘法,就是 2 个9乘9 的矩阵相乘,得到一个数(黑色的点),所有的像素点都被滑动完了,就得到一个右边的新的红色的矩阵,这个红色矩阵代表的是一张新的图像,新的图像也代表了左边原图的一个特征图。这个过程就是卷积,你细品!
在这里插入图片描述
下面这张图,是经典的卷积神经网络,convolutions 就是卷积操作。红色箭头指的地方,可以形象看到,卷积之后的结果,使图像变多了,这些多出来的图像就是上一层图像的特征图。
在这里插入图片描述

代码示例
这段代码展示了如何手动实现一个简单的二维卷积操作,使用NumPy库来处理图像和卷积核。

import numpy as np
# 图像
# 生成一个 64 × 64 的二维数组(模拟灰度图像),其元素是从标准正态分布中随机抽取的。
img = np.random.randn(64, 64)
# 卷积核
# 生成一个 3×3 的二维数组(模拟卷积核或滤波器),其元素也是从标准正态分布中随机抽取的。
kernel = np.random.randn(3, 3)
# 初始尺寸
# 获取输入图像的高度和宽度。
H, W = img.shape
# 获取卷积核的高度和宽度。
k, k = kernel.shape
# 结果
# 根据输入图像和卷积核的尺寸,初始化一个与输出大小相匹配的全零矩阵。
# 输出的尺寸是 (H-k+1, W-k+1),这是由于卷积过程中卷积核在图像上滑动时的有效区域大小。
result = np.zeros(shape=(H-k+1, W-k+1))
"""卷积的基本计算
"""
# 遍历 H 方向,遍历图像的高度方向,确保卷积核可以在该位置完全覆盖图像的部分。
for h_idx in range(H-k+1):# 遍历 W 方向,遍历图像的宽度方向,同样确保卷积核可以在此位置完全覆盖图像的部分。for w_idx in range(W-k+1):# 图像块,提取当前卷积核位置对应的图像块。img_block = img[h_idx: h_idx + k, w_idx: w_idx + k]# 填充结果# 对提取出的图像块和卷积核进行逐元素相乘后求和,得到的结果存入结果矩阵对应的位置。result[h_idx, w_idx] = (img_block * kernel).sum()
# 结果矩阵 result 包含了所有卷积操作的结果,每个值代表了原图中相应位置经过卷积运算后的响应值。
result

总结:这段代码演示了如何使用纯Python和NumPy实现基本的二维卷积操作。它首先生成了一个模拟的图像和卷积核,然后通过遍历图像的每一个可能放置卷积核的位置,计算卷积核与图像局部区域的点积之和,从而形成一个新的特征图。这个过程是许多计算机视觉任务中的基础,比如边缘检测、特征提取等。通过这种方式,可以直观地理解卷积操作是如何工作的。

下面这段代码,是使用PyTorch实现卷积操作

import torch
import torch.nn as nn# 定义输入:1张3通道的5x5图像
input = torch.randn(1, 3, 5, 5)  # [N, C, H, W]# 定义卷积层:3输入通道,2输出通道,3x3卷积核,步长1,填充1
conv = nn.Conv2d(in_channels=3, out_channels=2, kernel_size=3, stride=1, padding=1)# 执行卷积
output = conv(input)
print(output.shape)  # 输出形状:[1, 2, 5, 5]
  1. 激活函数(Activation Function)
    • 功能:引入非线性因素,使网络能够学习更复杂的模式,在二维平面里简单理解,一条直线y=wx+b,不管你的参数w和 b做什么样的变化,y 始终是一条直线,x 和 y 始终是线性关系,为了把直线掰弯,就得在y上面增加一个函数,这个使直线弯曲的函数,就是激活函数。
    • 常用类型:ReLU、Sigmoid 和 Tanh。

下面是三个函数在二维坐标系里的图像,感受一下,函数都很简单,比如ReLU:f(x)= max(0,x),即对于输入x,如果x大于0,则输出x;如果x小于或等于0,则输出0。上面的例子y=wx+b,增加一个ReLU,y=max(0,wx+b),y就不再是一条直线了,y 和 x 的关系就不再是线性的了,
在这里插入图片描述
在这里插入图片描述
你可能会说,这样做了那不就改变了原本的表达含义了吗,其实我们要处理的任务本来就不是一个线性关系,比如下面这个图像分类,把黄色的点和蓝色的点分开,就不会是一条线性的线。
在这里插入图片描述

我们在训练模型的时候,计算机要从一推数据中去找规律,本来就很复杂,不可能是线性的规律。无激活函数的神经网络仅是线性变换的堆叠,无法学习复杂模式。后面在讲激活函数的威力,现在只需要有个初步认识。

代码示例:ReLU激活效果可视化

import matplotlib.pyplot as plt# 生成一个从-5到5之间均匀分布的100个数值的张量。这将作为ReLU激活函数的输入值范围。
x = torch.linspace(-5, 5, 100)
# 将ReLU激活函数应用于每个元素的 x 张量,得到一个新的张量 y,其中所有负数都被替换为0。
y = nn.ReLU()(x)
# 将PyTorch张量转换为NumPy数组后进行绘图。
# x.numpy() 和 y.numpy() 分别表示ReLU函数的输入和对应的输出值。
plt.plot(x.numpy(), y.numpy())
plt.title("ReLU Activation")
plt.xlabel("Input")
plt.ylabel("Output")
plt.show()

在这里插入图片描述
直观地看到ReLU是如何工作的——它将所有的负输入值变为0,而正输入值保持不变。

  • 在 (x<0) 的区域,图形与X轴重合,因为ReLU对所有负输入返回0。
  • 在 (x>0) 的区域,图形是一条斜率为1的直线,表明ReLU对所有正输入返回其本身值。

激活函数如何发挥作用,可以看看这个视频,比较形象,《10分钟直观展示神经网络是怎样学会任何东西的!》

  1. 池化层(Pooling Layer)
    • 功能:通过降采样操作减少特征图的尺寸,即宽度和高度,同时保留重要的信息,从而降低计算复杂度并防止过拟合。就是特征图太大了,为了减少计算量,把特征图的像素变小,假如特征图是 500 x 500 像素的图,通过某种方式,把特征图变成 100 x 100像素。
    • 常用类型:最大池化(Max Pooling)和平均池化(Average Pooling)。

最大池化(Max Pooling)

定义:最大池化操作是在输入特征图上滑动一个固定大小的窗口(通常称为池化核或滤波器),并在每个窗口内选择最大的值作为输出特征图对应位置的值。还是拿这个动图举例,看它是不是把一张大图,滑动+计算之后,就变成了右边的图,右边的图比左边的小。
在这里插入图片描述
还是看看经典的 CNN 网络,红色箭头指的地方,可以形象看到,这就是池化之后的结果,图像的尺寸相比前一层的图片尺寸变小了。
在这里插入图片描述

工作原理

  • 假设有一个 n x n 的局部区域,最大池化会选择这个区域内最大的数值。
  • 例如,在 (2 x 2) 的池化窗口中,如果输入值为
    在这里插入图片描述
    那么最大池化的结果将是 (4),因为它是该窗口中的最大值。

特点

  • 保持显著特征:最大池化倾向于保留最突出的特征(即具有最高激活值的特征),这对于识别图像中的关键部分特别有用。
  • 减少噪声影响:由于它只选择最强信号,因此可以帮助减少背景噪声的影响。
  • 空间不变性:有助于模型对输入的小变化不敏感,增加模型的鲁棒性。

示例代码

import torch
import torch.nn as nn# 创建一个简单的2D张量作为输入
input_tensor = torch.tensor([[[[1, 2, 3, 0],[4, 5, 6, 0],[7, 8, 9, 0],[0, 0, 0, 0]
]]], dtype=torch.float32)# 定义最大池化层
# kernel_size=2, 表示卷积核的大小是2乘2的矩阵
# stride=2,表示每次移动 2 个像素
max_pool = nn.MaxPool2d(kernel_size=2, stride=2)# 应用最大池化
output_tensor = max_pool(input_tensor)
print("最大池化结果:\n", output_tensor)

输出:

最大池化结果:tensor([[[[5., 6.],[8., 9.]]]])

平均池化(Average Pooling)

定义:平均池化操作同样是在输入特征图上滑动一个固定大小的窗口,但它计算的是窗口内所有数值的平均值,而不是最大值。

工作原理

  • 对于同样的 (2 x 2) 区域,如果输入值为
    在这里插入图片描述
    平均池化的结果将是 (1+3+4+2) / 4 = 2.5。

特点

  • 平滑过渡:平均池化通过取平均值的方式可以产生更加平滑的结果,有助于减小特征图中的突变。
  • 信息保留:与最大池化相比,平均池化可能保留更多的原始信息,因为它考虑了区域内所有像素的贡献。

示例代码

# 使用相同的输入张量
# 定义平均池化层
avg_pool = nn.AvgPool2d(kernel_size=2, stride=2)# 应用平均池化
output_tensor_avg = avg_pool(input_tensor)
print("平均池化结果:\n", output_tensor_avg)

输出结果:

平均池化结果:tensor([[[[3.0000, 2.2500],[3.7500, 2.2500]]]])
  1. 全连接层(Fully Connected Layer)
    • 功能:将前面层提取的特征图展平成一维向量,然后通过多层全连接层进行分类或回归,简单理解就是将一个多维度的矩阵,转换成为一个一维的矩阵。全连接层通常位于网络的末端,用于输出最终的预测结果。

在看看经典的 CNN 网络,红色箭头指的地方,可以形象看到,这就是全连接层。在简单点理解就是一个一个的像素点,组成一个一维向量。在这里插入图片描述

具体解释

  1. 特征提取:通过一系列卷积层和池化层,从输入图像中提取出有用的特征。每一层都会生成一个或多个特征图,表示不同层次的抽象特征。

  2. 展平操作:在进入全连接层之前,必须将这些特征图转换为一维向量。这是因为全连接层中的每个神经元都与前一层的所有神经元相连,要求输入是一个一维向量而不是多维矩阵。

  3. 全连接层:展平后的向量被馈送到一个或多个全连接层中。每个全连接层由许多神经元组成,每个神经元接收前一层所有神经元的输出,并通过加权求和和激活函数来计算自己的输出。最后一层通常用于分类或回归任务,其输出维度取决于具体的应用场景(例如,在分类任务中,输出层的神经元数量等于类别的数量)。

示例代码

这里有一个简单的示例,展示如何使用PyTorch实现这个过程:

import torch
import torch.nn as nn# 假设我们有一个经过卷积和池化后的特征图,尺寸为 (batch_size, channels, height, width)
# 这里假设 batch_size=64, channels=32, height=7, width=7
feature_map = torch.randn((64, 32, 7, 7))  # 展平特征图:将 (batch_size, channels, height, width) 转换为 (batch_size, channels*height*width)
flattened_vector = feature_map.view(feature_map.size(0), -1)print("原始特征图尺寸:", feature_map.size())
print("展平后的向量尺寸:", flattened_vector.size())# 定义全连接层 全连接层的输入是in_features=1568 = 32 * 7 * 7个数,输出是out_features=128个数,
# 全连接层要做的,就是怎么把1568个数,映射到128个数上,out_features的每一个数,都和in_features的所有数,都有关系
fc_layer = nn.Linear(in_features=32 * 7 * 7, out_features=128)# 将展平后的向量输入到全连接层
output = fc_layer(flattened_vector)print("全连接层输出尺寸:", output.size())

输出内容看到,展平后的向量尺寸是[64, 1568],这里 64 代表 64 张图片,因为是多张图片同时处理,不是一张一张图片处理,每一张图片展平后的尺寸是1568个像素点。

原始特征图尺寸: torch.Size([64, 32, 7, 7])
展平后的向量尺寸: torch.Size([64, 1568])
展平后的向量: tensor([[ 0.0468,  0.2119,  1.0045,  ...,  0.2380, -0.6989,  0.2017],[-1.2644, -0.4565,  0.2545,  ..., -0.6224,  0.3993,  1.0740],[ 1.5705, -0.5679, -1.4569,  ...,  1.6291,  0.6159, -0.6800],...,[-0.3710,  0.0769, -2.0269,  ...,  0.0668,  2.4325,  0.6908],[ 1.7032, -0.3882,  0.0301,  ...,  0.4000,  0.8739,  0.2931],[-1.9210, -1.7849, -0.4754,  ..., -1.5891, -1.2453,  1.2085]])
全连接层输出尺寸: torch.Size([64, 128])

代码解释

  • feature_map: 输入的特征图,假定大小为 (64 x 32 x 7 x 7)(批次大小为64,通道数为32,高度和宽度均为7)。
  • view 方法: 将特征图展平成形状为 (64 x (32 x 7 x 7)) 的一维向量。这里的 -1 参数告诉PyTorch自动计算该维度的大小。
  • fc_layer: 定义了一个全连接层,它接受一个大小为 (32 x 7 x 7) 的输入,并输出一个大小为128的向量。

通过这种方式,您可以将任意大小的多维特征图转换为适合全连接层处理的一维向量,从而进行进一步的分类或回归任务。

四、什么是灰度图像、灰度值?
五、特征抽取的具体过程
六、CNN的简单案例

接下一篇《计算机视觉:卷积神经网络(CNN)基本概念(二)》

相关文章:

计算机视觉:卷积神经网络(CNN)基本概念(一)

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络 一、引言 卷积神经网络&…...

C#: String s = new String(“Hello“)无法编译?编程语言字符集有两个?为什么这种变量名“\u0061\u0062”都能编译通过?

C#: String s new String("Hello")无法编译? C# String类型是literal常量&#xff0c;默认不能用new创建&#xff0c;但可以在unsafe下用char *字符串指针创建。 char* charPtr stackalloc char[2]; charPtr[0] H; charPtr[1] \0; String myString new Strin…...

网络安全学习笔记之Internet基本知识

Internet构成 根据工作方式&#xff0c;可以把Internet分为边缘部分和核心部分。边缘部分由连接在Internet上的主机&#xff08;用户的终端、服务器&#xff09;组成。用户直接使用边缘部分进行通信和资源共享。核心部分由大量网络和连接这些网络的路由器组成。 服务类别 面向…...

【设计模式】【结构型模式】装饰者模式(Decorator)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…...

3D可视化定制:开启个性化消费新时代

3D可视化定制是一种将产品的三维模型与可视化技术相结合&#xff0c;以满足消费者个性化需求的服务。以下是对3D可视化定制的详细介绍&#xff1a; 一、定义与原理 3D可视化定制是指利用三维建模技术和可视化工具&#xff0c;为消费者提供一个直观、互动且高度个性化的定制平…...

CRMEB 多商户版v3.0.1源码全开源+PC端+Uniapp前端+搭建教程

一.介绍 crmeb多商户是一套B2B2C商家入驻模式的平台多商户商城系统&#xff0c;系统支持平台自营、联营、招商等多种运营模式&#xff0c;可满足企业新零售、批发、分销、预售、O2O、多店、商铺入驻等各种业务需求。 后端全开源、uniapp多端可编译&#xff01; 二、搭建教程…...

java八股文-mysql

1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树&#xff0c;最坏情况o&…...

Audio-Visual Speech Enhancement(视听语音增强)领域近三年研究进展与国内团队及手机厂商动态分析

一、视听语音增强领域近三年研究进展 多模态融合与模型轻量化 多模态特征融合:中国科学技术大学团队提出通过引入超声舌头图像和唇部视频的联合建模,结合知识蒸馏技术,在训练阶段利用教师模型传递舌部运动知识,从而在推断时仅依赖唇部视频即可提升语音增强效果。此外,中科…...

React AJAX:深入理解与高效实践

React AJAX:深入理解与高效实践 引言 随着互联网技术的不断发展,前端开发领域也经历了翻天覆地的变化。React 作为当前最流行的前端框架之一,其强大的组件化和虚拟DOM机制受到了广泛关注。而 AJAX(Asynchronous JavaScript and XML)作为实现前后端数据交互的重要技术,与…...

撕碎QT面具(1):Tab Widget转到某个Tab页

笔者未系统学过C语法&#xff0c;仅有Java基础&#xff0c;具体写法仿照于大模型以及其它博客。自我感觉&#xff0c;如果会一门对象语言&#xff0c;没必要先刻意学C&#xff0c;因为自己具有对象语言的基础&#xff0c;等需要用什么再学也不迟。毕竟不是专门学C去搞算法。 1…...

2025.2.16

Web [GDOUCTF 2023]泄露的伪装&#xff1a; 点进去看就是装神弄鬼&#xff0c;那就直接扫描 果然有东西 第一个是php代码 第二个是个文件 访问发现是一样的 分析一下&#xff1a;使用 file_get_contents($cxk) 函数读取 $cxk 变量中指定的 URL 或文件的内容。 如果读取的内…...

002 第一个python程序

编程语言 编程语言可以做的事情&#xff1a; 网站开发、软件 、游戏、APP、 小程序、 爬虫、 数据分析、脚本 第一个python程序 找到IDE图标pycharm 新建项目 选择项目路径 创建目录 新建python文件 输入代码 运行程序查看结果 print 介绍 print : 输出内容…...

面试完整回答:SQL 分页查询中 limit 500000,10和 limit 10 速度一样快吗?

首先&#xff1a;在 SQL 分页查询中&#xff0c;LIMIT 500000, 10 和 LIMIT 10 的速度不会一样快&#xff0c;以下是原因和优化建议&#xff1a; 性能差异的原因 LIMIT 10&#xff1a; 只需要扫描前 10 条记录&#xff0c;然后返回结果。 性能非常高&#xff0c;因为数据库只…...

《Foundation 起步》

《Foundation 起步》 引言 在当今快速发展的科技时代,了解并掌握最新的技术是至关重要的。本文旨在为初学者提供一个全面的《Foundation》起步指南,帮助大家快速入门并掌握这一强大的技术。 一、什么是Foundation? Foundation 是一个流行的前端框架,由 ZURB 公司开发。…...

【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十五节】

ISO 14229-1:2023 UDS诊断服务测试用例全解析&#xff08;RoutineControl_0x31服务&#xff09; 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月14日 关键词&#xff1a;UDS协议、0x31服务、例程控制、ISO 14229-1:2023、ECU测试 一、服务功能概述 0x31服…...

数据结构:顺序表

目录 一、数据结构的概念 什么是数据结构&#xff1f; 为什么还需要数据结构&#xff1f; 二、顺序表 1.线性表 2.顺序表和数组的区别 3.顺序表分类 3.1静态顺序表 3.2动态顺序表 三、动态顺序表的实现 一、数据结构的概念 什么是数据结构&#xff1f; 数据结构可以…...

LC-随机链表的复制、排序链表、合并K个升序链表、LRU缓存

随机链表的复制 为了在 O(n) 时间复杂度内解决这个问题&#xff0c;并且使用 O(1) 的额外空间&#xff0c;可以利用以下技巧&#xff1a; 将新节点插入到原节点后面&#xff1a;我们可以将复制节点插入到原节点后面。例如&#xff0c;如果链表是 A -> B -> C&#xff0c…...

对于简单的HTML、CSS、JavaScript前端,我们可以通过几种方式连接后端

1. 使用Fetch API发送HTTP请求&#xff08;最简单的方式&#xff09;&#xff1a; //home.html // 示例&#xff1a;提交表单数据到后端 const submitForm async (formData) > {try {const response await fetch(http://your-backend-url/api/submit, {method: POST,head…...

打印问题总结

问题一&#xff1a; 记一次发票打印模糊问题&#xff0c;后端返回的是pdf 之前实现的效果是将后端返回的pdf转成canvas再转成图片 预览 问题&#xff1a; 打印效果很模糊 解决方式&#xff1a; 就是直接预览pdf 借助pdf的打印和下载即可 问题二&#xff1a; 激光打印一般…...

2025蓝桥杯JAVA编程题练习Day4

1.艺术与篮球 问题描述 小蓝出生在一个艺术与运动并重的家庭中。 妈妈是位书法家&#xff0c;她希望小蓝能通过练习书法&#xff0c;继承她的艺术天赋&#xff0c;并练就一手好字。爸爸是一名篮球教练&#xff0c;他希望小蓝能通过篮球锻炼身体&#xff0c;培养运动的激情和…...

github用户名密码登陆失效了

问题&#xff1a; git push突然推代码需要登陆&#xff0c;但是用户名和密码正确输入后&#xff0c;却提示403 git push# Username for https://github.com: **** #Password for https://gyp-programmergithub.com: #remote: Permission to gyp-programmer/my-app.git denie…...

数据结构 day02

3. 线性表 3.1. 顺序表 3.1.3. 顺序表编程实现 操作&#xff1a;增删改查 .h 文件 #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #define N 10 typedef struct seqlist {int data[N];int last; //代表数组中最后一个有效元素的下标 } seqlist_t;//1.创建一个空的顺序表 seq…...

前端里的this指向问题

目录 1.代码输出结果 2.代码输出结果 3.代码输出结果 4.代码输出结果 5.代码输出结果 6.代码输出结果 7.代码输出结果 8.代码输出结果 9.代码输出结果 10.代码输出结果 11.代码输出结果 12.代码输出结果 13.代码输出结果 14.代码输出结果 总结 1.代码输出结果 f…...

pandas(11 分类数据和数据可视化)

前面内容&#xff1a;pandas(10 日期和Timedelta) 目录 一、Python Pandas 分类数据 1.1 pd.Categorical() 1.2 describe() 1.3 获取类别的属性 1.4 分类操作 1.5 分类数据的比较 二、Python Pandas 数据可视化 2.1 基础绘图&#xff1a;plot 2.2 条形图 2.3 直方…...

cmake Qt Mingw windows构建

今天教大家怎么在windows构建qt应用使用cmd命令行&#xff0c;而不是一键通过QtCreator一键构建。首先我们用qtcreator创建一个模板程序(PS&#xff1a;记得在安装qt时要悬着mingw套件&#xff0c;如果安装太慢可以换源&#xff09; 输入以下的命令&#xff1a; mkdir build …...

缓存穿透、缓存击穿、缓存雪崩的区别与解决方案

1. 缓存穿透&#xff08;Cache Penetration&#xff09; 定义&#xff1a;大量请求查询 数据库中不存在的数据&#xff0c;导致请求绕过缓存直接访问数据库&#xff0c;造成数据库压力过大。 场景&#xff1a; 恶意攻击&#xff1a;例如用不存在的用户ID频繁请求。 业务误操作…...

【Rust中级教程】1.6. 内存 Pt.4:静态(static)内存与‘static生命周期标注

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 1.6.1. 静态(static)内存 static内存实际上是一个统称&#xff0c;它指的是程序编译后的文…...

Python爬虫实战:股票分时数据抓取与存储 (1)

在金融数据分析中&#xff0c;股票分时数据是投资者和分析师的重要资源。它能够帮助我们了解股票在交易日内的价格波动情况&#xff0c;从而为交易决策提供依据。然而&#xff0c;获取这些数据往往需要借助专业的金融数据平台&#xff0c;其成本较高。幸运的是&#xff0c;通过…...

HTML之JavaScript对象

HTML之JavaScript对象 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…...

【第12章:深度学习与伦理、隐私—12.3 深度学习模型的透明性与可解释性提升策略】

凌晨三点的ICU病房,AI辅助诊断系统将一位患者的肺炎误判为普通感冒——当主治医生要求查看诊断依据时,系统只能给出冷冰冰的概率数值。这场惊心动魄的误诊事件,掀开了深度学习可解释性危机的冰山一角。 一、模型透明的"第一性原理" 1.1 可解释性的三维度量 ![可…...

SOCKET建立简单的tcp服务端与客户端通信

socket是什么 socket可以使两台机子建立连接&#xff0c;就像连接风扇与电源的插座一样&#xff0c;socket可以使服务端与客户端建立连接&#xff0c;服务端就像供电厂&#xff0c;而客户端就像用电器&#xff0c;而socket就是连接二者的插座。 建立简单的连接 如果我们想在客…...

最新智能优化算法: 阿尔法进化(Alpha Evolution,AE)算法求解23个经典函数测试集,MATLAB代码

一、阿尔法进化算法 阿尔法进化&#xff08;Alpha Evolution&#xff0c;AE&#xff09;算法是2024年提出的一种新型进化算法&#xff0c;其核心在于通过自适应基向量和随机步长的设计来更新解&#xff0c;从而提高算法的性能。以下是AE算法的主要步骤和特点&#xff1a; 主…...

HTML之JavaScript常见事件

HTML之JavaScript常见事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>&…...

《云原生安全攻防》-- K8s镜像安全:镜像全生命周期安全管理

从攻击者的角度来看&#xff0c;针对容器镜像的软件供应链攻击和镜像投毒等攻击方式&#xff0c;不仅攻击成本低&#xff0c;而且还能带来更高且持久的收益。因此&#xff0c;镜像安全问题变得日益突出。 在本节课程中&#xff0c;我们将深入探讨镜像全生命周期的安全管理&…...

【Copilot】Redis SCAN SSCAN

目录 SCAN 命令SSCAN 命令使用示例原理Redis SCAN 和 SSCAN 命令的注意事项及风险注意事项风险 以下内容均由Github Copilot生成。 SCAN 和 SSCAN 命令是 Redis 提供的用于增量迭代遍历键或集合元素的命令。它们的主要优点是可以避免一次性返回大量数据&#xff0c;从而减少对 …...

【含开题报告+文档+PPT+源码】基于Spring+Vue的拾光印记婚纱影楼管理系统

开题报告 本论文旨在探讨基于Spring和Vue框架的拾光印记婚纱影楼管理系统的设计与实现。该系统集成了用户注册登录、个人资料修改、婚庆资讯浏览、婚庆套餐查看、婚纱拍摄预约、婚纱浏览与租赁、客片查看以及在线客服等多项功能&#xff0c;为用户提供了一站式的婚纱影楼服务体…...

静态页面在安卓端可以正常显示,但是在ios打开这个页面就需要刷新才能显示全图片

这个问题可能有几个原因导致,我来分析一下并给出解决方案: 首要问题是懒加载实现方式的兼容性问题。当前的懒加载实现可能在 iOS 上不够稳定。建议修改图片懒加载的实现方式: // 使用 Intersection Observer API 实现懒加载 function initLazyLoading() {const imageObserver…...

【Qt】QObject类的主要功能

在 Qt 中&#xff0c;QObject 类是所有 Qt 对象的基类&#xff0c;提供了许多基础功能&#xff0c;使得 Qt 的对象系统能够有效地工作。它为其他类提供了核心的机制&#xff0c;比如信号和槽机制、对象树结构、内存管理等。 QObject 类的主要功能&#xff1a; 信号和槽机制&am…...

第 16 天:游戏 UI(UMG)开发,打造主菜单 血条!

&#x1f3af; 目标 ✅ 使用 UMG 创建 UI 并在游戏中显示 ✅ 实现血条&#xff08;HP Bar&#xff09;系统&#xff0c;动态显示角色生命值 ✅ 创建主菜单 UI&#xff0c;并添加开始/退出按钮 ✅ 保存当前场景&#xff0c;创建新场景作为主菜单 ✅ 点击 StartGameButton 后&am…...

兔兔答题应用于微信考试、付费考试、社会调查问卷、明星知识问答、员工培训考核、模拟自测、企业面试、试题库等多种场景。

“兔兔答题系统”是一个面向教育、培训和在线测评场景的智能化答题平台&#xff08;兔兔答题官网地址&#xff09;。其设计目标是帮助用户高效完成题目练习、考试组织及学习效果分析&#xff0c;通常具备以下核心功能和特色&#xff1a; 一、核心功能 题库管理 支持多题型录入&…...

【办公类-90-02】】20250215大班周计划四类活动的写法(分散运动、户外游戏、个别化综合)(基础列表采用读取WORD表格单元格数据,非采用切片组合)

背景需求&#xff1a; 做了中班的四类活动安排表&#xff0c;我顺便给大班做一套 【办公类-90-01】】20250213中班周计划四类活动的写法&#xff08;分散运动、户外游戏、个别化&#xff08;美工室图书吧探索室&#xff09;&#xff09;-CSDN博客文章浏览阅读874次&#xff0…...

19.4.6 读写数据库中的二进制数据

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 需要北风数据库的请留言自己的信箱。 北风数据库中&#xff0c;类别表的图片字段在【数据表视图】中显示为Bitmap Image&#xff1…...

使用 Python 爬虫获取微店快递费用 item_fee API 接口数据

在电商运营中&#xff0c;快递费用是影响商家利润和用户体验的重要因素之一。微店作为国内知名的电商平台&#xff0c;提供了丰富的 API 接口供开发者使用&#xff0c;其中也包括查询商品快递费用的接口。通过调用微店的 item_fee 接口&#xff0c;开发者可以获取指定商品的快递…...

蓝桥杯篇---温度传感器 DS18B20

文章目录 前言DS18B201. DS18B20 引脚说明2. 单总线通信协议3. DS18B20 操作流程初始化写操作读操作 4. 示例代码5. 代码说明6. 注意事项总结 前言 本文简单介绍了IAP15F2K61S2中温度传感器模块DS18B20的使用。 DS18B20 DS18B20 是一款数字温度传感器&#xff0c;采用单总线&…...

NAC网络接入控制三种认证方式802.1X认证、MAC认证和Portal认证

NAC网络接入控制三种认证方式802.1X认证、MAC认证和Portal认证 1.NAC简介2.802.1X认证3. MAC认证4. Portal认证 1.NAC简介 NAC&#xff08;Network Access Control&#xff09;称为网络接入控制&#xff0c;通过对接入网络的客户端和用户的认证保证网络的安全&#xff0c;是一…...

字节Trae使用感想(后端)

前言 昨天分享了字节哥的Trae从0到1创作模式构建一个vue前端项目&#xff0c;今天又来试试她的后端项目能力。不是我舔&#xff0c;不得不说确实不错。可惜现在曾经没有好好学习&#xff0c;进不了字节。既然进不了字节&#xff0c;那我就用字节哥的产品吧。 后面有惊喜…...

蓝桥杯 Java B 组之简单动态规划(爬楼梯、斐波那契数列)

Day 6&#xff1a;简单动态规划&#xff08;爬楼梯、斐波那契数列&#xff09; 动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是计算机科学中的一种算法设计思想&#xff0c;用来解决最优解问题&#xff0c;它的核心思想是将大问题分解为小问题&am…...

传统 I/O 和 NIO 的主要区别

在 Java 中&#xff0c;文件读写可以通过传统的 I/O 方式&#xff08;如 InputStream 和 OutputStream&#xff09;或 NIO&#xff08;New I/O&#xff09;方式&#xff08;如 FileChannel&#xff09;来实现。NIO 的 FileChannel 提供了更高效的文件操作方式&#xff0c;尤其是…...

0基础学LabVIEW

对于零基础的朋友来说&#xff0c;学习LabVIEW需要一个科学的学习路径和方法。通过观看优质的B站教程打好基础&#xff0c;再结合实际项目进行实践操作&#xff0c;能够快速提升LabVIEW的应用能力。以下是从入门到进阶的学习建议。 ​ 一、利用B站入门教程打基础 筛选优质教程…...

二〇二四年终总结

写在前面 简单总结一下告诉自己&#xff0c;曾经活着 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前的风景已经和从前不一样了。——村上春树 原本应该 24 年年中的时候写 23 年年终的总结&#xff0c;但是一直拖着&…...