【计算机视觉】人脸识别
一、简介
人脸识别是将图像或者视频帧中的人脸与数据库中的人脸进行对比,判断输入人脸是否与数据库中的某一张人脸匹配,即判断输入人脸是谁或者判断输入人脸是否是数据库中的某个人。
人脸识别属于1:N的比对,输入人脸身份是1,数据库人脸身份数量为N,一般应用在办公室门禁,疑犯追踪;人脸验证属于1:1的比对,输入人脸身份为1,数据库中为同一人的数据,在安全领域应用比较多。
一个完整的人脸识别流程主要包括人脸检测、人脸对齐、特征提取、人脸对比几个部分。
二、人脸检测
人脸检测是寻找并定位人脸在输入图像中的位置。
传统人脸检测算法
Viola-Jones人脸检测活Haar特征级联分类器
import cv2# 加载预训练模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')# 读取输入图像
image_path = "path_to_image.jpg" # 替换为你的图片路径
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转为灰度图# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 绘制人脸矩形框
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)roi_gray = gray[y:y+h, x:x+w]roi_color = image[y:y+h, x:x+w]# 在每张人脸区域内检测眼睛eyes = eye_cascade.detectMultiScale(roi_gray)for (ex, ey, ew, eh) in eyes:cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)# 显示结果
cv2.imshow("Detected Faces and Eyes", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
1. 加载预训练模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
- 功能:加载 OpenCV 提供的预训练 Haar 级联分类器模型,用于检测人脸和眼睛。
- 参数:
cv2.CascadeClassifier
:加载 XML 模型文件。cv2.data.haarcascades
:OpenCV 提供的 Haar 分类器模型的默认路径。'haarcascade_frontalface_default.xml'
:用于检测正面人脸。'haarcascade_eye.xml'
:用于检测眼睛。
2. 读取并预处理图像
image_path = "path_to_image.jpg" # 替换为你的图片路径
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转为灰度图
- 功能:
- 使用
cv2.imread
读取图像。 - 转换为灰度图(灰度图检测效率更高,级联分类器对彩色图像没有直接支持)。
- 使用
- 原因:级联分类器的训练和使用都基于灰度图像。
3. 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
- 功能:检测图像中的所有人脸。
- 参数:
gray
:输入的灰度图。scaleFactor=1.1
:每次图像缩小时的比例因子,较大的值降低检测时间但可能错过较小的人脸。minNeighbors=5
:每个候选矩形需满足的邻近矩形数量。值越大,检测结果越严格。minSize=(30, 30)
:目标检测框的最小尺寸,用于过滤过小的区域。
- 输出:返回一个列表,每个元素是一个
(x, y, w, h)
元组,表示检测到的人脸的矩形框。
4. 绘制人脸矩形框并检测眼睛
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)roi_gray = gray[y:y+h, x:x+w]roi_color = image[y:y+h, x:x+w]
- 功能:
- 遍历
faces
中的每个人脸检测框(x, y, w, h)
。 - 使用
cv2.rectangle
在原图上绘制蓝色框((255, 0, 0)
)表示人脸区域。 - 提取每个人脸的灰度子图
roi_gray
和原图的子图roi_color
,用于后续的眼睛检测。
- 遍历
- 原因:减少检测区域,提高眼睛检测的精度和速度。
5. 在每张人脸区域内检测眼睛
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex, ey, ew, eh) in eyes:cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
- 功能:使用
eye_cascade.detectMultiScale
在人脸区域内检测眼睛。 - 参数:同人脸检测,输入的灰度子图为
roi_gray
。 - 绘制结果:用绿色框(
(0, 255, 0)
)表示检测到的眼睛。
6. 显示结果
cv2.imshow("Detected Faces and Eyes", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 功能:
- 使用
cv2.imshow
显示图像。 cv2.waitKey(0)
:等待用户按键关闭窗口。cv2.destroyAllWindows
:销毁所有窗口,释放资源。
- 使用
总结
- 输入:一张图片(RGB 格式)。
- 处理:
- 转为灰度图。
- 使用预训练的 Haar 级联模型检测人脸和眼睛。
- 在检测到的区域绘制矩形框。
- 输出:在窗口中显示标注了人脸和眼睛的图片。
基于深度学习的人脸检测算法
基于深度学习的人脸检测算法经历了从传统方法到现代深度学习方法的演变,其发展历程可以划分为几个重要阶段。以下是基于深度学习的人脸检测算法的主要发展历史:
1. 传统方法阶段(2000年以前)
- 特点:
- 依赖于手工设计特征和传统机器学习方法(如 Haar 特征、HOG 特征)。
- 算法代表:Haar 级联分类器(Viola-Jones,人脸检测的重要突破)。
- 局限:
- 对光照、姿态、遮挡等情况敏感。
- 检测速度快但精度有限。
这一阶段虽然不基于深度学习,但奠定了人脸检测的基础。
2. 深度学习的初步应用(2012年左右)
- 背景:2012年 AlexNet 在 ImageNet 比赛中获胜,深度学习开始广泛应用于计算机视觉。
- 特点:
- 使用卷积神经网络(CNN)作为特征提取器。
- 算法代表:DeepFace(Facebook, 2014)
- 使用深度神经网络(DNN)对人脸检测和识别进行处理。
- 首次将深度学习应用于人脸检测和识别任务,性能显著提升。
- 局限:
- 网络规模较小,无法应对复杂场景(如多角度、遮挡)
3. 基于回归的方法(2015年左右)
- 背景:深度学习框架和硬件性能的进步,使得更复杂的网络架构成为可能。
- 特点:
- 使用 CNN 直接回归人脸框的坐标。
- 算法代表:
- Cascade CNN(2015):使用多个 CNN 逐步回归人脸位置,提高检测精度。
- MTCNN(Multi-task Cascaded CNN, 2016):结合多任务学习,联合进行人脸检测和关键点定位。
- 特点:多阶段检测框架,利用级联网络逐步细化结果。
- 优点:检测速度和精度兼顾,成为经典方法。
4. 单阶段和双阶段目标检测器的引入(2016年-2018年)
- 背景:通用目标检测器如 Faster R-CNN、SSD、YOLO 等在物体检测任务中的成功,推动了它们在人脸检测领域的应用。
- 特点:
- 单阶段方法:如 SSD 和 YOLO,将人脸检测视为通用物体检测任务。
- 双阶段方法:如 Faster R-CNN,将区域建议网络(RPN)与分类器结合。
- 算法代表:
- Face R-CNN:使用 Faster R-CNN 对人脸进行检测。
- S3FD(Single Shot Scale-invariant Face Detector, 2017):基于 SSD 的改进,解决了人脸大小变化的问题。
- RetinaFace(2019):结合关键点检测,性能优异。
5. 基于关键点检测和自监督学习(2018年后)
- 特点:
- 强调对复杂场景(如遮挡、多角度、低光照)的鲁棒性。
- 将人脸关键点检测和人脸检测结合,进一步提升精度。
- 算法代表:
- DSFD(Dual Shot Face Detector, 2019):多分辨率特征融合,更适合检测小人脸。
- CenterFace(2020):轻量级人脸检测器,结合人脸框和关键点检测,适合实时应用。
- SCRFD(2021):针对边缘设备优化的高效人脸检测器。
6. 大模型和自监督学习的影响(2021年后)
- 背景:大规模预训练模型(如 Vision Transformer, CLIP)的兴起,为人脸检测带来了新的可能性。
- 特点:
- 使用自监督学习方法,通过大规模无标签数据学习强大的特征表征。
- 将 Transformer 等新架构引入人脸检测任务。
- 算法代表:
- DEtection TRansformer (DETR):结合 Transformer 架构的人脸检测方法。
- YOLO 系列最新版本:如 YOLOv5、YOLOv8,在人脸检测任务中的应用。
三、人脸对齐
人脸对齐是将检测得到的人脸图像变换到标准正脸姿态,在实际图片中,由于头部姿态各异、人脸尺度不一,所呈现的形式也各不相同。
- 人脸检测:
- 检测人脸框,提取人脸区域。
- 使用 OpenCV 提供的 Haar 或 DNN 检测器。
- 关键点检测:
- 使用关键点检测模型提取人脸的关键点(如眼睛、鼻尖等)。
- 关键点可以用 Dlib 或深度学习模型(如 MTCNN)提取。
- 仿射变换:
- 根据检测到的关键点,定义源点(人脸关键点)和目标点(标准模板关键点)。
- 计算仿射变换矩阵并应用变换,将人脸对齐。
四、特征提取
特征提取是将输入的人脸图像用一个高维特征向量来表示;如果同一个人,则两个高维特征向量的距离近;如果不同,则距离远。人脸特征提取的方法也可以分为传统方法和深度学习两大类。
人脸特征提取算法经历了从早期的几何特征分析到现代深度学习的转变,其发展历史可以分为以下几个阶段:
1. 几何特征阶段(20世纪70-90年代)
代表方法:
- 几何特征分析:
- 利用人脸的几何属性(如眼睛间距、鼻梁长度、脸型轮廓)作为特征。
- 通过手工定义的特征点计算欧氏距离等度量方式。
- 模板匹配:
- 使用平均脸模板,匹配输入人脸与模板的相似度。
优缺点:
- 优点:简单直观,计算量小。
- 缺点:对光照、姿态和遮挡不鲁棒,特征维度较低。
代表研究:
- 1973年,Bledsoe 提出的人脸几何模型匹配方法。
- 1987年,Sirovich 和 Kirby 提出的脸空间方法,为 PCA 奠定了基础。
2. 统计学习阶段(1990-2010年)
代表方法:
- 主成分分析(PCA):
- 把人脸图像作为高维向量,降维成低维特征表示(如特征脸)。
- 1991年,Turk 和 Pentland 提出了Eigenfaces 方法。
- 线性判别分析(LDA):
- 增强类间区分能力,用于人脸识别。
- 解决了 PCA 的类间可分性不足问题。
- 独立成分分析(ICA):
- 分离人脸的非高斯成分,适合表情和姿态变化分析。
- 局部二值模式(LBP):
- 基于纹理模式的人脸描述,提取局部区域的纹理特征。
- Fisherfaces:
- 综合 PCA 和 LDA 方法,提升对光照变化的鲁棒性。
优缺点:
- 优点:提出了许多经典算法,对光照、姿态变化有一定鲁棒性。
- 缺点:对非线性特征无法很好建模,提取的特征不够高维,难以处理复杂场景。
代表研究:
- 1991年,Eigenfaces。
- 1997年,Belhumeur 提出的 Fisherfaces。
- 2002年,LBP 被引入人脸识别领域。
3. 局部特征阶段(2000-2015年)
代表方法:
- SIFT (Scale-Invariant Feature Transform):
- 提取图像中的局部关键点和特征描述。
- 对光照、尺度、旋转变化鲁棒。
- HOG (Histogram of Oriented Gradients):
- 提取梯度方向分布,用于描述人脸的全局形状。
- Gabor 特征:
- 模拟人类视觉皮层特性,用 Gabor 滤波器提取人脸纹理。
优缺点:
- 优点:提升了对光照和局部细节的鲁棒性。
- 缺点:局部特征无法很好表达全局信息,算法复杂度较高。
代表研究:
- 2004年,Lowe 提出的 SIFT。
- 2005年,Dalal 和 Triggs 提出的 HOG。
- 2006年,Gabor 特征被广泛应用于人脸识别。
4. 深度学习阶段(2014年至今)
关键技术:
- 卷积神经网络(CNN):
- 自适应提取多层次特征,捕捉人脸的纹理、形状、表情等信息。
- 提取的特征更具辨别性。
- 预训练模型:
- 使用大规模人脸数据集进行训练,如 LFW、CASIA-WebFace 等。
- 模型具备迁移学习能力。
代表算法:
- DeepFace (2014, Facebook):
- 首个端到端人脸识别深度学习模型。
- 采用卷积神经网络,实现接近人类的识别精度。
- DeepID (2014-2015, 中国科学院):
- 提出多层 CNN 架构,特征更加鲁棒。
- 引入多个子网络对不同区域进行特征提取。
- FaceNet (2015, Google):
- 基于深度学习的人脸特征提取算法。
- 使用 Triplet Loss 学习特征嵌入,支持高效人脸验证和聚类。
- ArcFace (2018, InsightFace):
- 提出了 Additive Angular Margin Loss,进一步优化特征的判别性。
- 被广泛用于工业人脸识别系统。
- CosFace、SphereFace:
- 聚焦于特征分布的角度约束,提升类间分离度。
优缺点:
- 优点:特征表示能力强,适用于大规模人脸识别。
- 缺点:需要大量数据和计算资源,可能存在隐私问题。
代表研究:
- 2014年,Facebook 提出 DeepFace。
- 2015年,Google 提出 FaceNet。
- 2018年,ArcFace 成为人脸识别领域的主流算法。
五、人脸比对
获取了人脸特征后,对于不同人脸图像,通过比对其人脸特征之间的距离远近,就可以判断人脸身份。
在 Python 中,OpenCV 提供的 cv2.FaceRecognizerSF
模块可以用于人脸识别任务,match
是其方法之一,用于比较两个特征向量之间的相似度。以下是 facerecognizer.match
方法的详细介绍:
函数原型
cv2.FaceRecognizerSF.match(face1: numpy.ndarray, face2: numpy.ndarray, disType: int = 0) -> float
参数说明
-
face1
- 类型:
numpy.ndarray
- 描述: 第一个人脸的特征向量。
- 特征向量通常由
cv2.FaceRecognizerSF.feature()
方法生成,表示人脸的深度特征。
- 特征向量通常由
- 类型:
-
face2
- 类型:
numpy.ndarray
- 描述: 第二个人脸的特征向量。
- 同样通过
feature()
方法提取,用于与face1
比较。
- 同样通过
- 类型:
-
disType
- 类型:
int
- 描述: 指定距离度量的类型,用于衡量两个特征向量之间的相似性。
- 可选值:
0
(cv2.FaceRecognizerSF.FR_COSINE
): 使用余弦相似度。1
(cv2.FaceRecognizerSF.FR_NORM_L2
): 使用 L2 范数(欧几里得距离)。
- 类型:
返回值
- 类型:
float
- 描述: 返回两个特征向量的相似度分数。
- 对于余弦相似度,值越大表示越相似(最大值为1)。
- 对于 L2 范数,值越小表示越相似。
六、开源项目盘点
- CompreFace
- Deepface
- InsightFace
- Face Recognition
- FaceNet
- OpenFace
相关文章:
【计算机视觉】人脸识别
一、简介 人脸识别是将图像或者视频帧中的人脸与数据库中的人脸进行对比,判断输入人脸是否与数据库中的某一张人脸匹配,即判断输入人脸是谁或者判断输入人脸是否是数据库中的某个人。 人脸识别属于1:N的比对,输入人脸身份是1&…...
Spark Streaming的核心功能及其示例PySpark代码
Spark Streaming是Apache Spark中用于实时流数据处理的模块。以下是一些常见功能的实用PySpark代码示例: 基础流处理:从TCP套接字读取数据并统计单词数量 from pyspark import SparkContext from pyspark.streaming import StreamingContext# 创建Spar…...
高效实现 Markdown 转 PDF 的跨平台指南20250117
高效实现 Markdown 转 PDF 的跨平台指南 引言 Markdown 文件以其轻量化和灵活性受到开发者和技术写作者的青睐,但如何将其转换为易于分享和打印的 PDF 格式,是一个常见需求。本文整合了 macOS、Windows 和 Linux 三大平台的转换方法,并探讨…...
冯诺依曼架构和哈佛架构的主要区别?
冯诺依曼架构(Von Neumann Architecture)和哈佛架构(Harvard Architecture)是两种计算机体系结构,它们在存储器组织、指令处理和数据存取等方面有明显的不同。以下是它们的主要区别: 1.存储器结构 冯诺依曼…...
AI 新动态:技术突破与应用拓展
目录 一.大语言模型的持续进化 二.AI 在医疗领域的深度应用 疾病诊断 药物研发 三.AI 与自动驾驶的新进展 四.AI 助力环境保护 应对气候变化 能源管理 后记 在当下科技迅猛发展的时代,人工智能(AI)无疑是最具影响力的领域之一。AI 技…...
Java锁 从乐观锁和悲观锁开始讲 面试复盘
目录 面试复盘 Java 中的锁 大全 悲观锁 专业解释 自我理解 乐观锁 专业解释 自我理解 悲观锁的调用 乐观锁的调用 synchronized和 ReentrantLock的区别 相同点 区别 详细对比 总结 面试复盘 Java 中的锁 大全 悲观锁 专业解释 适合写操作多的场景 先加锁可以…...
【RabbitMq】RabbitMq高级特性-延迟消息
延迟消息 什么是延迟消息死信交换机延迟消息插件-DelayExchange其他文章 什么是延迟消息 延迟消息:发送者发送消息时指定一个时间,消费者不会立刻收到消息,而是在指定时间之后才收到消息。 延迟任务:设置在一定时间之后才执行的任…...
MindAgent:基于大型语言模型的多智能体协作基础设施
2023-09-18 ,加州大学洛杉矶分校(UCLA)、微软研究院、斯坦福大学等机构共同创建的新型基础设施,目的在评估大型语言模型在游戏互动中的规划和协调能力。MindAgent通过CuisineWorld这一新的游戏场景和相关基准,调度多智…...
Linux内存管理(Linux内存架构,malloc,slab的实现)
文章目录 前言一、Linux进程空间内存分配二、malloc的实现机理三、物理内存与虚拟内存1.物理内存2.虚拟内存 四、磁盘和物理内存区别五、页页的基本概念:分页管理的核心概念:Linux 中分页的实现:总结: 六、伙伴算法伙伴算法的核心…...
【机器学习实战中阶】比特币价格预测
比特币价格预测项目介绍 比特币价格预测项目是一个非常有实用价值的机器学习项目。随着区块链技术的快速发展,越来越多的数字货币如雨后春笋般涌现,尤其是比特币作为最早的加密货币,其价格波动备受全球投资者和研究者的关注。本项目的目标是…...
【JVM-9】Java性能调优利器:jmap工具使用指南与应用案例
在Java应用程序的性能调优和故障排查中,jmap(Java Memory Map)是一个不可或缺的工具。它可以帮助开发者分析Java堆内存的使用情况,生成堆转储文件(Heap Dump),并查看内存中的对象分布。无论是内…...
使用vscode在本地和远程服务器端运行和调试Python程序的方法总结
1 官网下载 下载网址:https://code.visualstudio.com/Download 如下图所示,可以分别下载Windows,Linux,macOS版本 历史版本下载链接: https://code.visualstudio.com/updates 2 安装Python扩展工具 打开 VS Code,安装 Microsoft 提供的官…...
AI 编程工具—Cursor 对话模式详解 Chat、Composer 与 Normal/Agent 模式
Cursor AI 对话模式详解:Chat、Composer 与 Normal/Agent 模式 一、简介 Cursor 是一个强大的 AI 辅助编程工具,它提供了多种对话模式来满足不同的开发需求。主要包括: Chat 模式:直接对话交互Composer 模式:结构化编程助手Normal/Agent 模式:不同的 AI 响应策略打开Ch…...
【MySQL】数据库基础知识
欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】数据库基础知识 发布时间:2025.1.21 隶属专栏:MySQL 目录 什么是数据库为什么要有数据库数据库的概念 主流数据库mysql的安装mysql登录使用一下mysql显示数据库内容创建一个数据库创…...
ChatGPT开发教程指南
ChatGPT开发教程指南 一、ChatGPT 概述二、开发环境搭建(一)硬件要求(二)软件要求 三、开发流程(一)数据处理(二)模型选择与训练(三)接口开发 四、示例代码 随…...
OpenEuler学习笔记(四):OpenEuler与CentOS的区别在那里?
OpenEuler与CentOS的对比 一、基本信息 起源与背景: OpenEuler:由华为发起,后捐赠给开放原子开源基金会,旨在构建一个开放、多元化的云计算和边缘计算平台,以满足华为及其他企业的硬件和软件需求。CentOS:…...
spring cloud如何实现负载均衡
在Spring Cloud中,实际上并没有直接支持lb:\\这样的URL前缀来自动解析为负载均衡的服务地址。lb:\\这样的表示可能是在某些特定框架、文档或示例中自定义的,但它并不是Spring Cloud官方API或规范的一部分。 Spring Cloud实现负载均衡的方式通常依赖于服…...
LeetCode:37. 解数独
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:37. 解数独 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则ÿ…...
如何在idea中搭建SpringBoot项目
如何在idea中快速搭建SpringBoot项目 目录 如何在idea中快速搭建SpringBoot项目前言一、环境准备:搭建前的精心布局 1.下载jdk (1)安装JDK:(2)运行安装程序:(3)设置安装…...
STM32补充——FLASH
目录 1.内部FLASH构成(F1) 2.FLASH读写过程(F1) 2.1内存的读取 2.2闪存的写入 2.3FLASH接口寄存器(写入 & 擦除相关) 3.FLASH相关HAL库函数简介(F1/F4/F7/H7) 4.编程实战 …...
ASP.NET Core 中的 JWT 鉴权实现
在当今的软件开发中,安全性和用户认证是至关重要的方面。JSON Web Token(JWT)作为一种流行的身份验证机制,因其简洁性和无状态特性而被广泛应用于各种应用中,尤其是在 ASP.NET Core 项目里。本文将详细介绍如何在 ASP.…...
Docker配置国内镜像源
访问docker hub需要科学上网 在 Docker 中配置镜像地址(即镜像加速器)可以显著提升拉取镜像的速度,尤其是在国内访问 Docker Hub 时。以下是详细的配置方法: 1. 配置镜像加速器 Docker 支持通过修改配置文件来添加镜像加速器地址…...
qiankun+vite+vue3
基座与子应用代码示例 本示例中,基座为Vue3,子应用也是Vue3,由于qiankun不支持Vite构建的项目,这里还要引入 vite-plugin-qiankun 插件 基座(主应用) 加载qiankun依赖 npm i qiankun -S qiankun配置(src/qiankun) src/qiankun/config.ts export default {subApp…...
如何使用AI工具cursor(内置ChatGPT 4o+claude-3.5)
⚠️温馨提示: 禁止商业用途,请支持正版,充值使用,尊重知识产权! 免责声明: 1、本教程仅用于学习和研究使用,不得用于商业或非法行为。 2、请遵守Cursor的服务条款以及相关法律法规。 3、本…...
Linux内核编程(二十一)USB驱动开发-键盘驱动
一、驱动类型 USB 驱动开发主要分为两种:主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备,而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…...
vue3+ts watch 整理
watch() 一共可以接受三个参数,侦听数据源、回调函数和配置选项 作用:监视数据的变化(和Vue2中的watch作用一致) 特点:Vue3中的watch只能监视以下四种数据: ref定义的数据。 reactive定义的数据。 函数返…...
2025年最新深度学习环境搭建:Win11+ cuDNN + CUDA + Pytorch +深度学习环境配置保姆级教程
本文目录 一、查看驱动版本1.1 查看显卡驱动1.2 显卡驱动和CUDA对应版本1.3 Pytorch和Python对应的版本1.4 Pytorch和CUDA对应的版本 二、安装CUDA三、安装cuDANN四、安装pytorch五、验证是否安装成功 一、查看驱动版本 1.1 查看显卡驱动 输入命令nvidia-smi可以查看对应的驱…...
USART_串口通讯轮询案例(HAL库实现)
引言 前面讲述的串口通讯案例是使用寄存器方式实现的,有利于深入理解串口通讯底层原理,但其开发效率较低;对此,我们这里再讲基于HAL库实现的串口通讯轮询案例,实现高效开发。当然,本次案例需求仍然和前面寄…...
CAN 网络介绍
背景 在T-Box 产品开发过程中,我们离不开CAN总线,因为CAN总线为我们提供了车身的相关数据,比如,车速、油耗、温度等。用于上报TSP平台,进行国标认证;也帮助我们进行车身控制,比如车门解锁/闭锁…...
pytorch 多机多卡训练方法
在深度学习训练中,使用多机多卡(多台机器和多块 GPU)可以显著加速模型训练过程。 PyTorch 提供了多种方法来实现多机多卡训练,以下是一些常用的方法和步骤: 1. 使用 torch.distributed 包 PyTorch 的 torch.distribut…...
【智能控制】年末总结,模糊控制,神经网络控制,专家控制,遗传算法
关注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 …...
Linux系统 C/C++编程基础——使用make工具和Makefile实现自动编译
ℹ️大家好,我是练小杰,今天周二了,距离除夕只有6天了,新的一年就快到了😆 本文是有关Linux C/C编程的make和Makefile实现自动编译相关知识点,后续会不断添加相关内容 ~~ 回顾:【Emacs编辑器、G…...
kafka学习笔记7 性能测试 —— 筑梦之路
kafka 不同的参数配置对 kafka 性能都会造成影响,通常情况下集群性能受分区、磁盘和线程等影响因素,因此需要进行性能测试,找出集群性能瓶颈和最佳参数。 # 生产者和消费者的性能测试工具 kafka-producer-perf-test.sh kafka-consumer-perf-t…...
C#与AI的共同发展
C#与人工智能(AI)的共同发展反映了编程语言随着技术进步而演变,以适应新的挑战和需要。自2000年微软推出C#以来,这门语言经历了多次迭代,不仅成为了.NET平台的主要编程语言之一,还逐渐成为构建各种类型应用程序的强大工具。随着时…...
multus使用教程
操作步骤如下: 1.在vmware vsphere上配置所有主机使用的端口组安全项 Forged transmits 设置为: Accept Promiscuous Mode 设置为:Accept Promiscuous Mode(混杂模式)和Forged Transmits(伪传输)…...
用JAVA写算法之输入输出篇
本系列适合原来用C语言或其他语言写算法,但是因为找工作或比赛的原因改用JAVA语言写算法的同学。当然也同样适合初学算法,想用JAVA来写算法题的同学。 常规方法:使用Scanner类和System.out 这种方法适用于leetcode,以及一些面试手…...
场馆预定平台高并发时间段预定实现V2
🎯 本文档介绍了场馆预订系统接口V2的设计与实现,旨在解决V1版本中库存数据不一致及性能瓶颈的问题。通过引入令牌机制确保缓存和数据库库存的最终一致性,避免因服务器故障导致的库存错误占用问题。同时,采用消息队列异步处理库存…...
(1)STM32 USB设备开发-基础知识
开篇感谢: 【经验分享】STM32 USB相关知识扫盲 - STM32团队 ST意法半导体中文论坛 单片机学习记录_桃成蹊2.0的博客-CSDN博客 USB_不吃鱼的猫丿的博客-CSDN博客 1、USB鼠标_哔哩哔哩_bilibili usb_冰糖葫的博客-CSDN博客 USB_lqonlylove的博客-CSDN博客 USB …...
Spring Boot 整合 ShedLock 处理定时任务重复执行的问题
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…...
缓存之美:万文详解 Caffeine 实现原理(上)
由于社区最大字数限制,本文章将分为两篇,第二篇文章为缓存之美:万文详解 Caffeine 实现原理(下) 大家好,我是 方圆。文章将采用“总-分-总”的结构对配置固定大小元素驱逐策略的 Caffeine 缓存进行介绍&…...
PHP语言的网络编程
PHP语言的网络编程 网络编程是现代软件开发中不可或缺的一部分,尤其是在日益发展的互联网时代。PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,专门用于Web开发。它的灵活性、易用性以及强大的社区支持使得PHP在网络…...
【技巧】优雅的使用 pnpm+Monorepo 单体仓库构建一个高效、灵活的多项目架构
单体仓库(Monorepo)搭建指南:从零开始 单体仓库(Monorepo)是一种将多个相关项目集中管理在一个仓库中的开发模式。它可以帮助开发者共享代码、统一配置,并简化依赖管理。本文将通过实际代码示例࿰…...
算法项目实时推流
1、搭建流媒体服务器 下载mediamtx 2、视频流直推 ffmpeg -stream_loop -1 -i DJI_20250109112715_0002_W.MP4 -r 30 -c:v libx264 -preset ultrafast -f flv rtmp://192.168.100.20:1935/live/test_chengdu1 3、硬件加速 如果硬件支持,可以使用硬件加速编码器&am…...
软件测试—— 接口测试(HTTP和HTTPS)
软件测试—— 接口测试(HTTP和HTTPS) HTTP请求方法GET特点使用场景URL结构URL组成部分URL编码总结 POST特点使用场景请求结构示例 请求标头和响应标头请求标头(Request Headers)示例请求标头 响应标头(Response Header…...
PCL K4PCS算法实现点云粗配准【2025最新版】
目录 一、算法原理1、算法概述2、算法流程3、参考文献二、 代码实现1、原始版本2、2024新版三、 结果展示本文由CSDN点云侠原创,原文链接,首发于:2020年4月27日。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 博客长期更新,本文最近一次更新时间为…...
Docker 学习总结(85)—— docker cp 使用总结
前言 在现代软件开发中,Docker 已成为一种流行的容器化技术。无论是在开发、测试还是生产环境中,管理容器内的文件都是一项常见且重要的任务。本文将详细介绍如何使用 docker cp 命令在 Docker 容器与宿主机之间拷贝文件和目录,并结合一些实际使用场景,帮助您更高效地管理…...
《FMambaIR:一种基于混合状态空间模型和频域的方法用于图像恢复》学习笔记
paper:(PDF) FMambaIR: A Hybrid State Space Model and Frequency Domain for Image Restoration 目录 摘要 一、引言 二、相关工作 1、图像恢复 2、频率学习 3、状态空间模型(SSM) 三、框架 1、基本知识 2、整体框架 3、F-Mamba…...
PyQt5 超详细入门级教程上篇
PyQt5 超详细入门级教程 上篇:1-3部分:PyQt5基础与常用控件 第1部分:初识 PyQt5 和安装 1.1 什么是 PyQt5? PyQt5 是 Python 的图形用户界面 (GUI) 框架,它基于强大的 Qt 库。Qt 是一个跨平台的 C 框架,用…...
通信协议—WebSocket
一、WebSocket编程概念 1.1 什么是WebSocket WebSocket 是一种全双工通信协议,允许在客户端(通常是浏览器)和服务器之间建立持久连接,以实现实时的双向通信。它是 HTML5 标准的一部分,相比传统的 HTTP 请求ÿ…...
FFmpeg音视频采集
文章目录 音视频采集音频采集获取设备信息录制麦克风录制声卡 视频采集摄像机画面采集 音视频采集 DirectShow(简称DShow)是一个Windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能,它支持多种多样的媒体文件格式&…...