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

人脸真假检测:SVM 与 ResNet18 的实战对比

  在人工智能蓬勃发展的当下,人脸相关技术广泛应用于安防、金融、娱乐等诸多领域。然而,随着人脸合成技术的日益成熟,人脸真假检测成为保障这些应用安全的关键环节。本文将深入探讨基于支持向量机(SVM)结合局部二值模式(LBP)特征,以及基于 ResNet18 神经网络的人脸真假检测方法,并通过 Python 代码实战进行详细分析与对比。

一、技术原理

(一)SVM 与 LBP 特征

  LBP 特征提取:LBP 是一种用于描述图像局部纹理特征的算子。其基本原理是对图像每个像素点,以其为中心,设定邻域像素点个数(如本文中的 8 个邻域点)和半径(本文为 1)。将邻域像素点的灰度值与中心像素点灰度值进行比较,大于等于中心像素点灰度值的邻域点记为 1,小于则记为 0,这些二进制值按顺时针或逆时针顺序排列形成一个二进制码,该码就是中心像素点的 LBP 值。对整幅图像计算 LBP 值后,通过统计不同 LBP 值出现的频率(即直方图),得到图像的 LBP 特征。这种特征对光照变化具有一定的鲁棒性,能有效捕捉图像的纹理细节 。

  SVM 模型:支持向量机是一种二分类模型,旨在寻找一个最优分类超平面,使得不同类别的样本点尽可能地远离该超平面。在本文中,采用径向基函数(RBF)作为核函数,它能够将低维空间中的数据映射到高维空间,从而更好地处理非线性分类问题。利用提取的 LBP 特征训练 SVM 模型,实现对人脸真假的分类预测。

(二)ResNet18 神经网络

  ResNet18 架构:ResNet(残差网络)是深度学习领域的经典网络结构,通过引入残差块解决了深度神经网络训练过程中的梯度消失和梯度爆炸问题,使得网络可以训练得更深。ResNet18 包含 18 层卷积层和全连接层,能够自动学习图像的高级特征。

  模型修改与训练:在本文中,对预训练的 ResNet18 模型进行了修改,将最后一层全连接层的输出特征数量调整为 1,并添加了 Sigmoid 激活函数,使其输出为 0 到 1 之间的概率值,用于二分类任务(判断人脸真假)。训练过程中,使用交叉熵损失函数(BCELoss)衡量预测结果与真实标签之间的差异,通过 Adam 优化器调整模型参数,逐步降低损失,提高模型的准确性。

二、代码实现

(一)环境设置与库导入

  首先,需要导入一系列必要的库,包括用于图像处理的 OpenCV、NumPy、scikit - image,用于深度学习的 PyTorch 及其相关工具,以及用于数据处理和评估的 scikit - learn 等:

import os
import cv2
import numpy as np
from skimage.feature import local_binary_pattern
import torch
from torch import nn
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, models
from PIL import Image
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report
import matplotlib.pyplot as plt
import random

 

(二)SVM 模型实现 

  LBP 特征提取函数extract_lbp_features函数负责读取图像并提取其 LBP 特征。首先将图像转换为灰度图,调整大小为指定尺寸,计算 LBP 值并生成直方图,最后对直方图进行归一化处理:

def extract_lbp_features(image_path, target_size=(64, 64)):try:image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)if image is None:return Noneimage = cv2.resize(image, target_size)lbp = local_binary_pattern(image, 8, 1, method='uniform')(hist, _) = np.histogram(lbp.ravel(), bins=np.arange(0, 10), range=(0, 10))hist = hist.astype("float")hist /= (hist.sum() + 1e-7)return histexcept:return None

 

  数据加载函数load_svm_data函数从指定的真假人脸图像文件夹中读取图像,提取 LBP 特征,并为每个样本标记对应的标签(0 表示假脸,1 表示真脸):

