OpenCVのCascadeClassifierクラスを使った顔検出

概要

OpenCVのCascadeClassifierは、主に物体検出タスクに使用されます。特に、顔検出や顔の特徴点(目、鼻、口など)検出によく使われます。これは、CascadeClassifierが「カスケード分類器」というアルゴリズムを使用しており、このアルゴリズムは特に顔検出において高いパフォーマンスを発揮します。これは、セキュリティシステム、ユーザー認証、人間とコンピュータのインタラクション、広告、SNSなど、さまざまなアプリケーションで使用されています。

出力結果

OpenCVのCascadeClassifierクラスを使った顔検出

プログラム全体

import cv2 import urllib.request import numpy as np from matplotlib import pyplot as plt # カスケード分類器を読み込む face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') # 画像をダウンロードする url = 'https://raw.githubusercontent.com/opencv/opencv/master/samples/data/lena.jpg' with urllib.request.urlopen(url) as url: s = url.read() arr = np.asarray(bytearray(s), dtype=np.uint8) img = cv2.imdecode(arr, -1) # 'そのまま読み込む' # グレースケールに変換する gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 顔を検出する faces = face_cascade.detectMultiScale(gray, 1.1, 4) # 検出した顔の周りに矩形を描画する for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) # 出力を表示する plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.show()

解説

解説1:ライブラリのインポート

import cv2 import urllib.request import numpy as np from matplotlib import pyplot as plt

この部分では、プログラムで必要なライブラリをインポートしています。これらのライブラリはプログラムの機能を提供します。

cv2 OpenCVライブラリ。画像処理やコンピュータビジョンのタスクを行うための関数とクラスを提供します。
urllib.request URLを扱うためのライブラリ。このプログラムでは、画像をインターネットからダウンロードするために使用します。
numpy 数値計算を行うためのライブラリ。このプログラムでは、画像データを扱うために使用します。
matplotlib.pyplot グラフ描画ライブラリ。このプログラムでは、画像を表示するために使用します。

解説2: カスケード分類器の読み込み

# カスケード分類器を読み込む face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

この部分では、OpenCVのCascadeClassifierクラスを使用して、顔検出のためのカスケード識別器の学習済みファイル('haarcascade_frontalface_default.xml')を読み込んでいます。学習済みファイルは画像内の特定のオブジェクト(この場合は顔)を検出するためのモデルです。上記を実行すると、face_cascadeという名前のツールが作られ、このツールを使って画像の中から人の顔を見つけることができます。画像の中をスキャンして人の顔があるかどうかをチェックし、あればその位置を教えてくれます。

補足:カスケード識別器の学習済みファイル

カスケード識別器の学習済みファイルは、特定の物体(この場合は人の顔)を見つけるためのルールが書かれています。このルールは、大量の画像(人の顔が写っている画像と、そうでない画像)をコンピュータに見せて学習させることで作られます。通常の学習の過程では、コンピュータは人の顔が写っている画像とそうでない画像を何千回も何万回も見て、人の顔の特徴を学びます。たとえば、「目は通常、頭の上部にある」、「鼻は目の間にある」、「口は鼻の下にある」などの特徴を学び、その特徴を元にルールを作ります。このルールが「カスケード識別器の学習済みファイル」に書かれています。このルールを使って新しい画像を見ると、コンピュータは画像の中に人の顔があるかどうかを判断できます。たとえば、画像の中に「目が頭の上部にあり、鼻が目の間にあり、口が鼻の下にある」部分があれば、そこには人の顔があると判断します。なお、OpenCVでは学習済みの識別器ファイルを幾つか公開しています。
https://github.com/opencv/opencv/tree/master/data/haarcascades

解説3: 画像のダウンロードと前処理

# 画像をダウンロードする url = 'https://raw.githubusercontent.com/opencv/opencv/master/samples/data/lena.jpg' with urllib.request.urlopen(url) as url: s = url.read() arr = np.asarray(bytearray(s), dtype=np.uint8) img = cv2.imdecode(arr, -1) # 'そのまま読み込む' # グレースケールに変換する gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ここでは、まずURLから画像をダウンロードしています。次に、ダウンロードした画像データをNumPy配列に変換し、OpenCVのimdecode関数を使用して画像として読み込んでいます。最後に、cvtColor関数を使用して画像をグレースケールに変換しています。グレースケール変換は、顔検出の処理を簡単にするために行います。

解説4: 顔の検出と結果の表示

# 顔を検出する faces = face_cascade.detectMultiScale(gray, 1.1, 4) # 検出した顔の周りに矩形を描画する for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) # 出力を表示する plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.show()

この部分は、画像の中から人の顔を見つけて、その顔の周りに四角形を描くという作業をしています。まず、faces = face_cascade.detectMultiScale(gray, 1.1, 4)の部分では、先ほど学習済みファイル('haarcascade_frontalface_default.xml')を使って、画像の中から人の顔を探しています。ここで、grayは人の顔を探すための画像(モノクロにしたもの)、「1.1」は画像のサイズ、「4」は顔と認識するための数を表しています。for (x, y, w, h) in faces:の部分では、見つけた顔の位置と大きさを取り出しています。facesには見つけた顔の情報が入っており、そこから「x, y」は顔の左上の角の位置、「w, h」は顔の幅と高さを取得します。そして、cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)の部分では、取り出した顔の位置と大きさを使って、画像の上に四角形を描いています。imgは元の画像、(x, y), (x+w, y+h)は四角形の左上と右下の角の位置、(255, 0, 0)は四角形の色(この場合は赤色)、2は四角形の線の太さを表しています。 最後に、plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.show()の部分で、四角形を描いた画像を表示しています。cv2.cvtColor(img, cv2.COLOR_BGR2RGB)は色の順番を変えて、画像を正しく表示するための処理です。以上のように、このプログラムの部分は、画像の中から人の顔を見つけて、その顔の周りに四角形を描き、その結果を表示するという作業を行っています。

おまけ

TheImagingSource社のカメラには、バーコードを読み取るためのSDKが付属しています。このSDKを使用すると、バーコードの情報だけでなく、その位置情報も取得できます。そのため、上記のサンプルのように、読み取ったバーコードの位置を画像上で四角形で囲うことが可能です。
https://www.argocorp.com/software/DL/tis/index.html#tab4

さらに、HoneywellのSwiftDecoderのようなサードパーティ製のソフトウェアとも簡単に連携できます。これにより、さまざまなソフトウェア環境でのバーコード読み取りが可能となります。
https://www.argocorp.com/UVC_camera/Sample_SwiftDecoder.html