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

1. エグゼクティブサマリー

本記事では,Dlib と Python を用いて,Windows 上で顔検出および顔ランドマーク検出を行う方法を示す.環境構築からプログラムの実行までの手順を扱う.

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

顔検出 (face detection):Dlib には Convolutional Neural Network (CNN) による顔検出機能がある.

Dlib による顔検出の例

顔検出により,顔を囲むバウンディングボックス (bounding box) が表示される.

バウンディングボックスの座標値が数値データとして得られる.

顔ランドマークの検出 (face landmark detection):画像から最大 68 のランドマーク (68 landmarks) を得る機能である.tree structured part model を用いる.

顔のランドマーク検出により,バウンディングボックスと顔のランドマーク表示される.

本記事のプログラムでは,静止画像での顔検出,68 ランドマークの描画,目の領域のみの表示,ビデオファイルおよびビデオカメラからのリアルタイム処理,顔領域の切り出し保存,ランドマーク座標の CSV 出力を行う.

目次
  1. エグゼクティブサマリー
  2. 前準備(必要ソフトウェアの入手)
  3. 実行のための準備とその確認手順(Windows 前提)
  4. 概要・使い方・実行上の注意
  5. ソースコード
  6. まとめ
サイト内の関連ページ

2. 前準備(必要ソフトウェアの入手)

ここでは、最低限の事前準備について説明する。機械学習や深層学習を行う場合は、NVIDIA CUDA、Visual Studio、Cursorなどを追加でインストールすると便利である。これらについては別ページ https://www.kkaneko.jp/cc/dev/aiassist.htmlで詳しく解説しているので、必要に応じて参照してください。

Build Tools for Visual Studio 2026 のインストール(Windows 上) [クリックして展開]

Build Tools for Visual Studio は,Visual Studio の IDE を含まない C/C++ コンパイラ,ライブラリ,ビルドツール等のコマンドライン向け開発ツールセットである。インストール済みの場合、この手順は不要である。

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

REM VC++ ランタイム
winget install --scope machine --id Microsoft.VCRedist.2015+.x64 -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/quiet /norestart"

REM Build Tools + Desktop development with C++(VCTools)+ 追加コンポーネント(一括)
winget install --scope machine --id Microsoft.VisualStudio.BuildTools -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "--quiet --wait --norestart --nocache --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100"

--add で追加されるコンポーネント

上記のコマンドでは,まず Build Tools 本体と Visual C++ 再頒布可能パッケージをインストールし,次に setup.exe を用いて以下のコンポーネントを追加している。

インストール完了の確認

winget list Microsoft.VisualStudio.BuildTools

上記以外の追加のコンポーネントが必要になった場合は Visual Studio Installer で個別にインストールできる。

Visual Studio の機能を必要とする場合は、追加インストールできる。

Python 3.12 のインストール(Windows 上) [クリックして展開]

以下のいずれかの方法で Python 3.12 をインストールする。Python がインストール済みの場合、この手順は不要である。

方法1:winget によるインストール

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

winget install --scope machine --id Python.Python.3.12 -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_pip=1 Include_test=0 Include_launcher=1 InstallLauncherAllUsers=1"

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。

方法2:インストーラーによるインストール

  1. Python 公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」に必ずチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから python コマンドを実行できない。
  4. 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。

インストールの確認

コマンドプロンプトで以下を実行する。

python --version

バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。

AIエディタ Windsurf のインストール(Windows 上) [クリックして展開]

Pythonプログラムの編集・実行には、AIエディタの利用を推奨する。ここでは、Windsurfのインストールを説明する。Windsurf がインストール済みの場合、この手順は不要である。

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

winget install --scope machine --id Codeium.Windsurf -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/SP- /SUPPRESSMSGBOXES /NORESTART /CLOSEAPPLICATIONS /DIR=""C:\Program Files\Windsurf"" /MERGETASKS=!runcode,addtopath,associatewithfiles,!desktopicon"
powershell -Command "$env:Path=[System.Environment]::GetEnvironmentVariable('Path','Machine')+';'+[System.Environment]::GetEnvironmentVariable('Path','User'); windsurf --install-extension MS-CEINTL.vscode-language-pack-ja --force; windsurf --install-extension ms-python.python --force; windsurf --install-extension Codeium.windsurfPyright --force"

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。

関連する外部ページ

Windsurf の公式ページ: https://windsurf.com/

Git のインストール(Windows 上) [クリックして展開]

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

