Pythonで実行できるAI(機械学習)のスクリプトはたくさんのサンプルがあります。
この記事では、
- 少し古いけど
- windowsで実行するための
- もっとも簡単な
- 確実に実行できる
というポイントでサンプルスクリプトをご紹介します。
なお、「コピペしたのに動かない」「mac版も教えて」「ラズパイカメラでも動かしたい」という要望があれば、追記します。
技術の概要
この記事でご紹介する顔認識プログラムの概要を説明します。
技術とかいいからスクリプトだけ見たいという方は、こちらまで飛んでください。
また、実行環境を確認してからスクリプトを試したい方はこちらから飛んでご覧ください。
顔を認識する
顔を認識する方法はいろいろあります。
今回は「Haar-like特徴分類器」という方法を利用します。
Haar-like特徴分類器は、対象となる特徴量(顔と認識するための特徴)を学習させ、学習データをもとにパターン認証を行うカスケード分類器の一つです。
Haar-like特徴分類器では、顔のデータベースを利用し、目鼻口といったパーツの位置関係を確かめ、顔かどうかを判定するという手法です。
写真をグレースケール(白黒)に変換することで、明るいところが白くなり、暗いところが暗くなるので、特徴を捉えやすくなります。
例えば、鼻は顔の中で明るい部分で、左右の部分は陰で暗くなります。
目は目の上には眉毛があるので、目の上部分は暗く、目の下は明るくなります。
以上のように、顔の各パーツごとに明暗のパターンに合致するかどうかを学習するのです。
OpenCVについて
この記事で紹介する顔認識のスクリプトでは、画像処理を行うためのライブラリである「OpenCV(Open Source Computer Vision Library)」を使用します。
OpenCVの説明は下図の通りですが、これはあくまで画像処理のために使用するのであり、機械学習とは直接関係がありません。
簡単に言うと、画像データを数値データに変えないと学習できないので変換するということです。
実行環境の構築
ライブラリのインストール
Pythonのバージョンは3.6以降であればOKです。
必要なライブラリは「Open CV」のみです。
まだインストールしたことがない人は、コマンドプロンプトで以下を実行してください。
pip install opencv-python
カスケードファイルの準備
続いて、顔を認識するためのカスケードファイルをダウンロードします。
こちらのサイトにアクセスし、以下の手順でファイルをダウンロードしましょう。
https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml
ファイルはスクリプトと同じディレクトリに入れておけばOKです。
別の階層にあっても呼び出せますが、今回は説明を省略します。
また、もし他の顔のデータが欲しい場合、こちらで好きなものを選択することができます。
https://github.com/opencv/opencv/tree/master/data/haarcascades
例えば、全身だったら「fullbody」、眼鏡姿だったら「eyeglasses」などが用意されています。
サンプルスクリプト
それでは、リアルタイムに顔認識するPythonのスクリプトをご紹介します。
import cv2
cascade_file = 'haarcascade_frontalface_alt.xml'
face_cascade = cv2.CascadeClassifier(cascade_file)
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
for x, y, w, h in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
face = img[y: y + h, x: x + w]
face_gray = gray[y: y + h, x: x + w]
cv2.putText(img, 'Face Detect', (20,50), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0,0,200), 2, cv2.LINE_AA)
cv2.imshow('video image', img)
key = cv2.waitKey(10)
if key == 27:
break
cap.release()
cv2.destroyAllWindows()
たったこれだけで、顔を認識するビデオの実行が可能です。
実行結果の動画はこちら。
(終了する場合はESCキーを押してください)
上手く認識しないことがあると思いますが、その理由はいくつかあります。
- 正面の顔ではない
- 顔に角度が付いている
- 顔を傾けている
- 顔が小さいまたは大きい
解決策として、上記のカスケードファイルを別のものに変更する。
またはスクリプト内の「detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)」のパラメータ値を変更することで解消できる場合があります。
ただ、今回はあくまでも「体験」のためのスクリプトなので、これで勘弁してください。
今回の記事では、このスクリプトの詳細は割愛します。
まとめ
今回はPythonでできるリアルタイム顔認識プログラムのサンプルについて解説しました。
もしスクリプトの説明やを聞きたいという方がいれば、コメントかフォームでお問い合わせください。
また、「上手くいかない」「別のエラーが出た」などがありましたら、フォームやコメントでお知らせください。
できる限りフォローします。
また、この技術を応用して「リアルタイム映像で顔にモザイクを付けるスクリプト」も紹介しています。
興味がある方はこちらの記事をご覧ください。
それでは、ステキなPythonライフを!
Pythonの機械学習について詳しく知りたいという初学者には、こちらの書籍がおススメです。