基于深度学习的手势控制模型

关于深度实战社区

我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万+粉丝,拥有2篇国家级人工智能发明专利。


1. 项目简介

该项目是一个基于深度学习的虚拟交互系统,旨在实现手势控制、面部识别和背景模糊等高级图像处理功能。它使用了Mediapipe作为主要的手部和面部特征检测工具,通过捕捉摄像头图像流进行实时处理。项目的主要目标是创建一个能够识别手势动作的虚拟摄像头,用户可以通过比出特定手势来控制视频的播放、暂停、放大和模糊等操作。系统能够识别诸如“拳头闭合”、“手上移”、“手下移”、“两指显示”和“三指显示”等手势信号,并根据这些手势动态调整摄像头画面的状态。此外,项目还集成了面部识别与背景模糊功能,使其能够在人脸存在时自动模糊背景,提升用户隐私保护。此项目的应用场景非常广泛,可以用于视频会议、虚拟课堂以及其他需要实时手势交互的场景。项目通过将不同的图像处理模块(如handsutilsfaceutilszoomutils)整合为一体,提供了一个多功能的虚拟摄像系统,实现了手势识别和虚拟交互的有效结合。

在这里插入图片描述

2.技术创新点摘要

  1. 多手势识别和控制机制的集成:项目中使用了Mediapipe的手部检测模块,能够实时跟踪手部关键点并识别多种手势信号(如“拳头闭合”、“手上移”、“两指显示”和“三指显示”)(fingerutils)。这些手势信号不仅被用于控制虚拟摄像头的状态(如启用或禁用视频流),还实现了精细的手势控制操作(如放大、缩小、背景模糊)。特别是通过判断两指间距动态调整缩放比例的创新设计,使得用户可以通过手势精确地控制图像的变焦(zoomutils)。
  2. 面部识别与背景模糊的组合应用:在面部检测方面,项目通过Mediapipe的面部检测模块实现了对单人和多人的识别(face_detection)。结合背景模糊算法(使用faceutils.background_blur),当系统检测到有人脸存在时,能够自动进行背景虚化,从而提升隐私保护效果(faceutils)。这一功能对远程办公和视频会议场景特别有用,因为它能有效避免背景中敏感信息的泄露。
  3. 虚拟摄像头实时效果展示:项目利用pyvirtualcam库将处理后的图像流实时输出到虚拟摄像头设备上(main)。这一技术使得经过手势控制和人脸处理的画面可以被其他应用程序(如Zoom或Teams)直接使用,极大地扩展了系统的适用场景。这种模块化输出方式不仅提高了系统的集成度,还为后续的扩展提供了可能。
  4. 自定义手势识别规则与复合信号判断机制:项目中的手势识别规则是基于多点位置关系进行的复合判断(如两指显示与手势方位组合)(fingerutils)。该机制通过逐帧分析手部关键点之间的空间关系,定义了多种自定义手势信号,并能在不同手势之间平滑切换。这种规则判定方式能够根据用户的手部动态调整输出行为,使其具备较高的交互响应精度和稳定性。

3. 数据集与预处理

该项目的数据主要来源于实时摄像头捕捉的视频帧,而非预定义的静态数据集。因此,每个数据输入都具有高度的动态性和随机性,这给模型的实时响应提出了较高的要求。该项目使用OpenCV捕捉视频流,并通过Mediapipe进行关键点检测和图像处理,涉及的主要数据类型包括手部和面部关键点坐标、视频帧图像以及特征点的状态数据。

