工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

リアルタイムの顔認識:エンドツーエンドのプロジェクト

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をインストールするためにいくつかの異なるガイドを試しました。エイドリアンのチュートリアルは最高です。彼のガイドラインに従って、同じことを行うことをお勧めします。

エイドリアンのチュートリアルを終了したら、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

そして3.5(またはそれ以上)バージョンを実行していることを確認します。

インタープリター内(「>>>」が表示されます)で、OpenCVライブラリをインポートします:

cv2をインポート

エラーメッセージが表示されない場合、OpenCVはPython仮想環境に正しくインストールされています。

インストールされているOpenCVのバージョンを確認することもできます:

cv2 .__ version __

3.3.0(または将来リリースされる可能性のある優れたバージョン)が表示されるはずです。

上記のターミナルPrintScreenは前の手順を示しています。

ステップ3:カメラをテストする

RPiにOpenCVをインストールしたら、カメラが正しく機能していることを確認するためにテストしましょう。

ラズベリーパイにすでにPiCamがインストールされていることを前提としています。

エイドリアンのチュートリアルを実行するときは、カメラを有効にする必要があります。有効にしないと、ドライバーが正しくインストールされません。

次のようなエラーが発生した場合: OpenCVエラー:アサーションに失敗しました 、次のコマンドを使用して、問題の解決を試みることができます:

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)顔を「キャプチャ」する必要があります。

顔(または任意のオブジェクト)を検出する最も一般的な方法は、「HaarCascade分類子」を使用することです

Haar特徴ベースのカスケード分類器を使用したオブジェクト検出は、2001年にPaulViolaとMichaelJonesの論文「BoostedCascadeofSimpleFeaturesを使用した迅速なオブジェクト検出」で提案された効果的なオブジェクト検出方法です。は、カスケード関数が多くのポジティブおよびネガティブイメージからトレーニングされる機械学習ベースのアプローチです。その後、他の画像内のオブジェクトを検出するために使用されます。

ここでは顔検出を使用します。最初に、アルゴリズムは分類子をトレーニングするために多くのポジティブ画像(顔の画像)とネガティブ画像(顔のない画像)を必要とします。次に、そこから特徴を抽出する必要があります。幸いなことに、OpenCVにはトレーナーと検出器が付属しています。車や飛行機などのオブジェクトに対して独自の分類子をトレーニングする場合は、OpenCVを使用して分類子を作成できます。詳細については、カスケード分類子トレーニングをご覧ください。

独自の分類子を作成したくない場合、OpenCVには、顔、目、笑顔などの事前トレーニング済みの分類子がすでに多数含まれています。これらのXMLファイルはhaarcascadesディレクトリからダウンロードできます。

理論的には、OpenCVで顔検出器を作成しましょう!

ファイルをダウンロードします:GitHubからfaceDetection.py。

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’)

これは「分類子」をロードする行です(プロジェクトディレクトリの下の「Cascades /」という名前のディレクトリにある必要があります)。

次に、カメラを設定し、ループ内で入力ビデオをグレースケールモードでロードします(前に見たものと同じです)。

次に、分類関数を呼び出して、スケールファクター、隣接する顔の数、検出された顔の最小サイズなど、いくつかの非常に重要なパラメーターを渡す必要があります。

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)が大量の計算能力を使用すると、処理が遅くなることに注意してください。デスクトップでは、実行が簡単です。

私のGitHubには、他の例があります:

  • faceEyeDetection.py
  • faceSmileDetection.py
  • faceSmileEyeDetection.py
そして写真で結果を見ることができます。

以下のチュートリアルに従って、顔検出をよりよく理解することもできます。

ハーカスケードオブジェクト検出フェイス&アイOpenCVPythonチュートリアル

ステップ5:データ収集

まず、写真の顔認識に関する素晴らしい仕事をしてくれたRamizRajaに感謝します。

OPENCVとPYTHONを使用した顔認識:初心者向けガイド

また、ビデオを使用して非常に包括的なチュートリアルを開発したAnirban Kar:

顔認識–3つの部分

両方のチュートリアルをご覧になることを強くお勧めします。

それでは、プロジェクトの最初のフェーズを開始しましょう。ここで行うことは、最後のステップ(顔検出)から開始し、データセットを作成するだけです。ここに、IDごとに、顔検出に使用された部分を含む灰色の写真のグループを保存します。

>

まず、プロジェクトを開発するディレクトリを作成します(例:FacialRecognitionProject:

)。

mkdir FacialRecognitionProject

このディレクトリには、プロジェクト用に作成する3つのPythonスクリプトの他に、FacialClassifierを保存しておく必要があります。私のGitHubからダウンロードできます:haarcascade_frontalface_default.xml

次に、顔のサンプルを保存するサブディレクトリを作成し、「データセット」という名前を付けます。

mkdirデータセット

そしてGitHubからコードをダウンロードします:01_face_dataset.py

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

私のPiの写真に示されているように:

私のコードでは、各IDから30個のサンプルをキャプチャしています。最後の「elif」で変更できます。サンプルの数は、顔のサンプルがキャプチャされるループを解除するために使用されます。

Pythonスクリプトを実行し、いくつかのIDをキャプチャします。新しいユーザーを集約する(または既存のユーザーの写真を変更する)たびに、スクリプトを実行する必要があります。

ステップ6:トレーナー

この第2フェーズでは、データセットからすべてのユーザーデータを取得し、OpenCVレコグナイザーを「トレーナー」する必要があります。これは、特定のOpenCV関数によって直接実行されます。結果は「trainer /」ディレクトリに保存される.ymlファイルになります。

詳細を読む:リアルタイムの顔認識:エンドツーエンドのプロジェクト


製造プロセス

  1. Python 演算子
  2. パイソンリスト
  3. Python タプル
  4. Python 辞書
  5. MATRIX VOICE GOOGLE ASSISTANT – MATRIX VOICE PROJECT
  6. Speathe
  7. Windows IoT:顔認識ドア
  8. 自動ビジョンオブジェクト追跡
  9. PiCameraによるAI数字認識
  10. ローバー
  11. GoPiGo v2 with Windows IoT