前回、「【python 活用】pytorch facenetでAI 顔認証のアルゴリズム、実装方法の説明」でアルゴリズムとコーディングについて説明しましたが、今回は実際にアプリケーションにしてみたいと思います。
-
-
参考【python できること】pytorch facenetでAI 顔認証のアルゴリズム、実装方法の説明
続きを見る
本記事はこんな方におすすめです。

本記事の内容
- サンプルコードの動かし方
- サンプルコードの説明
今回は、Windwosのノートパソコンで実際に動く顔認証アプリケーションの開発を紹介いたします。
次のような、ユーザー登録と登録されたユーザーかを認証する機能があるアプリケーションを作っていきます。

サンプルコードをダウンロードいただければ、実際に顔認証を体験していただくことができます。
目次
サンプルコードの動かし方
ライブラリが数GBありため、数ステップ必要になりますが、以下の手順でインストールしてください。
サンプルコードダウンロード
下記リンクより、ダウンロードしてください。
CodeからDownload ZIPを選択

ダウンロードしたら解凍してください。

ライブラリのインストール
解凍したファイルの中の、_internalフォルダの中のpython_console.batを起動します。
起動したら、「python get-pip.py」と入力

インストールが完了したら、続いて、「pip install -r requirements.txt」を入力

数GBのライブラリを取得しているので10分ほど待ちます。
次の画面になれば、インストール完了。

アプリケーションを起動
解凍したフォルダの「app.bat」で起動します。

ユーザーを登録
認証するユーザーを登録します。
「顔認証ボタン」を押してください。

ファイルダイアログが開くので、自分の名前をファイル名にした、顔の写真を読み込みます。

次の画面で登録が完了。

顔データを数値化して、登録されて解凍したフォルダに、「face_data.pkl」で保存されます。

顔認証をする
「顔認証」ボタンを押すと、ノートパソコンのカメラが起動しますので、顔を映り込ませてください。
認識すると、下記メッセージが出ます。

以上が、サンプルコードの使い方になります。
このまま、サンプルコードの内容を知りたい方は、引き続き読んでいただければと思います。
サンプルコードの解説
サンプルコードでは、他の記事で紹介しているコードを流用しています。
合わせて、他の記事も参考にしてみてください。
デスクトップアプリ
PyQt5を使ったデスクトップアプリは、「【python 活用】【PyQt5】デスクトップアプリ化して配布 -その3 ツールバー(QToolBar)の追加-」のコードを使っていますので、この記事を参考にしてください。
-
-
参考【python】【PyQt5】デスクトップアプリ化して配布 -その3 ツールバー(QToolBar)の追加-
続きを見る
この記事では、ツールバーにボタン2つが付いたWindowsのデスクトップアプリの紹介をしています。
次に、「【python 活用】pytorch facenetでAI 顔認証のアルゴリズム、実装方法の説明」の記事で使ったコードをもとに、ユーザー登録と顔認証の機能を実装します。
全体のコードが200行くらいあるので、全体のコードは下記リンクを見てください。
ユーザー登録
ユーザーの登録では、次の処理を実行しています。
登録処理流れ
- ファイルダイアログ表示
- AIモデル読み込み
- 画像読み込み
- 顔を切り取る
- 顔を数値化
- 数値をdict型にファイル名で入れて、face_data.pklに保存
def register_user(self):
dir = os.path.dirname(self.member_path)
filters = "Images (*.png *.jpg *.jpeg)"
fileObj = QFileDialog.getOpenFileName(self, " File dialog ", dir, filters)
fn = fileObj[0]
if fn:
mtcnn = MTCNN(image_size=img_size, margin=10)
# Create an inception resnet (in eval mode):
resnet = InceptionResnetV1(pretrained='vggface2').eval()
img_mem = Image.open(fn)
filename = os.path.basename(fn).split(".")[0]
img_mem = img_mem.resize((img_size, img_size))
img_mem_cropped = mtcnn(img_mem)
img_embedding = resnet(img_mem_cropped.unsqueeze(0))
x1 = img_embedding.squeeze().to('cpu').detach().numpy().copy()
self.member[filename] = x1
with open(self.member_path, 'wb') as f:
pickle.dump(self.member, f)
QMessageBox.information(self, '顔認証', f'{filename}さん登録完了!')
保存されたデータは、アプリ起動時に読み込んでいます。
顔認証
顔認証では、ノートパソコンのカメラから取得できる人の顔が、登録ユーザーと一致しているか確認します。
認証の流れ
- AIモデル読み込み
- カメラ起動
- 画像から顔を切りとる
- 顔を数値化
- 登録ユーザーと類似度計算
- 0.7以上か確認
def match(self):
if self.member:
def cos_sim(v1, v2):
return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
# If required, create a face detection pipeline using MTCNN:
mtcnn = MTCNN(image_size=img_size, margin=10)
# Create an inception resnet (in eval mode):
resnet = InceptionResnetV1(pretrained='vggface2').eval()
cap = cv2.VideoCapture(0)
name = ""
score = 0.0
check_count = 0.0
while True:
ret, frame = cap.read()
cv2.imshow('Face Match', frame)
k = cv2.waitKey(10)
if k == 27:
break
# numpy to PIL
img_cam = Image.fromarray(frame)
img_cam = img_cam.resize((img_size, img_size))
img_cam_cropped = mtcnn(img_cam)
if img_cam_cropped is not None:
# if len(img_cam_cropped.size()) != 0:
img_embedding = resnet(img_cam_cropped.unsqueeze(0))
x2 = img_embedding.squeeze().to('cpu').detach().numpy().copy()
name = ""
score = 0.0
for key in self.member:
x1 = self.member[key]
if cos_sim(x1, x2) > 0.7:
name = key
score = cos_sim(x1, x2)
self.lock = False
break
check_count += 1.0
else:
check_count += 0.2
# 色々ループ抜ける条件
if name:
break
if check_count>20:
break
cap.release()
cv2.destroyAllWindows()
if name:
QMessageBox.information(self, '顔認証', f'Welcome {name}!')
else:
QMessageBox.information(self, '顔認証', '該当するユーザーがいません!')
else:
QMessageBox.information(self, '顔認証', '顔データが未登録です。')
うまく認証しましたか?
複数の顔を登録して遊んでみると良いでしょう!
こんな感じで、Pythonスキルを習得したら、ぜひ活用しましょう!