前回、「【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スキルを習得したら、ぜひ活用しましょう!