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

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

[[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が描ける

ブログ    
ブログ    
ブログ    

推薦する

「トランスフォーマー」は5年でクレイジーなCNNに取って代わりました!トランスフォーマーは人工知能を支配するのでしょうか?

AI業界では今や誰もが知る名前となったTransformerが、これほど短期間でなぜこれほど人気を...

Python は 2023 年のプログラミング言語リストで引き続きトップを占めています。 SQLが求人需要リストのトップに

技術の急速な発展により、プログラミング言語は現代社会に欠かせないものになりました。ウェブサイト開発、...

機械学習プロジェクトを構築するための6つのステップをマスターしましょう

上のホワイトボードには、一連の機械学習プロジェクトの立ち上げが示されています。機械学習は幅広い分野を...

最近 IT 業界で起こったいくつかの大きな出来事についてお話ししましょう。

新年が明けたばかりですが、新しい技術、新しい知識、新しいコンテンツが次々と登場し、新年早々も怠けるこ...

AI はどのようにして既存の人間の偏見を強化するのでしょうか?

定義上、人工知能 (AI) は人間の脳の働きを模倣して組織活動を最適化することを目的としています。 ...

アイウェア市場は1000億円規模を超えるか? 3Dプリントで「顔のカスタマイズ」を実現

私たちの日常生活には、近視用メガネ、サングラス、サングラス、遠視用メガネ、ゴーグルなど、視力矯正、視...

LRU キャッシュ アルゴリズムの Java カスタム実装

背景LinkedHashMap は HashMap を継承し、内部的に removeEldestEn...

人工知能は感情を認識するために使われている

感情認識技術は、人工知能を使用して人の表情から感情を検出する、数十億ドル規模の新興産業です。しかし、...

畳み込みニューラルネットワークの簡単な説明

畳み込みニューラルネットワークネットワーク構造図図2 畳み込みニューラルネットワークの構造図畳み込み...

...

クラウドコンピューティングと人工知能が、先進的な企業に前例のない機会を生み出す方法

近年、ますます大規模なデータセットを処理するために SaaS (サービスとしてのソフトウェア) モデ...

...

PG&E、AIを活用して山火事のリスクを軽減

2018年、パシフィック・ガス・アンド・エレクトリック(PG&E)の送電線の故障により発生し...

LiDARは自動運転以外にも様々な用途があります!

近年、スマートカーの継続的な発展に伴い、LIDARはますます注目を集めており、特にテスラと他の自動車...