def load_svm_data(fake_dir, real_dir):X, y = [], []for img_name in os.listdir(fake_dir):img_path = os.path.join(fake_dir, img_name)features = extract_lbp_features(img_path)if features is not None:X.append(features)y.append(0)for img_name in os.listdir(real_dir):img_path = os.path.join(real_dir, img_name)features = extract_lbp_features(img_path)if features is not None:X.append(features)y.append(1)return np.array(X), np.array(y)

 

  模型训练与评估函数train_svm函数加载训练数据和测试数据,训练 SVM 模型,并对模型进行评估,输出准确率和分类报告:

def train_svm():X_train, y_train = load_svm_data("training_fake", "training_real")X_test, y_test = load_svm_data("testing_fake", "testing_real")svm = SVC(kernel='rbf', random_state=42)svm.fit(X_train, y_train)y_pred = svm.predict(X_test)accuracy = accuracy_score(y_test, y_pred)print("\n支持向量机模型评估结果:")print("准确率:", accuracy)print(classification_report(y_test, y_pred))return accuracy

 

(三)ResNet18 模型实现 

  自定义数据集类FaceDataset类继承自Dataset,用于加载真假人脸图像数据。在初始化时,将图像路径和对应的标签存储起来,并支持数据增强操作(如随机水平翻转):

class FaceDataset(Dataset):def __init__(self, fake_dir, real_dir, transform=None):self.image_paths = []self.labels = []for img_name in os.listdir(fake_dir):self.image_paths.append(os.path.join(fake_dir, img_name))self.labels.append(0)for img_name in os.listdir(real_dir):self.image_paths.append(os.path.join(real_dir, img_name))self.labels.append(1)self.transform = transformdef __len__(self):return len(self.image_paths)def __getitem__(self, idx):try:image = Image.open(self.image_paths[idx]).convert("RGB")label = self.labels[idx]if self.transform:image = self.transform(image)return image, labelexcept:return None

 

  ResNet18 模型定义与修改get_resnet18函数获取预训练的 ResNet18 模型,并修改其最后一层全连接层和添加 Sigmoid 激活函数:

def get_resnet18():model = models.resnet18(pretrained=True)num_ftrs = model.fc.in_featuresmodel.fc = nn.Linear(num_ftrs, 1)model = nn.Sequential(model, nn.Sigmoid())return model

 

  训练与评估函数train_resnet18函数对数据进行预处理,创建数据集和数据加载器,初始化模型、损失函数和优化器,进行模型训练和测试评估,并绘制训练过程中的损失和准确率曲线:

def train_resnet18():transform = transforms.Compose([transforms.Resize((224, 224)),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])def create_dataset(fake_dir, real_dir, transform):dataset = FaceDataset(fake_dir, real_dir, transform)valid_indices = [i for i in range(len(dataset)) if dataset[i] is not None]return torch.utils.data.Subset(dataset, valid_indices)train_dataset = create_dataset("training_fake", "training_real", transform)test_dataset = create_dataset("testing_fake", "testing_real", transform)train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = get_resnet18().to(device)criterion = nn.BCELoss()optimizer = torch.optim.Adam(model.parameters(), lr=0.001)losses = []accuracies = []model.train()for epoch in range(10):running_loss = 0.0for images, labels in train_loader:images, labels = images.to(device), labels.float().to(device).unsqueeze(1)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()epoch_loss = running_loss / len(train_loader)losses.append(epoch_loss)print(f"Epoch {epoch + 1}/10, Loss: {epoch_loss:.4f}")model.eval()correct, total = 0, 0test_images = []test_labels = []test_predictions = []with torch.no_grad():for images, labels in test_loader:test_images.extend(images.cpu().numpy())test_labels.extend(labels.cpu().numpy())images, labels = images.to(device), labels.float().to(device).unsqueeze(1)outputs = model(images)predicted = (outputs > 0.5).float()total += labels.size(0)correct += (predicted == labels).sum().item()test_predictions.extend(predicted.cpu().numpy())accuracy = correct / totalprint("\nResNet18模型评估结果:")print(f"准确率: {accuracy:.4f}")plt.figure(figsize=(12, 5))plt.subplot(1, 2, 1)plt.plot(losses, label='Training Loss')plt.xlabel('Epoch')plt.ylabel('Loss')plt.legend()plt.subplot(1, 2, 2)plt.plot(accuracies, label='Training Accuracy')plt.xlabel('Epoch')plt.ylabel('Accuracy')plt.legend()plt.show()return accuracy, test_images, test_labels, test_predictions

 

  可视化随机五张识别结果visualize_random_five函数从测试数据中随机选取五张图像,展示其真实标签和预测结果:

