コンピュータビジョン5の応用 ~PCA次元削減手法を用いた簡易な顔認識モデルの実現~

こんにちは、Wei Xue AI です。今日は、コンピューター ビジョンの応用 5 - PCA 次元削減手法を使用して簡単な顔認識モデルを実現する方法を紹介します。この記事では、主成分分析 (PCA) を使用して簡単な顔認識モデルを実現する方法を紹介します。顔認証モデルです。まず、PCA の原理と顔認識におけるその応用について簡単に紹介します。次に、例を通して Python を使用して PCA 次元削減を実装する方法を示し、完全なコード例を示します。

記事ディレクトリ

  • I.はじめに
  • 2. PCAの原理
  • 3. 顔認識における PCA の適用
  • 4. 簡易顔認識モデルの実現
    • 4.1 データの前処理
    • 4.2 PCAの次元削減を実現
    • 4.3 顔認識のためのユークリッド距離の計算
    • 4.4 コードの実装
  • 5. まとめ

I.はじめに

主成分分析 (PCA) は、データの次元削減、圧縮、視覚化に広く使用されている手法です。線形変換を通じて元のデータを一連の新しい変数 (主成分) に変換します。新しい変数はそれぞれ元の変数の線形結合であり、重要度に従って並べ替えられるため、最初の主成分は元のデータを保持します。データ内の可能な限り多くの情報を取得し、その後の主成分が残りの情報を順番に取得します。したがって、PCA は生データをより少ない次元に圧縮できるため、データの分析と視覚化が容易になります。具体的には、n 次元データ サンプルが m 個あると仮定すると、それらは mxn 行列 X として表されます。顔認識の分野では、PCAを使用して顔画像の主な特徴を抽出することで、高い認識率を維持しながらデータサイズを削減し、計算量を削減できます。

2. PCAの原理

PCA の目標は、データの主な特性を維持しながら、高次元データを低次元空間に投影することです。具体的な手順は次のとおりです

1. データの平均ベクトルと共分散行列を計算します。

2. 共分散行列の固有値と固有ベクトルを計算します。

3. 固有値を降順に並べ、上位 k 個の最大固有値に対応する固有ベクトルを選択して射影行列を形成します (k は次元削減後の次元です)。

4. データを射影行列に射影して、次元削減されたデータを取得します。

3. 顔認識における PCA の適用

顔認識の問題では、画像データを高次元空間内の点として考えることができます。PCA の次元削減により、主な特徴情報を維持しながら画像を低次元空間に投影できます。そして、ユークリッド距離を計算するなどして画像間の類似性を計測し、顔認識を実現します。

4. 簡易顔認識モデルの実現

4.1 データの前処理

PCA 次元削減の実装を開始する前に、データを前処理する必要があります。具体的な手順は次のとおりです。

1. 顔画像データを読み取ります。

2. 画像をグレースケール画像に変換します。

3. グレースケール画像を 1 次元ベクトルに変換します。

4. すべての画像ベクトルをマトリックスにスタックします。

4.2 PCAの次元削減を実現

PCA 次元削減を実装する場合、Python の NumPy ライブラリによって提供される関数を使用して、前述の PCA 原理の計算ステップを完了できます。

4.3 顔認識のためのユークリッド距離の計算

PCA の次元削減が完了すると、次元削減空間内でテスト画像とトレーニング画像の間のユークリッド距離を計算し、最も近い距離を持つ画像を認識結果として選択できます。

4.4 コードの実装

以下は、PCA を使用して単純な顔認識モデルを実装するための完全なコードです。

import numpy as np
import cv2
import os

def load_images(path):
    images = []
    labels = []
    for subdir, dirs, files in os.walk(path):
        for file in files:
            img_path = os.path.join(subdir, file)
            img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
            img = cv2.resize(img, (248, 248))
            img_vector = img.flatten()
            images.append(img_vector)
            labels.append(subdir.split("/")[-1])
    return np.array(images), np.array(labels)

def pca(X, k):
    #print(X.shape)
    mean = np.mean(X, axis=0)
    X_centered = X - mean
    cov_matrix = np.cov(X_centered.T)
    # 使用 atleast_2d 函数将 cov_matrix 转换为至少有两个维度的数组
    cov_matrix = np.atleast_2d(cov_matrix)

    eig_vals, eig_vecs = np.linalg.eig(cov_matrix)
    sorted_indices = np.argsort(eig_vals)[::-1]
    top_k_eig_vecs = eig_vecs[:, sorted_indices[:k]]
    X_centered = X_centered.reshape(-1, 1)
    print(X_centered.shape)
    #top_k_eig_vecs = top_k_eig_vecs.T
    X_pca = X_centered.dot(top_k_eig_vecs)
    return X_pca, top_k_eig_vecs, mean

def euclidean_distance(a, b):
    return np.sqrt(np.sum((a - b) ** 2))

def face_recognition(test_image, train_images, train_labels, eig_vecs, mean):
    test_image_centered = test_image - mean
    test_image_centered =test_image_centered.reshape(-1, 1)

    test_image_pca = test_image_centered.dot(eig_vecs)
    print(test_image_pca.shape)
    min_distance = float("inf")
    best_match = None
    train_images =[train_images]
    for i, train_image_pca in enumerate(train_images):
        print(test_image_pca.shape)
        distance = euclidean_distance(test_image_pca, train_image_pca)
        if distance < min_distance:
            min_distance = distance
            best_match = train_labels[i]
    return best_match

