顔認証

ゆうき( @BASEBALLY15 )です^^

畳み込みニューラルネットワークについて学習したので,何か作品を作りたいです・・・

それでは,自分の顔と他人の顔を判定するAIを作ってみましょう^^

いいですね^^

第1章から第3章に分けて,AIによる自分の顔の判定方法についてご紹介します.
第1章では,自分の顔と他の人の顔をカスケード分類器によって読み取り,
それを画像として保存したいと思います.

第1章から第3章までの構成要素

第1章から第3章までの流れは以下の通りです.

AIによる顔の判定
(PowerPointで作成)

まず,第1章では,カスケードファイルを使って,顔を検出し,画像としてディレクトリに保存します.

そして,第2章では畳み込みニューラルネットワークを使って,自分の顔と他人の顔を判定します.

最後に,第3章では,第1章と第2章で作ったファイルを組み合わせて,実行する方法についてご紹介します.

第1章-カスケードファイルで顔を検出しよう!-

今回は,こちらのサイトの『haarcascade_frontalface_alt.xml』を使いたいと思います.

RAWをクリックしてダウンロードします.

もし,ダウンロードできない場合は,メモ帳にコピーして,

ファイルの拡張子を『.xml』にすると使えます.

カスケードファイルを使うと何が出来るの?

具体的に,どのようなことが出来るかと言うと,

以下の図のように,人の顔を四角で囲ってくれます.

カスケードファイルによって顔を検出
(PowerPointで作成)

このように,顔を検出することによって,顔のみの画像をディレクトリに保存することが出来ます.

今回は,自分の顔男性の顔女性の顔を検出しました.

それでは,コードを見ていきましょう^^

ライブラリ

ファイル名:my_face.py

(※other_face.pyと other_face2.pyも同じ流れなので,割愛させていただきます。 )

#映像を扱うためのライブラリ
import cv2

import numpy as np

#ファイルやディレクトリを操作するためのライブラリ
import os

#ディレクトリを取り除くためのライブラリ
import shutil

コード

ディレクトリを作る

まずは,画像を保存するためのディレクトリを作ります.

  #ディレクトリの作成(画像の保存先)
    save_dir = "./my_face"
    
    #ディレクトリの初期化
    if os.path.exists(save_dir) == True:
        
        #取り除く
        shutil.rmtree(save_dir)
        
    
    
    #もし,ディレクトリが無いなら,作る
    if not os.path.isdir(save_dir):
        os.mkdir(save_dir)

shutil.rmtree(save_dir)で,もし既にディレクトリがある場合に,消去しておきます.

これをしておかないと,「ディレクトリが既に存在しています」というエラーがでます!

カスケードファイルを用意する

次に,顔を検出するために,カスケードファイルを用意します.

  #Webカメラから入力を開始
    cap = cv2.VideoCapture(0)
    
    #顔の検出器を作成
    face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")

また,検出した結果を画像として保存するときに,枚数が分かるように,以下のコードも書いておきます.

  #画像のサイズの指定
    width = 500

    height = 300
    
    #画像の枚数の初期化
    all_N = 0
    
    #検出した枚数の初期化
    detect_N = 0

映像から顔を検出する

次に,映像から顔を検出したいと思います.

  #カメラから連続して映像を取得
    while True:

        #カメラの画像を読み込む
        ret, frame = cap.read()
        
        #画像のサイズを変更(リサイズ)
        frame = cv2.resize(frame, (width, height))
        
        #画像の枚数をカウントしていく
        all_N += 1
        
        #グレイスケールに変換
        gray_flame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        
        #顔認証を実行(minNeighboreは信頼性のパラメータ)
        face_list = face_cascade.detectMultiScale(gray_flame, minNeighbors=20)
        
        
        #顔を四角で囲む
        for (x,y,w,h) in face_list:
            
            red = (0,0,255)

            #赤色の枠で囲む
            cv2.rectangle(frame, (x,y), (x+w,y+h), red, 1)
                     
            #顔のみを切り取る
            trim_face = frame[y:y+h, x:x+w]
            
            
        #顔を認証した時のみディレクトリに保存していく
        if len(face_list) > 0:
                
            #ファイル名
            file_name = save_dir + "/"+ "my_face" + str(detect_N) + ".jpg"
            
            #保存する
            cv2.imwrite(file_name, trim_face)
            
            #保存した画像をカウントする
            detect_N += 1
                 
                
        #ウィンドウに画像を出力
        cv2.imshow("My_Face", frame)
        
        
        #もし,Enterキーが押されたら終了
        #1msec確認
        exit_wind = cv2.waitKey(1)

        if exit_wind == 13: break
    
    
    #------------------------------------------------
        
    #カメラを終了
    cap.release()
    
    #ウィンドウを閉じる
    cv2.destroyAllWindows()
    
    #------------------------------------------------
    
    #全枚数に対して,顔を何枚認証したか?
    print(detect_N, "/", all_N, "枚の画像を保存しました")

    print("保存率={}%".format(int((detect_N/all_N)*100)))
    
    #------------------------------------------------

