リアルタイムの顔認識:エンドツーエンドのプロジェクト
PiCamを使用してリアルタイムで顔を認識する方法を段階的に学習します。OpenCVを探索する最後のチュートリアルでは、自動ビジョンオブジェクトトラッキングを学習しました。
次に、以下に示すように、PiCamを使用してリアルタイムで顔を認識します。
このプロジェクトは、この素晴らしい「オープンソースコンピュータビジョンライブラリ」であるOpenCVを使用して行われました。このチュートリアルでは、Raspberry Pi(つまり、OSとしてのRaspbian)とPythonに焦点を当てますが、My Macでコードをテストしたところ、正常に動作します。 OpenCVは、計算効率を重視し、リアルタイムアプリケーションに重点を置いて設計されました。そのため、カメラを使用したリアルタイムの顔認識に最適です。
3フェーズ
顔認識に関する完全なプロジェクトを作成するには、3つの非常に異なるフェーズに取り組む必要があります。
- 顔検出とデータ収集
- 認識機能のトレーニング
- 顔認識
ステップ1:BoM –部品表
- Raspberry Pi V3 – US $ 32.00
- 5メガピクセル1080pセンサーOV5647ミニカメラビデオモジュール– US $ 13.00
ステップ2:OpenCV3パッケージをインストールする
Raspbian(Stretch)の最新バージョンに更新されたRaspberry Pi V3を使用しているため、OpenCVをインストールする最善の方法は、Adrian Rosebrockによって開発された優れたチュートリアルに従うことです:Raspbian Stretch:Install RaspberryPi上のOpenCV3 + Python。
PiにOpenCVをインストールするためにいくつかの異なるガイドを試しました。エイドリアンのチュートリアルは最高です。彼のガイドラインに従って、同じことを行うことをお勧めします。
仮想環境に移動して、OpenCV3が正しくインストールされていることを確認しましょう。
エイドリアンは、システム変数が正しく設定されていることを確認するために、新しいターミナルを開くたびにコマンド「source」を実行することをお勧めします。
ソース〜/ .profile
次に、仮想環境に入りましょう:
workon cv
プロンプトの前にテキスト(cv)が表示されている場合は、 cv virtual 環境:
(cv)pi @ raspberry:〜$
エイドリアンは、 cvPython仮想環境に注意を促します。 は完全に独立しており、RaspbianStretchのダウンロードに含まれているデフォルトのPythonバージョンから隔離されています。そのため、グローバルsite-packagesディレクトリ内のPythonパッケージは、cv仮想環境では使用できません。同様に、cvのsite-packagesにインストールされているPythonパッケージは、Pythonのグローバルインストールでは使用できません。
ここで、Pythonインタープリターを入力します:
Python
cv2をインポート
エラーメッセージが表示されない場合、OpenCVはPython仮想環境に正しくインストールされています。
cv2 .__ version __
3.3.0(または将来リリースされる可能性のある優れたバージョン)が表示されるはずです。
ステップ3:カメラをテストする
エイドリアンのチュートリアルを実行するときは、カメラを有効にする必要があります。有効にしないと、ドライバーが正しくインストールされません。
sudo modprobe bcm2835-v4l2
すべてのドライバーが正しくインストールされたら、IDEに以下のPythonコードを入力します。
import numpy as np
import cv2
cap =cv2.VideoCapture(0)
cap.set(3,640)#幅を設定
cap.set(4,480)#高さを設定
while(True):
ret、frame =cap.read()
frame =cv2.flip(frame、-1)#カメラを垂直に反転
gray =cv2.cvtColor(frame 、cv2.COLOR_BGR2GRAY)
cv2.imshow( ‘frame’、frame)
cv2.imshow( ‘gray’、gray)
k =cv2.waitKey(30)&0xff
if k ==27:#「ESC」を押して終了します
break
cap.release()
cv2.destroyAllWindows()
上記のコードは、PiCamによって生成されるビデオストリームをキャプチャし、BGRカラーとグレーモードの両方で表示します。
組み立て方法により、カメラを垂直に回転させたことに注意してください。そうでない場合は、「flip」コマンドラインにコメントを付けるか削除してください。
または、GitHubからコードをダウンロードすることもできます:simpleCamTest.py
実行するには、次のコマンドを入力します:
python simpleCamTest.py
プログラムを終了するには、キーボードの[ESC]キーを押す必要があります。 [ESC]を押す前に、ビデオウィンドウ上でマウスをクリックしてください。
一部のメーカーは、カメラを開こうとしたときに問題を発見しました(「アサーションに失敗しました」というエラーメッセージ)。これは、OpenCvのインストール中にカメラが有効になっておらず、カメラドライバーが正しくインストールされなかった場合に発生する可能性があります。修正するには、次のコマンドを使用します:
sudo modprobe bcm2835-v4l2
/ etc / modulesファイルの最後の行にbcm2835-v4l2を追加して、ドライバーが起動時にロードされるようにすることもできます。
OpenCVの詳細については、チュートリアル「loading -video-python-opencv-tutorial
」に従ってください。ステップ4:顔検出
顔認識の最も基本的なタスクは、もちろん「顔検出」です。何よりもまず、将来(フェーズ3)にキャプチャされた新しい顔と比較した場合、顔を認識するために(フェーズ1)顔を「キャプチャ」する必要があります。
Haar特徴ベースのカスケード分類器を使用したオブジェクト検出は、2001年にPaulViolaとMichaelJonesの論文「BoostedCascadeofSimpleFeaturesを使用した迅速なオブジェクト検出」で提案された効果的なオブジェクト検出方法です。は、カスケード関数が多くのポジティブおよびネガティブイメージからトレーニングされる機械学習ベースのアプローチです。その後、他の画像内のオブジェクトを検出するために使用されます。
独自の分類子を作成したくない場合、OpenCVには、顔、目、笑顔などの事前トレーニング済みの分類子がすでに多数含まれています。これらのXMLファイルはhaarcascadesディレクトリからダウンロードできます。
理論的には、OpenCVで顔検出器を作成しましょう!
numpyをnpとしてインポート
import cv2
faceCascade =cv2.CascadeClassifier( 'Cascades / haarcascade_frontalface_default.xml')
cap =cv2.VideoCapture(0)
cap.set(3,640) #幅を設定
cap.set(4,480)#高さを設定
Trueの場合:
ret、img =cap.read()
img =cv2.flip(img、–1 )
gray =cv2.cvtColor(img、cv2.COLOR_BGR2GRAY)
faces =faceCascade.detectMultiScale(
gray、
scaleFactor =1.2、
minNeighbors =5、
minSize =(20、20)
)
for(x、y、w、h)in faces:
cv2.rectangle(img、(x、y)、(x + w、y + h)、(255,0,0)、2)
roi_gray =gray [y:y + h、x:x + w]
roi_color =img [y:y + h、x:x + w]
cv2.imshow( 'video'、img)
k =cv2.waitKey(30)&0xff
if k ==27:# 'ESCを押す'終了する
break
cap.release()
cv2.destroyAllWindows()
信じられないかもしれませんが、PythonとOpenCVを使用して顔を検出するために必要なのは、上記の数行のコードだけです。
カメラのテストに使用された最後のコードと比較すると、カメラに追加されたパーツが少ないことがわかります。以下の行に注意してください:
faceCascade =cv2.CascadeClassifier( ‘Cascades / haarcascade_frontalface_default.xml’)
次に、カメラを設定し、ループ内で入力ビデオをグレースケールモードでロードします(前に見たものと同じです)。
次に、分類関数を呼び出して、スケールファクター、隣接する顔の数、検出された顔の最小サイズなど、いくつかの非常に重要なパラメーターを渡す必要があります。
faces =faceCascade.detectMultiScale(
gray、
scaleFactor =1.2、
minNeighbors =5、
minSize =(20、20)
)
- 灰色 入力グレースケール画像です。
- scaleFactor 各画像スケールで画像サイズがどれだけ縮小されるかを指定するパラメータです。スケールピラミッドを作成するために使用されます。
- minNeighbors は、各候補長方形を保持するために必要なネイバーの数を指定するパラメーターです。数値が大きいほど、誤検知が少なくなります。
- minSize は、面と見なされる最小の長方形のサイズです。
顔の(x、y、w、h)の場合:
cv2.rectangle(img、(x、y)、(x + w、y + h)、(255,0,0)、2)
roi_gray =gray [y:y + h、x:x + w]
roi_color =img [y:y + h、x:x + w]
面が見つかった場合、検出された面の位置を、左上隅(x、y)を持ち、幅が「w」、高さが「h」の長方形として返されます==>(x、y、w、h)。写真をご覧ください。
これらの場所を取得したら、顔の「ROI」(描画された長方形)を作成し、その結果を imshow()で表示できます。 機能。
Rpiターミナルを使用して、Python環境で上記のPythonスクリプトを実行します。
python faceDetection.py
Piでは、同じコードに複数の分類子があると、この検出方法(HaarCascades)が大量の計算能力を使用すると、処理が遅くなることに注意してください。デスクトップでは、実行が簡単です。
例
- faceEyeDetection.py
- faceSmileDetection.py
- faceSmileEyeDetection.py
以下のチュートリアルに従って、顔検出をよりよく理解することもできます。
ステップ5:データ収集
まず、写真の顔認識に関する素晴らしい仕事をしてくれたRamizRajaに感謝します。
それでは、プロジェクトの最初のフェーズを開始しましょう。ここで行うことは、最後のステップ(顔検出)から開始し、データセットを作成するだけです。ここに、IDごとに、顔検出に使用された部分を含む灰色の写真のグループを保存します。
>まず、プロジェクトを開発するディレクトリを作成します(例:FacialRecognitionProject:
)。mkdir FacialRecognitionProject
このディレクトリには、プロジェクト用に作成する3つのPythonスクリプトの他に、FacialClassifierを保存しておく必要があります。私のGitHubからダウンロードできます:haarcascade_frontalface_default.xml
次に、顔のサンプルを保存するサブディレクトリを作成し、「データセット」という名前を付けます。
mkdirデータセット
import cv2
import os
cam =cv2.VideoCapture(0)
cam.set(3、640)#ビデオ幅を設定
cam.set(4、480)#setビデオの高さ
face_detector =cv2.CascadeClassifier( 'haarcascade_frontalface_default.xml')
#各人に1つの数値の顔IDを入力
face_id =input( '\ nユーザーIDを入力endpress
print(“ \ n [INFO]顔キャプチャを初期化しています。カメラを見て待ってください…”)
#個々のサンプリング顔数を初期化します
count =0
while(True):
ret、img =cam.read()
img =cv2.flip(img、-1)#ビデオ画像を垂直方向に反転
gray =cv2.cvtColor(img 、cv2.COLOR_BGR2GRAY)
faces =face_detector.detectMultiScale(gray、1.3、5)
for(x、y、w、h)in faces:
cv2.rectangle(img、(x 、y)、(x + w、y + h)、(255,0,0)、2)
count + =1
#キャプチャした画像をデータセットフォルダに保存します
cv2 .imwrite(“ dataset / User。” + str(face_id)+ '。' + str(count)+“ .jpg”、gray [y:y + h、x:x + w])
cv2。 imshow( 'image'、img)
k =cv2.waitKey(100)&0x ff#ビデオを終了するには「ESC」を押します
if k ==27:
break
elif count> =30:#30の顔サンプルを取り、ビデオを停止します
break
#少しクリーンアップを行います
print(“ \ n [INFO] Exiting Program and cleanup stuff”)
cam.release()
cv2.destroyAllWindows()
コードは、顔検出で見たコードと非常によく似ています。追加したのは、整数(1、2、3など)である必要があるユーザーIDをキャプチャするための「入力コマンド」でした
face_id =input( ‘\ nユーザーIDを入力endpress ==>‘)
キャプチャされたフレームごとに、「データセット」ディレクトリにファイルとして保存する必要があります。
cv2.imwrite(“ dataset / User。” + str(face_id)+ ‘。’ + str(count)+“ .jpg”、gray [y:y + h、x:x + w])
上記のファイルを保存するには、ライブラリ「os」をインポートしておく必要があることに注意してください。各ファイルの名前は次の構造に従います:
User.face_id.count.jpg
たとえば、face_id =1のユーザーの場合、dataset /ディレクトリの4番目のサンプルファイルは次のようになります。
User.1.4.jpg
私のコードでは、各IDから30個のサンプルをキャプチャしています。最後の「elif」で変更できます。サンプルの数は、顔のサンプルがキャプチャされるループを解除するために使用されます。
Pythonスクリプトを実行し、いくつかのIDをキャプチャします。新しいユーザーを集約する(または既存のユーザーの写真を変更する)たびに、スクリプトを実行する必要があります。
ステップ6:トレーナー
この第2フェーズでは、データセットからすべてのユーザーデータを取得し、OpenCVレコグナイザーを「トレーナー」する必要があります。これは、特定のOpenCV関数によって直接実行されます。結果は「trainer /」ディレクトリに保存される.ymlファイルになります。
詳細を読む:リアルタイムの顔認識:エンドツーエンドのプロジェクト
製造プロセス