機器學習實驗八--基于pca的人臉識別

基于pca的人臉識別

  • 引言:pca
    • 1.pca是什么
    • 2.PCA算法的基本步驟
  • 實例:人臉識別
    • 1.實驗目的
    • 2.實現步驟
    • 3.代碼實現
    • 4.實驗結果
    • 5.實驗總結

引言:pca

1.pca是什么

pca是一種統計方法,它可以通過正交變換將一組可能相關的變量轉換成一組線性不相關的變量,這組新的變量被稱為主成分。PCA常用于高維數據的降維,通過保留最重要的幾個主成分來簡化數據集,同時盡可能保留原始數據的信息。

2.PCA算法的基本步驟

  1. 數據標準化:對原始數據進行預處理,使得每個特征的均值為0,標準差為1。這一步是為了消除不同量綱對數據分析的影響。
  2. 構建協方差矩陣:計算數據的協方差矩陣,協方差矩陣能夠反映不同特征之間的相關性。
  3. 計算協方差矩陣的特征值和特征向量:特征值和特征向量能夠揭示數據的內在結構。特征值越大,對應的特征向量在數據集中的重要性越高。
  4. 選擇主成分:根據特征值的大小,選擇前k個最大的特征值對應的特征向量作為主成分。通常會選擇累計貢獻率達到一定比例(如85%)的特征向量。
  5. 形成特征向量矩陣:將選定的特征向量組成一個矩陣,這個矩陣將用于將原始數據轉換到新的特征空間。
  6. 數據轉換:使用特征向量矩陣將原始數據轉換到新的特征空間,得到降維后的數據。

實例:人臉識別

1.實驗目的

  1. 理解PCA原理:通過實踐掌握主成分分析(PCA)算法的核心思想及其在降維中的應用
  2. 應用PCA處理圖像數據:學習如何將PCA應用于高維圖像數據,特別是人臉識別領域
  3. 探索特征提取:了解PCA如何提取圖像的主要特征(特征臉)及其在人臉表示中的作用
  4. 評估降維效果:通過圖像重建實驗,直觀理解不同數量主成分對圖像質量的影響

2.實現步驟

  1. 數據準備
    ? 加載ORL人臉數據集(包含40個人的400張人臉圖像)
    ? 將每張112×92像素的灰度圖像轉換為10304維的向量
    ? 構建數據矩陣(每行代表一張圖像)
  2. 數據預處理
    ? 計算并減去平均臉(數據集中所有圖像的平均)
    ? 中心化數據(使數據均值為0)
  3. PCA分析
    ? 使用sklearn的PCA進行主成分分析
    ? 提取前50個主成分
    ? 可視化前5個特征臉(主成分)
  4. 方差分析
    ? 繪制累計解釋方差圖
    ? 觀察不同數量主成分對數據方差的解釋程度
  5. 圖像重建
    ? 選擇樣本圖像進行重建
    ? 分別使用10、30、50個主成分重建圖像
    ? 對比重建圖像與原始圖像的質量差異
  6. 結果分析
    ? 觀察特征臉的特點
    ? 分析主成分數量對重建質量的影響
    ? 評估PCA在圖像壓縮和特征提取中的效果

3.代碼實現