def visualize_random_five(test_images, test_labels, test_predictions):indices = random.sample(range(len(test_images)), 5)plt.figure(figsize=(15, 7))for i, idx in enumerate(indices):img = np.transpose(test_images[idx], (1, 2, 0))img = (img - np.min(img)) / (np.max(img) - np.min(img))label = 'Real' if test_labels[idx] == 1 else 'Fake'prediction = 'Real' if test_predictions[idx] == 1 else 'Fake'plt.subplot(1, 5, i + 1)plt.imshow(img)plt.title(f'Label: {label}\nPred: {prediction}')plt.axis('off')plt.show()

 

(四)主程序入口 

  在主程序中,依次训练 SVM 模型和 ResNet18 模型,比较两个模型的准确率并进行可视化,同时可视化 ResNet18 模型随机五张测试图像的识别结果:

if __name__ == "__main__":print("正在训练支持向量机模型...")svm_accuracy = train_svm()print("\n正在训练ResNet18模型...")resnet_accuracy, test_images, test_labels, test_predictions = train_resnet18()models = ['SVM', 'ResNet18']accuracies = [svm_accuracy, resnet_accuracy]plt.bar(models, accuracies)plt.xlabel('Models')plt.ylabel('Accuracy')plt.title('Model Accuracy Comparison')for i, v in enumerate(accuracies):plt.text(i, v, str(round(v, 4)), ha='center')plt.show()visualize_random_five(test_images, test_labels, test_predictions)

 

三、实验结果与分析 

 

 

 

 

 

  从训练过程输出的日志来看,ResNet18 模型在 10 个训练轮次(Epoch)中,损失(Loss)不断下降,从 Epoch 1 的 0.7298 逐步降低到 Epoch 10 的 0.2930 ,这表明模型在训练过程中不断学习,对训练数据的拟合能力逐渐增强。最终在测试集上得到的准确率为 0.6176 。

  对比 SVM 模型与 ResNet18 模型的准确率柱状图,SVM 模型的准确率为 0.5392,而 ResNet18 模型的准确率为 0.6176,ResNet18 模型的准确率相对更高。这是因为 ResNet18 作为深度神经网络,具备强大的自动特征提取能力,能够从大量图像数据中学习到更复杂、更具区分性的特征表示,从而在分类任务中表现更优。而 SVM 虽然在处理一些简单特征和小规模数据时表现良好,但在面对人脸真假检测这种复杂的图像分类任务时,其特征表示能力相对有限,导致准确率略低。

  观察 ResNet18 模型训练损失曲线,其呈现出持续下降的趋势,说明模型在训练过程中能够有效优化,不断调整参数以降低损失。但从下降的速率和幅度来看,在前期下降较快,后期下降逐渐变缓,这可能意味着模型在后期逐渐接近收敛状态,进一步提升的难度增大。同时,由于未给出测试集上的损失或准确率随 Epoch 的变化情况,暂时无法确定是否存在过拟合现象。不过仅从当前训练损失持续下降且测试准确率有所提升来看,模型在一定程度上能够泛化到测试数据,但后续仍需进一步分析验证。

  从这五张随机选取的测试图像可视化结果来看,模型在部分样本上预测准确,但也存在误判情况。其中,第一张、第二张和第四张图像真实标签为 “Real”,模型预测也为 “Real” ,说明对于这类图像,模型能够较好地提取特征并做出正确判断。第五张图像真实标签为 “Fake”,模型预测也为 “Fake”,表明模型在识别这类假脸图像时具备一定能力。

  然而,第三张图像真实标签为 “Fake”,但模型却预测为 “Real” ,出现了误判。这可能是由于该假脸图像具有一些与真脸相似的特征,或者其合成技术较为特殊,导致模型提取的特征不足以准确区分真假。通过对这类误判样本的深入分析,我们可以针对性地改进模型。比如,进一步挖掘该图像中模型未能有效捕捉的特征差异,调整模型结构或训练策略,以增强模型对这类特殊样本的识别能力。这也再次强调了在实际应用中,不能仅依赖模型的准确率指标,还需关注模型在具体样本上的预测表现,通过对误判样本的研究来不断优化模型性能。

