トップページ -> 実践知識 -> 顔検出、顔識別 -> Dlib で顔検出を行ってみる,カメラともつなぐ
[サイトマップへ], サイト内検索:

Dlib で顔検出を行ってみる,カメラともつなぐ

サイト構成 連絡先,業績など 実践知識 データの扱い コンピュータ 教材 サポートページ

Dlibは,機械学習のアルゴリズムやトールの機能を持つソフトウエア.

Dlib の次の機能を使います

利用条件などは利用者において確認してください

サイト内の関連Webページ:

先人に感謝

dlib の Web ページ: http://dlib.net/


前準備

Python, 主要パッケージ, TenforFlow, Keras, Dlib, MSVC ビルドツール (Build Tools) のインストール

以下,Windows でインストール済みであるものとして説明を続ける.

Dlib は C:\pytools\dlib にインストールされているとします


学習データの準備

  1. 学習済みデータ mmod_human_face_detector.datのダウンロード

    http://dlib.net/files/ を開き、 mmod_human_face_detector.dat.bz2をダウンロード

  2. ダウンロードした .bz2 ファイルを展開(解凍)する.

    ※ Windows での展開(解凍)のためのソフトには,「7-Zip」などがある.

  3. 学習済みデータ mmod_human_face_detector.dat のファイルを C:\pytools\dlib\python_examples に置く

    C:\pytools\dlib が無いときは作る

動かしてみる

  1. まずは、DLib に同封の顔画像ファイルに何があるかを、簡単にみておく

    C:\pytools\dlib\examples\faces の下の顔画像のファイルを確認する

  2. Windows のコマンドプロンプトを開く

  3. 実行してみる
    cd C:\pytools\dlib\python_examples
    python cnn_face_detector.py mmod_human_face_detector.dat ..\examples\faces\2007_007763.jpg
    

    結果が表示されるまで少し待つ

    うまく動かないときのヒント

    • 次のように「RuntimeError: Unable to open mmod_human_face_detector.dat for reading」というエラーメッセージが出たときは、 上の前準備をやり直して、もう一度実行

    • python にパスが通っていないときは、うまくいかない. Windows で,python にパスが通っているかは、次のコマンドで確認
      where python
      

      回避策: Anaconda の python のパスの設定については別のWebページに書いています

  4. 別の画像で試してみる
    cd C:\pytools\dlib\python_examples
    python cnn_face_detector.py mmod_human_face_detector.dat ..\examples\faces\2008_001009.jpg
    

  5. さらに別の画像で試してみる
    cd C:\pytools\dlib\python_examples
    python cnn_face_detector.py mmod_human_face_detector.dat ..\examples\faces\2008_001322.jpg
    

  6. ./cnn_face_detector.py をエディタなどで開いて、中身を確認

    Dlib には Convolutional Network による顔検出の機能があり、顔検出させるためのプログラムは実質2行. 画面を開く、画像ファイルを読み込む、画像データを表示する、顔部分を四角で描くといったことも簡単なコマンド.


パソコンにつないだカメラで試してみる

Python プログラムを動かしたい. そのために, 「Python コンソール」を使う..

PyCharmspyder を使うのが簡単

※ (オプション)もし、virtualenv のPython 仮想環境にインストールしていて、それを使いたいときは、有効化する

dlib に付属の「face_detector.py」を参考にして、次のプログラムを作成してみた

import sys
import dlib
from skimage import io
import cv2
import numpy as np

def box_label(bgr, x1, y1, x2, y2, label): 
    cv2.rectangle(bgr, (x1, y1), (x2, y2), (255, 0, 0), 1, 1)
    cv2.rectangle(bgr, (int(x1), int(y1-25)), (x2, y1), (255,255,255), -1)
    cv2.putText(bgr, label, (x1, int(y1-5)), cv2.FONT_HERSHEY_COMPLEX, 0.7, (0,0,0), 1)

detector = dlib.get_frontal_face_detector()
v = cv2.VideoCapture(0)

while(v.isOpened()):
    r, bgr = v.read()
    if ( r == False ):
        break
    cv2.imwrite("hoge.png", bgr)
    img = io.imread("hoge.png")
    dets, scores, idx = detector.run(img, 1, -1)
    for i, d in enumerate(dets):
        box_label(bgr, d.left(), d.top(), d.right(), d.bottom(), 'face')
        print(d)

    cv2.imshow("", bgr)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる