↓もし、良かったらSNSでの紹介よろしくお願いします。

OpenCVで顔認識とそれ以外の物体認識(カスケード分類機まとめ)

bootstrap

OpenCVで物体認識

OpenCVで静止画から物体認識をする場合、3つの方法があります。

  1. テンプレートマッチング法

    https://www.tech-tech.xyz/archives/3065942.html

  2. 特徴点の抽出し、比較することで検出

    https://www.tech-tech.xyz/archives/sift-surf-akaze.html

    OpenCV(Python)で物体認識、特徴抽出(SIFT、SURF、A-KAZEの使い方)

  3. カスケード型分類器を用いて検出
    今回は3.の方法で物体認識を行います。

お手軽順で並べてます。
つまり、1.が最もお手軽な方法で、
3.は判別機の学習のためにデータを集めて成形するのが面倒です。

ただし、3.の方法を使った顔認識は優秀な判別機が公式から配布されているのでお手軽にできます。

OpenCVで顔認識

カスケード分類機の準備

顔のカスケードファイルが公式から配布されているので、それを用います。

下記のリンクへ飛んで”haarcascade_frontalface_default.xml”をダウンロードして適当な業ディレクトリに保存しましょう。

OpenCVのカスケードファイルの公開場所

このカスケードファイルは後程、
cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
スクリプト内でパスを指定して読み込むことになります。

顔のカスケード分類機(OpenCV)は画像から顔の場所とそれ以外の場所を分類するための情報が書き込まれたXMLファイルです。

顔検出以外にもさまざまなカスケードファイルがありますがこれは記事後半で解説しています。

サンプルコード

写真から顔の位置を検出して、四角で囲むコードです。

# coding: utf-8
import cv2
img = cv2.imread('img.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#カスケードファイルの読み込み
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

#カスケードファイルと使って顔認証
faces = face_cascade.detectMultiScale(gray)
for (x,y,w,h) in faces:
    #顔部分を四角で囲う
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

結果

一部検出に失敗しているところもありますが、おおむねうまくできています。

OpenCV3出力結果の画像

誤認識を防ぐ

detectMultiScaleには誤認識を防ぐ引数がいくつか用意されています。

cascade.detectMultiScale(img, scaleFactor, minNeighbors, flags, minSize, maxSize)
  • scaleFactor:画像をスケーリングして検出するときの設定変数
    scaleFactorが1.1のとき10%ずつ元画像を縮小して検出を行います。

  • minNeighbors:検出する領域の間隔を調節
    大きな値にすると、顔の領域が近くならないように検出されます。

  • flags:現在、サポートされていません。
    古いカスケードファイルでサポートされていたフラグを利用するための変数です。

  • minSize:検出領域の最小の大きさを調節
    変数は、(幅, 高さ)というタプル形式で渡します

  • maxSize:検出領域の最大の大きさを調節

先ほどの例で、minNeighbors=30にして再検出したら認識できました。

誤認識を防いだ結果

顔以外のカスケードファイル

公式が配布しているカスケードファイル

  • haarcascade_eye.xml:人の目
  • haarcascade_eye_tree_eyeglasses.xml:めがねを付けた目
  • haarcascade_frontalcatface.xml:猫の顔(正面)
  • haarcascade_frontalcatface_extended.xml:猫の顔(正面)
  • haarcascade_frontalface_alt.xml:顔検出(正面)
  • haarcascade_frontalface_alt2.xml:顔検出(正面)
  • haarcascade_frontalface_alt_tree.xml:顔検出(正面)
  • haarcascade_frontalface_default.xml:顔検出(正面)
  • haarcascade_profileface.xml:証明写真の顔
  • haarcascade_smile.xml:笑顔
  • haarcascade_lefteye_2splits.xml:左目
  • haarcascade_righteye_2splits.xml:右目
  • haarcascade_fullbody.xml:全身
  • haarcascade_upperbody.xml:上半身
  • haarcascade_lowerbody.xml:下半身
  • haarcascade_licence_plate_rus_16stages.xml:ロシアの車ナンバープレート(全体)
  • haarcascade_russian_plate_number.xml:ロシアの車ナンバープレート(数字部分)