四、总结与展望

  本文通过代码实现并对比了 SVM 结合 LBP 特征与 ResNet18 神经网络在人脸真假检测任务中的应用。实验结果表明,ResNet18 在准确率上优于 SVM,展现出深度神经网络在图像分类任务中的强大性能。SVM 结合 LBP 特征的方法虽然计算相对简单,但在复杂图像特征提取方面存在不足,导致准确率受限。

  在实际应用中,对于计算资源有限、数据规模较小的场景,SVM 方法可作为一种轻量级的解决方案;而对于追求高准确率、数据量充足的场景,ResNet18 等深度神经网络更为合适。未来可尝试将两者结合,比如先用 SVM 进行初步筛选,再利用 ResNet18 进行精细分类,发挥各自优势,提升检测性能。

  此外,当前模型的准确率仍有提升空间。未来可从以下几方面改进:一是进一步优化模型结构,如调整 ResNet18 的层数、参数,或尝试其他更先进的神经网络架构;二是扩充数据集,引入更多不同场景、光照条件、合成技术的人脸图像,增强模型的泛化能力。

 

 

 

相关文章:

人脸真假检测:SVM 与 ResNet18 的实战对比

在人工智能蓬勃发展的当下,人脸相关技术广泛应用于安防、金融、娱乐等诸多领域。然而,随着人脸合成技术的日益成熟,人脸真假检测成为保障这些应用安全的关键环节。本文将深入探讨基于支持向量机(SVM)结合局部二值模式&…...

求数组中的两数之和--暴力/哈希表

暴力法太好用了hhhhhhhhhhhhhhhhhhh我好爱鹅鹅鹅鹅鹅鹅呃呃呃呃呃呃呃呃呃呃 #include <iostream> #include <vector> using namespace std; int main(){ int n,target; cin>>n>>target; vector<int> nums(n); for(int i0;i<n;i){ cin>>…...

Go多服务项目结构优化:为何每个服务单独设置internal目录?

文章目录 Go多服务项目结构优化&#xff1a;为何每个服务单独设置internal目录&#xff1f;背景什么是 Go 的 internal 机制&#xff1f;传统根 internal 目录的局限为什么要每个服务单独设置 internal &#xff1f;推荐结构示例 总结 Go多服务项目结构优化&#xff1a;为何每个…...

Wallcraft 3.53.0 | 提供高质量动态4D壁纸,解锁高级版,无广告干扰

Wallcraft是一款专注于提供高质量、原创壁纸的应用程序&#xff0c;特别是其特色的动态4D壁纸。这款应用程序不仅提供了大量免费的4K超高清壁纸和炫酷背景&#xff0c;还特别推出了带有视差效果的动态超高清4K壁纸及视频壁纸。用户可以根据个人喜好选择并设置这些壁纸作为手机屏…...

akshare爬虫限制,pywencai频繁升级个人做量化,稳定数据源和券商的选择

做量化&#xff0c;数据和交易接口是策略和自动化交易的基石&#xff0c;而稳定的数据和快人一步的交易接口是个人做量化的催化剂。 之前写过一篇文章&#xff1a;个人做量化常用的数据&#xff0c;多以爬虫为主&#xff0c;最近akshare爬虫限制&#xff0c;pywencai频繁升级。…...

leetcode504.七进制数

标签&#xff1a;进制转换 机试真题 给定一个整数 num&#xff0c;将其转化为 7 进制&#xff0c;并以字符串形式输出。 示例 1: 输入: num 100 输出: "202" 示例 2: 输入: num -7 输出: "-10" 思路&#xff1a;求n进制就是循环取余数&#xff0c;…...

OpenAI 结构改革:迈向民主化 AI 的新篇章

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Satori:元动作 + 内建搜索机制,让大模型实现超级推理能力

