Pythonでの顔検出プロジェクト[5つの簡単なステップで]
公開: 2020-09-01物体の識別と顔の検出は、おそらくコンピュータビジョンの最も一般的なアプリケーションです。 このテクノロジーは、セキュリティやソーシャルメディアなどのさまざまな業界でアプリケーションを見つけます。 そのため、Pythonを使用して顔検出プロジェクトを構築しています。
Python、OpenCV、およびNumPyでのプログラミングに精通している必要があることに注意してください。 これにより、このプロジェクトでの作業中に混乱しないようになります。 始めましょう。
顔認識を実行するための2つの方法を共有しました。 1つはPythonの顔認識ライブラリを使用し、もう1つはOpenCVとNumPyを使用します。 詳細については、データサイエンスプログラムをご覧ください。
目次
Pythonの「顔認識」による顔認識
おそらく、顔を検出する最も簡単な方法は、Pythonの顔認識ライブラリを使用することです。 LFWデータベースの精度は99.38%でした。 使い方はとても簡単で、それほど手間はかかりません。 さらに、ライブラリには、画像内の顔を識別するための専用の「face_recognition」コマンドがあります。
顔認識の使い方
'face_locations'コマンドを使用して、画像内の顔を区別できます。
face_recognitionをインポートします

image = face_recognition.load_image_file(“ your_file.jpg”)
face_locations = face_recognition.face_locations(image)
また、顔を認識し、それらを名前に関連付けることもできます。
face_recognitionをインポートします
known_image = face_recognition.load_image_file(“ modi.jpg”)
unknown_image = face_recognition.load_image_file(“ unknown.jpg”)
modi_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
結果=face_recognition.compare_faces([modi_encoding]、unknown_encoding)
写真には「ナレンドラ・モディ」が含まれています
このライブラリを他のライブラリと組み合わせて実行できることは他にもたくさんあります。 次に、Pythonの他の著名なライブラリ、特にOpenCVとNumPyで顔認識を実行する方法について説明します。
続きを読む: Python NumPyチュートリアル:例を使用してPythonNumpyを学ぶ
Pythonの顔検出プロジェクト
このプロジェクトでは、OpenCVとNumPyを使用して顔の検出と認識を実行しました。 Raspberry Piを使用しましたが、他のシステムでも使用できます。 他のデバイス(MacやWindows PCなど)で使用するには、コードを少し変更するだけです。
このプロジェクトのクレジットの一部はMarceloRovaiにあります。
ステップ1:ライブラリをインストールする
まず、必要なライブラリ、OpenCV、およびNumPyをインストールする必要があります。 次の方法で簡単にインストールできます。
pip install opencv-python
pip install opencv-contrib-python
システムにNumPyをインストールするには、上記と同じコマンドを使用して、「opencv-python」を「numpy」に置き換えます。
pip install numpy
ステップ2:顔を検出する
次に、カメラを構成してシステムに接続する必要があります。 顔検出の問題を回避するために、カメラは適切に機能する必要があります。
カメラが私たちを認識する前に、まず顔を検出する必要があります。 顔検出にはHaarCascade分類器を使用します。 これは主に、ネガティブイメージとポジティブイメージを介してカスケード関数をトレーニングし、その後、他の写真のオブジェクトを検出できるようになるオブジェクト検出方法です。
この場合、モデルで顔を検出する必要があります。 OpenCVにはトレーナーと検出器が付属しているため、HaarCascade分類器を使用する方がこのライブラリの方が比較的快適です。 分類器を作成して、他の画像も検出できます。
コードは次のとおりです。
numpyをnpとしてインポートします
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)
灰色=cv2.cvtColor(img、cv2.COLOR_BGR2GRAY)
顔=faceCascade.detectMultiScale(
グレー、
scaleFactor = 1.2、
minNeighbors = 5、
minSize =(20、20)
)。
顔の(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]
cv2.imshow('video'、img)
k = cv2.waitKey(30)&0xff
k == 27の場合:#「ESC」を押して終了します
壊す
cap.release()
cv2.destroyAllWindows()
ステップ3:データを収集する
モデルが顔を識別できるようになったので、モデルをトレーニングして、写真に写っている顔を認識し始めることができます。 そのためには、覚えておきたい顔の写真を複数用意する必要があります。
そのため、写真を収集してデータセットを作成することから始めます。 必要な画像を収集したら、すべての人のIDを追加して、モデルがどの顔をどのIDに関連付けるかを認識できるようにします。 1人の人物の画像から始めて、少なくとも10〜20を追加します。 最も効果的な結果を得るには、さまざまな式を使用してください。
画像にユーザーIDを追加するためのスクリプトを作成するので、毎回手動で行う必要はありません。 モデルを複数の面に使用する場合は、スクリプトが不可欠です。
世界のトップ大学から機械学習コースを学びましょう。 マスター、エグゼクティブPGP、または高度な証明書プログラムを取得して、キャリアを迅速に追跡します。
ステップ4:トレーニング
人物の画像のデータセットを作成したら、モデルをトレーニングする必要があります。 写真をOpenCVレコグナイザーにフィードすると、最後に「trainer.yml」という名前のファイルが作成されます。
この段階では、モデルに画像とそのIDを提供するだけで、モデルはすべての画像のIDに慣れることができます。 モデルのトレーニングが終了したら、テストできます。
コードは次のとおりです。
cv2をインポートする

