人臉真假檢測: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 的層數、參數,或嘗試其他更先進的神經網絡架構;二是擴充數據集,引入更多不同場景、光照條件、合成技術的人臉圖像,增強模型的泛化能力。

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904910.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904910.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904910.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

類加載器, JVM類加載機制

1.類加載器 Java里有如下幾種類加載器 1.引導類加載器 負責加載支撐JVM運行的位于JRE的lib目錄下的核心類庫,比如rt.jar、charsets.jar等 2.擴展類加載器 負責加載支撐JVM運行的位于JRE的lib目錄下的ext擴展目錄中的JAR類包 3.應用程序類加載器 負責加載Class…

Hadoop 2.x設計理念解析

目錄 一、背景 二、整體架構 三、組件詳解 3.1 yarn 3.2 hdfs 四、計算流程 4.1 上傳資源到 HDFS 4.2 向 RM 提交作業請求 4.3 RM 調度資源啟動 AM 4.4 AM運行用戶代碼 4.5 NodeManager運行用戶代碼 4.6 資源釋放 五、設計不足 一、背景 有人可能會好奇&#xf…

串口屏調試 1.0

http://wiki.tjc1688.com 先把商家的鏈接貼過來 淘晶馳T1系列3.2寸串口屏tft液晶屏顯示屏HMI觸摸屏超12864液晶屏 這是主包的型號 打開這個玩意 有十個基本的功能區 新建工程 在界面的右邊,指令一定要寫在page前面,這里的波特率等等什么的都可以…

《設計數據密集型應用》——閱讀小記

設計數據密集型應用 這本書非常推薦看英語版,如果考過了CET-6就可以很輕松的閱讀這本書。 當前計算機軟件已經不是單體的時代了,分布式系統,微服務現在是服務端開發的主流,如果沒有讀過這本書,則強力建議讀這本書。 …

【SpringMVC】詳解cookie,session及實戰

目錄 1.前言 2.正文 2.1cookie與session概念 2.2返回cookie參數 2.3設置session 3.小結 1.前言 哈嘍大家好吖,今天繼續來給大家來分享SpringMVC的學習,今天主要帶來的是cookie與session的講解以及通過postman和fiddler來實戰,廢話不多…

令狐沖的互聯網大廠Java面試之旅

場景描繪:互聯網大廠Java面試 在某個陽光明媚的上午,令狐沖來到了風清揚所在的互聯網大廠,準備迎接他的Java開發工程師面試。風清揚是一位以嚴謹和深厚技術功底著稱的面試官,令狐沖稍顯緊張,但他相信自己的準備。 第…

照片to谷歌地球/奧維地圖使用指南

軟件介紹 照片to谷歌地球/奧維地圖是一款由WTSolutions開發的跨平臺圖片處理工具,能夠將帶有GPS信息的照片導入Google Earth(谷歌地球)或奧維地圖。該軟件支持Windows、Mac、iOS、Linux和Android系統,無需下載安裝,直…

客戶端建立一個連接需要占用客戶端的端口嗎

客戶端建立TCP連接時需占用本地端口,具體機制如下: 一、端口占用的必要性 四元組唯一性? TCP連接通過?源IP、源端口、目標IP、目標端口?四元組唯一標識。客戶端發起連接時,必須綁定本地端口以完成通信標識。 動態端口分配? 客戶端操作…

【生存技能】ubuntu 24.04 如何pip install

目錄 原因解決方案說明 在接手一個新項目需要安裝python庫時彈出了以下提示: 原因 這個報錯是因為在ubuntu中嘗試直接使用 pip 安裝 Python 包到系統環境中,ubuntu 系統 出于穩定性考慮禁止了這種操作 這里的kali是因為這臺機器的用戶起名叫kali,我也不知道為什么…

智能時代下,水利安全員證如何引領行業變革?

當 5G、AI、物聯網等技術深度融入水利工程,傳統安全管理模式正經歷顛覆性變革。在這場智能化浪潮中,水利安全員證扮演著怎樣的角色?又將如何重塑行業人才需求格局? 水利工程智能化轉型對安全管理提出新挑戰。無人機巡檢、智能監測…

TDengine 在智能制造中的核心價值

簡介 智能制造與數據庫技術的深度融合,已成為現代工業技術進步的一個重要里程碑。隨著信息技術的飛速發展,智能制造已經成為推動工業轉型升級的關鍵動力。在這一進程中,數據庫技術扮演著不可或缺的角色,它不僅承載著海量的生產數…

微調ModernBERT為大型語言模型打造高效“過濾器”

ModernBERT(2024 年 12 月)是最近發布的小型語言模型,由 Answer.AI、LightOn 和 HuggingFace 共同開發。它利用了現代優化技術,如用于 8,192 token 上下文窗口的 RoPE 和 GeGLU layers,在保持效率的同時提升性能。jina…

電網拓撲分析:原理與應用

在現代電力系統中,電網拓撲分析是一項至關重要的技術,它為電力系統的安全、穩定和高效運行提供了堅實的基礎。電網拓撲描述了電力系統中各元件(如發電機、變壓器、輸電線路、負荷等)之間的連接關系,通過拓撲分析&#…

OSPF案例

拓撲圖: 要求: 1,R5為ISP,其上只能配置IP地址;R4作為企業邊界路由器, 出口公網地址需要通過PPP協議獲取,并進行chap認證 2,整個OSPF環境IP基于172.16.0.0/16劃分;…

2D橫板跳躍游戲筆記(查漏補缺ing...)

1.Compression(壓縮質量):可以改為None,不壓縮的效果最好,但占用內存 2.Filter Mode(過濾模式):可以選擇Point(no filter) 3.Pixels Per Unit:是…

MAD-TD: MODEL-AUGMENTED DATA STABILIZES HIGH UPDATE RATIO RL

ICLR 2025 spotlight paper 構建能夠在少量樣本下學習出優良策略的深度強化學習(RL)智能體一直是一個極具挑戰性的任務。為了提高樣本效率,近期的研究嘗試在每獲取一個新樣本后執行大量的梯度更新。盡管這種高更新-數據比(UTD&am…

Dia瀏覽器:AI驅動瀏覽網頁,究竟怎么樣?(含注冊申請體驗流程)

名人說:博觀而約取,厚積而薄發。——蘇軾《稼說送張琥》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊) 目錄 一、Dia瀏覽器簡介1. 什么是Dia瀏覽器2. 開發背景與公司簡介3. 與傳統瀏覽器的區別 …

SSL/TLS 證書與數字簽名:構建互聯網信任的詳解

在浩瀚的數字世界中,信任是安全通信的基石。當我們通過瀏覽器訪問一個 HTTPS 網站、進行在線支付,或者下載一個重要的軟件更新時,我們如何能確信自己正在與合法的、未被仿冒的對方進行交互?我們又如何能保證傳輸的數據沒有被中途竊…

近日部署跑通的若干多模態模型總結與論文概述

CLIP模型概述與落地測試 CLIP模型全稱是Contrastive Language-Image Pretraining??(對比語言圖像預訓練)。是OpenAI于2021年提出的多模態預訓練模型,通過對比學習對齊圖像和文本的表示,實現零樣本(zero-shot&#x…

Web3 初學者的第一個實戰項目:留言上鏈 DApp

目錄 📌 項目簡介:留言上鏈 DApp(MessageBoard DApp) 🧠 技術棧 🔶 1. Solidity 智能合約代碼(MessageBoard.sol) 🔷 2. 前端代碼(index.html script.js…