数据预处理流程
  1. 图像标准化:项目使用OpenCV获取摄像头输入,并通过调整图像大小(1280×720像素)和帧率(30FPS)来确保输入数据的格式一致(main)。这种标准化的图像格式便于后续的关键点检测和特征提取。
  2. 颜色空间转换:在进行Mediapipe处理之前,所有输入图像会被从BGR格式转换为RGB格式。颜色空间的转换能够提升Mediapipe模型的处理效率,并确保模型能够更精确地识别图像中的手部和面部特征(face_detection)。
  3. 数据增强与裁剪:为了提高系统的实时性和降低冗余计算量,项目在检测手部动作时采用了局部裁剪策略。该策略通过只分析图像中的特定区域(如手部所在的区域)来减少数据维度,并提高了手势识别的速度(handsutils)。
  4. 特征点提取与归一化:对于每一帧图像,系统会提取手部和面部的特征点,并根据图像的宽高进行归一化处理(特征点坐标被标准化到0~1的范围内)。这种归一化的处理方式能够消除不同分辨率图像输入带来的影响,使模型能够在不同设备上保持一致的精度和效果。
  5. 多模态数据的融合:系统整合了手部与面部检测数据,实现了多模态特征的联合应用。通过判断手部关键点与人脸状态的关系(如手部姿态与面部位置),系统能够对复杂场景进行多维度的解析。

4. 模型架构

