ディープラーニングを使った顔認証

ディープラーニングを使った顔認証

[[390275]]

今日は、ディープラーニングを使用して顔認証アルゴリズムを作成します。 私たちのタスクを達成するには、主に 3 つの部分が必要です。

  • 顔を見つけるアルゴリズム
  • 顔をベクトル空間に埋め込む方法
  • エンコードされた顔を比較する機能

顔検索と位置情報

まず、画像内の顔を見つける方法が必要です。 MTCNN (マルチタスク カスケード畳み込みネットワーク) と呼ばれるエンドツーエンドのアプローチを使用できます。

少し技術的な背景を説明すると、これは複数のステージで構成され、各ステージにニューラル ネットワークがあるため、カスケードと呼ばれます。 次の図はフレームワークを示しています。

私たちは facenet-pytorch の MTCNN 実装に依存しています。

データ

画像が必要です!レオナルド・ディカプリオとマット・デイモンの写真をいくつか集めました。

PyTorch のベスト プラクティスに従い、ImageFolder を使用してデータセットを読み込みます。 MTCNN インスタンスを作成し、transform パラメータを使用してデータセットを渡しました。

私のフォルダ構造は次のとおりです。

  1. ./顔
  2. ├── ディカプリオ
  3. │ ├── ....jpg
  4. ├── マット・デーモン
  5. │ ├── ....jpg
  6. └── 私
  7. │ ├── ....jpg

MTCNN は入力を自動的に切り抜いてサイズを変更します。モデルはそのサイズの画像でトレーニングされるため、image_size = 160 を使用します。 また、顔全体が確実に含まれるように、18 ピクセルの余白を追加します。

  1. 輸入トーチ
  2. torchvision.transforms をTとしてインポートします。
  3. matplotlib.pyplot をpltとしてインポートします。
  4.   
  5. torch.utils.dataからDataset、DataLoader をインポートします
  6. torchvision.datasetsからImageFolder をインポートします
  7. facenet_pytorchからMTCNN、InceptionResnetV1 をインポートします
  8. pathlibからPathをインポート
  9. import Union , Callableと入力し
  10.   
  11. data_root = パス( '.' )
  12. # MTCNNネットワークを作成する
  13. 変換 = MTCNN(画像サイズ=160、マージン=18)
  14.   
  15. ds = ImageFolder(root=data_root / 'faces' 、transform=transform)
  16. # データセット非常に小さいため、batch_size はその長さ同じになります
  17. dl = DataLoader(ds, バッチサイズ=len(ds))
  18.   
  19. ds[1]

ds の構造は次のとおりです。

  1. (テンソル([[[ 0.9023, 0.9180, 0.9180, ..., 0.8398, 0.8242, 0.8242], [ 0.9023, 0.9414, 0.9492, ..., 0.8555, 0.8320, 0.8164], [ 0.9336, 0.9805, 0.9727, ..., 0.8555, 0.8320, 0.7930], ..., [-0.7070, -0.7383, -0.7305, ..., 0.4102, 0.3320, 0.3711], [-0.7539, -0.7383, -0.7305, ..., 9258, 0.9258], [ 0.9336, 0.9492, 0.9492, ..., 0.9336, 0.9258, 0.9258], [ 0.9414, 0.9648, 0.9414, ..., 0.9570, 0.9414, 0.9258], ..., [-0.3633, , 0.5352, 0.5820], [-0.3945, -0.3867, -0.3945, ..., 0.5820, 0.5742, 0.6211], [-0.3711, -0.3633, -0.4023, ..., 0.5273, 0.6055, 0.6211]], [[ 0.8867, 0.8867, 0.8945, ..., 0.8555, 0.8477, 0.8477], [ 0.8789, 0.8867, 0.8789, ..., 0.8789, 0.8633, 0.8477]、[ 0.8867、0.9023、0.8633、...、0.9023、0.8789、0.8555]、...、[-0.0352、-0.0586、-0.0977、...、0.7617、0.7070、0.7461]、[-0.0586、-0.0586、-0.0977、...、0.7617、0.7617、0.8086]、[-0.0352、-0.0352、-0.1211、...、0.7227、0.8086、0.8086]]])、0)

データセットはテンソルとして返されます。 すべての入力を視覚化してみましょう。 これらは MTCNN 画像によって正規化されており、最後の行の最後の 3 つの画像は私自身の自撮りです :)

埋め込みベクトル空間

データは準備完了です。 顔を比較して 2 つの顔が類似しているかどうかを確認するには、それらをベクトル空間にエンコードする必要があります。2 つの顔が類似している場合は、それらに関連付けられた両方のベクトルも類似しています (近い)。

よく知られた顔データセット (例: vgg_face2) でトレーニングされたモデルを使用し、分類ヘッドの前の最後のレイヤーの出力 (潜在空間) をエンコーダーとして使用することができます。

これらのデータセットのいずれかでトレーニングされたモデルは、入力に関する重要な特徴を学習する必要があります。 最後のレイヤー (完全に接続されたレイヤーの前) は、高レベルの機能をエンコードします。 したがって、これを使用して入力をベクトル空間に埋め込み、類似した画像が互いに近くなることを期待できます。

