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

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

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

ブログ    

推薦する

...

Google が Mirasol をリリース: 30 億のパラメータで、マルチモーダル理解を長時間動画にまで拡張

11月16日、Googleは、動画に関する質問に答えたり、新たな記録を樹立したりできる小型人工知能モ...

AIのおかげで、これら5つの業界の求人需要は大幅な成長傾向を示すだろう

編集者注: 人工知能と人間の仕事は、今日多くの人が話題にしているトピックであり、議論の焦点は主に、人...

マスク氏、さらに 4 人の「民間」宇宙飛行士を宇宙に送り出す!スペースXは12回の有人ミッションを成功させた

北京時間の今朝早く、SpaceXは再び人類を宇宙に送り出すことに成功した。これは、米国の民間航空宇宙...

...

現時点で最も包括的なPythonの採用方針

Pythonは、コンパイル速度が超高速なオブジェクト指向プログラミング言語です。誕生から25年が経ち...

...

アリババが自社開発の音声認識モデルDFSMNをオープンソース化、精度は最大96.04%

[[232541]]最近、アリババDAMOアカデミーの機械知能研究所は、新世代の音声認識モデルDF...

Google AI 面接の質問(回答と戦略付き)

おそらくすべてのプログラマーは Google への入社を考えたことがあるでしょう。しかし、「試験」に...

AI技術により人類の寿命が延びる

現在、50歳以上の人口は世界で最も急速に増加している年齢層となっており、当然ながら世界経済と医療制度...

ビデオチャットでも顔を偽ることはできますか?恐ろしい AI 顔交換ソフトウェアを詳しく見る

[[397963]]誰もがビデオ AI による顔の修正について聞いたことがあるはずです。ビデオクリッ...

Forbes: 14 人の技術専門家が、将来 AI によって混乱が生じる業界を予測しています。

AI の恩恵を受ける業界はどれでしょうか?人工知能と機械学習はすでにさまざまな業界に導入されており...

2時間で人間を超えることができます! DeepMind の最新 AI が 26 の Atari ゲームをスピードラン

DeepMind の AI エージェントが再び自らの力を発揮します。よく見てください。BBF という...

Buildで発表された新しいMicrosoft Store AIハブが現在展開中

7月11日、ネットユーザーは、MicrosoftがBuildカンファレンスで発表した新しいMicro...

Google、検索結果にAIベースの「要約」機能を追加

Googleは8月4日、今年のGoogle I/Oで「Search Generative Engin...