これらを一つの関数(def)にして,コマンドプロンプトで表示させたいと思います.

関数(def)化する

上で紹介したコードを関数(def)化します.

関数名をmy_face()にします.

def my_face():
    
    #ディレクトリの作成(画像の保存先)
    save_dir = "./my_face"
    
    #ディレクトリの初期化
    if os.path.exists(save_dir) == True:
        
        #取り除く
        shutil.rmtree(save_dir)
        
    
    
    #もし,ディレクトリが無いなら,作る
    if not os.path.isdir(save_dir):

        os.mkdir(save_dir)
        
    #------------------------------------------------
    
    #画像のサイズの指定
    width = 500

    height = 300
    
    #画像の枚数の初期化
    all_N = 0
    
    #検出した枚数の初期化
    detect_N = 0
    
    #------------------------------------------------
    
    #Webカメラから入力を開始
    cap = cv2.VideoCapture(0)
    
    #顔の検出器を作成
    face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
    
    #------------------------------------------------
    
    #カメラから連続して映像を取得
    while True:

        #カメラの画像を読み込む
        ret, frame = cap.read()
        
        #画像のサイズを変更(リサイズ)
        frame = cv2.resize(frame, (width, height))
        
        #画像の枚数をカウントしていく
        all_N += 1
        
        #グレイスケールに変換
        gray_flame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        
        #顔認証を実行(minNeighboreは信頼性のパラメータ)
        face_list = face_cascade.detectMultiScale(gray_flame, minNeighbors=20)
        
        
        #顔を四角で囲む
        for (x,y,w,h) in face_list:
            
            #赤色
            red = (0,0,255)

            #赤色の枠で囲む
            cv2.rectangle(frame, (x,y), (x+w,y+h), red, 1)
            
            
            #顔のみを切り取る
            trim_face = frame[y:y+h, x:x+w]
            
            
        #顔を認証した時のみディレクトリに保存していく
        if len(face_list) > 0:
                
            #ファイル名
            file_name = save_dir + "/"+ "my_face" + str(detect_N) + ".jpg"
            
            #保存する
            cv2.imwrite(file_name, trim_face)
            
            #番号を増やしていく
            detect_N += 1
                 
                
        #ウィンドウに画像を出力
        cv2.imshow("My_Face", frame)
        
        
        #もし,Enterキーが押されたら終了
        #1msec確認
        exit_wind = cv2.waitKey(1)

        if exit_wind == 13: break
    
    
    #------------------------------------------------
        
    #カメラを終了
    cap.release()
    
    #ウィンドウを閉じる
    cv2.destroyAllWindows()
    
    #------------------------------------------------
    
    #全枚数に対して,顔を何枚認証したか?
    print(detect_N, "/", all_N, "枚の画像を保存しました")

    print("保存率={}%".format(int((detect_N/all_N)*100)))
    
    #------------------------------------------------

そして,コマンドプロンプトで実行するために,以下のコードを書きます.

#コマンドプロンプト上で表示する
if __name__ == "__main__":

  #関数を呼び出す
    my_face()

Anaconda Promptで実行する

最後に,Anaconda Promptを開き,以下の文字を書きます.

  • cd Desktop
  • cd my_face.pyがあるディレクトリ名
  • python my_face.py

すると,このように顔が検出されます.

そして,ディレクトリに画像が保存され,何枚保存されたのかが表示されます.

(PowerPointで作成)

終わりに

今回は,カスケードファイルを使って,顔を検出しました.

次回の第2章では,畳み込みニューラルネットワークによって,

自分の顔と他人の顔を判定していきます.

それでは,第2章でまたお会いしましょう^^

Q &A

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA