トップページ -> 最新情報技術の実習と研究ツール -> 顔検出、顔識別 -> 68ランドマークを表示してみる(Dlib を使用)
[サイトマップへ]  

68ランドマークを表示してみる(Dlib を使用)

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

Dlib を用いて、次のことを行います

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

先人に感謝

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


前準備

Python, 主要パッケージ, OpenCV, Dlib, git のインストール

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

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

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


imutils のインストール

  1. Window でコマンドプロンプトを実行

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

    ※ virtualenv のPython 仮想環境を有効化したいときに限る(「ai」のところは、Python仮想環境の名前に変えること)

    workon ai 
    

  3. imutils のインストール
    mkdir c:\pytools
    cd c:\pytools
    rmdir /s /q imutils
    

    cd c:\pytools
    git clone https://github.com/jrosebr1/imutils 
    cd imutils
    python setup.py build
    python setup.py install 
    

    (以下省略)

  4. imutils のバージョン確認

    Windows のコマンドプロンプトで、次のコマンドを実行

    python -c "import imutils; print( imutils.__version__ )"
    

この Web ページで説明のために使用するビデオ

顔が写ったビデオファイル

ここで使用する mp4 形式ビデオファイル: sample2.mp4 (30秒)

顔が写ったビデオファイル

ここで使用する顔写真: 126.png, 127.png

作業手順

  1. C:\face-image のような作業用のディレクトリ(フォルダ)を作る

  2. sample2.mp4, 126.png, 127.png を、C:\face-image の下にダウンロード

学習済みのモデルデータのダウンロードと展開(解凍)

次の3つの「学習済みのモデルデータ」をダウンロードする

  1. 作業用ディレクトリとして「C:\trained\dlib」のようなディレクトリ(フォルダ)を新しく作る

  2. Web ブラウザで次の URL を開く

    http://dlib.net/files

  3. 次のファイルをダウンロードする

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

    ※ Windows での展開(解凍)のためのソフトは「7-Zip」をおすすめ.

  5. 展開(解凍)してできたファイルを確認する.

  6. このファイルを, 作業用ディレクトリ「C:\trained\dlib」のようなディレクトリ(フォルダ) の下にコピー

68 ランドマークを調べてみる

Python プログラムを動かしたい. そのために, PyCharmなどにある Python コンソールを使う

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

ビデオで行ってみる

import numpy as np
import dlib
import cv2
import imutils
from imutils import face_utils

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()
predictor = dlib.shape_predictor('C:/trained/dlib/shape_predictor_68_face_landmarks.dat')


v = cv2.VideoCapture("C:/face-image/sample2.mp4")
while(v.isOpened()):
    r, disp = v.read()
    if ( r == False ):
        break

    mono = cv2.cvtColor(disp, cv2.COLOR_BGR2GRAY)
    rects = detector(mono, 1)

    for (i, rect) in enumerate(rects):
        shape = predictor(mono, rect)
        shape = face_utils.shape_to_np(shape)
        (x, y, w, h) = face_utils.rect_to_bb(rect)
        box_label(disp, x, y, x + w, y + h, str(i))

        j = 0    
        for (x, y) in shape:
            j = j + 1
            if ( j > 36 and j < 49): 
                cv2.putText(disp, str(j), (x, y - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
                cv2.circle(disp, (x, y), 2, (0, 255, 0), -1)
 
    cv2.imshow("", disp)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

v.release()
cv2.destroyAllWindows()

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

ビデオカメラで行ってみる

今度は、USB接続できるビデオカメラを準備し,パソコンに接続しておく.

「v = cv2.VideoCapture(0)」のように設定している.他は前のプログラムと同じ

import numpy as np
import dlib
import cv2
import imutils
from imutils import face_utils

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()
predictor = dlib.shape_predictor('C:/trained/dlib/shape_predictor_68_face_landmarks.dat')


v = cv2.VideoCapture(0) 
while(v.isOpened()):
    r, disp = v.read()
    if ( r == False ):
        break

    mono = cv2.cvtColor(disp, cv2.COLOR_BGR2GRAY)
    rects = detector(mono, 1)

    for (i, rect) in enumerate(rects):
        shape = predictor(mono, rect)
        shape = face_utils.shape_to_np(shape)
        (x, y, w, h) = face_utils.rect_to_bb(rect)
        box_label(disp, x, y, x + w, y + h, str(i))

        j = 0    
        for (x, y) in shape:
            j = j + 1
            if ( j > 36 and j < 49): 
                cv2.putText(disp, str(j), (x, y - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
                cv2.circle(disp, (x, y), 2, (0, 255, 0), -1)
 
    cv2.imshow("", disp)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

v.release()
cv2.destroyAllWindows()

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