本项目采用了Mediapipe提供的预训练模型与OpenCV实现手部和面部检测与图像处理,并将其集成到虚拟摄像头系统中。该项目的架构主要由手部识别、面部检测和背景处理三个子模块组成。由于Mediapipe内部封装了大量的深度学习模型和图像处理操作,因此该项目没有进行自定义模型的训练,但使用了特定规则的算法组合来实现多模式交互功能。以下是每个模块的具体逻辑与功能说明:

  1. 模型结构逻辑
  1. 手部识别模型
    • Mediapipe的Hands模型由三个主要部分组成:手部检测器(Hand Detection)手部关键点检测(Hand Landmark Model)和手势分类(Gesture Classification)
    • 手部检测器使用了轻量级CNN(卷积神经网络)架构对图像进行二值化分类,输出手部边界框(Bounding Box)坐标。
    • 关键点检测模块基于特征点预测网络,提取21个关键点(Landmarks),其输出公式为: L i = ( x i , y i , z i ) , i = 1 , 2 , … , 21 L_i = (x_i, y_i, z_i), \quad i = 1, 2, \ldots, 21 Li=(xi,yi,zi),i=1,2,,21 其中,(xi,yi,zi)代表手部第 i 个特征点的三维坐标位置。
    • 手势分类模块通过对关键点间的相对距离和方向进行计算,输出手势类别(如“握拳”、“手上移”、“两指显示”等),公式为: D i , j = ( x i − x j ) 2 + ( y i − y j ) 2 + ( z i − z j ) 2 D_{i, j} = \sqrt{(x_i - x_j)^2 + (y_i - y_j)^2 + (z_i - z_j)^2} Di,j=(xixj)2+(yiyj)2+(zizj)2 该公式计算手部两个特征点 i 和 j 之间的欧几里得距离,以判断手指的相对位置关系。
  1. 面部检测模型
    使用了Mediapipe的FaceDetection模型,其核心结构是一个单阶段目标检测网络(Single-Stage Detector),用来检测图像中的面部位置。该模型输出的是每个人脸的边界框和人脸特征点。
    检测框的预测公式为: B = ( x , y , w , h ) B = (x, y, w, h) B=(x,y,w,h) 其中,(x,y)是人脸中心坐标,w 和 h 分别是宽度和高度。
  1. 背景模糊模型
    使用了Mediapipe的SelfieSegmentation模型,该模型将图像分割为前景(用户)和背景两部分。其核心结构为基于深度学习的自监督分割网络,输出的分割掩码(Segmentation Mask)表示像素是否属于前景: M ( x , y ) = { 1 , 若  ( x , y ) 属于前景 0 , 若  ( x , y ) 属于背景 M(x, y) = \begin{cases} 1, & \text{若 } (x, y) \text{ 属于前景} \\ 0, & \text{若 } (x, y) \text{ 属于背景} \end{cases} M(x,y)={1,0, (x,y) 属于前景 (x,y) 属于背景 最终通过掩码将背景区域进行模糊处理。
  1. 模型的整体流程
  1. 数据预处理
    • 捕捉摄像头的实时视频流,并标准化图像格式(如分辨率、帧率等)。
    • 使用mediapipe的颜色空间转换与局部裁剪策略减少冗余数据量,并根据用户手势与人脸特征进行图像局部处理。
  1. 手部与面部检测
    • 调用Hands模块和FaceDetection模块同时进行手部与面部的多模态特征检测,并通过判断手部特征点与面部特征的相对位置关系,实现多种手势组合控制功能(如图像缩放与背景模糊切换)。
  1. 图像处理与输出
    • 当手势识别模型检测到特定手势信号时(如“握拳”或“三指”),调用相应图像处理模块(如背景模糊、图像放大等)进行动态调整。
    • 将处理后的图像实时输出到虚拟摄像头设备中,供其他应用程序(如Zoom、Teams)使用。
  1. 模型评估与性能指标

由于该项目是一个实时视频处理系统,其主要评估指标包括:

  1. 帧率(FPS) :衡量系统在不同设备上的处理速度,确保能够达到30帧每秒以上的实时性能。
  2. 手势识别准确率:手部关键点检测和手势分类的准确性,该指标由手势判断的误差率(手势识别错误率)衡量。
  3. 延迟(Latency) :在手势发生与系统响应之间的时间差,理想情况下延迟应小于100毫秒。

5. 核心代码详细讲解

1. main.py 中的核心代码

文件:main.py(main)

with pyvirtualcam.Camera(width, height, fps, device=device_val, fmt=PixelFormat.BGR) as cam:print('Virtual camera device: ' + cam.device)while True:success, img = cap.read()  # 从摄像头中读取一帧图像cropped_img = img[0:720, 0:400]  # 裁剪图像,保留720x400区域用于手部检测img = handsutils.mediapipe_gestures(img, cropped_img)  # 调用手势检测模块,对图像进行手势识别处理img = cv2.resize(img, (1280, 720))  # 将处理后的图像调整回1280x720分辨率cam.send(img)  # 将图像发送至虚拟摄像头cam.sleep_until_next_frame()  # 保持每帧的输出时间一致
  • pyvirtualcam.Camera() :创建一个虚拟摄像头对象,将处理后的图像输出到虚拟摄像头设备中。width, height, fps 分别设置图像的宽度、高度和帧率;fmt=PixelFormat.BGR 指定图像格式为BGR。
  • cap.read() :从摄像头捕捉一帧图像。success 表示捕捉是否成功,img 是读取的图像帧。
  • cropped_img = img[0:720, 0:400] :裁剪图像,只保留高度为720像素、宽度为400像素的区域,这样做是为了减少手势检测时的计算量。
  • handsutils.mediapipe_gestures() :调用handsutils模块中的手势识别功能,将原始图像 img 和裁剪后的图像 cropped_img 传入,返回经过手势处理后的图像帧。
  • cv2.resize() :将处理后的图像恢复到原始大小(1280x720),确保输出图像与摄像头设置的分辨率匹配。
  • cam.send() :将处理后的图像发送到虚拟摄像头,供其他应用程序(如Zoom)使用。
  • cam.sleep_until_next_frame() :保持帧与帧之间的时间间隔一致,避免视频流出现跳帧或延迟。
2. face_detection.py 中的面部检测代码

文件:face_detection.py(face_detection)

with mp_face_detection.FaceDetection(model_selection=0, min_detection_confidence=0.5) as face_detection:image.flags.writeable = False  # 设置图像为不可写状态,提升处理速度image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转换图像颜色空间,从BGR变为RGBresults = face_detection.process(image)  # 进行面部检测,返回检测结果if results.detections:  # 检查是否有面部检测结果return len(results.detections)  # 返回检测到的面部数量
  • mp_face_detection.FaceDetection() :调用Mediapipe的FaceDetection模块进行面部检测。model_selection=0表示选择第一个预训练模型,min_detection_confidence=0.5表示最低检测置信度为0.5。
  • image.flags.writeable = False:将图像设置为不可写状态,这样可以提高Mediapipe模型处理的速度。
  • cv2.cvtColor() :将图像从BGR格式转换为RGB格式,这是Mediapipe模型所需的输入格式。
  • face_detection.process() :将图像传入Mediapipe模型进行面部检测,并返回结果。
  • results.detections:检测结果中包含每个检测到的面部特征信息,判断是否有面部被检测到。
  • return len(results.detections) :返回检测到的面部数量。
3. handsutils.py 中的手势检测代码

文件:handsutils.py(handsutils)

cropped_img_rgb = cv2.cvtColor(cropped_img, cv2.COLOR_BGR2RGB)  # 转换裁剪图像的颜色空间为RGB
results = hands.process(cropped_img_rgb)  # 使用Mediapipe的手部检测模块进行手势识别
  • cv2.cvtColor() :将裁剪后的图像 cropped_img 转换为RGB格式。Mediapipe的手部检测模型需要RGB格式的输入图像。
  • hands.process() :调用Mediapipe的 Hands 模块进行手部关键点检测,并返回包含所有检测到的手部特征的 results 对象。
if fingerutils.hand_down(landmarks):  # 检查手势是否为“手下移”video_status = Trueif fingerutils.three_signal(landmarks):  # 检查手势是否为“三指显示”blur_status = Trueif fingerutils.two_signal(landmarks):  # 检查手势是否为“两指显示”blur_status = False
  • fingerutils.hand_down() :判断手部关键点的坐标是否符合“手下移”手势的条件。如果满足,则设置 video_statusTrue,表示视频流暂停。
  • fingerutils.three_signal() :判断手部关键点是否符合“三指显示”手势,如果满足,则设置 blur_statusTrue,表示启动背景模糊。
  • fingerutils.two_signal() :判断是否符合“两指显示”手势,如果满足,则设置 blur_statusFalse,表示关闭背景模糊。
if len(zoom_arr) > 1 and fingerutils.is_fist_closed(landmarks) and fingerutils.hand_up(landmarks):  # 检查握拳手势p1 = zoom_arr[0]p2 = zoom_arr[1]dist = math.sqrt(pow(p1[0] - p2[0], 2) + pow(p1[1] - p2[1], 2))  # 计算两指间的欧几里得距离if 150 <= dist <= 300:  # 如果距离在150到300像素之间zoom_factor = zoomutils.fetch_zoom_factor(dist)  # 调用zoomutils模块计算缩放因子
  • fingerutils.is_fist_closed() :判断手势是否为“握拳”状态,意味着用户有意调整图像缩放。
  • math.sqrt() :计算两指尖坐标的欧几里得距离。这个距离被用来衡量用户手势的“缩放”程度。
  • zoomutils.fetch_zoom_factor() :根据两指间的距离计算缩放因子 zoom_factor,用来动态调整图像的放大或缩小。
4. zoomutils.py 中的缩放计算代码

文件:zoomutils.py(zoomutils)

zoom_fact = (addval and (((distance - 150) * zoom_range) / finger_range)) + 1  # 计算缩放因子
  • zoom_fact:根据手势间的距离 distance 计算图像的缩放比例。如果 distance 在150到300像素之间,则缩放因子 zoom_fact 随着 distance 增加而增加,使得图像在用户缩放手势中动态放大或缩小。

6. 模型优缺点评价

该模型的优点主要体现在其多功能集成和实时性方面。首先,项目利用Mediapipe的手势识别和面部检测模型,通过简化的逻辑实现了多种复杂的交互功能(如手势控制、背景模糊等),而且该模型对计算资源的要求较低,能够在普通的个人计算机上实现30帧每秒的实时处理效果。其次,通过虚拟摄像头的输出,将处理后的图像流与视频会议软件无缝集成,为实际应用提供了便利。此外,模型的手势识别逻辑基于手部关键点坐标进行自定义手势的判断,在手势识别精度和灵活性方面具有优势。

然而,该模型也存在一些缺点。首先,由于依赖Mediapipe的预训练模型,无法针对特定场景进行微调,导致手势识别在光照和姿态变化较大的情况下准确率下降。其次,模型的交互逻辑依赖于多种手势组合,当手势切换频繁时,可能出现响应延迟或识别错误。此外,背景模糊功能是基于简单的图像分割,无法处理复杂背景或动态环境,效果可能不够自然。

改进方向包括以下几点:1) 引入卷积神经网络(CNN)或Transformer架构对手势进行更精确的分类,从而提升模型的鲁棒性;2) 针对不同的光照和背景情况,使用数据增强(如随机旋转、亮度调整等)来扩展训练数据集,以提高模型在复杂环境下的表现;3) 通过超参数调优(如优化模型的置信度阈值、调整输入图像大小)来减少识别错误和延迟问题,从而提升系统的整体稳定性。通过这些优化,模型能够更好地适应多种复杂场景,进一步提升其应用效果。