import os
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA# 1. 加載ORL人臉數據集
def load_orl_faces(data_path, num_persons=40, num_images=10, img_size=(112, 92)):"""加載ORL人臉數據集參數:data_path: 數據集路徑num_persons: 人數(默認40)num_images: 每人圖像數(默認10)img_size: 圖像尺寸(默認112×92)返回:X: 圖像矩陣(每行一個圖像)image_shape: 圖像原始形狀"""total_images = num_persons * num_imagesX = np.zeros((total_images, img_size[0] * img_size[1]))image_count = 0for person in range(1, num_persons + 1):person_dir = os.path.join(data_path, f's{person}')for img_num in range(1, num_images + 1):img_path = os.path.join(person_dir, f'{img_num}.pgm')if os.path.exists(img_path):try:img = Image.open(img_path).convert('L')img_array = np.array(img).flatten()X[image_count] = img_arrayimage_count += 1except Exception as e:print(f"處理文件 {img_path} 時出錯: {str(e)}")else:print(f"警告: 未找到文件 {img_path}")# 只保留成功加載的圖像X = X[:image_count]return X, img_size# 2. PCA降維與可視化
def pca_analysis(X, image_shape, n_components=50):"""PCA分析與人臉重建參數:X: 圖像矩陣image_shape: 圖像原始形狀n_components: 保留的主成分數量"""# 數據標準化mean_face = np.mean(X, axis=0)X_centered = X - mean_face# 使用sklearn的PCApca = PCA(n_components=n_components)X_pca = pca.fit_transform(X_centered)# 可視化前幾個特征臉plt.figure(figsize=(15, 5))for i in range(5):eigenface = pca.components_[i].reshape(image_shape)plt.subplot(1, 5, i+1)plt.imshow(eigenface, cmap='gray')plt.title(f'Eigenface {i+1}')plt.axis('off')plt.suptitle('Top 5 Eigenfaces')plt.show()# 顯示方差解釋率plt.figure(figsize=(10, 5))plt.plot(np.cumsum(pca.explained_variance_ratio_))plt.xlabel('Number of Components')plt.ylabel('Cumulative Explained Variance')plt.title('Explained Variance by PCA Components')plt.grid()plt.show()return pca, mean_face, X_pca# 3. 圖像重建與對比
def reconstruct_and_compare(pca, mean_face, X_pca, image_shape, sample_indices=[0, 10, 20]):"""重建圖像并與原始圖像對比參數:pca: PCA模型mean_face: 平均臉X_pca: PCA降維后的數據image_shape: 圖像形狀sample_indices: 要顯示的樣本索引"""plt.figure(figsize=(15, 5 * len(sample_indices)))for i, idx in enumerate(sample_indices):# 原始圖像original_img = mean_face + X_pca[idx] @ pca.components_# 使用不同數量的主成分重建plt.subplot(len(sample_indices), 4, i*4 + 1)plt.imshow(original_img.reshape(image_shape), cmap='gray')plt.title(f'Original Image {idx}')plt.axis('off')for j, n in enumerate([10, 30, 50]):# 使用前n個主成分重建reconstructed = mean_face + X_pca[idx, :n] @ pca.components_[:n]plt.subplot(len(sample_indices), 4, i*4 + j + 2)plt.imshow(reconstructed.reshape(image_shape), cmap='gray')plt.title(f'{n} Components')plt.axis('off')plt.suptitle('Image Reconstruction with Different Numbers of PCA Components')plt.tight_layout()plt.show()# 主程序
def main():# 數據集路徑 - 替換為你的實際路徑dataset_path = r'C:\Users\62755\Downloads\ORL_Faces'# 1. 加載數據X, image_shape = load_orl_faces(dataset_path)print(f"成功加載 {X.shape[0]} 張人臉圖像,每張圖像維度 {X.shape[1]}")# 2. PCA分析pca, mean_face, X_pca = pca_analysis(X, image_shape, n_components=50)# 3. 重建與對比reconstruct_and_compare(pca, mean_face, X_pca, image_shape)if __name__ == "__main__":main()

4.實驗結果

請添加圖片描述
圖像重建對比圖:
請添加圖片描述

累計解釋方差圖:
累計解釋方差圖

5.實驗總結

通過本次基于PCA的人臉識別實驗,我深入理解了主成分分析的核心原理及其在實際問題中的應用價值。實驗過程中,我不僅掌握了如何將高維圖像數據轉化為適合PCA處理的矩陣形式,還學會了數據標準化和中心化的預處理方法。通過可視化特征臉,我直觀認識到PCA如何自動提取數據的主要變化模式,這些特征臉實際上構成了人臉圖像的基礎成分。

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

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

相關文章

【LLIE專題】NTIRE 2025 低照度圖像增強第二名方案