if __name__ == "__main__":
    train_images_path = "图片文件夹"
    test_image_path = "1.png"

    # Load and preprocess images
    train_images, train_labels = load_images(train_images_path)
    print(train_images, train_labels)
    test_image = cv2.imread(test_image_path, cv2.IMREAD_GRAYSCALE)
    test_image = cv2.resize(test_image, (248, 248))
    test_image_vector = test_image.flatten()
    #train_images = np.stack(train_images, axis=1)
    # Perform PCA on training images
    k = 50
    train_images_pca, eig_vecs, mean = pca(train_images[0], k)

    # Perform face recognition
    result = face_recognition(test_image_vector, train_images_pca, train_labels, eig_vecs, mean)
    print("测试的图片类别是:", result)

"图片文件夹"「1.png」が実際のトレーニング イメージとテスト イメージのパスに置き換えられていることに注意してください。

V. まとめ

この記事では、PCA 次元削減手法を使用して簡単な顔認識モデルを実現する原理と実装プロセスを紹介します。PCA の次元削減により、画像の主な特徴を維持しながら計算量を削減できます。この方法は、他の距離測定方法を使用したり、他の特徴抽出方法を組み合わせたりするなど、実際のアプリケーションではさらなる最適化と改善が必要になる場合があります。

 過去の作品:

 ディープラーニング実践プロジェクト

1. ディープラーニングの実践 1-(keras フレームワーク) エンタープライズ データの分析と予測

2. ディープラーニングの実践 2 - (keras フレームワーク) 企業の信用格付けと予測

3. 深層学習の実践 3 テキスト畳み込みニューラル ネットワーク (TextCNN) ニュース テキスト分類

4. 深層学習戦闘 4 - 畳み込みニューラル ネットワーク (DenseNet) 数学的グラフィック認識 + トピック パターン認識

5. 深層学習の実践 5-畳み込みニューラル ネットワーク (CNN) 中国語 OCR 認識プロジェクト

6. ディープラーニング戦闘 6 - 畳み込みニューラル ネットワーク (Pytorch) + クラスター分析で大気質と天気予測を実現

7. ディープラーニングの実践 7 - 電子商取引商品レビューの感情分析

8. Deep Learning Combat 8​​ - Life Photo Transformation Comic Photo アプリケーション

9. ディープラーニング実践9-テキスト生成画像-ローカルコンピュータでtext2imgを実現

10. ディープラーニング演習10 ~数式認識~画像のLatex化(img2Latex)

11. ディープラーニング実践11(上級編) - BERTモデルの微調整適用 - テキスト分類の場合

12. ディープラーニング演習 12 (上級編) - Dewarp を使用してテキストの歪みを修正する

13. ディープラーニング実践編13(上級編) - 文字誤り訂正機能、よく誤字を書く友人には頑張ってください

14. ディープラーニング実践14(上級編) - 手書き文字OCR認識、手書きメモも認識可能

15. Deep Learning Combat 15 (Advanced Edition) - 読解は機械に任せる + 質問者になって質問できる

16. ディープラーニング実践16(上級編) - 仮想スクリーンショット認識テキスト - 紙の契約書やフォームの認識も可能

17. ディープラーニング演習17(上級編) - インテリジェントアシスタント編集基盤システムの構築・開発事例

18. Deep Learning Combat 18 (Advanced Edition) - 市販されているNLPタスクを実現できるNLP融合システムの15タスク

19. Deep Learning Combat 19 (Advanced Edition) - ChatGPT に基づいて独自のプラットフォームに SpeakGPT 機能を実装するための SpeakGPT のローカル実装デプロイメント テスト

20. Deep Learning Combat 20 (Advanced Edition) - ファイルの内容に基づいてキーワードを検索し、ファイルを迅速に見つけることができるファイル インテリジェント検索システム

21. ディープラーニング実践21(上級編)~あらゆる名詞を検索できる事典「AI物体事典検索」

22. ディープラーニング実践22(応用編)~AI漫画動画生成モデル、自分だけの漫画動画を作ろう

23. Deep Learning Combat 23 (Advanced Edition) - 文字画像のマッティング (コンピューター ビジョン) の効果を実現するセマンティック セグメンテーション コンバット

24. Deep Learning Combat 24 - 人工知能 (Pytorch) が変圧器モデルを構築し、実際に変圧器モデルを実行し、変圧器の構造を深く理解します。

25. 深層学習の実践 25 - 人工知能 (Pytorch) が T5 モデルを構築し、実際に T5 モデルを実行し、T5 モデルを使用してデジタル加算および減算結果を生成します。

26. Deep Learning Combat 26 - (Pytorch) マルチラベルテキスト分類のタスクを実現する TextCNN の構築

27. ディープラーニング実践27 - 中国語文章の関係性抽出を実現するPytorchフレームワーク+BERT

28. 深層学習の実践 28-AIGC プロジェクト: ChatGPT を使用してカスタマイズされた PPT ファイルを生成する

29. Deep Learning Combat 29-AIGC プロジェクト: テキスト継続と歌詞生成タスクに GPT-2 (CPU 環境) を使用

(アップグレード保留中)

おすすめ

転載: blog.csdn.net/weixin_42878111/article/details/130796899