基于Python实现人脸识别相似度对比
目录
- 引言
- 背景介绍
- 目的和意义
- 人脸识别的原理
- 人脸图像获取
- 人脸检测与定位
- 人脸特征提取
- 相似度计算
- 基于Python的人脸相似度对比实现
- 数据集准备
- 人脸图像预处理
- 特征提取
- 相似度计算
引言
背景介绍
人脸识别技术是一种通过计算机对人脸图像进行分析和处理,从而实现自动识别和辨认人脸的技术。随着计算机视觉和模式识别领域的快速发展,人脸识别技术取得了长足的进步。从最早的基于特征点的方法到后来的基于深度学习的方法,人脸识别技术在准确性和效率上都有了显著提升。
人脸相似度对比是人脸识别技术的一个重要应用场景。通过比较两张人脸图像的相似度,可以实现人脸搜索、身份验证等功能。例如,在安全监控领域,人脸相似度对比可以帮助警方追踪嫌疑人;在社交媒体平台,人脸相似度对比可以用于自动标记照片中的好友。

目的和意义
本文旨在介绍如何使用Python实现人脸相似度对比,帮助读者了解人脸识别的原理和Python中的人脸识别库。通过深入了解人脸识别技术的原理和实际操作,读者将能够掌握基于Python实现人脸相似度对比的方法和技巧。这对于对人脸识别技术感兴趣的学生、研究人员和开发者来说,具有重要的指导意义。