Satori&#xff1a;元动作 内建搜索机制&#xff0c;让大模型实现超级推理能力 论文大纲一、背景&#xff1a;LLM 推理增强的三类方法1. 基于大规模监督微调&#xff08;SFT&#xff09;的推理增强2. 借助外部机制在推理时进行搜索 (RLHF / 多模型 / 工具)3. 现有局限性总结 二…...

Python序列化的学习笔记

1. Npy&Numpy O4-mini-Cursor&#xff1a;如果.npy文件里包含了「Python对象」而非纯数值数组时&#xff0c;就必须在加载时加上allow_pickleTrue。...

如何修改进程优先级?

文章目录 1. 摘要2. 命令实现2.1 使用 renice&#xff08;调整普通进程的优先级&#xff09;​2.2 使用 chrt&#xff08;调整实时进程的优先级&#xff09; 3. 代码实现 1. 摘要 在实际开发中&#xff0c;我们经常会遇到创建进程的场景&#xff0c;但是往往并不关心它的优先级…...

java命令行打包class为jar并运行

1.创建无包名类: 2.添加依赖jackson 3.引用依赖包 4.命令编译class文件 生成命令: javac -d out -classpath lib/jackson-core-2.13.3.jar:lib/jackson-annotations-2.13.3.jar:lib/jackson-databind-2.13.3.jar src/UdpServer.java 编译生成class文件如下 <...

JAVA自动装箱拆箱

引言 Java 中的**装箱&#xff08;Boxing&#xff09;和拆箱&#xff08;Unboxing&#xff09;**是自动类型转换的机制&#xff0c;用于在基本数据类型&#xff08;如 int、long 等&#xff09;和其对应的包装类&#xff08;如 Integer、Long 等&#xff09;之间进行转换。这种…...

Linux系统之----模拟实现shell

在前面一个阶段的学习中&#xff0c;我们已经学习了环境变量、进程控制等等一系列知识&#xff0c;也许有人会问&#xff0c;学这个东西有啥用&#xff1f;那么&#xff0c;今天我就和大家一起综合运用一下这些知识&#xff0c;模拟实现下shell&#xff01; 首先我们来看一看我…...

Doris和Clickhouse对比

目录 一、Doris和Clickhouse对比**1. 底层架构****Doris****ClickHouse** **2. 运行原理****Doris****ClickHouse** **3. 使用场景****Doris****ClickHouse** **4. 优缺点对比****总结** 二、MPP架构和Shared-Nothing 架构对比**1. 什么是 MPP 架构&#xff1f;****定义****特点…...

思考:(linux) tmux 超级终端快速入门的宏观思维

tmux 工具集合 GitHub - rothgar/awesome-tmux: A list of awesome resources for tmux 要点&#xff1a; 习惯性思维的变换与宿主机之间的双向复制、粘贴手动备份全部窗口&#xff0c;以及还原自定义窗格提示信息TPM 插件的安装思想别名 在有些场景里&#xff0c;可能无法…...

JavaScript基础-全局作用域

在JavaScript中&#xff0c;理解不同种类的作用域是掌握这门语言的关键之一。作用域决定了变量和函数的可访问性&#xff08;即可见性和生命周期&#xff09;。其中&#xff0c;全局作用域是最基本也是最宽泛的作用域类型。本文将深入探讨全局作用域的概念、特点及其使用时需要…...

【MCAL】TC397+EB-tresos之I2c配置实战(同步、异步)

I2C总线是Philips公司在八十年代初推出的一种串行、半双工的总线&#xff0c;主要用于近距离、低速的芯片之间的通信。本篇文章首先从理论讲起&#xff0c;介绍了英飞凌TC3x系列芯片对应MCAL中对I2C驱动的定义与介绍&#xff0c;建议读者在阅读本篇文章之前对I2C有个简单的认识…...

电网拓扑分析:原理与应用

在现代电力系统中&#xff0c;电网拓扑分析是一项至关重要的技术&#xff0c;它为电力系统的安全、稳定和高效运行提供了坚实的基础。电网拓扑描述了电力系统中各元件&#xff08;如发电机、变压器、输电线路、负荷等&#xff09;之间的连接关系&#xff0c;通过拓扑分析&#…...