具体的には、vggface2 データセットでトレーニングされた Inception Resnet を使用します。 埋め込み空間の次元は 512 です。

  1. resnet = InceptionResnetV1(事前トレーニング済み = 'vggface2' ).eval()
  2.   
  3. torch.no_grad()の場合:
  4. (画像、ラベル)dlに挿入:
  5. embs = resnet(画像)
  6. 壊す
  7.   
  8. embs.shape
  9.   
  10. トーチ.サイズ([8, 512])

完璧です。8枚の画像があり、8つのベクトルが得られます。

類似度の計算

ベクトルを比較するには、cosine_similarity を使用して、ベクトルが互いにどれだけ近いかを確認します。 コサイン類似度は [-1, 1] の間の値を出力します。 単純なケースでは、比較される 2 つのベクトルは同じであり、それらの類似度は 1 です。したがって、類似度は 1 に最も近くなります。

これで、データセット内のすべてのペア間の距離をすべて見つけることができます。

  1. Seaborn をSNSとしてインポートする
  2. numpyをnpとしてインポートする
  3.   
  4. 類似度マトリックス = torch.zeros(embs.shape[0], embs.shape[0])
  5.   
  6. iが範囲(embs.shape[0])の場合:
  7. jが範囲(embs.shape[0])の場合:
  8. similarity_matrix[i,j] = torch.cosine_similarity(embs[i] .view (1,-1), embs[j].view ( 1,-1))の類似度行列を求める。
  9.   
  10.   
  11. 図 = plt.figure(図サイズ=(15, 15))
  12.   
  13. sns.heatmap(類似性マトリックス.numpy(), annot = True ,)
  14.   
  15. ヌミコン = 8
  16. i が範囲(numicons)場合:
  17. アキシコン = fig.add_axes([0.12+0.082*i,0.01,0.05,0.05])
  18. axicon.imshow(un_normalize(ds[i][0]).permute(1,2,0).numpy())
  19. axicon.set_xticks([])
  20. axicon.set_yticks([])
  21.   
  22. アキシコン = fig.add_axes([0, 0.15 + 0.092 * i, .05, 0.05])
  23. axicon.imshow(un_normalize(ds[len(ds) - 1 - i][0]).permute(1,2,0).numpy())
  24. axicon.set_xticks([])
  25. axicon.set_yticks([])

もちろん、私はマットやレオとあまり似ていませんが、共通点がいくつかあります。

さらに一歩進んで、埋め込みベクトルに対して PCA を実行し、画像を 2D 平面に投影することもできます。

  1. matplotlib.offsetboxからOffsetImage、AnnotationBbox をインポートします
  2.   
  3. pca(x: torch.Tensor, k: int = 2) を定義します。-> torch.Tensor:
  4. 「」 「
  5. http://agnesmustar.com/2017/11/01/principal-component-analysis-pca-implemented-pytorch/より
  6. 「」 「
  7. # データを前処理する
  8. X_mean = torch.mean(x, 0)
  9. x = x - X_mean.expand_as(x)
  10. #svd
  11. U、S、V = torch.svd(torch.t(x))
  12. torch.mm(x, U[:, :k])を返す
  13.   
  14. ポイント = pca(embs, k=2)
  15. plt.rcParams[ "figure.figsize" ] = (12,12)
  16.   
  17. 図、ax = plt.figure()、plt.subplot(111)
  18. plt.scatter(ポイント[:,0], ポイント[:,1])
  19. i, penumerate(ポイント)代入する場合:
  20. x, y = p[0], p[1]
  21. img = un_normalize(ds[i][0])
  22. img_np = img.permute(1, 2, 0).numpy().squeeze()
  23. ab = AnnotationBbox(OffsetImage(img_np, zoom=0.6), (x, y), frameon= False )
  24. ax.add_artist(ab)
  25.   
  26. plt.plot()

512 次元を 2 次元に圧縮したため、大量のデータが失われました。

さて、顔を見つけて、それらが互いに似ているかどうかを確認する方法ができたので、顔認証アルゴリズムを作成できます。

