
ゆうき( @BASEBALLY15 )です^^
畳み込みニューラルネットワークについて学習したので,何か作品を作りたいです・・・
それでは,自分の顔と他人の顔を判定するAIを作ってみましょう^^
いいですね^^
第1章から第3章に分けて,AIによる自分の顔の判定方法についてご紹介します.
第1章では,自分の顔と他の人の顔をカスケード分類器によって読み取り,
それを画像として保存したいと思います.

目次
第1章から第3章までの構成要素
第1章から第3章までの流れは以下の通りです.

まず,第1章では,カスケードファイルを使って,顔を検出し,画像としてディレクトリに保存します.
そして,第2章では畳み込みニューラルネットワークを使って,自分の顔と他人の顔を判定します.
最後に,第3章では,第1章と第2章で作ったファイルを組み合わせて,実行する方法についてご紹介します.
第1章-カスケードファイルで顔を検出しよう!-
今回は,こちらのサイトの『haarcascade_frontalface_alt.xml』を使いたいと思います.
RAWをクリックしてダウンロードします.
もし,ダウンロードできない場合は,メモ帳にコピーして,
ファイルの拡張子を『.xml』にすると使えます.
カスケードファイルを使うと何が出来るの?
具体的に,どのようなことが出来るかと言うと,
以下の図のように,人の顔を四角で囲ってくれます.

このように,顔を検出することによって,顔のみの画像をディレクトリに保存することが出来ます.
今回は,自分の顔と男性の顔と女性の顔を検出しました.
それでは,コードを見ていきましょう^^
ライブラリ
ファイル名: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
すると,このように顔が検出されます.
そして,ディレクトリに画像が保存され,何枚保存されたのかが表示されます.



終わりに
今回は,カスケードファイルを使って,顔を検出しました.
次回の第2章では,畳み込みニューラルネットワークによって,
自分の顔と他人の顔を判定していきます.
それでは,第2章でまたお会いしましょう^^