人脸识别的原理
人脸图像获取
人脸图像获取是进行人脸识别的第一步,它涉及到如何获取人脸图像的过程。
常用的人脸图像获取方法:
-
摄像头采集:
最常见的人脸图像获取方式是通过摄像头实时捕捉人脸图像。摄像头可以连接到计算机或移动设备上,使用相应的软件来实时获取人脸图像。这种方法适用于需要实时进行人脸识别的场景,如门禁系统、人脸支付等。 -
图片采集:
除了实时采集外,还可以通过拍摄静态图片来获取人脸图像。这种方法适用于需要对已有图片进行人脸识别的场景,比如人脸搜索、社交媒体标记等。可以使用手机、相机或者其他设备拍摄人脸照片,并保存为图像文件供后续处理和分析。 -
数据集采集:
在一些特定的应用场景中,需要构建大规模的人脸数据集用于训练和测试人脸识别算法。这时可以通过邀请志愿者参与数据采集,或者从互联网上收集公开的人脸图像数据集。在进行数据集采集时需要遵守相关法律法规,确保数据采集的合法性和隐私保护。
人脸检测与定位
人脸检测与定位是人脸识别的第二步,它涉及到如何从图像中准确地检测和定位人脸的位置。
介绍几种常用的人脸检测与定位方法:
-
基于特征的方法:
基于特征的方法是最早被提出的人脸检测方法之一,它通过设计和提取人脸特征来判断图像中是否存在人脸。常用的特征包括颜色信息、纹理信息、边缘信息等。然后使用分类器或匹配算法对这些特征进行分析和处理,以确定人脸的位置。例如,Haar特征和级联分类器是一种经典的基于特征的人脸检测方法。 -
基于机器学习的方法:
基于机器学习的方法利用已标注的训练数据,通过训练分类器或回归模型来实现人脸检测和定位。常用的机器学习算法包括支持向量机(SVM)、随机森林(Random Forest)和卷积神经网络(Convolutional Neural Network,CNN)等。这些算法可以使用人工提取的特征或直接从原始图像数据中学习特征,从而实现对人脸的准确检测和定位。 -
基于深度学习的方法:
随着深度学习的兴起,基于深度学习的人脸检测与定位方法取得了巨大的突破。使用深度神经网络(Deep Neural Network,DNN)可以直接从原始图像数据中学习人脸的特征表示,从而实现高效、准确的人脸检测和定位。常用的深度学习模型包括卷积神经网络(CNN)、区域卷积神经网络(Region-based Convolutional Neural Network,R-CNN)和单阶段检测器(One-stage Detector)等。
无论采用哪种方法,人脸检测和定位的目标是准确地找到图像中人脸的位置和边界框,以便后续的人脸特征提取和识别。在选择方法时,需要考虑检测速度、准确性、鲁棒性等因素,并根据具体应用场景进行选择。近年来,基于深度学习的方法在人脸检测与定位领域取得了显著的进展,成为当前最主流的方法之一。
人脸特征提取
人脸特征提取是人脸识别的重要环节,它涉及到从人脸图像中提取出能够表达人脸差异的关键特征。
-
Eigenfaces(特征脸):
Eigenfaces是一种经典的线性降维方法,它通过主成分分析(Principal Component Analysis,PCA)将人脸图像投影到低维空间中,得到一组称为"特征脸"的基向量。这些特征脸具有良好的区分能力,可以用于表示人脸图像,并且可以通过计算图像与特征脸之间的投影系数来比较和识别人脸。 -
Local Binary Patterns(局部二值模式):
局部二值模式是一种基于纹理特征的人脸描述方法,它通过对每个像素点与其周围像素的比较来构造二进制编码。将这些二进制编码串联起来,可以得到一个表示整个人脸图像纹理信息的特征向量。局部二值模式在人脸特征提取中具有较好的鲁棒性和表达能力,并且计算效率较高。 -
Histogram of Oriented Gradients(梯度方向直方图):
梯度方向直方图是一种基于边缘特征的人脸描述方法,它通过计算图像中每个像素点的梯度方向和梯度强度来构造直方图。这些直方图能够有效地表达人脸图像的局部结构和纹理信息,并且具有一定的旋转和尺度不变性。 -
Deep Face Representations(深度学习人脸表示):
随着深度学习的发展,基于深度神经网络的人脸特征提取方法也取得了显著的进展。通过使用预训练的卷积神经网络(Convolutional Neural Network,CNN)或使用迁移学习将网络应用于人脸数据集,可以从中提取出高层次、语义丰富的人脸特征。这些特征在人脸识别任务中表现出了出色的性能。
人脸特征提取的目标是将人脸图像转化为一个紧凑、可区分的特征向量,以便后续的人脸匹配和识别。在选择方法时,需要考虑特征的鲁棒性、区分能力、计算效率等因素,并根据具体应用场景进行选择。
相似度计算
相似度计算是人脸识别的核心环节,它涉及到如何比较两个人脸特征向量之间的相似度。
-
欧几里得距离:
欧几里得距离是最简单、最直观的相似度计算方法之一。它计算两个向量之间的欧几里得距离,即两个向量各个元素差值的平方和再开方。欧几里得距离适用于特征向量维度较小的情况。 -
余弦相似度:
余弦相似度是常用的相似度计算方法之一,它计算两个向量之间的余弦夹角,即两个向量的内积除以它们的模长乘积。余弦相似度适用于特征向量维度较大的情况,并且具有一定的旋转不变性。 -
皮尔逊相关系数:
皮尔逊相关系数是一种常用的相似度计算方法,它衡量两个向量之间的线性相关程度。它计算两个向量之间的协方差与它们的标准差之积,可以用于判断两个向量是否具有相同的分布特征。 -
Mahalanobis距离:
Mahalanobis距离是一种在多维空间中度量样本间距离的方法,它考虑了各个维度之间的相关性。它首先对数据进行协方差矩阵的分解,然后计算两个向量间的马氏距离。Mahalanobis距离可以有效地处理数据中存在相关性的情况。 -
深度神经网络相似度计算:
近年来,借助深度神经网络技术,人们已经提出了一些基于神经网络的相似度计算方法。这些方法通过训练神经网络,将两个人脸特征向量映射到一个低维空间中,然后计算它们的欧氏距离或余弦相似度。这些方法具有较强的表达能力和鲁棒性,并且可以在大规模数据集上实现高效的人脸识别。
基于Python的人脸相似度对比实现
数据集准备
-
数据采集:
首先,需要采集包含人脸的图像数据。可以通过使用摄像头拍摄照片或者从已有的图像数据集中选择合适的图像。确保图像中的人脸清晰可见,并且具有一定的样本多样性。 -
数据标注:
对于采集到的图像数据,需要进行标注,即给每个图像中的人脸位置打上标签。通常使用矩形框(bounding box)来标注人脸位置,可以使用标注工具手动标注或者借助自动化的算法进行标注。 -
数据预处理:
在进行人脸识别之前,对数据进行预处理是必要的。常见的预处理操作包括图像缩放、灰度转换、直方图均衡化等。这些操作有助于提高数据的质量和减少噪声。 -
数据划分:
为了评估模型的性能,需要将数据集划分为训练集和测试集。通常将大部分数据用于训练,留出一部分作为测试。可以使用sklearn库中的train_test_split函数来实现数据集的划分。
import cv2
import os
from sklearn.model_selection import train_test_split# 数据采集和标注
image_dir = 'dataset'
labels = []
images = []for label in os.listdir(image_dir):label_path = os.path.join(image_dir, label)for image_file in os.listdir(label_path):image_path = os.path.join(label_path, image_file)# 进行数据预处理image = cv2.imread(image_path)image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)image = cv2.resize(image, (100, 100)) # 图像缩放labels.append(label)images.append(image)# 数据划分
X_train, X_test, y_train, y_test = train_test_split(images, labels, test_size=0.2, random_state=42)# 训练集和测试集保存
train_dir = 'train'
test_dir = 'test'for i, image in enumerate(X_train):label = y_train[i]save_path = os.path.join(train_dir, label, f"image{i}.jpg")cv2.imwrite(save_path, image)for i, image in enumerate(X_test):label = y_test[i]save_path = os.path.join(test_dir, label, f"image{i}.jpg")cv2.imwrite(save_path, image)
假设图像数据存放在dataset目录下,每个类别的图像放在对应的子目录下。通过遍历目录,读取图像数据并进行预处理。然后使用sklearn库中的train_test_split函数将数据集划分为训练集和测试集,并保存到’train’和’test’目录下。
人脸图像预处理
人脸图像预处理是进行人脸识别任务的重要步骤之一。在进行训练和测试之前,需要对人脸图像进行预处理,以便提高模型的精度和鲁棒性。
常见的人脸图像预处理操作包括:
-
图像缩放:将图像按比例缩小或放大,可以使图像在计算机中更易处理,同时还可以减少噪音的影响。
-
灰度转换:将彩色图像转换为灰度图像,可以简化图像处理过程,并减少数据存储空间和计算时间。
-
直方图均衡化:通过调整图像像素值的分布,可以增强图像的对比度和清晰度,有助于提高人脸检测和识别的准确性。
-
非线性滤波:使用非线性滤波器(如中值滤波器)可以去除图像中的椒盐噪声、斑点噪声等,从而提高图像的质量。
-
人脸对齐:由于人脸在不同姿势下可能存在旋转、平移等变化,因此需要对人脸进行校准,以保证不同人脸之间的比较具有可比性。
import cv2
import numpy as np# 图像缩放
def resize(image, size=(224,224)):return cv2.resize(image, size)# 灰度转换
def to_gray(image):return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 直方图均衡化
def equalize_hist(image):return cv2.equalizeHist(image)# 非线性滤波
def median_blur(image, kernel_size=3):return cv2.medianBlur(image, kernel_size)# 人脸对齐
def face_alignment(image, landmarks):# 将landmarks转换为numpy数组landmarks = np.array(landmarks)# 计算眼睛中心点left_eye_center = np.mean(landmarks[36:42], axis=0).astype("int")right_eye_center = np.mean(landmarks[42:48], axis=0).astype("int")# 计算旋转角度和缩放比例dy = right_eye_center[1] - left_eye_center[1]dx = right_eye_center[0] - left_eye_center[0]angle = np.degrees(np.arctan2(dy, dx)) - 180scale = np.sqrt(dx ** 2 + dy ** 2) / 96# 构造旋转矩阵M = cv2.getRotationMatrix2D(tuple(left_eye_center), angle, scale)# 进行仿射变换aligned = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]), flags=cv2.INTER_CUBIC)return aligned# 对一张人脸图像进行预处理
def preprocess_image(image, landmarks=None):# 图像缩放image = resize(image)# 灰度转换image = to_gray(image)# 直方图均衡化image = equalize_hist(image)# 非线性滤波image = median_blur(image)# 人脸对齐if landmarks is not None:image = face_alignment(image, landmarks)return image
以上代码中,定义了一些基本的图像处理函数,包括缩放、灰度转换、直方图均衡化、非线性滤波和人脸对齐。这些函数可以组合使用,构成一个完整的人脸图像预处理流程。
特征提取
特征提取是进行人脸识别任务的核心步骤之一。在这一步骤中,需要将预处理后的人脸图像转化为一组特征向量,以便于进行比较和分类。
常见的人脸特征提取方法包括:
-
统计特征:如LBP(局部二值模式)等,该方法通过统计图像中像素点之间的灰度差异来描述图像纹理特征。
-
基于深度学习的特征提取:如使用卷积神经网络(CNN)等深度学习模型来提取图像特征,这种方法通常能够得到更加准确和稳定的特征向量。
import cv2
import face_recognition# 使用face_recognition库的API提取人脸特征向量
def extract_features(image):# 使用HOG算法检测人脸位置locations = face_recognition.face_locations(image, model="hog")# 对每个人脸进行特征提取features = []for loc in locations:# 提取68个关键点landmarks = face_recognition.face_landmarks(image, [loc])[0]# 将关键点转换为128维特征向量feature = face_recognition.face_encodings(image, [landmarks])[0]features.append(feature)return features# 对多张人脸图像进行特征提取
def extract_features_batch(images):features_batch = []for image in images:features = extract_features(image)features_batch.append(features)return features_batch
以上代码中,使用face_recognition库的API来实现人脸位置检测、关键点定位和特征提取。该库使用HOG算法来检测人脸位置,使用68个关键点来描述人脸的形态和结构,并将这些关键点转换为128维特征向量。
相似度计算
定义了计算欧氏距离和余弦相似度的函数,并提供了一个计算两个人脸特征向量相似度得分的函数。根据需要选择相应的相似度计算方法,可以通过传入参数
method来指定。
import numpy as np# 计算欧氏距离
def euclidean_distance(feature1, feature2):diff = feature1 - feature2distance = np.sqrt(np.sum(diff**2))return distance# 计算余弦相似度
def cosine_similarity(feature1, feature2):dot_product = np.dot(feature1, feature2)norm1 = np.linalg.norm(feature1)norm2 = np.linalg.norm(feature2)similarity = dot_product / (norm1 * norm2)return similarity# 计算两张人脸图像的相似度得分
def compute_similarity_score(feature1, feature2, method='euclidean'):if method == 'euclidean':score = euclidean_distance(feature1, feature2)elif method == 'cosine':score = cosine_similarity(feature1, feature2)else:raise ValueError("Invalid similarity calculation method.")return score相关文章:
基于Python实现人脸识别相似度对比
目录 引言背景介绍目的和意义 人脸识别的原理人脸图像获取人脸检测与定位人脸特征提取相似度计算 基于Python的人脸相似度对比实现数据集准备人脸图像预处理特征提取相似度计算 引言 背景介绍 人脸识别技术是一种通过计算机对人脸图像进行分析和处理,从而实现自动识…...
CSS 蜡烛效果
<template><view class="holder"><!-- 身子 --><view class="candle"><!-- 光源 --><view class="blinking-glow"></view><!-- 火星子 --><view class="thread"></view>…...
渗透测试之Kali如何利用CVE-2019-0708漏洞渗透Win7
环境: 1.攻击者IP:192.168.1.10 系统: KALI2022(vmware 16.0) 2.靶机IP:192.168.1.8 系统:Windows 7 6.1.7601 Service Pack 1 Build 7601 已开启远程协助RDP服务开启了3389端口 问题描述: KALI 如何利用CVE-2019-0708漏洞渗透Win7 解决方案: 1.打开kali,msf搜索…...
Docker(二)安装指南:主要介绍在 Linux 、Windows 10 和 macOS 上的安装
作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! 安装 Docker Docker 分为 stable test 和 nightly 三个更新频道。 官方网站上有各种环境下的 安装指南,这里主要介绍 Docker 在…...
LeetCode 410. 分割数组的最大值
一、题目 1、题目描述 给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组。 设计一个算法使得这 k 个子数组各自和的最大值最小。 2、接口描述 class Solution { public:int splitArray(vector<int>& nums, int …...
linux shell脚本 基础认识
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并…...
一文(10图)了解Cornerstone3D核心概念(万字总结附导图)
Cornerstone3D介绍 Cornerstone3D是一个专门为处理三维医学影像而设计的JavaScript库。 它是Cornerstone项目的一部分,旨在为医学影像社区提供高性能、可扩展且易于使用的开源Web工具,专注于提供交互式的3D医学图像浏览体验,适用于多种医学…...
牛客网-----跳石头
题目描述: 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有N块岩石(不含起点和终点的岩石)。在比赛过程中࿰…...
用ChatGPT教学、科研!大学与OpenAI合作
亚利桑那州立大学(简称“ASU”)在官网宣布与OpenAI达成技术合作。从2024年2月份开始,为所有学生提供ChatGPT企业版访问权限,主要用于学习、课程作业和学术研究等。 为了帮助学生更好地学习ChatGPT和大语言模型产品,AS…...
运维平台介绍:视频智能运维平台的视频质量诊断分析和告警中心
目 录 一、视频智能运维平台介绍 (一)平台概述 (二)结构图 (三)功能介绍 1、运维监控 2、视频诊断 3、巡检管理 4、告警管理 5、资产管理 6、工单管理 7、运维…...
GAMES104-现代游戏引擎:从入门到实践 - 物理引擎课程笔记汇总
文章目录 0 入门资料1 物理引擎基本概念Actor & shapesRigid body dynamicsCollision DetectionCollision Resolution 应用与实践Character controllerRagdoll 0 入门资料 GAMES104-现代游戏引擎:从入门到实践_课程视频_bilibiliGAMES104官方账号 - 知乎课程主页…...
【linux】Xorg的工作原理
介绍 在linux系统上执行nvidia-smi时,总有一个进程占用gpu。 1 N/A N/A 2174 G /usr/lib/xorg/Xorg 4MiB /usr/lib/xorg/Xorg 是与X Window System(简称X11或X)相关的一个应用程序。X Window System是一个…...
02-docker下部署seata
官方部署文档 http://seata.io/zh-cn/docs/ops/deploy-by-docker 配置参数说明 http://seata.io/zh-cn/docs/user/configurations 1、镜像拉取 docker pull seata-server2、复制配置文件 mkdir /home/server/seata cd /home/server/seata docker run -d -p 8091:8091 -p 709…...
回归预测 | Matlab实现GA-APSO-MBP、GA-MBP、MBP、BP多输入单输出回归预测
回归预测 | Matlab实现GA-APSO-MBP、GA-MBP、MBP、BP多输入单输出回归预测 目录 回归预测 | Matlab实现GA-APSO-MBP、GA-MBP、MBP、BP多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现GA-APSO-MBP、GA-MBP、MBP、BP多输入单输出回归预测&…...
精益生产咨询背后的秘密:企业如何实现价值最大化
精益生产,起源于丰田生产系统,是一种集中于削减浪费、优化流程、提升顾客价值的生产方法。它的核心在于确保每一步生产过程都能为顾客创造价值。以下是实现精益生产咨询的详细步骤: 1.确定客户价值 一切从顾客需求出发。企业需深入理解顾客…...
创建SERVLET
创建SERVLET 要创建servlet,需要执行以下任务: 编写servlet。编译并封装servlet。将servlet部署为Java EE应用程序。通过浏览器访问servlet。编写servlet 要编写servlet,需要扩展HttpServlet接口的类。编写servlet是,需要合并读取客户机请求和返回响应的功能。 读取和处…...
python算法与数据结构(搜索算法和拓扑排序算法)---深度优先搜索
课程目标 了解树/图的深度遍历,宽度遍历基本原理;会使用python语言编写深度遍历,广度遍历代码;掌握拓扑排序算法 搜索算法的意义和作用 搜索引擎 提到搜索两个子,大家都应该会想到搜索引擎,搜索引擎的基…...
thinkphp5实战之phpstudy v8环境搭建,解决Not Found找不到路径问题
引言 thinkphp以快速、简约的大道至简的思想广受欢迎,适合开发小型项目。本地环境下,phpstudy v8是一款比较优秀的集成环境软件。部署完项目后,访问的时候傻眼,报错。 解决方案 不要慌,这个是伪静态的原因。选择apach…...
fastjson-BCEL不出网打法原理分析
FastJson反序列化漏洞 与原生的 Java 反序列化的区别在于,FastJson 反序列化并未使用 readObject 方法,而是由 FastJson 自定一套反序列化的过程。通过在反序列化的过程中自动调用类属性的 setter 方法和 getter 方法,将JSON 字符串还原成对…...
部署mysql主从同步,部署mysql数据读写分离结构+mycat2
主要命令 [rootmysql59 ~]# yum –y install mysql-server mysql[rootmysql59 ~]# systemctl start mysqld[rootmysql59 ~]# vim /etc/my.cnf.d/mysql-server.cnf[mysqld]server-id59log-binmysql59:wq[rootmysql59 ~]# systemctl restart mysqld//用户授权[rootmysql59 ~]# my…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
中南大学无人机智能体的全面评估!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.…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
