OpenCVとは?

最近、スマートフォン/タブレットのアプリ、施設の入出場記録、監視カメラ等、様々な場面で顔認証を利用したアプリケーションを目にする機会が増えてきています。

これらのアプリケーションは昨今話題の”AI”や”機械学習”というテクノロジーによって実現していることはよく知られていると思いますが、実際にこのテクノロジーを製品開発等に導入することを考えると、ハードルが高そうなイメージがあると思います。

そこで今回の記事ではOpenCVというオープンソースライブラリを活用して顔検出アルゴリズムを手軽に実装する方法を紹介していきたいと思います。
OpenCVとはコンピュータビジョンに特化したアルゴリズムで、これを使うことによって物体認識、パターン認識、動作認識等のアルゴリズムを容易に実装することが出来るようになります。

Snapdragon 410でOpenCVを動かして顔検出

今回は、Qualcomm Snapdragon 410が搭載されたIntrinsyc社のOpen-Q™ 410 Development Kitを活用し、
Snapdragon410でOpenCVを動かして、USBカメラで取得した画像をリアルタイムでHDMIモニターに出力しながら人の顔/目を検出したら枠で囲むといったデモを作っていきたいと思います。(左画像:イメージ写真) 

記事後半には動画も載せていますので、ぜひご覧ください。

デモ機材の準備

今回のデモでは、以下の機材を使用します。

  • Open-Q™ 410 Development Kit (以下Devkit)
  • USBハブ
  • USBマウス
  • USBキーボード
  • USBカメラ
  • HDMIモニター
  • USBメモリ
  • Windows PC

また、下図のように各機器を接続します。

OSにはLinuxを使用します。Linuxのインストール方法は“Qualcomm® Snapdragon™ 410でLinux®をインストールしてみた”の記事を参照ください。

Python-OpenCVのインストール

OpenCVでは公式でC++、JAVA、Python向けのパッケージがサポートされています。

今回はPythonを使っていきたいと思います。まずは必要なパッケージをインストールします。

手順は非常にシンプルで、Qterminalを起動し下記のapt-getコマンドを実行します。今回のデモは下記のパッケージで動かすことが出来ます。

linaro@linaro-alip:~$ sudo apt-get install python python-dev python-opencv python-numpy

学習データの準備

対象画像と非対象画像を精度良く判別するためには、膨大な数のデータ収集が必要となりますが、OpenCVでは学習済みのカスケード分類器のデータが公式でリリースされており、それらを活用することで簡単に物体検出が可能となります。   ”haarcascade_frontalface_alt.xml”と”haarcascad_eye.xml”というファイルが正面の顔と目を検出する学習データに該当するようですので、今回はこの2種類をダウンロードします。
ここでダウンロードした学習データファイルは後ほどPythonスクリプト内で読み込むことになります。これらのファイルは下記リンクのGithubレポジトリから取得することが出来ます。

OpenCVのGitHubレポジトリ 

Pythonスクリプトの準備

これからPythonコードを書いていきます。GithubでPython、OpenCV関連のコードを参考にしながら下記のようなコードを書いてみました。

import cv2
# カスケード分類器データの読み込み
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
frame_width = 320
frame_height = 240
esc = 27 # ESCキーはASCIIコードで27
# USBカメラのIDを設定して初期化
cap = cv2.VideoCapture(0)
# キャプチャ画像のフレームサイズ設定
cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, frame_width)
cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, frame_height)
while True:
    # キャプチャ
    ret, img = cap.read()
    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 検出スタート
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.7, minNeighbors=3)
    # 顔/目検出を実行して検出したら矩形で囲む枠を描写
    for x, y, w, h in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
        face = img[y: y + h, x: x + w]
        face_gray = gray[y: y + h, x: x + w]
        eyes = eye_cascade.detectMultiScale(face_gray)
        for ex, ey, ew, eh in eyes: 
            cv2.rectangle(face, (ex, ey), (ex + ew, ey + eh), (255, 0, 0), 2)
    # 検出結果表示ウィンドウの名前
    cv2.imshow('Face Eyes Detection', img)
    # ESCキーで検出ストップ
    key = cv2.waitKey(1)
    if key == esc:
        break
cap.release()
cv2.destroyAllWindows()

作成したスクリプトはPython用の拡張子(.py)で保存します。

今回は”face_eyes_detect.py”というファイルを作成しています。このスクリプトファイルを先ほど作成した学習データファイルと同じフォルダに入れておきます。これでついにデモを動かす準備が整いました。

顔/目検出デモの実行

QTerminalを起動し、Pythonスクリプト(.py)と学習データファイル(.xml)が入っているディレクトリでpythonファイルを実行するためのコマンド(python <.pyファイル名>)を打ち込みます。カメラで取得した画像がモニターにリアルタイムに映し出され、顔と目を囲む矩形が表示されました。

linaro@linaro-alip:/media/linaro/8089-CA45/faceeyesdetect$ ls
face_eyes_detect.py  haarcascade_eye.xml  haarcascade_frontalface_alt.xml
linaro@linaro-alip:/media/linaro/8089-CA45/faceeyesdetect$ python face eyes detect.py

このようにOpenCVを使うことで、簡単に顔/目検出デモを実装することが出来ました。OpenCVには他にも様々な分類器データが用意されています。こういった便利なリソースを上手く活用することで画像の高度な処理が必要なアプリケーション開発をより効率的に進めていくことが可能になります。 

また、画像処理や機械学習といった負荷がかかるアプリケーションでは、今回使用したSnapdragonシリーズのように高性能なSoCを使用することで、スピーディに処理を実行することが出来るようになります。ぜひ試してみてはいかがでしょうか。  

製品について詳しく知りたい方

本記事で紹介した製品に関する詳細な情報をお求めの方は、是非こちらからお問い合わせください。

おすすめ記事/資料はこちら

メーカーサイト/その他関連リンクはこちら

Qualcomm Snapdragon is a product of Qualcomm Technologies, Inc. Qualcomm and Snapdragon are trademarks of Qualcomm Incorporated, registered in the United States and other countries.