计算机视觉:卷积神经网络(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 主要组件
- 卷积层(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]
- 激活函数(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分钟直观展示神经网络是怎样学会任何东西的!》
- 池化层(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]]]])
- 全连接层(Fully Connected Layer)
- 功能:将前面层提取的特征图展平成一维向量,然后通过多层全连接层进行分类或回归,简单理解就是将一个多维度的矩阵,转换成为一个一维的矩阵。全连接层通常位于网络的末端,用于输出最终的预测结果。
在看看经典的 CNN 网络,红色箭头指的地方,可以形象看到,这就是全连接层。在简单点理解就是一个一个的像素点,组成一个一维向量。
具体解释
-
特征提取:通过一系列卷积层和池化层,从输入图像中提取出有用的特征。每一层都会生成一个或多个特征图,表示不同层次的抽象特征。
-
展平操作:在进入全连接层之前,必须将这些特征图转换为一维向量。这是因为全连接层中的每个神经元都与前一层的所有神经元相连,要求输入是一个一维向量而不是多维矩阵。
-
全连接层:展平后的向量被馈送到一个或多个全连接层中。每个全连接层由许多神经元组成,每个神经元接收前一层所有神经元的输出,并通过加权求和和激活函数来计算自己的输出。最后一层通常用于分类或回归任务,其输出维度取决于具体的应用场景(例如,在分类任务中,输出层的神经元数量等于类别的数量)。
示例代码
这里有一个简单的示例,展示如何使用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)基本概念(一)
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 一、引言 卷积神经网络&…...
企业文件共享中的权限管理与安全风险防范
在企业的日常运营中,文件共享是必不可少的一项工作。然而,文件共享过程中如果权限管理不当,极易引发安全风险,导致企业敏感信息泄露。因此,加强文件共享中的权限管理与安全风险防范,对于保障企业信息安全至…...
使用DeepSeek建立一个智能聊天机器人0.12
为了确保这段代码能够在Windows和Linux系统上都能正常运行,我考虑以下几个方面: 路径分隔符:在Windows和Linux中,文件路径的分隔符不同。Windows使用反斜杠(\),而Linux使用正斜杠(/)。我们可以使用 os.path.join 来处理路径,以确保跨平台兼容性。 消息框:tkinter.…...

国家队出手!DeepSeek上线国家超算互联网平台!
目前,国家超算互联网平台已推出 DeepSeek – R1 模型的 1.5B、7B、8B、14B 版本,后续还会在近期更新 32B、70B 等版本。 DeepSeek太火爆了!在这个春节档,直接成了全民热议的话题。 DeepSeek也毫无悬念地干到了全球增速最快的AI应用。这几天,国内的云计算厂家都在支持Dee…...

Deep seek学习日记1
Deepseek最强大的就是它的深度思考,并且展现了它的思考过程。 五种可使用Deep seek的方式(应该不限于这五种,后续嵌入deepseek的应该更多,多了解一点因为官网容易崩~~): 1.deep seek官网 2.硅基流动silicon…...
乐理笔记(持续更新)
单音与音程 单音:由一个音组成。 音程:由两个音组成,表示两个音之间的音高距离。 如何数音程: 单音程:9 - X,性质相反。例如,9度音程减去某个数,性质会相反。 复音程:…...