leetcode-hot-100(哈希)

写在前面 这部分官方标记为哈希&#xff0c;下面的代码使用的都是 C 进行实现&#xff0c;说到 C 中的哈希&#xff0c;需要了解一下 C 中的 hashtable&#xff08;std::unordered_map或std::unordered_set&#xff09;。 std::unordered_map std::unordered_map 是一个存储…...

音频类网站或者资讯总结

我爱音频网&#xff1a; 我爱音频网 - 我们只谈音频&#xff0c;丰富的TWS真无线蓝牙耳机拆解报告 (52audio.com) 其他更多资讯 音频行业全品类深度剖析&#xff0c;2024市场趋势解读汇总-EDN 电子技术设计 (ednchina.com)...

优选算法——前缀和

目录 1. 数组的中心下标 2. 除自身以外数组的乘积 3. 和为k的子数组 4. 和可被K整除的子数组 5. 连续数组 6. 矩阵区域和 1. 数组的中心下标 题目链接&#xff1a;724. 寻找数组的中心下标 - 力扣&#xff08;LeetCode&#xff09; 题目展示&#xff1a; 题目分析&am…...

VScode密钥(公钥,私钥)实现免密登录【很细,很全,附带一些没免密登录成功的一些解决方法】

一、 生成SSH密钥对 ssh-keygen 或者 ssh-keygen -t rsa -b 4096区别&#xff1a;-t rsa可以明确表示生成的是 RSA 类型的密钥-b参数将密钥长度设置为 4096 位默认&#xff1a;2048 位密钥不指定-t参数&#xff0c;ssh -keygen默认也可能生成 RSA 密钥【确保本机安装ssh&#…...

MySQL进阶篇2_SQL优化、锁

文章目录 1 SQL优化1.1插入数据优化1.2主键优化页分裂页合并主键设计原则 1.3order by设计优化1.4group by设计优化小理解 1.5limit设计优化顺序IO和随机IO小疑惑 1.6count设计优化1.7update优化关于隐式事务事务的DML操作 锁全局锁表级锁表锁元数据锁意向锁 行级锁锁的释放条件…...

Yocto项目实战经验总结:从入门到高级的全面概览

本文面向开发者和实际项目经验者&#xff0c;分享经过大量实战积累的 Yocto 项目工程经验和基础技巧。本文简明但精彩&#xff0c;应用和观察相结合&#xff0c;充分适合做为全面进阶 Yocto 项目开发的实用指南。 一、入门理解&#xff1a;Yocto 是什么&#xff1f;规划如何开始…...

关于web3

主流看法&#xff0c;集合当前网络上的大部分资料的看法&#xff1f; 基于区块链运行的交易系统&#xff1f;面向的交易市场是基于世界的&#xff0c;由于将整个世界的交易联系起来&#xff0c;所以底层区块链就类似于一个非常大的分布式系统&#xff0c;由于需要在各个地区都…...

以影像为笔,劳润智在世界舞台上书写艺术之路

在光影交织中,摄影师劳润智的镜头仿佛能穿透喧嚣,捕捉人类情感最细腻的脉动。从疫情下洛杉矶裁缝日常的温馨瞬间,到象征自由与解脱的飞鸟影像,再到探索时间与空间交错的抽象作品,每一幅作品都展现了他对艺术的深度追求与对生活的温柔洞察。 劳润智的作品为他赢得了多个国际奖项…...

2025python学习笔记

一.Python语言基础入门 第一章 01.初识Python Python的起源&#xff1a; 1989年&#xff0c;为了打发圣诞节假期&#xff0c;Gudio van Rossum吉多范罗苏姆&#xff08;龟叔&#xff09;决心开发一个新的解释程序&#xff08;Python维形&#xff09;1991年&#xff0c;第一个…...

数学相关使用笔记

1、样本标准差计算步骤整理 1. 基础数据 数据样本&#xff1a;[44.530, 44.023, 43.837, 44.213, 44.498] 样本量&#xff1a;n5 2. 计算步骤 (1) 求均值 总和 44.53044.02343.83744.21344.498 221.101 均值 221.101/5 44.2202 (2) 求平方差 ① (44.530-44.2202) 0.3…...