REM Git をシステム領域にインストール
winget install --scope machine --id Git.Git -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/VERYSILENT /NORESTART /NOCANCEL /SP- /CLOSEAPPLICATIONS /RESTARTAPPLICATIONS /COMPONENTS=""icons,ext\reg\shellhere,assoc,assoc_sh"" /o:PathOption=Cmd /o:CRLFOption=CRLFCommitAsIs /o:BashTerminalOption=MinTTY /o:DefaultBranchOption=main /o:EditorOption=VIM /o:SSHOption=OpenSSH /o:UseCredentialManager=Enabled /o:PerformanceTweaksFSCache=Enabled /o:EnableSymlinks=Disabled /o:EnableFSMonitor=Disabled"

7-Zip のインストール(Windows 上) [クリックして展開]

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

REM 7-Zip をシステム領域にインストール
winget install --scope machine --id 7zip.7zip -e --silent --installer-type msi --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/qn /norestart"
REM 7-Zip のパス設定
powershell -NoProfile -Command "$p='C:\Program Files\7-Zip'; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $p) -and $c -notlike \"*$p*\"){[Environment]::SetEnvironmentVariable('Path',\"$p;$c\",'Machine')}"

Dlib ライブラリのインストールと学習済みモデルのダウンロード [クリックして展開]

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

Dlib ライブラリのインストール

python -m pip uninstall -y dlib
cd C:\
rmdir /s /q dlib
git clone https://github.com/davisking/dlib
cd C:\dlib
python setup.py build --no DLIB_GIF_SUPPORT
python setup.py install --no DLIB_GIF_SUPPORT

インストールの確認

バージョン番号が表示されれば OK である.下の図とは異なるバージョンが表示されることがある.
python -c "import dlib; print( dlib.__version__ )"

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

cd C:\
rmdir /s /q dlib
git clone https://github.com/davisking/dlib

学習済みモデルのダウンロード

cd C:\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

Dlib の動作確認

次を実行し,エラーメッセージが出ずに顔検出の結果が表示されれば OK とする.

cd C:\dlib
cd python_examples
python cnn_face_detector.py mmod_human_face_detector.dat ..\examples\faces\2007_007763.jpg

imutils のインストール [クリックして展開]

管理者権限コマンドプロンプトで以下を実行する(手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」).

  1. imutils のインストール
    cd /d c:%HOMEPATH%
    rmdir /s /q imutils
    
    cd /d c:%HOMEPATH%
    git clone https://github.com/jrosebr1/imutils
    cd imutils
    python setup.py build
    python setup.py install
    

    (以下省略)
  2. imutils のバージョン確認

    Windowsコマンドプロンプトで次を実行する.

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

3. 実行のための準備とその確認手順(Windows 前提)

3.1 プログラムファイルの準備

第5章のソースコードをテキストエディタ(メモ帳,Windsurf 等)に貼り付け,以下のファイル名で C:\dlib に保存する(文字コード:UTF-8).

ファイル名内容
5.1grayscale.py濃淡画像に変換して表示
5.2face_detect.py顔検出
5.3landmarks68.py68 ランドマークの描画
5.4eyes_only.py右目と左目の情報のみ表示
5.5video_landmarks.pyビデオで顔ランドマーク検出
5.6camera_landmarks.pyビデオカメラで顔ランドマーク検出
5.7face_crop.py顔領域を切り出して保存
5.8landmarks_csv.pyランドマーク座標を CSV 出力

Python の対話モード(python を実行して >>> プロンプトに直接入力する方法)でも実行できる.その場合はファイルへの保存は不要である.

3.2 実行コマンド

コマンドプロンプトで保存先ディレクトリに移動し,以下を実行する.

cd C:\dlib
python grayscale.py

他のプログラムも同様に,python face_detect.pypython landmarks68.py 等で実行する.

3.3 動作確認チェックリスト

確認項目期待される結果
濃淡画像変換(5.1)126.png が濃淡画像に変換され,ウインドウに表示される
顔検出(5.2)バウンディングボックスの座標値(rects)が数値で表示される
68 ランドマーク(5.3)バウンディングボックスと 68 個のランドマーク(番号付き)が画像上に表示される
目の領域のみ(5.4)ランドマーク 37〜48 番(目の領域)のみが表示される
ビデオ処理(5.5)sample1.mp4 の各フレームで顔ランドマーク検出が行われ,動画として表示される
ビデオカメラ(5.6)USB カメラからリアルタイムで顔ランドマーク検出が行われ,表示される
顔領域切り出し(5.7)各顔が face_0.png, face_1.png, ... として保存され,ウインドウに表示される
CSV 出力(5.8)landmarks.csv に顔番号,ランドマーク番号,x 座標,y 座標が記録される