numpyをnpとしてインポートします
PILインポート画像から
OSのインポート
#顔画像データベースのパス
パス='データセット'
レコグナイザー=cv2.face.LBPHFaceRecognizer_create()
検出器=cv2.CascadeClassifier(“ haarcascade_frontalface_default.xml”);
#画像とラベルデータを取得する関数
def getImagesAndLabels(path):
imagePaths = [os.listdir(path)のfのos.path.join(path、f)]
faceSamples = []
ids = []
imagePathsのimagePathの場合:
PIL_img = Image.open(imagePath).convert('L')#グレースケール
img_numpy = np.array(PIL_img、'uint8')
id = int(os.path.split(imagePath)[-1] .split(“。”)[1])
面=detector.detectMultiScale(img_numpy)
顔の(x、y、w、h)の場合:
faceSamples.append(img_numpy [y:y + h、x:x + w])
ids.append(id)
faceSamples、idsを返します
印刷(「\ n [情報]トレーニング面。数秒かかります。お待ちください…」)
faces、ids = getImagesAndLabels(path)
Recognitionr.train(faces、np.array(ids))
#モデルをtrainer/trainer.ymlに保存します
Recognitionr.write('trainer / training.yml')
#トレーニングされた面の数を印刷し、プログラムを終了します
print(“ \ n [INFO] {0}面はトレーニング済みです。プログラムを終了します” .format(len(np.unique(ids))))
学習:顔認識におけるMATLABアプリケーション:コード、説明、構文
ステップ5:認識を開始する
モデルのトレーニングが完了したので、モデルのテストを開始できます。 このセクションでは、IDに名前を追加して、モデルが認識したそれぞれのユーザーの名前を表示できるようにしました。
モデルは人を認識しません。 検出した顔がデータベースに存在する顔と一致するかどうかを予測します。 私たちのモデルは、その顔がデータベースに存在する顔とどれだけ一致するかのパーセンテージを表示します。 その精度は、テストしている画像とデータベースに追加した画像(モデルをトレーニングした画像)に大きく依存します。
コードは次のとおりです。
cv2をインポートする
numpyをnpとしてインポートします
OSのインポート
レコグナイザー=cv2.face.LBPHFaceRecognizer_create()
Recognitionr.read('trainer / training.yml')
cascadePath =“ haarcascade_frontalface_default.xml”
faceCascade = cv2.CascadeClassifier(cascadePath);
フォント=cv2.FONT_HERSHEY_SIMPLEX
#initiate id counter
id = 0
#IDに関連する名前:例==> upGrad:id=1など
names = ['None'、upGrad'、Me'、'Friend'、'Y'、'X']
#リアルタイムビデオキャプチャを初期化して開始します
cam = cv2.VideoCapture(0)
cam.set(3、640)#ビデオ幅を設定
cam.set(4、480)#ビデオの高さを設定
#顔として認識される最小ウィンドウサイズを定義する
minW = 0.1 * cam.get(3)
minH = 0.1 * cam.get(4)
Trueの場合:
ret、img = cam.read()
img = cv2.flip(img、-1)#垂直方向に反転
灰色=cv2.cvtColor(img、cv2.COLOR_BGR2GRAY)
顔=faceCascade.detectMultiScale(
グレー、
scaleFactor = 1.2、
minNeighbors = 5、
minSize =(int(minW)、int(minH))、
)。
for(x、y、w、h)in faces:
cv2.rectangle(img、(x、y)、(x + w、y + h)、(0,255,0)、2)
id、confidence = Recognitionr.predict(gray [y:y + h、x:x + w])
#信頼度が100未満の場合==>“ 0”:完全一致
if(confidence <100):
id = names [id]
信頼度=” {0}%”。format(round(100 –信頼度))
そうしないと:
id="不明"
信頼度=” {0}%”。format(round(100 –信頼度))
cv2.putText(
img、
str(id)、
(x + 5、y-5)、
フォント、
1、
(255,255,255)、
2
)。
cv2.putText(
img、
str(自信)、
(x + 5、y + h-5)、
フォント、
1、
(255,255,0)、
1
)。
cv2.imshow('camera'、img)
k = cv2.waitKey(10)&0xff#ビデオを終了するには「ESC」を押します
k == 27の場合:
壊す
#クリーンアップを行う
print(“ \ n [INFO]プログラムを終了してクリーンアップを実行しています”)
cam.release()

