福岡人データサイエンティストの部屋

データサイエンスを極めるため、日々の学習を綴っています。

【OpenCV】画像の顔検出【Python】



こんにちは!こーたろーです。


OpenCVの基礎トレーニング第2回です。


第2回は、画像における顔の検出を行っていきます。


顔認識は結構身近になったと思いますが、私としては全然やっていなかったので、これを機にプロフェッショナルになってみたいです。


CPUでは限界がありますが、できるところまでやってみます!


ライブラリのインポート



画像取得及び操作・表示のためのライブラリをインポートします。


画像操作用のOpenCVと、描画用にmatplotlibとurllibを定義しておきます。

import cv2
import matplotlib.pyplot as plt
import urllib.request as req


画像データの取得



以前やったように、画像をWebから取得します。


取得する画像は、フリーのものを選びました。

url = "https://jp.static.photo-ac.com/assets/img/ai_page/ai_model_512_01.png"
req.urlretrieve(url, "face_test.png")

img = cv2.imread("face_test.png")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)






今回もこちらの画像を使用します。

カスケードファイルの定義と検出器の作成・顔の検出



画像における顔の部分を検出するためには、カスケードファイルなるものが必要だそうです。


github.com


こちらのサイトの、「haarcascade_frontalcatface.xml」ファイルをダウンロード、又はコピーしてファイルを作成しましょう。


カスケードファイルを用いて顔の検出器を作成するのですが、このカスケードファイルは、画像の明暗に対して、「目・鼻・口」といったパーツに関するフィルタのようなものが含まれており、画像をグレースケールにしたうえでこのフィルターを使ってパーツを検出し、顔全体を検出するという仕組みです。

cascade_file = "haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_file)
face_list = cascade.detectMultiScale(img_gray, minSize = (150, 150))



カスケードファイルを定義して、「cv2.CascadeClassifier」関数にて検出器を作成します。


その後、検出器にグレースケールに変換した画像と最小サイズを定義します。


このCascadeClassifierメソッドの引数は、次のようなものがあります。

⁻image : CV_8U型の行列。ここに格納されていいる画像中から物体が検出されます。

  • objects : 矩形を要素とするベクトル。それぞれの矩形には、検出した物体を含みます。
  • scaleFactor : 画像スケールにおける縮小量を表します。
  • minNeighbors : 物体候補となる矩形は、最低でもこの数だけの近傍矩形を含む必要があります。
  • flags : このパラメータは、新しいカスケードでは使用されません。古いカスケードに対しては、cvHaarDetectObjects関数の場合と同じ意味を持ちます。
  • minSize : 物体が取り得る最小サイズ。これよりも小さい物体は無視されます。
  • maxSize : 物体が取り得る最大サイズ。

検出結果の表示



検出後のface_listには、次のような値が入っています。

face_list






元画像に対して、検出した枠を描画してみます。


face_listと書いていますが、実際はarray[0]にtupleが入っているため、for分で座標を書きます。

for x, y, w, h  in face_list:
    print("顔の座標 =", x, y, w, h)
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), thickness = 5)

plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()






確かに顔が検出されていることが分かります。


なんか少しやってやった感が残ります。


ではでは。


OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)