4. 概要・使い方・実行上の注意

顔写真とビデオの準備

mp4 形式動画ファイル: sample1.mp4

顔写真: 126.png, 127.png

Windowsコマンドプロンプトで次を実行してダウンロードする.

cd C:\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

各プログラムの概要

濃淡画像変換(5.1):顔画像 126.png を読み込み,濃淡画像に変換して表示する.

顔検出(5.2)dlib.get_frontal_face_detector() で顔を検出し,結果を数値で表示する.

68 ランドマーク(5.3):顔検出に加え,shape_predictor_68_face_landmarks.dat で 68 ランドマークを描画する.

目の領域のみ表示(5.4):68 ランドマークのうち目の領域(37〜48番)のみを表示する.if 36 < j < 49: という条件で絞り込んでいる.

ビデオ処理(5.5)OpenCV による動画表示で,ビデオファイル sample1.mp4 の各フレームに対して顔ランドマーク検出を行う.

ビデオカメラ(5.6):USB 接続のビデオカメラをパソコンに接続して使用する.cv2.VideoCapture(0) で設定している.他はビデオ版と同じである.

顔領域切り出し(5.7):バウンディングボックスの領域を画像から切り出し,ファイルに保存する.複数の顔が検出された場合は,それぞれ face_0.png, face_1.png, ... として個別に保存される.

CSV 出力(5.8):68 ランドマークの座標を CSV(Comma-Separated Values; カンマ区切り値)ファイルとして出力する.得られた座標データは,顔の特徴分析や機械学習の入力データとして活用できる.

実行上の注意

画像表示プログラムでは,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

ビデオ・ビデオカメラのプログラムでは,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

ソースコードは第5章に掲載している.

5. ソースコード

5.1 濃淡画像に変換して表示

顔画像 126.png を読み込み,濃淡画像に変換して表示する.

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

cd C:\dlib
python

次の Python プログラムを実行する.

import dlib
import cv2
img = cv2.imread("./python_examples/126.png")
mono = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("", mono)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

5.2 顔検出

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

cd C:\dlib
python

次の Python プログラムを実行する.

import dlib
import cv2
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)

結果が数値で表示される.

5.3 68 ランドマーク

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

cd C:\dlib
python

次の Python プログラムを実行する.

import dlib
import cv2
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)