↓↓↓更多热门推荐:
YOLOv4和Darknet实现坑洼检测

更多项目数据集、代码、教程点击下方名片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/55749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nexpose 6.6.271 发布下载,新增功能概览

Nexpose 6.6.271 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Sep 26, 2024 请访问原文链接&#xff1a;https://sysin.org/blog/nexpose-6/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.or…

安全工具 | 搭建带有 Web 仪表板的Interact.sh

介绍 Interactsh 是一个用于检测带外交互的开源工具。它是一种旨在检测导致外部交互的漏洞的工具。本文将主要介绍在子域上设置私有 Interact.sh 服务器以及部署其 Web 应用程序。只需一个 AWS EC2 或 VPS 实例和一个域。 要求 •具有静态IP的AWS EC2 / VPS •拥有自己的域…

实例讲解电动汽车VIN写入规则及Simulink建模方法(三)——VIN设置状态反馈及Simulink建模方法

目录 一、整车VIN设置状态反馈规则 二、整车VIN设置状态反馈设置策略 1、VIN设置状态判定 2、VIN设置状态反馈发送 三、整车VIN设置状态反馈Simulink建模 1、VIN设置状态判定 2、VIN设置状态反馈发送 3、整车VIN设置状态反馈设置完整Simulink模型 四、总结 一、整车VI…

