Python+OpenCVで顔検出してみる

OpenVINO-2 OpenCV

OpenVINOとOpenCV

以前「OpenVINOに挑戦」で顔認識に挑戦する内容の記事を書きました。OpenVINOとは「Open Visual Inference and Neural network Optimization」の略なのですが、ごっちゃになり易いものにOpenCV (Open Source Computer Vision Library)があります。今回はこのOpenCVで顔認識に挑戦しました。

検証環境

検証環境はWindows10 Pro 64bit バージョン2004、Pythonは3.6.1です。WEBカメラはラップトップ内蔵のものでも外付けでもOKですが、「内蔵PCに外付けをつないでいる」かつ「外付けを使いたい」ときは1か所コードの修正が必要です(コード中にコメント入れています)。ZoomなどWEBカメラを利用するアプリケーションも予め終了させておきます(最小化ではダメです)。

「OpenCVまだ入れてないよ~」という方は先にインストールしておきましょう!

pip install opencv-python

顔判定の仕組み

OpenVINOではインテルが作成したモデル(.xmlと.bin)を利用して画像(映像)を判定していました。OpenCVでは「カスケード分類器」と呼ばれるものがこれにあたります。

カスケード分類器は「正解」と「不正解」をひたすら判定させ続けて自分で作成することも可能ですが、膨大な量のサンプルが必要です。「立っている者は親でも使え」の精神で、ここは必要に応じ既存のものをダウンロードして利用しましょう。

Releases - OpenCV

gitでもダウンロードできますが、ファイルが不完全で実行時にエラーが出る場合がありますので公式から入手することをお勧めします。

上記サイトで任意のバージョンの「Sources」からzipをダウンロードし解凍→任意のディレクトリに保存してください。このフルパスが後ほど必要になりますので、忘れないように注意してください。

コード

ググって調べ自分で手を入れたものです。例によって誤認と思われる個所がありましたら是非ご指摘ください。

# -*- coding: utf-8 -*-
import cv2

# 分類器は下記から取得
#https://opencv.org/releases/

# カスケード分類器保存先
your_path = 'c:/opencv/'

# カスケード分類器ファイル名
cascade_path = your_path + "haarcascade_frontalface_alt.xml"

# カスケード分類器より特徴量取得
# カスケード分類器は...frontalface...の中から好きなものを選択
# 私の環境ではhaarcascade_frontalface_alt.xmlが一番好成績でした
cascade = cv2.CascadeClassifier(cascade_path)

# WEBカメラの映像取得
# 内蔵カメラあり+外付けの環境で外付けを使いたいときは(0)を(1)に変更
image = cv2.VideoCapture(0)

while True:

	key = cv2.waitKey(1)
	
	if key != -1:
        	break

	ret, frame = image.read()

	# 速度向上のためグレースケール変換
	image_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)	

	# 判定
	facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=2, minSize=(30, 30))
	
	# 検出した場合
	if len(facerect) > 0:

		# 矩形作成
		# 第4引数で矩形の色を選択するがRGB形式で指定するとintegerしかダメと怒られます
		for rect in facerect:
			cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), 255, 2)
	
	# 表示
	cv2.imshow('image', frame)

image.release()
cv2.destroyAllWindows()

いかがでしょう。私は「以外に簡単!」という印象でした。正直なところ認識精度はOpenVINOの方が優れいてる印象ですが、利用環境構築の容易さはpipを1度唱えるだけで済むOpevCVの方が圧倒的に楽ですね。認識精度も利用するカスケード分類器や判定のパラメータをチューニングすればもう少し向上するのでは、と期待しています。

皆さんも是非お試しください!

コメント