cv2.destroyAllWindows()
Pythonでの顔検出プロジェクトは終了しました。 これで、顔を検出して認識する機械学習モデルを作成する方法をマスターしました。 結果を私たちと共有してください!
学ぶ:初心者向けのTensorFlowオブジェクト検出チュートリアル
機械学習の詳細
この顔検出プロジェクトを気に入っていただけたでしょうか。 それをもっとやりがいのあるものにしたい場合は、データセットに複数の面を追加し、それに応じてモデルをトレーニングできます。 また、他のライブラリと組み合わせて、プログラムの顔検出セキュリティシステムなど、プロジェクトを他のライブラリに拡張することもできます。
機械学習について詳しく知りたい場合は、IIIT-BとupGradの機械学習とAIのエグゼクティブPGプログラムをご覧ください。このプログラムは、働く専門家向けに設計されており、450時間以上の厳格なトレーニング、30以上のケーススタディと課題、IIITを提供しています。 -B卒業生のステータス、5つ以上の実践的なキャップストーンプロジェクト、トップ企業との雇用支援。
顔認識に使用される数学的アプローチはどれですか?
顔認識は計算コストが高く、機械学習アルゴリズムやオブジェクト検出方法の精度テストとしてよく使用されます。 一般に、ほとんどの場合、古典的な数学的アプローチ、つまりユークリッド距離に従います。 2つのセット間の最も近いユークリッド距離を見つけるために、幾何学的変換が適用されます。 ユークリッド距離では、2つの画像を表す点の2つのベクトル間の差の2乗を合計する必要があります。 ユークリッド距離アルゴリズムの詳細については、この研究論文を参照してください。
顔検出はどのように機能しますか?
顔検出は、デジタル画像またはビデオ内の人間の顔または複数の人間の顔を検出するプロセスです。 顔検出は顔認識のサブプロセスですが、この用語は通常、画像内の顔の位置のみを使用して人物を識別または検証する画像ベースの顔認識を指し、顔認識はその独自のモデルも作成します次に、ターゲットの顔に一致する顔。 顔検出は、顔認識がデジタル画像またはビデオソースから人を識別または検証する自動化されたプロセスであるという点で、顔認識とは異なります。
顔認識の課題は何ですか?
ここでは、顔認識のいくつかの課題について説明します。 顔認識システムに含まれるアルゴリズムは非常に複雑であるため、非常に一貫性がありません。 顔認識システムは、環境や照明の変化、さまざまなポーズ、さらには似たような人にさえ簡単にだまされます。 顔認識システムは非常に高い計算能力を必要とするため、顔認識システムは主にハイエンドのスマートフォンやラップトップで使用されます。 顔認識システムは、1つのフレームで複数の誤った一致を検出する場合があります。 ソフトウェアは、ユーザーが何をしようとしていたかを判断する必要がありますが、これはソフトウェアにとって簡単な作業ではありません。