Towards Scale-Aware Low-Light Enhancement via Structure-Guided Transformer Design(2025,NTIRE) 專題介紹一、研究背景二、SG-LLIE方法1.和Retinexformer方案對比2.總體方案及創新點3.詳細方案3.1 結構先驗提取3.2 網絡結構3.3 損失函數 …

泊松融合的介紹和OpenCV教程

泊松融合 Poisson Blending 簡介 核心思想 泊松融合的目標是在保留剪切圖像的梯度(紋理)信息的同時,使融合結果在邊界區域平滑過渡到目標圖像中。換句話說,它在融合區域中重建一個圖像,使其梯度盡可能接近源圖像的梯度,并且邊界貼合目標圖像。 數學描述 泊松融合將問題…

Unity協程Coroutine與UniTask對比

原理對比 CoroutineUniTask本質IEnumerator 的協作調度器async/await 狀態機(IAsyncStateMachine)調度方式Unity 內部調用 MoveNext()自建 PlayerLoopRunner 控制狀態推進內存管理引用類型,頻繁分配 GC結構體 UniTask,低 GC 壓力…

MAC軟件打開提示已損壞:“已損壞,打不開。您應將它移到廢紙簍“

打開「終端.app」,輸入以下命令并回車,輸入開機密碼回車 sudo spctl --master-disable 按照上述步驟操作完成后,打開「系統偏好設置」-「安全與隱私」-「通用」,確保已經修改為「任何來源」。 打開「終端.app」,輸入…

JAVA之 Lambda

