画像に写る人物の顔を検出する手法は様々ありますが、実際にKagglerのみなさんが使うことにしたものはOpenCVが多いように思います。今回はOpenCVで顔検出することについてです。
1. 基本的な使い方と注意点
OpenCVのCascade Classifierは、検出したい物体に合わせてClassifierの重みを記録したXMLファイルを読み込んで画像を走査させることでその物体を検出しようとします。検出対象の物体ごとのXMLファイルは下記のOpenCVのgitHubサイトにて取得できます。
https://github.com/opencv/opencv/tree/master/data/haarcascades
例えば、人間の顔の前面を検出する場合、Pythonコードで書くと下記のようになります。
import cv2 # 顔の前面につき、顔前面用のXMLを読み込んでClassifierを用意する haarcascade_frontal_xml = 'haarcascade_frontalface_default.xml' face_cascade_frontal = cv2.CascadeClassifier(haarcascade_frontal_xml) # 走査する画像を読み込み img = cv2.imread(imagefile_name) # OpenCVはグレースケール画像に対して走査をするので、グレースケール画像に変換 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 1画像から複数の物体を検出する(パラメータの意味についてはOpenCVサイトを参照) faces_frontal = face_cascade_frontal.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=4, minSize=(100, 100) # 検出する顔の最小サイズ ) print(faces_frontal)
得られる「faces_frontal」には画像上の検出された顔の位置(起点x,yと幅h,w)が配列で記録されます。
なお、画像に写る顔は正面だけではなく横顔もあるため、上記の顔前面検出と同時に横顔(英語ではprofileという)画像検出も行う必要があります。その際に、注意点としては、使う「haarcascade_profileface.xml」は、顔の左側しか検出しないということです。ですので、検出対象とする画像を左右反転(flip)させて、その反転画像に対しても走査を行うことが重要です。これをしないと検出漏れがたくさん出ます。
2. Augumentation(水増し)
Deep Learningで学習データを生成する作業と切っても切れない作業が「Augmentation(オーグメンテーション)」です。オーグメンテーションとは「水増し」という意味で、学習データの数が足りない場合に、既にある学習データに本質を損なわないような加工をして学習データを増やすことを意味します。本来はこの「水増し」が意味なのですが、学習データ生成で画像の明暗を変化させたり、拡大縮小するような作業も含めてオーグメンテーションと読んでいるように感じます。
画像の学習データの生成では下記のような作業がよく行われ、後で作成するモデルの精度に寄与すると考えられています。
OpenCVは簡単に使え、この他にも様々な使い方ができる素晴らしいライブラリです。いろいろと遊んでみましょう。