AI関連技術

【機械学習】Pythonでできるリアルタイム顔認識プログラムのサンプル

【機械学習】Pythonでできるリアルタイム顔認識プログラムのサンプル

Pythonで実行できるAI(機械学習)のスクリプトはたくさんのサンプルがあります。

この記事では、

  • 少し古いけど
  • windowsで実行するための
  • もっとも簡単な
  • 確実に実行できる

というポイントでサンプルスクリプトをご紹介します。

なお、「コピペしたのに動かない」「mac版も教えて」「ラズパイカメラでも動かしたい」という要望があれば、追記します。

技術の概要

この記事でご紹介する顔認識プログラムの概要を説明します。

技術とかいいからスクリプトだけ見たいという方は、こちらまで飛んでください。

また、実行環境を確認してからスクリプトを試したい方はこちらから飛んでご覧ください。

顔を認識する

顔を認識する方法はいろいろあります。

今回は「Haar-like特徴分類器」という方法を利用します。

Haar-like特徴分類器は、対象となる特徴量(顔と認識するための特徴)を学習させ、学習データをもとにパターン認証を行うカスケード分類器の一つです。

Haar-like特徴分類器の説明

Haar-like特徴分類器では、顔のデータベースを利用し、目鼻口といったパーツの位置関係を確かめ、顔かどうかを判定するという手法です。

写真をグレースケール(白黒)に変換することで、明るいところが白くなり、暗いところが暗くなるので、特徴を捉えやすくなります。

例えば、鼻は顔の中で明るい部分で、左右の部分は陰で暗くなります。

目は目の上には眉毛があるので、目の上部分は暗く、目の下は明るくなります。

以上のように、顔の各パーツごとに明暗のパターンに合致するかどうかを学習するのです。

OpenCVについて

この記事で紹介する顔認識のスクリプトでは、画像処理を行うためのライブラリである「OpenCV(Open Source Computer Vision Library)」を使用します。

OpenCVの説明は下図の通りですが、これはあくまで画像処理のために使用するのであり、機械学習とは直接関係がありません。

OpenCVとは①

簡単に言うと、画像データを数値データに変えないと学習できないので変換するということです。

OpenCVとは②

実行環境の構築

ライブラリのインストール

Pythonのバージョンは3.6以降であればOKです。

必要なライブラリは「Open CV」のみです。

まだインストールしたことがない人は、コマンドプロンプトで以下を実行してください。

pip install opencv-python

カスケードファイルの準備

続いて、顔を認識するためのカスケードファイルをダウンロードします。

こちらのサイトにアクセスし、以下の手順でファイルをダウンロードしましょう。

https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml

カスケードファイルのダウンロードサイト
上記リンク先でRawというボタンをクリックする
カスケードファイルの保存画面
名前を付けて保存をクリック
カスケードファイルに「名前をつけて保存」する
ファイル名とファイルの種類はそのままで保存をクリック

ファイルはスクリプトと同じディレクトリに入れておけば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の機械学習について詳しく知りたいという初学者には、こちらの書籍がおススメです。

ABOUT ME
papa3
某教育機関で現役の講師をしながら、ブログとYouTubeでプログラミングの情報を発信しています。個人でもウェブアプリケーション開発と運営をしながら本業収入<副業を目指しています!

COMMENT

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