トップページ情報工学を学ぶ人工知能の実行,Python プログラム (Windows 上)Dlib による顔の 68 ランドマークの Python プログラム(Dlib, Python を使用)(Windows 上)

Dlib による顔の 68 ランドマークの Python プログラム(Dlib, Python を使用)(Windows 上)

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

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

サイト内の関連ページ

先人に感謝

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

前準備

Build Tools for Visual Studio 2022 (ビルドツール for Visual Studio 2022)のインストール(Windows 上)

Build Tools for Visual Studio は,Windows で動くMicrosoft の C++ コンパイラーである.

Build Tools for Visual Studio 2022 (ビルドツール for Visual Studio 2022)のダウンロードページ

https://visualstudio.microsoft.com/ja/downloads/

インストール手順の詳細(別ページ)

Build Tools for Visual Studio 2022 (ビルドツール for Visual Studio 2022)のインストール: 別ページで説明している.

インストール手順の概要

  1. ダウンロード URL を開く

    https://visualstudio.microsoft.com/ja/downloads/

  2. このページの下の方の「Visual Studio 2022用のツール」を展開

    [image]
  3. Build Tools for Visual Studio 2022」の右の「ダウンロード」をクリック.

    [image]
  4. ダウンロードが始まる

    [image]
  5. ダウンロードした .exe ファイルを実行する
  6. 表示を確認し,「続行」をクリック

    [image]
  7. C++ によるデスクトップ開発」をクリック.「インストール」をクリック.

    [image]
  8. ダウンロードとインストールが始まる
  9. インストール終了の確認

Git のインストール

7-Zip のインストール

7-Zip のページ: https://sevenzip.osdn.jp/ からダウンロードしてインストールする.

Python 64 ビット版のインストール,pip と setuptools の更新(Windows 上)

Windows での Python 3.10 のインストール,pip と setuptools の更新: 別ページで説明している.

Python の公式ページ: http://www.python.org/

Dlib のインストール

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

    Windowspip を実行するときは,コマンドプロンプト管理者として実行し,それを使って pip を実行することにする.

    コマンドプロンプトを管理者として実行: 別ページで説明している.

  2. 次のコマンドを実行.
    python -m pip install -U dlib
    

Dlib のソースコード等と,Dlib の学習済みモデルのダウンロード

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

    コマンドプロンプトを管理者として実行: 別ページで説明している.

  2. Dlib のソースコード等のダウンロード

    端末で,次のコマンドを実行..

    cd %HOMEPATH%
    rmdir /s /q dlib
    git clone https://github.com/davisking/dlib
    
  3. Dlib の学習済みモデルのダウンロード

    端末で,次のコマンドを実行..

    cd %HOMEPATH%
    cd dlib
    cd python_examples
    curl -O http://dlib.net/files/mmod_human_face_detector.dat.bz2
    curl -O http://dlib.net/files/dlib_face_recognition_resnet_model_v1.dat.bz2
    curl -O http://dlib.net/files/shape_predictor_5_face_landmarks.dat.bz2
    curl -O http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
    "c:\Program Files\7-Zip\7z.exe" x mmod_human_face_detector.dat.bz2
    "c:\Program Files\7-Zip\7z.exe" x dlib_face_recognition_resnet_model_v1.dat.bz2
    "c:\Program Files\7-Zip\7z.exe" x shape_predictor_5_face_landmarks.dat.bz2
    "c:\Program Files\7-Zip\7z.exe" x shape_predictor_68_face_landmarks.dat.bz2
    del mmod_human_face_detector.dat.bz2
    del dlib_face_recognition_resnet_model_v1.dat.bz2
    del shape_predictor_5_face_landmarks.dat.bz2
    del shape_predictor_68_face_landmarks.dat.bz2
    

imutils のインストール

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

    コマンドプロンプトを管理者として実行: 別ページで説明している.

  2. imutils のインストール
    cd %HOMEPATH%
    rmdir /s /q imutils
    

    [image]

    cd %HOMEPATH%
    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

[image]

[image]

作業手順

  1. Windows のコマンドプロンプトを開く
  2. ダウンロード

    端末で,次のコマンドを実行..

    cd %HOMEPATH%
    cd dlib
    cd python_examples
    curl -O https://www.kkaneko.jp/sample/face/126.png
    curl -O https://www.kkaneko.jp/sample/face/127.png
    curl -O https://www.kkaneko.jp/sample/face/sample1.mp4
    

Python プログラム

濃淡画像に変換して表示する Python プログラム

顔画像ファイル 126.png を読み込んで、濃淡画像に変換してみる

Python プログラムの実行

Python プログラムの実行

Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.

Python のまとめ: 別ページにまとめている.

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

cd %HOMEPATH%\dlib
python

次の Python プログラムを実行

import numpy as np
import dlib
import cv2
import imutils
from imutils import face_utils
img = cv2.imread("./python_examples/126.png")
mono = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("", mono)
cv2.waitKey(0)
cv2.destroyAllWindows()
exit()

[image]

[image]

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

顔検出の Python プログラム

Python プログラムの実行

Python プログラムの実行

Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.

Python のまとめ: 別ページにまとめている.

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

cd %HOMEPATH%\dlib
python

次の Python プログラムを実行

import numpy as np
import dlib
import cv2
import imutils
from imutils import face_utils
img = cv2.imread("./python_examples/126.png")
mono = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

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

結果が数値で表示される

[image]

顔検出の68 ランドマークの Python プログラム

Python プログラムの実行

Python プログラムの実行

Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.

Python のまとめ: 別ページにまとめている.

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

cd %HOMEPATH%\dlib
python

次の Python プログラムを実行

import numpy as np
import dlib
import cv2
import imutils
from imutils import face_utils
img = cv2.imread("./python_examples/126.png")
mono = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

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

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('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()
exit()

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

[image]

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

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

Python プログラムの実行

Python プログラムの実行

Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.

Python のまとめ: 別ページにまとめている.

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

python

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

cd %HOMEPATH%\dlib
python

次の Python プログラムを実行

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

import numpy as np
import dlib
import cv2
import imutils
from imutils import face_utils
img = cv2.imread("./python_examples/126.png")
mono = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

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

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('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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

ビデオで行ってみる

Python プログラムの実行

Python プログラムの実行

Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.

Python のまとめ: 別ページにまとめている.

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

cd %HOMEPATH%\dlib
python

次の Python プログラムを実行

OpenCV による動画表示を行う.

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('python_examples/shape_predictor_68_face_landmarks.dat')


v = cv2.VideoCapture("./python_examples/sample1.mp4")
while(v.isOpened()):
    r, f = v.read()
    if ( r == False ):
        break
    mono = cv2.cvtColor(f, 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(f, 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(f, str(j), (x, y - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
                cv2.circle(f, (x, y), 2, (0, 255, 0), -1)
    cv2.imshow("", f)
    # Press Q to exit
    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('python_examples/shape_predictor_68_face_landmarks.dat')


v = cv2.VideoCapture(0)
while(v.isOpened()):
    r, f = v.read()
    if ( r == False ):
        break
    mono = cv2.cvtColor(f, 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(f, 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(f, str(j), (x, y - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
                cv2.circle(f, (x, y), 2, (0, 255, 0), -1)
    cv2.imshow("", f)
    # Press Q to exit
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

v.release()
cv2.destroyAllWindows()

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

[image]