Node.js入门——fs、path模块、URL端口号、模块化导入导出、包、npm软件包管理器

Node.js入门 1.介绍 定义&#xff1a;跨平台的JS运行环境&#xff0c;使开发者可以搭建服务器端的JS应用程序作用&#xff1a;使用Node.Js编写服务器端代码Node.js是基于Chrome V8引擎进行封装&#xff0c;Node中没有BOM和DOM 2.fs模块-读写文件 定义&#xff1a;封装了与…

WIFI网速不够是不是光猫的“路由模式”和“桥接模式”配置错了?

光猫&#xff08;光纤调制解调器&#xff09;是一种用于将光纤信号转换为数字信号的设备&#xff0c;通常用于家庭或企业网络中。光猫可以在不同的工作模式下运行&#xff0c;其中最常见的两种模式是“路由模式”和“桥接模式”。以下是这两种模式的详细解释及其优缺点。 一、路…

python发邮件附件:配置SMTP服务器与认证?

python发邮件附件技巧&#xff1f;Python发送多附件邮件的方法&#xff1f; Python作为一种强大的编程语言&#xff0c;提供了丰富的库和工具来实现这一功能。AokSend将深入探讨如何使用Python发邮件附件&#xff0c;并详细介绍配置SMTP服务器与认证的关键步骤。 python发邮件…

通过阿里云Milvus与PAI搭建高效的检索增强对话系统

阿里云Milvus现已无缝集成于阿里云PAI平台&#xff0c;一站式赋能用户构建高性能的RAG&#xff08;Retrieval-Augmented Generation&#xff09;对话系统。您可以利用Milvus作为向量数据的实时存储与检索核心&#xff0c;高效结合PAI和LangChain技术栈&#xff0c;实现从理论到…

第69期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

react 知识点汇总(非常全面)

React 是一个用于构建用户界面的 JavaScript 库&#xff0c;由 Facebook 开发并维护。它的核心理念是“组件化”&#xff0c;即将用户界面拆分为可重用的组件。 React 的组件通常使用 JSX&#xff08;JavaScript XML&#xff09;。JSX 是一种 JavaScript 语法扩展&#xff0c;…