0.环境初始化

容器化部署 Nginx 前端文件在 html\hmdp 下&#xff0c;挂载到 /usr/share/nginx/html 下 所以要求 nginx.conf &#xff1a; root /usr/share/nginx/html; index index.html; 反向代理&#xff1a;proxy_pass http://host.docker.internal:8081; listen 80; 因为容器内端…...

数仓-范式建模、维度建模、雪花模型、星型模型对比及其适用范围

1. 范式建模 定义 范式建模是一种基于关系型数据库设计的建模方法&#xff0c;遵循数据库的范式规则&#xff08;如第一范式、第二范式、第三范式等&#xff09;&#xff0c;通过消除数据冗余、规范化字段和表结构来优化存储。数据被分解为多个表&#xff0c;通过外键关系进行…...

批量导出docker镜像

#!/bin/bash # 创建备份目录 BACKUP_DIR"docker_images_single_backup" mkdir -p "$BACKUP_DIR" # 遍历所有镜像 docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" | while read -r line; do # 提取镜像名称和ID REPO_TAG$(echo …...

棒球裁判员学习指南·棒球1号位

针对棒球裁判员的规则学习与能力提升指南&#xff0c;包含系统性学习路径和实践建议&#xff0c;帮助裁判员高效掌握规则并提升执法水平&#xff1a; 一、基础规则体系构建 1. 官方规则精读 核心文件&#xff1a;完整研读《世界棒垒球联盟&#xff08;WBSC&#xff09;官方规…...

vue注册用户使用v-model实现数据双向绑定

定义数据模型 Login.vue //定义数据模型 const registerData ref({username: ,password: ,confirmPassword: })使用 v-model 实现数据模型的key与注册表单中的元素之间的双向绑定 <!-- 注册表单 --><el-form ref"form" size"large" autocompl…...

BM14 链表的奇偶重排

20250510 题目我的解法❗️问题描述&#xff1a;为什么会报 OutOfMemoryError&#xff1f;&#x1f50d;详细分析✅如何修复&#xff1f;✅推荐修改方案&#xff08;正确版本&#xff09;✅为什么这样改有效&#xff1f;&#x1f9ea;测试示例✅总结 修改 题目 我的解法 impor…...

Client 和 Server 的关系理解

client.py 和 server.py 是基于 MCP&#xff08;Multi-Component Protocol&#xff09;协议的客户端-服务端架构&#xff0c;二者的关系如下&#xff1a; 1. 角色分工 server.py&#xff1a;服务端&#xff0c;负责注册和实现各种“工具函数”&#xff08;如新闻检索、情感分…...

Checkmk实战指南:从零构建企业级监控系统

在当今复杂的IT环境中,监控系统如同运维团队的"眼睛"和"耳朵",而Checkmk正是一款能够帮助企业实现全方位监控的开源利器。本文将带您从零开始,通过8个关键步骤构建一个功能完备的监控系统,涵盖从安装部署到高级优化的完整流程。 一、为什么选择Checkm…...

多模态大模型中的视觉分词器(Tokenizer)前沿研究介绍

文章目录 引言MAETok背景方法介绍高斯混合模型&#xff08;GMM&#xff09;分析模型架构 实验分析总结 FlexTok背景方法介绍模型架构 实验分析总结 Emu3背景方法介绍模型架构训练细节 实验分析总结 InternVL2.5背景方法介绍模型架构 实验分析总结 LLAVA-MINI背景方法介绍出发点…...

车载电子电器架构 --- 汽车网关概述

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

JVM对象创建内存分配

对象创建的主要流程&#xff1a; 检查加载类–》分配内存–》初始化–》设置对象头–》实例化&#xff0c;执行init方法。 在内存分配中&#xff0c;虚拟机将为新生对象内存分配 Minor GC : 新生代垃圾收集&#xff0c;特点是频繁&#xff0c;回收速度快&#xff1b; Full GC …...

project从入门到精通(五)