【动态路由】系统Web URL资源整合系列(后端技术实现)【nodejs实现】
需求说明 软件功能需求:反向代理功能(描述:apollo、eureka控、apisix、sentinel、普米、kibana、timetask、grafana、hbase、skywalking-ui、pinpoint、cmak界面、kafka-map、nacos、gateway、elasticsearch、 oa-portal 业务应用等多个web资…...
PHP高效、轻量级表格数据处理库 OpenSpout ,很好用
OpenSpout 是一个高效、轻量级的 PHP 库,用于处理电子表格文件(如 Excel 和 CSV)。它支持读取和写入大型文件,且内存占用低。本文将详细介绍如何安装和使用 OpenSpout。 目录 安装 基本使用 高级功能 参考文档 安装 OpenSp…...
2010年上半年软件设计师考试上午真题的知识点整理(附真题及答案解析)
以下是2010年上半年软件设计师考试上午真题的知识点分类整理,涉及定义的详细解释,供背诵记忆。 1. 计算机组成原理 CPU与存储器的访问。 Cache的作用: 提高CPU访问主存数据的速度,减少访问延迟。存储器的层次结构: 包括寄存器、Cache、主存和…...
EventSource的使用
什么是EventSource EventSource 是一个用于服务器推送事件(Server-Sent Events, SSE)的接口,它允许服务器推送实时更新到浏览器。与 WebSocket 不同,SSE 是单向的(服务器到客户端),适用于更新频…...
【第12章:深度学习与伦理、隐私—12.3 深度学习模型的透明性与可解释性提升策略】
凌晨三点的ICU病房,AI辅助诊断系统将一位患者的肺炎误判为普通感冒——当主治医生要求查看诊断依据时,系统只能给出冷冰冰的概率数值。这场惊心动魄的误诊事件,掀开了深度学习可解释性危机的冰山一角。 一、模型透明的"第一性原理" 1.1 可解释性的三维度量 
java八股文-mysql
1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树,最坏情况o&…...

Cherno C++ P55 宏
这篇文章我们讲一下C当中的宏。其实接触过大型项目的朋友可能都被诡异的宏折磨过。 宏是在预处理当中,通过文本替换的方式来实现一些操作,这样可以不用反复的输入代码,帮助我们实现自动化。至于预处理的过程,其实就是文本编辑&am…...
MybatisMybatisPllus公共字段填充与配置逻辑删除
Mybatis/MybatisPllus公共字段填充与配置逻辑删除 在开发过程中,很多时候需要处理一些公共字段,例如:创建时间、修改时间、状态字段等。这些字段通常会在插入或更新数据时进行填充,以便记录数据的变化和状态。同时,逻…...

VS Code User和System版区别【推荐使用System版本】and VSCode+Keil协同开发之Keil Assistant
VS Code User和System版区别 Chapter1 VS Code User和System版区别1. 对于安装而言2. 结束语 Chapter2 VS Code 安装、配置教程及插件推荐插件: Chapter3 VSCodeKeil协同开发之Keil Assistant1. 效果展示2. Keil Assistant简介3. Keil Assistant功能特性4. 部署步骤…...
MongoDB:listDatabases failed : not master and slaveOk=false
个人博客地址:MongoDB:listDatabases failed : not master and slaveOkfalse | 一张假钞的真实世界 异常描述 如果在MongoDB的SECONDARY上查询数据时会报如下错误信息: > show databases; 2018-09-20T17:40:55.3770800 E QUERY [thread…...

Python的那些事第二十二篇:基于 Python 的 Django 框架在 Web 开发中的应用研究
基于 Python 的 Django 框架在 Web 开发中的应用研究 摘要 Django 是一个基于 Python 的高级 Web 框架,以其开发效率高、安全性和可扩展性强等特点被广泛应用于现代 Web 开发。本文首先介绍了 Django 的基本架构和核心特性,然后通过一个实际的 Web 开发项目案例,展示了 Dj…...
【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析④】
ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase04 作者:车端域控测试工程师 更新日期:2025年02月15日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-004测试用例 用例ID测试场景验证要点参考条款预期…...

图论入门算法:拓扑排序(C++)
上文中我们了解了图的遍历(DFS/BFS), 本节我们来学习拓扑排序. 在图论中, 拓扑排序(Topological Sorting)是对一个有向无环图(Directed Acyclic Graph, DAG)的所有顶点进行排序的一种算法, 使得如果存在一条从顶点 u 到顶点 v 的有向边 (u, v) , 那么在排序后的序列中, u 一定…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...