簡単にできるOpenCVを使った顔検出

画像からの顔検出は意外と簡単

こんにちは。

AI coordinatorの清水秀樹です。

以前から画像に写っている顔の検出ができたら良いなぁって思っていましたが、そう簡単ではないイメージを持っていました。

ただ、最近になってちょっと調べてみたら、案外簡単にできそうだということが分かったので挑戦してみました。

そしてビックリするほどあっさりできたので、その内容を紹介します。

 

OpenCVを使えばあっさり画像からの顔検出ができますので、興味がある方はぜひやってみてください。

 

テスト環境

macOS Sierra

Anaconda3-4.2.0-MacOSX-x86_64

opencv3 3.1.0

 

顔検出に挑戦

それでは早速、画像からの顔検出に挑戦したいと思います。

今回使用する画像は以下の画像です。

 

適当にネットから拝借してきた新垣結衣さんの画像を使ってみたいと思います。

ソースコードは本当に少なくてすみます。

import cv2
import sys
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

#入力ファイルのパスを指定
in_jpg = "./photo/face.jpg"
out_jpg = "./face.jpg"

#入力画像の表示
plt.show(plt.imshow(np.asarray(Image.open(in_jpg))))

# 画像の読み込み 
image = cv2.imread(in_jpg)

# グレースケールに変換
image_gs = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 顔認識用特徴量ファイルを読み込む --- (カスケードファイルのパスを指定)
cascade = cv2.CascadeClassifier("./haarcascades/haarcascade_frontalface_alt.xml")
#cascade = cv2.CascadeClassifier("./haarcascades/haarcascade_eye.xml")
# 顔認識の実行
face_list = cascade.detectMultiScale(image_gs,
    scaleFactor=1.1,
    minNeighbors=1,
    minSize=(100,100))

if len(face_list) > 0:
    # 認識した部分を赤色で囲む
    print(face_list)
    color = (0, 0, 255)
    for face in face_list:
        x,y,w,h = face
        cv2.rectangle(image, (x,y), (x+w, y+h), color, thickness=3)
    # 描画結果をファイルに書き込む
    cv2.imwrite(out_jpg, image)
    
else:
    print("no face")
    
#出力画像の表示
plt.show(plt.imshow(np.asarray(Image.open(out_jpg))))

OpenCVには初めから顔検出ができるカスケードファイルが準備されています。

顔検出をしたい場合は、「haarcascade_frontalface_alt.xml」を指定しください。(ソースコードの真ん中あたり)

顔と検出した部分を赤枠で囲み、ファイル出力するようにしています。

 

実行はjupyter notebookで実行して頂ければ、入力前の画像と出力画像をjupyter notebook上に表示できるようにしています。

 

それでは早速実行しみましょう。

実行すると以下のような結果が表示されます。

 

しっかりと顔を検出できました。

画像が小さすぎる場合、上記ソースコードそのままでは検出しないことがあります。

その場合は、minSize(100,100)部分の数字を小さくしてください。

これは100ピクセル以下の画像は検出させないという指定になっています。

# 顔認識の実行
face_list = cascade.detectMultiScale(image_gs,
    scaleFactor=1.1,
    minNeighbors=1,
    minSize=(100,100)) #←ここで認識させるサイズを決定している

 

今度は別のカスケードファイルを使ってみましょう。

目を検出するカスケードファイルを使ってみると以下のような画像になりました。

minSize = (10,10)で実行しています。

なんだが目以外の画像も目と検出しているようです。

この辺の精度はあまり高くなさそうですね。

 

いずれにせよ、OpenCVを使用すれば簡単に画像からの物体検出ができるようです。

この技術を使えば色々なことに使用できそうですね。

ぜひお試しあれ。

 


その他の物体検出記事はこちらから

 

それではまた。

あなたにオススメの記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

PAGE TOP