私のアイデアは、人物の許容される画像を n 枚取得し、埋め込み空間の中心を見つけ、しきい値を選択して、中心と新しい画像間のコサイン類似度がそのしきい値より小さいか大きいかを確認することです。

  1. データクラスからデータクラスをインポートし、フィールド
  2. import List, Callable と入力し
  3. PIL インポート画像から
  4.   
  5. @データクラス
  6. クラス FaceUnlock:
  7.       
  8. 画像: List[Image.Image] = フィールド(default_factory = list)
  9. th:浮動小数点数= 0.8
  10. 変換: Callable = MTCNN(image_size=160, margin=18)
  11. 埋め込み: torch.nn.Module = InceptionResnetV1(事前トレーニング済み = 'vggface2' ).eval()
  12. 中心: torch.Tensor = None
  13.   
  14. __post_init__(self)を定義します。
  15. 顔 = torch.stack(リスト(map(self.transform, self.images)))
  16. embds = self.embedder(faces)
  17.   
  18. 自己中心 = embds.sum (0) / embds.shape[0]
  19.       
  20. def __call__(self, x: Image.Image) -> bool:
  21. 顔 = 自己.transform(x)
  22. emb = self.embedder(face.unsqueeze(0))
  23.   
  24. 類似度 = torch.cosine_similarity( emb.view (1,-1), self.center.view (1 , -1))
  25. is_me = 類似性 > self.th
  26.   
  27. is_me、類似度を返す
  28.   
  29. #自分写真を読み込む
  30. me = データルート / 'faces' / 'me'   
  31. 画像 = list(map( Image.open 、 me.glob( '*' )))
  32. #自分の画像顔認証を初期化する
  33. face_unlock = FaceUnlock(画像)
  34.   
  35. ipywidgetsから、interact、interactive、fixed、interact_manual をインポートします
  36.   
  37. def unlock_with_filepath(パス):
  38. img = Image.open (パス)
  39.       
  40. is_me、類似度 = face_unlock(img)
  41. print(f "{'' if is_me else ''} similarity={similarity.item():.3f}" )
  42.   
  43. 図 = plt.figure()
  44. plt.imshow(画像)
  45. plt.plot()
  46.   
  47. test_root = data_root / 'faces_test'   
  48.   
  49. 対話(unlock_with_filepath、パス=リスト(test_root.glob( '*' )))

類似度スコアは前の画像よりも高いので本物だと思います!

新しい自撮りを試してみましょう

要約する

2D データ (画像) のみを使用して顔認証アルゴリズムを作成する魅力的なアプローチを見てきました。 これは、類似した顔が互いに近接している高次元ベクトル空間で切り取られた顔をエンコードするためにニューラル ネットワークに依存しています。 しかし、モデルがどのようにトレーニングされたかはわかりませんし、簡単に混乱する可能性があります (私の実験ではアルゴリズムがうまく機能したにもかかわらず)。

モデルがデータ拡張なしでトレーニングされた場合はどうなるでしょうか? その場合、同じ人物を反転するだけで潜在的な表現が破壊される可能性があります。

より堅牢なトレーニング ルーチンは、データ拡張に大きく依存する教師なし (BYOL に類似) になります。

<<:  私の国の医薬品人工知能市場は急速な成長期に入っている

>>:  「カラフルな黒をください」というたった1行のコマンドでAIが描ける

ブログ    
ブログ    

推薦する

デジタルワールドが未来を予見するファバルタ製品・ユーザーカンファレンスが大盛況のうちに開催

9月19日、大手AIインフラ企業であるFabartaは、北京で初の製品およびユーザーカンファレンスを...

...

OpenAIがMicrosoftに反旗を翻す!アルトマン氏が「ChatGPTのカスタマイズ」を企む。AI市場の未来はまた変わるのか?

ChatGPTはリリースからわずか半年で、5日間でユーザー数が100万人を超え、現在ユーザー総数は...

視覚的な「脳の読み取り」:脳の活動から見える世界を再構築する

人間の知覚は客観的な刺激だけでなく過去の経験によっても形成され、それらが組み合わさって脳内で複雑な活...

漫画の着色に機械学習を使用する

何百ものトレーニング データの例を手描きせずに、シンプルなカラー スキームを自動的に適用できますか?...

AIはスペインの流行において重要な役割を果たし、新規感染者の死亡率を半減させた。

[[361228]]スペインは、感染者数が170万人を超え、欧州で新型コロナウイルスのパンデミック...

ディープラーニングのトレーニング中に GPU の温度が高すぎますか?すぐにクールダウンするには、以下の数行のコマンドを入力してください

[[197022]]新しく購入した水冷なしのパブリック版GPUの温度は、フル負荷で稼働すると室温から...

人工知能がプログラマーに取って代わるまでにはどれくらい時間がかかるのでしょうか?

予測によると、AI の影響を最も受ける職業の 1 つはアプリケーション開発者です。結局のところ、Ch...

データマイニング分野のトップ 10 の古典的なアルゴリズムの 1 つ - CART アルゴリズム (コード付き)

導入CART は C4.5 に似ており、決定木アルゴリズムの一種です。さらに、一般的な決定木アルゴリ...

...

Python のデータ構造とアルゴリズム - 順序付きリストの維持と二分

[[402075]]序文Bisect は、リストをソートしたままリストに要素を挿入するアルゴリズムを...

C# で開発されたソートアルゴリズムの詳細な説明

C# 言語は、まだ比較的一般的なものです。ここでは、バブル ソート、選択ソート、挿入ソート、シェル ...

エンジニアの職が危機に:ボストン・ダイナミクスのロボット犬がフォードにエンジニアとして入社!

[[335339]]ボストン・ダイナミクスのロボット犬に新たなアイデンティティが誕生。フォードのエ...

クロードからGPT-4まで、RLHFモデルではお世辞が蔓延している

AI界隈であろうと他の分野であろうと、多かれ少なかれ大規模言語モデル(LLM)を使ったことがあるでし...

清朗智能の新型消毒ロボットが海外市場を席巻

新型コロナウイルスの感染力が高いため、防疫期間中、一般の人々は、インテリジェント消毒ロボットが医療産...