AI DeepLearning Python プログラミング

【python できること】pytorch facenetでAI 顔認証アプリ開発する方法

 

前回、「【python 活用】pytorch facenetでAI 顔認証のアルゴリズム、実装方法の説明」でアルゴリズムとコーディングについて説明しましたが、今回は実際にアプリケーションにしてみたいと思います。

参考【python できること】pytorch facenetでAI 顔認証のアルゴリズム、実装方法の説明

続きを見る

 

本記事はこんな方におすすめです。

hituji
サンプルコードをコピペして、簡単に顔認証アプリケーションを開発したい

 

本記事の内容

  • サンプルコードの動かし方
  • サンプルコードの説明

 

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

>> Python 副業の始め方紹介【隙間時間 で可能】

-AI, DeepLearning, Python, プログラミング