トップページ人工知能,実世界DB顔情報(顔検出,顔識別、表情判定,顔のクラスタリングや類似度や分類,肌色部分の抽出,瞳孔の検出,顔姿勢の推定)顔のランドマーク(68 ランドマーク)の取得(Dlib,Python を使用)(Windows 上)

顔のランドマーク(68 ランドマーク)の取得(Dlib,Python を使用)(Windows 上)

Dlibは,数多くの機能を持つ C++ ライブラリ.機能には,機械学習,数値計算,グラフィカルモデル推論,画像処理,スレッド,通信,GUI,データ圧縮・一貫性,テスト,さまざまなユーティリティなどがある.Python API もある.

Dlib を用いて、次のことを行う

【サイト内の関連ページ】

先人に感謝

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

前準備

Python のインストール,pip と setuptools の更新,Python 開発環境

Python の URL: http://www.python.org/

【Python, pip の使い方】

Python, pip は,次のコマンドで起動できる.

Python 開発環境のインストール】

Dlib のインストール

Dlib は c:\dlib にインストールされているとして,以下,説明する.

Git のインストール

imutils のインストール

  1. Windows で,コマンドプロンプト管理者として実行する.

    [image]
  2. imutils のインストール
    mkdir c:\pytools
    cd c:\pytools
    rmdir /s /q imutils
    

    [image]

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

    [image]
    (以下省略)
  3. imutils のバージョン確認

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

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

    [image]

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

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

ここで使用する mp4 形式ビデオファイル: sample1.mp4

[image]

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

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

作業手順

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

    [image]
  2. このディレクトリに,sample1.mp4, , 127.png を、C:\face-image の下にダウンロード

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

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

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

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

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

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

    [image]
  4. 学習済みデータ shape_predictor_68_face_landmarks.dat のファイルを c:\dlib\python_examples に置く

    c:\dlib が無いときは作る

    [image]

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

Python プログラムを動かす.

Python プログラムを動かすために, Windows では「python」, Ubuntu では「python3」などのコマンドを使う.

あるいは, 開発環境や Python コンソール(Jupyter Qt ConsoleSpyderPyCharmPyScripter など)の利用も便利である.

あるいは,オンラインで動くGoogle Colaboratory のノートブックの利用も,場合によっては便利である.

  1. 顔画像ファイル 126.png を読み込んで、濃淡画像に変換してみる
    import numpy as np
    import dlib
    import cv2
    import imutils
    from imutils import face_utils
    img = cv2.imread("c:/image/126.png")
    mono = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imshow("", mono)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    ※ 「import dlib」でエラーメッセージが出るときの対処

    Dlib のインストールを行うこと.(このWebページにある「前準備」も行うこと)

    [image]

    [image]

    画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

  2. 顔検出

    引き続き,次のプログラムを実行

    detector = dlib.get_frontal_face_detector()
    rects = detector(mono, 1)
    print(rects)
    

    [image]

    結果が数値で表示される

  3. 68 ランドマークの結果を表示

    ※ 「C:/pytools/dlib/python_examples」のところには、さきほどファイルを置いた作業用ディレクトリを設定すること

    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)
    
    disp = img.copy()
    predictor = dlib.shape_predictor('C:/pytools/dlib/python_examples/shape_predictor_68_face_landmarks.dat')
    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
            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)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    [image]

    画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

  4. 右目と左目の情報のみを表示

    「if ( j > 36 and j < 49): 」を追加

    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)
    
    disp = img.copy()
    predictor = dlib.shape_predictor('C:/pytools/dlib/python_examples/shape_predictor_68_face_landmarks.dat')
    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)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    [image]

    画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

ビデオで行ってみる

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:/pytools/dlib/python_examples/shape_predictor_68_face_landmarks.dat')


v = cv2.VideoCapture("c:/image/sample1.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()

[image]

※ 止めたいとき,右上の「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:/pytools/dlib/python_examples/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」のキーを押して閉じる

[image]