Haar カスケード分類器を使用した OpenCV 顔検出

Salman Mehmood 2024年2月15日
Haar カスケード分類器を使用した OpenCV 顔検出

このデモンストレーションでは、haar 機能ベースのカスケード分類器を使用して顔検出の基本を学び、OpenCV で画像とビデオから顔を検出する方法を学びます。

OpenCV の Haar カスケード分類器を使用して顔検出プロジェクトを作成する

Haar 機能ベースのカスケード分類器を使用したオブジェクト検出は、PaulViola と MichaelJones が彼らの人々に提案した効果的なオブジェクト検出方法です。Haar 機能ベースのカスケード分類器は、カスケード機能が多くのポジティブおよびネガティブイメージに対してトレーニングされる機械学習ベースのアプローチです。

では、これらのポジティブなイメージとネガティブなイメージは何ですか?分類子は、特定のオブジェクトの数百のサンプルビューでトレーニングされます。これは、顔、車、またはポジティブと呼ばれるその他のオブジェクトの場合があります。

たとえば、顔を検出する場合は、顔を含む画像の数を使用して分類子をトレーニングする必要があります。そして、それをポジティブイメージと呼びます。

別のケースでは、顔を検出する必要があり、画像に顔が含まれていない場合、それはネガティブ画像と呼ばれます。

分類子がトレーニングされた後、入力画像の対象領域に適用できます。領域にオブジェクトが表示される可能性が高い場合、分類子の出力は 1 です。それ以外の場合は 0 です。

OpenCV で Haar カスケード検出を使用する方法を見てみましょう。

OpenCV には、トレーナーと検出器が付属しています。時計、車などのオブジェクトの分類子をトレーニングする場合は、この分類子を使用できます。

OpenCV GitHub ページで、トレーニング済みの分類子 XML ファイルをいくつか見つけることができます。このリポジトリ内には、訓練された分類器がたくさんあります。

OpenCV GitHub トレーニング済み分類子 XML ファイル

この強調表示されたファイルを開き、生のアイコンボタンをクリックしてダウンロードするだけです。開いたら、右クリックしてコンピュータに保存できます。

コードエディタを開いて、分類子を定義しましょう。

分類子パスを提供できる CascadeClassifier() というメソッドがあります。分類子を定義したら、画像を読み取ります。

F_C = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

この分類子はグレースケール画像で機能するため、画像をグレースケール画像に変換する必要があります。画像変換の実装は本当に簡単です。

IMG = cv2.imread("inp.png")
G_scale = cv2.cvtColor(IMG, cv2.COLOR_BGR2GRAY)

次のステップは、この画像内の顔を検出することです。これを行うには、Faces という変数を宣言します。3つのパラメーターを受け取る detectMultiScale() メソッドを呼び出します。

1つ目はグレースケール画像で、2つ目の引数はスケール係数です。これは、各画像スケールで画像サイズがどれだけ縮小されるかを指定するために使用されます。次は、最小ネイバーパラメータです。これは、各候補長方形でそれを保持する必要があるネイバーの数を指定します。

Faces = F_C.detectMultiScale(G_scale, 1.1, 4)

最後のステップは、検出したすべての面を繰り返し処理してから、長方形を描画することです。この Faces 変数は、各長方形に検出されたオブジェクトが含まれる長方形のベクトルになります。この場合は、検出された面になります。

Faces オブジェクトからパラメータ (x,y,w,h) を取得します。これらは、オブジェクトの長方形の値です。

座標を取得しながら、rectangle() メソッドを使用して長方形を描画します。

いくつかのパラメータが必要です。1つ目は画像、2つ目は Faces ベクトルを使用して取得したポイント (x,y)、次のパラメーターは長方形の 2 番目のポイントです。

次の 2つのパラメータは、色と厚さです。

import cv2

F_C = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

IMG = cv2.imread("inp.png")
G_scale = cv2.cvtColor(IMG, cv2.COLOR_BGR2GRAY)
Faces = F_C.detectMultiScale(G_scale, 1.1, 4)

for (x, y, w, h) in Faces:
    cv2.rectangle(IMG, (x, y), (x + w, y + h), (255, 0, 0), 3)

cv2.imshow("IMG", IMG)

cv2.waitKey()

これで、画像内で顔が検出されたことがわかります。

OpenCV Haar カスケード画像顔検出出力

ビデオ内の顔を検出してみましょう。これは別のアプローチではありません。このアプローチをすべてのフレームに適用するだけでよいので、画像を読み取る代わりに、VideoCapture() メソッドを使用してビデオをキャプチャします。

フレームをキャプチャするには、Video 変数を定義して VideoCapture() と等しくし、mp4 ファイルを提供する必要があります。カメラをお持ちの場合は、0 を指定できます。

次に、上記のすべてのコードを while ループ内に囲み、while ループに isOpened() メソッドを定義します。このメソッドが真の値を返す場合、プログラムはフレームの読み取りに進みます。Video.read() を呼び出します。これは、すべてのフレームを読み取っていることを意味します。

誰かがキーqを押したときの条件を定義すると、プログラムは while ループから抜け出します。最後に、while ループの外で、ビデオをリリースします。

import cv2

F_C = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

Video = cv2.VideoCapture("inp.mp4")

while Video.isOpened():
    _, IMG = Video.read()

    G_scale = cv2.cvtColor(IMG, cv2.COLOR_BGR2GRAY)
    Faces = F_C.detectMultiScale(G_scale, 1.1, 4)

    for (x, y, w, h) in Faces:
        cv2.rectangle(IMG, (x, y), (x + w, y + h), (255, 0, 0), 3)

    cv2.imshow("Window", IMG)
    K = cv2.waitKey(1)
    if K & 0xFF == ord("q"):
        break

Video.release()

このビデオでは、リアルタイムビデオで検出された顔を見ることができます。

OpenCV Haar カスケードビデオ顔検出出力

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

関連記事 - Python OpenCV