HCIP——GRE和MGRE

目录 VPN GRE GRE环境的搭建 GRE的报文结构 GRE封装和解封装报文的过程 GRE配置​编辑 R1 R2 GRE实验​​​​​​​​编辑 MGRE 原理 MGRE的配置 R1 R2 R3 R4 查看映射表 抓包 MGRE环境下的RIP网络 综合练习​编辑 VPN 说到GRE&#xff0c;我们先来说个大…

Http 协议和 RPC 协议有什么区别?

Http 协议和 RPC 协议有什么区别&#xff1f; 三个层面来述说&#xff1a; 从功能特性来说&#xff1a; HTTP是一个属于应用层的超文本传输协议&#xff0c;是万维网数据通信的基础&#xff0c;主要服务在网页端和服务端的数据传输上。 RPC是一个远程过程调用协议&#xff0…

AI+视频监控:EasyCVR安防平台赋能火电制造行业的视频智能管理方案

随着信息技术的飞速发展和智能制造的深入推进&#xff0c;火电制造行业作为国民经济的重要组成部分&#xff0c;正面临着智能化转型的迫切需求。为了提升生产效率、保障设备安全、优化管理流程&#xff0c;火电制造企业迫切需要引入先进的视频监控与人工智能技术。EasyCVR安防监…

TinyOS 点对基站通信

文章目录 一、前言1.1 发包的BlinkToRadio的数据包格式 二、混淆基站源码分析2.1 Makefile2.2 组件连接2.3 主逻辑代码 一、前言 1.1 发包的BlinkToRadio的数据包格式 如下&#xff0c;注意&#xff1a;AM层类型(1byte)即handlerID使可以在组件中修改的。 二、混淆基站源码…

《安富莱嵌入式周报》第343期:雷电USB4开源示波器正式发布,卓越的模拟前端低噪便携示波器,自带100W电源的便携智能烙铁,NASA航空航天锂电池设计

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程 【授人以渔】CMSIS-RTOS V2封装层专题视频&#xff0c;一期视频将常用配置和用法梳理清楚&#xff0…

【Mybatis篇】Mybatis的注解开发

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】&#xff0c;【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 文章目录 &#x1f3af; Select注解 …

自动猫砂盆有必要买吗?高性价比的自动猫砂盆怎么选通通看这篇

最近市面上又新出了很多款式的自动猫砂盆&#xff0c;有些铲屎官蠢蠢欲动&#xff0c;但又在犹豫&#xff0c;自己真的需要自动猫砂盆吗&#xff1f;作为养猫4年的资深铲屎官&#xff0c;在买过这么多猫咪智能用品的里面&#xff0c;最不后悔的就是自动猫砂盆了&#xff01;要知…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第二十五章 Source Insight 的安装和使用

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

ElasticSearch备考 -- Multi match

一、题目 索引task有3个字段a、b、c&#xff0c;写一个查询去匹配这三个字段为mom&#xff0c;其中b的字段评分比a、c字段大一倍&#xff0c;将他们的分数相加作为最后的总分数 二、思考 通过题目要求对多个字段进行匹配查询&#xff0c;可以考虑multi match、bool query操作。…

RabbitMQ的相关题

一、 MQ的作⽤及应⽤场景 类似问题: 项⽬什么场景下使⽤到了MQ, 为什么需要MQ? RabbitMQ 的作⽤?使⽤场景有哪些? RabbitMQ…

【JWT安全】portswigger JWT labs 全解

目录 1.利用有缺陷的 JWT 签名验证 ①接受任意签名 lab1:通过未验证的签名绕过 JWT 身份验证 ②接受无签名的token lab2:通过有缺陷的签名验证来绕过 JWT 身份验证 2.暴力破解密钥 ①使用hashcat lab3:通过弱签名密钥绕过 JWT 身份验证 3.JWT 标头参数注入 ①通过 jwk…