30行で顔認識(OpenCV)してファイル出力!


やること

  • 前回記事でGoogle画像検索結果をスクレイピングし、画像データをダウンロードしました。
  • 今回は、人物の画像データをダウンロードしておき、その人物の顔部分をOpenCVで認識させ、顔画像のデータを作成したいと思います。

手順概要

  1. cascadeファイルの準備
  2. 画像データの準備
  3. 顔認識 & ファイル出力

動作環境

  • macOS Catalina 10.15 beta
  • anaconda 4.6.14
  • Python 3.6.8
  • opencv 3.4.2

1. cascadeファイルの準備

  • 私の場合はanacondaで環境構築をしているため、"anaconda3/pkgs/.../haarcascades/"の中に「haarcascade_frontalface_default.xml」があります。(Finderなどで検索してみてください)
    それをコピーして、実行ファイルと同じディレクトリに格納しました。
  • ファイルが無い場合は、GitHub上からダウンロードしてください。
1.cascadeファイルの準備
import os
import cv2

HAAR_FILE = "./haarcascade_frontalface_default.xml"
face_cascade = cv2.CascadeClassifier(HAAR_FILE)

2. 画像データの準備

  • 入力元ファイルと出力先ファイルを格納するフォルダ(input/output)を作成しておき、入力元には複数の画像データ(.jpg)を格納しておきます。
2.画像データの準備
IN_PATH = './input/'
OUT_PATH = './output/'

def get_file(dir_path):
    file_names = os.listdir(dir_path)
    return file_names

images = get_file(IN_PATH)

3. 顔認識 & ファイル出力

  • 画像データを読み込みます(imread)
  • 画像を検出しやすいようにグレースケールに変換します(cvtColor)
  • 顔認識を実行するため、1.で読み込みしたcascadeを利用します
    detectMultiScaleの戻り値は、下記のリストになります
    • x座標
    • y座標
    • 横幅
    • 縦幅
  • 顔の範囲を抽出、または範囲を赤枠(OpenCVのimreadはBGRの順)で囲み、それぞれのファイルを出力します
  • rectangleは四角形を描画します。
    • rectangle(画像, 左上座標, 右下座標, 色, 線の太さ)
3.顔認識&ファイル出力
for i in images:

    # read image
    img = cv2.imread(IN_PATH + i)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # face detection
    face = face_cascade.detectMultiScale(gray)

    # get face area
    for x,y,w,h in face:
        face_cut = img[y:y+h, x:x+w]
    # wrap in red frame
    for x,y,w,h in face:
        cv2.rectangle(img, (x,y), (x+w, y+h), (0, 0, 255), 2)

    cv2.imwrite(OUT_PATH + '{}_face_cut.jpg'.format(i.replace('.jpg', '')), face_cut)
    cv2.imwrite(OUT_PATH + '{}_face_rectangle.jpg'.format(i.replace('.jpg', '')), img)

実行結果

  • 実行前後の画像データは以下の通りです。

【実行前】

1. 001.jpg

2. 002.jpg

3. 003.jpg

【実行後】

1.

001_face_cut.jpg

001_face_rectangle.jpg

2.

002_face_cut.jpg

002_face_rectangle.jpg

3.

003_face_cut.jpg

003_face_rectangle.jpg

ソースコード

参考文献