目录 创建资源的基本信息 在project中创建资源工作表 ​编辑信息详解 最大单位 标准费率与加班费率 每次使用成本 成本累算 基准日历 三类资源工作表的总结——不同的资源必须要设置的属性 除了资源名称是必须设置的之外&#xff0c;剩余的资源的可设置选项如下图所…...

研发效率破局之道阅读总结(5)管理文化

研发效率破局之道阅读总结(5)管理文化 Author: Once Day Date: 2025年5月10日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…...

Java常用类概述

Java常用类概述 一、字符串三剑客1. String&#xff08;不可变字符串&#xff09;2. StringBuilder&#xff08;可变&#xff0c;线程不安全&#xff09;3. StringBuffer&#xff08;可变&#xff0c;线程安全&#xff09; 二、日期时间类&#xff08;重点掌握新版API&#xff…...

202535| Kafka架构与重要概念+幂等性+事务

好的&#xff01;以下是关于 Kafka 架构 以及其 重要概念 的详细介绍&#xff0c;结合 Mermaid 图形 和 表格&#xff0c;帮助你更好地理解各个概念的关系和作用。 Kafka 架构与重要概念 Kafka 是一个分布式消息系统&#xff0c;广泛应用于日志收集、流处理、事件驱动架构等场…...

MySQL 索引和事务

目录 一、MySQL 索引介绍 1、索引概述 2、索引作用 3、索引的分类 &#xff08;1&#xff09;普通索引 &#xff08;2&#xff09;唯一索引 &#xff08;3&#xff09;主键索引 &#xff08;4&#xff09;组合索引&#xff08;最左前缀&#xff09; &#xff08;5&…...

IPFS与去中心化存储:重塑数字世界的基石

引言 在数据爆炸式增长的数字时代&#xff0c;中心化存储的弊端日益凸显——数据垄断、隐私泄露、单点故障等问题频发。IPFS&#xff08;InterPlanetary File System&#xff09; 作为一种去中心化存储协议&#xff0c;正与区块链技术共同推动一场存储革命。本文将深入解析IPF…...

Web3 学习全流程攻略

目录 🧭 Web3 学习全流程攻略 🌱 第一阶段:打好基础(Web3 入门) 🧠 目标: 📚 学习内容: ✅ 推荐资源: 🧑‍💻 第二阶段:技术栈搭建(成为 Web3 开发者) 🧠 目标: 📚 学习内容: ✅ 推荐资源: 🌐 第三阶段:构建完整 DApp(去中心化应用)…...

AUTODL Chatglm2 langchain 部署大模型聊天助手

资源申请 注册登录 进入下面的链接 AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDLAutoDL为您提供专业的GPU租用服务&#xff0c;秒级计费、稳定好用&#xff0c;高规格机房&#xff0c;7x24小时服务。更有算法复现社区&#xff0c;一键复现算法。https://autodl.com/ho…...

牛客练习赛138

牛客练习赛138 A.小s的签到题 思路&#xff1a;过题人数最多的就是签到题 #include <bits/stdc.h> using namespace std; typedef long long ll; typedef pair<int, char> PII;bool cmp(PII a, PII b) {return a.first > b.first; }void solve() {int n;cin …...

【脑机接口临床】脑机接口手术的风险?脑机接口手术的应用场景?脑机接口手术如何实现偏瘫康复?

脑机接口的应用 通常对脑机接口感兴趣的两类人群&#xff0c;一类是适应症患者 &#xff0c;另一类是科技爱好者。 1 意念控制外部设备 常见的外部设备有&#xff1a;外骨骼、机械手、辅助康复设备、电刺激设备、电脑光标、轮椅。 2 辅助偏瘫康复或辅助脊髓损伤患者意念控制…...

普通IT的股票交易成长史--股价起伏的真相-缺口(2)

声明&#xff1a;本文章的内容只是自己学习的总结&#xff0c;不构成投资建议。价格行为理论学习可参考简介中的几位&#xff0c;感谢他们的无私奉献。 送给自己的话&#xff1a; 仓位就是生命&#xff0c;绝对不能满仓&#xff01;&#xff01;&#xff01;&#xff01;&…...