Java Lambda Lambda 表達式是 Java 8 的核心特性,通過 函數式編程 大幅簡化代碼。其核心思想是將行為作為參數傳遞,替代匿名內部類,提升代碼的簡潔性和可讀性。以下是系統解析和完整代碼示例: 一、Lambda 表達式基礎 語法結構 (…

Starrocks中RoaringBitmap雜談

背景 最近在閱讀Starrocks源碼的時候&#xff0c;遇到ColumnRefSet的RoaringBitmap使用&#xff0c;所以借此來討論一下RoaringBitmap這個數據結構,這種思想是很值得借鑒的。 對于的實現可以參考一下 <dependency><groupId>org.roaringbitmap</groupId><…

數據結構:泰勒展開式:霍納法則(Horner‘s Rule)

目錄 &#x1f50d; 若用遞歸計算每一項&#xff0c;會發生什么&#xff1f; Horners Rule&#xff08;霍納法則&#xff09; 第一步&#xff1a;我們從最原始的泰勒公式出發 第二步&#xff1a;從形式上重新觀察展開式 &#x1f31f; 第三步&#xff1a;引出霍納法則&…

從Java的Jvm的角度解釋一下為什么String不可變?

從Java的Jvm的角度解釋一下為什么String不可變&#xff1f; 從 JVM 的角度看&#xff0c;Java 中 String 的不可變性是由多層次的機制共同保障的&#xff0c;這些設計涉及內存管理、性能優化和安全保障&#xff1a; 1. JVM 內存模型與字符串常量池 字符串常量池&#xff08;St…

初識硬編碼(x86指令描述)

硬編碼 任何一個程序其實都可以看做兩部分組成的&#xff0c;指令和數據 cpu并沒有明確的規定哪些要當做數據&#xff0c;哪些要當做指令來執行&#xff0c;把數據給EIP只要是遵循了指定的格式&#xff08;x86 x64 ARM&#xff09;&#xff0c;cpu都會當做指令來執行 x86/x64…

3.RV1126-OPENCV 圖像疊加

一.功能介紹 圖像疊加&#xff1a;就是在一張圖片上放上自己想要的圖片&#xff0c;如LOGO&#xff0c;時間等。有點像之前提到的OSD原理一樣。例如&#xff1a;下圖一張圖片&#xff0c;在左上角增加其他圖片。 二.OPENCV中圖像疊加常用的API 1. copyTo方法進行圖像疊加 原理…

MySQL垂直分庫(基于MyCat)

參考資料&#xff1a; 參考視頻 參考博客 Mycat基本部署 視頻參考資料&#xff1a;鏈接: https://pan.baidu.com/s/1xT_WokN_xlRv0h06b6F3yg 提取碼: aag3 概要&#xff1a; 本文的垂直分庫&#xff0c;全部是基于前文部署的基本架構進行的 垂直分庫&#xff1a; 垂直分庫…

Spitfire:Codigger 生態中的高性能、安全、分布式瀏覽器

Spitfire 是 Codigger 生態系統中的一款現代化瀏覽器&#xff0c;專為追求高效、隱私和分布式技術的用戶設計。它結合了 Codigger 的分布式架構優勢&#xff0c;在速度、安全性和開發者支持方面提供了獨特的解決方案&#xff0c;同時確保用戶對數據的完全控制。 1. 高性能瀏覽…

1-【源碼剖析】kafka核心概念

從今天開始開始在csdn上記錄學習的筆記&#xff0c;主要包括以下幾個方面&#xff1a; kafkaflinkdoris 本系列筆記主要記錄Kafka學習相關的內容。在進行kafka源碼學習之前&#xff0c;先介紹一下Kafka的核心概念。 消息 消息是kafka中最基本的數據單元&#xff0c;由key和…

互聯網大廠Java求職面試:云原生架構下的微服務網關與可觀測性設計

互聯網大廠Java求職面試&#xff1a;云原生架構下的微服務網關與可觀測性設計 鄭薪苦懷著忐忑的心情走進了會議室&#xff0c;對面坐著的是某大廠的技術總監張總&#xff0c;一位在云原生領域有著深厚積累的專家。 第一輪面試&#xff1a;微服務網關的設計挑戰 張總&#xf…

【HarmonyOS 5】針對 Harmony-Cordova 性能優化,涵蓋原生插件開發、線程管理和資源加載等關鍵場景

1. ?原生圖片處理插件&#xff08;Java&#xff09; package com.example.plugin; import ohos.media.image.ImageSource; import ohos.media.image.PixelMap; import ohos.app.Context; public class ImageProcessor { private final Context context; public ImagePro…

Java-IO流之緩沖流詳解

Java-IO流之緩沖流詳解 一、緩沖流概述1.1 什么是緩沖流1.2 緩沖流的工作原理1.3 緩沖流的優勢 二、字節緩沖流詳解2.1 BufferedInputStream2.1.1 構造函數2.1.2 核心方法2.1.3 使用示例 2.2 BufferedOutputStream2.2.1 構造函數2.2.2 核心方法2.2.3 使用示例 三、字符緩沖流詳…

健康檢查:在 .NET 微服務模板中優雅配置 Health Checks

&#x1f680; 健康檢查&#xff1a;在 .NET 微服務模板中優雅配置 Health Checks &#x1f4da; 目錄 &#x1f680; 健康檢查&#xff1a;在 .NET 微服務模板中優雅配置 Health Checks一、背景與意義 &#x1f50d;二、核心配置 &#x1f527;2.1 引入必要的 NuGet 依賴 &…

關于akka官方quickstart示例程序(scala)的記錄

參考資料 https://doc.akka.io/libraries/akka-core/current/typed/actors.html#first-example 關于scala語法的注意事項 extends App是個語法糖&#xff0c;等同于直接在伴生對象中編寫main 方法對象是通過apply方法創建的&#xff0c;也可以通過對象的名稱單獨創建&#x…

基于vue3-elemenyui的頁面加載及新建瀏覽頁案例

1.參考鏈接&#xff1a; 基于創建vue3鏈接&#xff1a;Vue3前端項目創建_vscode創建vue3項目-CSDN博客 基于創建elementui鏈接&#xff1a;Vue3引入ElementPlus_vue引入element-plus-CSDN博客 2.案例內容 該案例實現了基本的app.vue的路由跳轉、新建瀏覽頁參數傳入以及瀏覽…

板凳-------Mysql cookbook學習 (十)

5.6 改變字符串的字符集或字符排序 mysql> set s1 my string; Query OK, 0 rows affected (0.01 sec)mysql> set s2 convert(s1 using utf8); Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> select charset(s1), charset(s2); -------------------------…