def box_label(bgr, x1, y1, x2, y2, label):
    cv2.rectangle(bgr, (x1, y1), (x2, y2), (255, 0, 0), 1, 1)
    cv2.rectangle(bgr, (x1, y1 - 25), (x2, y1), (255, 255, 255), -1)
    cv2.putText(bgr, label, (x1, 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 = face_utils.shape_to_np(predictor(mono, rect))
    (x, y, w, h) = face_utils.rect_to_bb(rect)
    box_label(disp, x, y, x + w, y + h, str(i))
    for j, (px, py) in enumerate(shape, 1):
        cv2.putText(disp, str(j), (px, py - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
        cv2.circle(disp, (px, py), 2, (0, 255, 0), -1)

cv2.imshow("", disp)
cv2.waitKey(0)
cv2.destroyAllWindows()

68 ランドマークの結果が表示される.

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

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

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

cd C:\dlib
python

次の Python プログラムを実行する.目の領域(37〜48番)のみを表示するため,if 36 < j < 49: という条件を追加している.

import dlib
import cv2
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)

def box_label(bgr, x1, y1, x2, y2, label):
    cv2.rectangle(bgr, (x1, y1), (x2, y2), (255, 0, 0), 1, 1)
    cv2.rectangle(bgr, (x1, y1 - 25), (x2, y1), (255, 255, 255), -1)
    cv2.putText(bgr, label, (x1, 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 = face_utils.shape_to_np(predictor(mono, rect))
    (x, y, w, h) = face_utils.rect_to_bb(rect)
    box_label(disp, x, y, x + w, y + h, str(i))
    for j, (px, py) in enumerate(shape, 1):
        if 36 < j < 49:
            cv2.putText(disp, str(j), (px, py - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
            cv2.circle(disp, (px, py), 2, (0, 255, 0), -1)

cv2.imshow("", disp)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

5.5 ビデオで顔ランドマーク検出

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

cd C:\dlib
python

次の Python プログラムを実行する.OpenCV による動画表示を行う.

import dlib
import cv2
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, (x1, y1 - 25), (x2, y1), (255, 255, 255), -1)
    cv2.putText(bgr, label, (x1, 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 not r:
        break
    mono = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
    rects = detector(mono, 1)
    for i, rect in enumerate(rects):
        shape = face_utils.shape_to_np(predictor(mono, rect))
        (x, y, w, h) = face_utils.rect_to_bb(rect)
        box_label(f, x, y, x + w, y + h, str(i))
        for j, (px, py) in enumerate(shape, 1):
            if 36 < j < 49:
                cv2.putText(f, str(j), (px, py - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
                cv2.circle(f, (px, py), 2, (0, 255, 0), -1)
    cv2.imshow("", f)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

v.release()
cv2.destroyAllWindows()

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

5.6 ビデオカメラで顔ランドマーク検出

USB 接続のビデオカメラをパソコンに接続しておく.cv2.VideoCapture(0) で設定している.他はビデオ版と同じである.

import dlib
import cv2
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, (x1, y1 - 25), (x2, y1), (255, 255, 255), -1)
    cv2.putText(bgr, label, (x1, 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 not r:
        break
    mono = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
    rects = detector(mono, 1)
    for i, rect in enumerate(rects):
        shape = face_utils.shape_to_np(predictor(mono, rect))
        (x, y, w, h) = face_utils.rect_to_bb(rect)
        box_label(f, x, y, x + w, y + h, str(i))
        for j, (px, py) in enumerate(shape, 1):
            if 36 < j < 49:
                cv2.putText(f, str(j), (px, py - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
                cv2.circle(f, (px, py), 2, (0, 255, 0), -1)
    cv2.imshow("", f)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

v.release()
cv2.destroyAllWindows()

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

5.7 顔領域を切り出して保存

バウンディングボックスの領域を画像から切り出し,ファイルに保存する.複数の顔が検出された場合は,それぞれ個別のファイルとして保存する.

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

cd C:\dlib
python

次の Python プログラムを実行する.

import dlib
import cv2
from imutils import face_utils

img = cv2.imread("./python_examples/127.png")
mono = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
detector = dlib.get_frontal_face_detector()
rects = detector(mono, 1)
for i, rect in enumerate(rects):
    (x, y, w, h) = face_utils.rect_to_bb(rect)
    face = img[y:y+h, x:x+w]
    cv2.imwrite("face_{}.png".format(i), face)
    cv2.imshow("face_{}".format(i), face)

cv2.waitKey(0)
cv2.destroyAllWindows()

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

5.8 ランドマーク座標を CSV 出力

68 ランドマークの座標を CSV(Comma-Separated Values; カンマ区切り値)ファイルとして出力する.得られた座標データは,顔の特徴分析や機械学習の入力データとして活用できる.

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

cd C:\dlib
python

次の Python プログラムを実行する.

import csv
import dlib
import cv2
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()
predictor = dlib.shape_predictor("python_examples/shape_predictor_68_face_landmarks.dat")
rects = detector(mono, 1)
with open("landmarks.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["face", "landmark", "x", "y"])
    for i, rect in enumerate(rects):
        shape = face_utils.shape_to_np(predictor(mono, rect))
        for j, (px, py) in enumerate(shape, 1):
            writer.writerow([i, j, px, py])

print("landmarks.csv に出力完了")

landmarks.csv が作成される.顔番号,ランドマーク番号,x 座標,y 座標がカンマ区切りで記録される.

6. まとめ

Dlib ライブラリ:Dlib は,機械学習,数値計算,画像処理など数多くの機能を持つ C++ ライブラリであり,Python API もある.

顔検出:Dlib の CNN による顔検出機能で,顔を囲むバウンディングボックスが表示され,その座標値が数値データとして得られる.

顔ランドマークの検出:tree structured part model により,画像から最大 68 のランドマークを得る.バウンディングボックスとランドマークが画像上に表示される.

静止画像とビデオへの適用:静止画像に対する顔検出と 68 ランドマーク描画に加え,ビデオファイルおよびビデオカメラからのリアルタイム処理にも対応している.OpenCV による動画表示で各フレームの顔ランドマーク検出を行う.

検出結果の活用:顔領域をバウンディングボックスに基づいて切り出し画像保存できる.また 68 ランドマーク座標を CSV 出力でき,顔の特徴分析や機械学習の入力データとして活用できる.