C++

【C++】dlibを最速で導入して顔認識を始める全手順

C++で顔認識や機械学習を取り入れるならdlibが最有力です。

ソースを取得してCMakeでビルドし、生成されたdlib.libとヘッダをプロジェクトに追加するだけで高性能なアルゴリズムをすぐ使えます。

OpenCVと組み合わせれば画像読み込みや前処理もスムーズに統合でき、WindowsとLinuxの両環境でほぼ同じ手順が通用します。

前提条件と推奨環境

dlibを使って顔認識を始めるにあたり、まずは開発環境の前提条件と推奨環境を整えることが重要です。

ここでは、必要なツールチェーンや依存ライブラリについて詳しく解説します。

必要なツールチェーン

dlibはC++で書かれているため、適切なコンパイラやビルドツールが必要です。

特にC++17に対応した環境を用意することが推奨されます。

C++17対応コンパイラ

dlibの最新バージョンはC++17の機能を活用しているため、C++17に対応したコンパイラが必須です。

以下のコンパイラが代表的です。

  • Windows環境

Visual Studio 2017以降のバージョンがC++17に対応しています。

Visual Studio 2019や2022を使うとより安定して動作します。

Visual Studioのインストール時に「C++によるデスクトップ開発」ワークロードを選択してください。

  • Linux環境

GCC 7以降、Clang 5以降がC++17に対応しています。

Ubuntu 18.04以降の標準GCCは7以上が多いので問題ありません。

コンパイラのバージョンはg++ --versionclang++ --versionで確認できます。

  • macOS環境

Xcode 10以降に付属するClangがC++17に対応しています。

macOSの最新バージョンを使う場合はXcodeのアップデートも忘れずに行いましょう。

CMakeバージョン要件

dlibのビルドにはCMakeが必要です。

CMakeはプロジェクトのビルド設定を自動化するツールで、dlibの公式ドキュメントでは最低でもバージョン3.1以上を推奨しています。

  • 推奨バージョン

CMake 3.15以上を使うと、より新しい機能やバグ修正が含まれているため安定してビルドできます。

  • インストール方法
    • Windows:公式サイト(https://cmake.org/download/)からインストーラーをダウンロードしてインストールします
    • Linux:sudo apt install cmake(Ubuntuの場合)やsudo yum install cmake(CentOSの場合)でインストール可能です
    • macOS:Homebrewを使う場合はbrew install cmakeでインストールできます
  • バージョン確認

インストールしたらコマンドラインでcmake --versionを実行して、インストール済みのバージョンを確認してください。表示されたらインストールに成功しています。

cmake version 4.0.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).

Pythonバインディングの利用可否

dlibはC++ライブラリですが、Pythonバインディングも提供されています。

C++での開発がメインの場合は必須ではありませんが、Pythonでのプロトタイピングやテストを行いたい場合はPythonバインディングの利用を検討してください。

  • Pythonバインディングの特徴
    • Pythonからdlibの機能を呼び出せるため、顔認識のアルゴリズムを簡単に試せます
    • C++の高速性とPythonの簡便性を両立できます
  • 利用条件
    • Python 3.6以降が推奨されます
    • CMakeでDLIB_USE_CUDADLIB_USE_BLASなどのオプションを有効にしてビルドする必要があります
    • Pythonの開発ヘッダーやnumpyなどの依存パッケージも必要です
  • 注意点
    • PythonバインディングのビルドはC++のビルドよりも複雑になることがあります
    • Windows環境ではVisual StudioのバージョンとPythonのビット数(32bit/64bit)が一致している必要があります

依存ライブラリの選定

dlib単体でも顔認識は可能ですが、実際の開発では他のライブラリと組み合わせることで利便性や性能が向上します。

ここでは特にOpenCVとCUDA/cuDNNの活用について解説します。

OpenCVを併用するメリット

OpenCVは画像処理の定番ライブラリで、dlibと組み合わせることで以下のようなメリットがあります。

  • 画像の読み込み・表示が簡単

dlib単体でも画像の読み込みは可能ですが、OpenCVのimreadimshowを使うと多彩な画像フォーマットに対応しやすく、GUI表示も簡単です。

  • 画像前処理の豊富な機能

リサイズ、回転、色空間変換、フィルタリングなどの画像処理をOpenCVで行い、dlibの顔認識に渡すことで精度や速度の向上が期待できます。

  • 動画処理のサポート

Webカメラや動画ファイルからのフレーム取得が容易で、リアルタイム顔認識アプリケーションの開発に役立ちます。

  • CMakeでの連携がスムーズ

OpenCVはCMakeで簡単に検出できるため、dlibプロジェクトに組み込みやすいです。

OpenCVの導入は以下のように行います。

  • Windowsでは公式サイトからインストーラーやビルド済みバイナリを入手可能です
  • Linux/macOSではパッケージマネージャーやソースビルドでインストールできます
  • CMakeLists.txtでfind_package(OpenCV REQUIRED)を使い、リンク設定を行います

CUDA・cuDNNによる高速化

顔認識の推論処理は計算負荷が高いため、GPUを活用すると大幅に高速化できます。

dlibはCUDAを利用したGPUアクセラレーションに対応しています。

  • CUDAとは

NVIDIA製GPU向けの並列計算プラットフォームで、深層学習や画像処理の高速化に使われます。

  • cuDNNとは

NVIDIAが提供する深層学習向けのGPUアクセラレーションライブラリで、畳み込みニューラルネットワークの処理を最適化します。

  • dlibでの利用方法
    • CUDA対応GPUが搭載された環境で、CUDA ToolkitとcuDNNをインストールします
    • CMakeのオプションDLIB_USE_CUDA=ONを有効にしてビルドします
    • GPUを使うことで顔認識の推論速度が数倍から数十倍に向上します
  • 注意点
    • CUDA対応GPUがない場合はCPUモードで動作します
    • CUDAのバージョンとドライバの互換性に注意してください
    • Windows環境ではVisual StudioのバージョンとCUDA Toolkitの対応表を確認することが重要です
  • 導入例

CUDA 11.0、cuDNN 8.0をインストールし、CMakeで以下のように指定します。

cmake -G "Visual Studio 16 2019" -A x64 -DDLIB_USE_CUDA=ON ..

これにより、dlibの顔認識処理がGPUで高速に実行できるようになります。

これらの前提条件と推奨環境を整えることで、dlibを使った顔認識開発がスムーズに進みます。

特にC++17対応のコンパイラとCMakeの適切なバージョン、OpenCVやCUDAの活用は開発効率と性能向上に直結します。

次のステップでは、dlibの取得方法やビルド設定について詳しく見ていきましょう。

dlibの取得方法

dlibを使い始めるには、まずソースコードを入手する必要があります。

ここでは代表的な3つの方法を紹介します。

GitHubから最新版をクローン

dlibの公式リポジトリはGitHub上に公開されており、最新の開発版を取得したい場合はGitを使ってクローンします。

これにより、常に最新の機能や修正を取り込めます。

  1. Gitがインストールされていることを確認します。

コマンドラインで以下を実行し、バージョンが表示されればOKです。

git --version
  1. 任意の作業ディレクトリに移動し、以下のコマンドでdlibをクローンします。
git clone https://github.com/davisking/dlib.git
  1. クローンが完了すると、dlibフォルダが作成され、その中に最新のソースコードが格納されます。
  2. 必要に応じて特定のブランチやタグに切り替えたい場合は、以下のようにします。
cd dlib
git checkout tags/v19.24

この方法は最新の修正を取り込みたい場合や、開発に参加したい場合に適しています。

Releaseアーカイブをダウンロード

安定版の特定バージョンを使いたい場合は、GitHubのReleaseページからアーカイブをダウンロードする方法が便利です。

  1. dlibのGitHubリポジトリのReleaseページにアクセスします。

https://github.com/davisking/dlib/releases

  1. 利用したいバージョンのzipまたはtar.gzファイルをダウンロードします。

例:dlib-19.24.zip

  1. ダウンロードしたアーカイブを任意の場所に解凍します。
  2. 解凍したフォルダ内にソースコードが含まれているため、そのままビルドやプロジェクトへの組み込みに使えます。

この方法は安定したバージョンを使いたい場合や、ネットワーク環境が制限されている場合に適しています。

サブモジュールとして組み込む

既存のC++プロジェクトにdlibを組み込みたい場合、Gitのサブモジュール機能を使うと管理が楽になります。

これにより、dlibのソースコードをプロジェクトの一部として扱えます。

  1. プロジェクトのルートディレクトリに移動します。
  2. 以下のコマンドでdlibをサブモジュールとして追加します。
git submodule add https://github.com/davisking/dlib.git external/dlib
  1. サブモジュールを初期化・更新します。
git submodule update --init --recursive
  1. CMakeLists.txtなどのビルド設定で、external/dlibのパスを指定してdlibをビルド対象に含めます。

この方法はプロジェクトの依存関係を明確に管理でき、チーム開発やCI環境での再現性を高めるのに役立ちます。

これらの方法でdlibのソースコードを入手し、次のステップでビルドやプロジェクトへの組み込みを進めてください。

ビルド設定のポイント

dlibを効率よくビルドするためには、CMakeのオプション設定やプラットフォームごとの注意点を押さえることが重要です。

ここでは主要なCMakeオプションの意味と、Windows、Linux、macOSそれぞれの環境での設定ポイントを解説します。

CMakeオプション解説

dlibのビルド時に指定できるCMakeオプションは多岐にわたりますが、特に重要なものをピックアップして説明します。

BUILD_SHARED_LIBSの選択

BUILD_SHARED_LIBSは、dlibを静的ライブラリ.lib.aとしてビルドするか、共有ライブラリ.dll.soとしてビルドするかを切り替えるオプションです。

  • ONに設定した場合

dlibを共有ライブラリとしてビルドします。

  • メリット
    • 複数のプロジェクトで同じdlibのDLLを共有できるため、ディスク容量やメモリ使用量が節約できます
    • ライブラリの更新が容易
  • デメリット
    • 実行時にDLLが必要になるため、配布時にDLLの管理が必要でしょう
    • Windows環境ではDLLのパス設定に注意が必要でしょう
  • OFFに設定した場合(デフォルト)

静的ライブラリとしてビルドします。

  • メリット
    • 実行ファイルにライブラリが組み込まれるため、配布が簡単
    • DLLの依存関係トラブルが起きにくい
  • デメリット
    • 実行ファイルのサイズが大きくなります
    • 複数プロジェクトで同じライブラリを使う場合、重複してビルドされます

設定例

CMakeコマンドで共有ライブラリをビルドする場合は以下のように指定します。

cmake -DBUILD_SHARED_LIBS=ON ..

用途や配布形態に応じて使い分けてください。

DLIB_USE_CUDAの切り替え

DLIB_USE_CUDAは、CUDAを使ってGPUアクセラレーションを有効にするかどうかを指定するオプションです。

  • ONに設定した場合
    • CUDA対応GPUがある環境でdlibの一部処理がGPUで高速化されます
    • CUDA Toolkitと対応するドライバ、cuDNNがインストールされている必要があります
    • ビルド時間が長くなることがあります
  • OFFに設定した場合(デフォルト)
    • CPUのみでビルドされます
    • GPUがない環境でも問題なく動作します

設定例

CUDAを有効にしてビルドする場合は以下のように指定します。

cmake -DDLIB_USE_CUDA=ON ..

CUDA環境が整っている場合はONにすると顔認識の推論速度が大幅に向上します。

マルチプラットフォームへの配慮

dlibはWindows、Linux、macOSの主要なプラットフォームで動作しますが、それぞれ特有の設定や注意点があります。

Windows特有の設定

  • Visual Studioのバージョン指定

CMakeのジェネレータでVisual Studioのバージョンを明示的に指定します。

cmake -G "Visual Studio 16 2019" -A x64 ..

64bit環境の場合は-A x64を忘れずに指定してください。

  • ランタイムライブラリの設定

Visual Studioのプロジェクト設定で、ランタイムライブラリ(/MD, /MTなど)をdlibとプロジェクトで統一することが重要です。

異なる設定だとリンクエラーや実行時エラーが発生します。

  • DLLのパス設定

BUILD_SHARED_LIBS=ONでビルドした場合、実行時にDLLのパスが通っていないとエラーになります。

  • 実行ファイルのあるディレクトリにDLLを置く
  • 環境変数PATHにDLLのパスを追加する
  • OpenCVとの連携

OpenCVを使う場合は、OpenCVのDLLも同様にパスを通す必要があります。

Linuxでの依存解決

  • 必要なパッケージのインストール

dlibのビルドにはbuild-essentialcmakelibboost-all-devlibx11-devlibgtk-3-devなどが必要です。

Ubuntuの場合は以下のコマンドでまとめてインストールできます。

sudo apt update
sudo apt install build-essential cmake libboost-all-dev libx11-dev libgtk-3-dev
  • OpenBLASやOpenCVのインストール

高速化や画像処理のためにOpenBLASやOpenCVを使う場合は別途インストールしてください。

  • CMakeのジェネレータ

通常はUnix Makefilesが使われます。

cmake ..
make -j$(nproc)
  • ライブラリパスの設定

共有ライブラリを使う場合はLD_LIBRARY_PATHにパスを追加するか、/etc/ld.so.conf.dに設定を追加してldconfigを実行します。

macOSでのXcodeプロジェクト

  • Xcodeのインストール

App StoreからXcodeをインストールし、コマンドラインツールも有効にします。

xcode-select --install
  • CMakeジェネレータの指定

Xcode用のプロジェクトを生成する場合は以下のように指定します。

cmake -G Xcode ..
  • ビルド方法

XcodeのGUIからビルドするか、コマンドラインでxcodebuildを使います。

xcodebuild -configuration Release
  • OpenCVのインストール

Homebrewを使うと簡単です。

brew install opencv
  • ライブラリパスの設定

macOSではDYLD_LIBRARY_PATHを設定するか、install_name_toolで実行ファイルの依存パスを修正します。

これらのポイントを踏まえてCMakeの設定を行うことで、環境に最適化されたdlibのビルドが可能になります。

特にCUDAの有効化や共有ライブラリの選択は、用途や配布形態に応じて慎重に設定してください。

IDEごとの導入フロー

dlibをC++プロジェクトに組み込む際、使うIDEによって設定方法が異なります。

ここではVisual Studio 2022、CLion、Qt Creatorの3つの主要なIDEでの導入手順を詳しく説明します。

Visual Studio 2022

Visual StudioはWindows環境で最も使われるIDEの一つです。

dlibを組み込む際のポイントを押さえましょう。

プロジェクト設定の変更

  1. プロジェクトの作成

Visual Studio 2022で「空のC++プロジェクト」を作成します。

プロジェクトのプラットフォームは64bit(x64)を選択してください。

  1. インクルードディレクトリの追加
  • ソリューションエクスプローラーでプロジェクトを右クリックし、「プロパティ」を開きます
  • 「構成プロパティ」→「C/C++」→「全般」→「追加のインクルードディレクトリ」にdlibのincludeディレクトリのパスを追加します

例:C:\path\to\dlib

  1. プリプロセッサ定義の確認

特に必要な定義はありませんが、CUDAを使う場合はDLIB_USE_CUDAを定義することがあります。

「C/C++」→「プリプロセッサ」→「プリプロセッサ定義」に追加してください。

  1. C++言語標準の設定

「C/C++」→「言語」→「C++言語標準」でISO C++17 標準(std:c++17)を選択します。

追加のリンカ入力

  1. ライブラリディレクトリの追加
  • 「構成プロパティ」→「リンカー」→「全般」→「追加のライブラリディレクトリ」にdlibのビルド済みライブラリのパスを追加します

例:C:\path\to\dlib\build\dlib\Release

  1. 追加の依存ファイル
  • 「リンカー」→「入力」→「追加の依存ファイル」にdlib.libを追加します
  • OpenCVを使う場合はOpenCVのライブラリファイルもここに追加してください

例:opencv_world451.lib

  1. ランタイムライブラリの統一
  • 「C/C++」→「コード生成」→「ランタイムライブラリ」をdlibのビルド時と同じ設定(例:/MD)に合わせます
  1. DLLの配置
  • 共有ライブラリ(DLL)を使う場合は、実行ファイルのあるフォルダにDLLを配置するか、環境変数PATHにDLLのパスを追加してください

CLion

CLionはJetBrainsが提供するクロスプラットフォームのC++ IDEで、CMakeをネイティブにサポートしています。

CMakeプロファイル最適化

  1. CMakeLists.txtの準備

dlibをサブディレクトリとして組み込む場合、以下のように記述します。

add_subdirectory(path/to/dlib)
target_link_libraries(your_target PRIVATE dlib::dlib)
  1. CMakeプロファイルの設定
  • CLionの「File」→「Settings」→「Build, Execution, Deployment」→「CMake」を開きます
  • 使用するCMakeバージョンを確認し、必要に応じて更新します
  • ビルドタイプ(Debug/Release)を選択します
  • CUDAを使う場合は、CMakeオプションに-DDLIB_USE_CUDA=ONを追加します
-DCMAKE_BUILD_TYPE=Release -DDLIB_USE_CUDA=ON
  1. 環境変数の設定
  • CUDAやOpenCVのパスが必要な場合は、環境変数PATH(Windows)やLD_LIBRARY_PATH(Linux/macOS)を設定してください
  • CLionの「Run/Debug Configurations」で環境変数を指定することも可能です
  1. ビルドと実行
  • プロジェクトをリロードし、ビルドボタンを押すとdlibがビルドされます
  • エラーが出た場合はCMakeのログを確認し、依存関係やパス設定を見直してください

Qt Creator

Qt CreatorはQtアプリケーション開発に特化したIDEですが、CMakeプロジェクトも扱えます。

Kit設定とインクルードパス

  1. Kitの選択
  • Qt Creatorの「ツール」→「オプション」→「Kits」で使用するコンパイラやCMakeのバージョンを確認します
  • 64bitのコンパイラを選択し、CMakeのパスも正しく設定してください
  1. プロジェクトのインポート
  • dlibを含むCMakeプロジェクトをQt Creatorで開きます
  • CMakeLists.txtが正しく読み込まれ、dlibのターゲットが認識されます
  1. インクルードパスの追加
  • CMakeLists.txtでdlibのインクルードディレクトリが指定されていれば問題ありませんが、必要に応じてinclude_directories()を使ってパスを追加します
  • Qt Creatorの「プロジェクト」→「ビルド設定」でも追加のインクルードパスを指定可能です
  1. 環境変数の設定
  • CUDAやOpenCVのライブラリパスが必要な場合は、Kitの環境変数設定でPATHLD_LIBRARY_PATHを追加します
  1. ビルドとデバッグ
  • Qt Creatorのビルドボタンでdlibを含むプロジェクトをビルドします
  • 実行時にDLLや共有ライブラリのパスが通っているか確認してください

これらの手順を踏むことで、各IDEでdlibをスムーズに導入し、顔認識機能を組み込んだC++アプリケーションの開発を始められます。

IDEごとの特徴を活かし、効率的な開発環境を構築してください。

OpenCVとの連携

dlibで顔認識を行う際、画像の読み込みや表示、前処理にOpenCVを活用するケースが多いです。

ここではOpenCVを使うメリットやCMakeでの連携方法、さらにカラースペース変換時の注意点を詳しく説明します。

画像入出力をOpenCVに任せる理由

dlib自体にも画像の読み込みや保存機能はありますが、OpenCVを使うことで以下のような利点があります。

  • 多彩な画像フォーマット対応

OpenCVはJPEG、PNG、BMP、TIFFなど多くのフォーマットをサポートしており、特殊な画像形式でも問題なく読み込めます。

dlibの標準機能は対応フォーマットが限定的です。

  • 動画やカメラ入力のサポート

OpenCVはWebカメラや動画ファイルからのフレーム取得が簡単にできるため、リアルタイム顔認識アプリケーションの開発に適しています。

  • 画像処理機能の豊富さ

リサイズ、回転、平滑化、エッジ検出など多彩な前処理をOpenCVで行い、dlibの顔認識に渡すことで精度や速度の向上が期待できます。

  • GUI表示の簡便さ

OpenCVのimshow関数を使うと、簡単にウィンドウ表示ができ、デバッグや結果確認が楽になります。

これらの理由から、dlibの顔認識処理の前後でOpenCVを使うのが一般的です。

CMakeで同時にリンクする方法

dlibとOpenCVを同じプロジェクトで使う場合、CMakeで両方のライブラリを正しく検出しリンクする必要があります。

以下は基本的な設定例です。

  1. OpenCVの検出

CMakeLists.txtに以下を追加します。

find_package(OpenCV REQUIRED)

これにより、OpenCVのインクルードディレクトリやライブラリパスが自動的に設定されます。

  1. dlibの追加

dlibをサブディレクトリとして組み込む場合は、

add_subdirectory(path/to/dlib)

または、dlibのインクルードパスとライブラリを手動で指定します。

  1. ターゲットのリンク設定

実行ファイルやライブラリのターゲットに対して、dlibとOpenCVのライブラリをリンクします。

target_link_libraries(your_target PRIVATE dlib::dlib ${OpenCV_LIBS})
  1. インクルードディレクトリの追加

必要に応じて、

target_include_directories(your_target PRIVATE ${OpenCV_INCLUDE_DIRS})

を指定します。

  1. サンプルCMakeLists.txtの例
cmake_minimum_required(VERSION 3.15)
project(FaceRecognition)
set(CMAKE_CXX_STANDARD 17)
find_package(OpenCV REQUIRED)
add_subdirectory(dlib)
add_executable(face_recognition main.cpp)
target_link_libraries(face_recognition PRIVATE dlib::dlib ${OpenCV_LIBS})
target_include_directories(face_recognition PRIVATE ${OpenCV_INCLUDE_DIRS})

このように設定することで、OpenCVとdlibを同時に使うプロジェクトが簡単に構築できます。

カラースペース変換の注意点

dlibとOpenCVでは画像のカラースペースの扱いに違いがあるため、連携時には注意が必要です。

  • OpenCVの画像フォーマット

OpenCVは画像をBGR(青・緑・赤)の順で扱います。

cv::Matで読み込んだカラー画像はBGR形式です。

  • dlibの画像フォーマット

dlibはRGB(赤・緑・青)形式を前提にしています。

dlibのmatrix<rgb_pixel>などはRGB順です。

  • 変換方法

OpenCVのBGR画像をdlibに渡す前に、色順を変換する必要があります。

以下のようにcv::cvtColorを使います。

cv::Mat bgr_image = cv::imread("image.jpg");
cv::Mat rgb_image;
cv::cvtColor(bgr_image, rgb_image, cv::COLOR_BGR2RGB);
  • dlibの画像型への変換

OpenCVのcv::Matからdlibのmatrix<rgb_pixel>に変換するには、dlibのassign_image関数を使います。

dlib::cv_image<dlib::bgr_pixel> dlib_bgr(bgr_image);
dlib::matrix<dlib::rgb_pixel> dlib_rgb;
dlib::assign_image(dlib_rgb, dlib_bgr);

ただし、この方法では色順がBGRのままなので、上記のcvtColorでBGR→RGB変換を行った後にcv_image<rgb_pixel>を使うのが正しいです。

  • まとめ

OpenCVの画像をdlibに渡す際は必ずBGRからRGBへの変換を行い、色のズレを防ぎましょう。

逆にdlibの画像をOpenCVで表示する場合はRGB→BGR変換が必要です。

OpenCVとdlibを連携させることで、画像の入出力や前処理が格段に楽になり、顔認識の開発効率が向上します。

カラースペースの違いに注意しつつ、CMakeでのリンク設定を正しく行うことが成功の鍵です。

顔認識モデルの準備

dlibで顔認識を行うには、事前に学習されたモデルファイルが必要です。

ここでは代表的な2つのモデルファイルの入手先と、適切な配置場所について詳しく説明します。

pretrainedモデルの入手先

dlibの顔認識機能は、顔のランドマーク検出や特徴量抽出に特化した学習済みモデルを利用します。

主に以下の2つのモデルが使われます。

shape_predictor_68_face_landmarks.dat

このモデルは顔の68個の特徴点(ランドマーク)を検出するためのものです。

目、鼻、口、顎の輪郭などの位置を高精度に特定できます。

顔認識の前処理として顔の向き補正や特徴抽出に欠かせません。

  • 入手先

dlibの公式サイトやGitHubのリリースページからダウンロード可能です。

公式ダウンロードページ:

http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

  • ダウンロード方法
  1. 上記URLから圧縮ファイル.bz2をダウンロードします。
  2. 解凍ツール(7-Zipやbzip2コマンドなど)で解凍し、.datファイルを取り出します。
  • ファイルサイズ

約100MB程度あります。

dlib_face_recognition_resnet_model_v1.dat

このモデルは顔の特徴量を128次元のベクトルに変換するための深層学習モデルです。

顔認識や類似度計算に使われ、顔の個人識別の核となる部分です。

  • 入手先

こちらもdlibの公式サイトからダウンロードできます。

公式ダウンロードページ:

http://dlib.net/files/dlib_face_recognition_resnet_model_v1.dat.bz2

  • ダウンロード方法

shape_predictorと同様に圧縮ファイルをダウンロードし、解凍してください。

  • ファイルサイズ

約100MB程度あります。

モデルファイルの配置パス

モデルファイルはプロジェクトの実行時に読み込むため、適切な場所に配置してパスを指定する必要があります。

  • 推奨配置場所
    • プロジェクトの実行ファイルと同じディレクトリ
    • modelsresourcesなどのサブディレクトリを作成し、その中に置く
    • 絶対パスや相対パスでアクセス可能な場所
  • パス指定の例

C++コード内でモデルを読み込む際は、以下のようにパスを指定します。

std::string shape_predictor_path = "./models/shape_predictor_68_face_landmarks.dat";
std::string face_rec_model_path = "./models/dlib_face_recognition_resnet_model_v1.dat";
dlib::shape_predictor sp;
dlib::deserialize(shape_predictor_path) >> sp;
dlib::anet_type net;
dlib::deserialize(face_rec_model_path) >> net;
  • 注意点
    • 実行環境によっては相対パスが異なる場合があるため、絶対パスを使うか、実行時にカレントディレクトリを確認してください
    • ファイルが存在しないと例外が発生するため、ファイルの存在チェックを行うと安全です
  • バージョン管理

モデルファイルは大きいため、Gitなどのバージョン管理システムには含めず、別途配布やダウンロードスクリプトで管理するのが一般的です。

これらのモデルファイルを正しく準備し、適切なパスで読み込むことで、dlibの顔認識機能を問題なく利用できます。

モデルのダウンロードと配置は最初の重要なステップです。

サンプルコード構成

dlibを使った顔認識プロジェクトを効率よく管理するためには、プロジェクトのディレクトリ構成やソースコードの役割分担、ヘッダファイルの整理が重要です。

ここでは具体例を交えて解説します。

プロジェクトディレクトリ例

以下はdlibを使った顔認識アプリケーションの典型的なディレクトリ構成例です。

FaceRecognitionProject
├── CMakeLists.txt
├── models
├── shape_predictor_68_face_landmarks.dat
└── dlib_face_recognition_resnet_model_v1.dat
├── src
├── main.cpp
├── FaceDetector.cpp
├── FaceDetector.h
├── FaceRecognizer.cpp
└── FaceRecognizer.h
├── include
└── utils.h
└── build
  • CMakeLists.txt

プロジェクト全体のビルド設定を記述します。

  • models/

学習済みモデルファイルを格納します。

実行時にここから読み込みます。

  • src/

実装ファイル.cppと対応するヘッダファイル.hを置きます。

  • main.cppはアプリケーションのエントリーポイントです
  • FaceDetectorクラスは顔検出処理を担当します
  • FaceRecognizerクラスは顔特徴量抽出や認識処理を担当します
  • include/

汎用的なユーティリティ関数や共通ヘッダを置きます。

  • build/

CMakeのビルド出力ディレクトリ。

ソースコードとは分離して管理します。

このように役割ごとにファイルを分けることで、コードの可読性と保守性が向上します。

main.cppの役割分担

main.cppはアプリケーションの起点として、以下の役割を持たせるのが一般的です。

  • 初期化処理
    • モデルファイルのパス設定
    • dlibのshape_predictoranet_type(顔認識ネットワーク)の読み込み
  • 画像の読み込み・前処理
    • OpenCVを使って画像やカメラ映像を取得
    • 必要に応じてリサイズやカラースペース変換を行う
  • 顔検出の呼び出し
    • FaceDetectorクラスのインスタンスを生成し、画像から顔領域を検出
  • 顔認識の呼び出し
    • 検出した顔領域に対してFaceRecognizerクラスを使い、特徴量を抽出・比較
  • 結果の表示・保存
    • 顔認識結果を画面に描画(矩形や名前表示)
    • 必要に応じてファイル保存やログ出力
  • エラーハンドリング
    • モデルファイルの読み込み失敗や画像取得エラーの処理

このようにmain.cppは処理の流れを制御し、各機能は別クラスに委譲することでコードの分離ができます。

ヘッダ整理術

ヘッダファイルはコードのインターフェースを定義し、適切に整理することでビルド時間の短縮や依存関係の管理がしやすくなります。

  • 機能ごとに分割する
    • 顔検出用のFaceDetector.h、顔認識用のFaceRecognizer.hなど、機能単位でヘッダを分けます
    • 汎用的な関数や定数はutils.hなどにまとめる
  • インクルードガードを必ず入れる

ヘッダファイルの重複読み込みを防ぐため、以下のように記述します。

#ifndef FACEDETECTOR_H
#define FACEDETECTOR_H
// ヘッダ内容
#endif // FACEDETECTOR_H
  • 必要最小限のインクルードに留める
    • ヘッダ内で他のヘッダを多用すると依存関係が複雑になるため、可能な限り前方宣言class ClassName;を使います
    • 実装ファイル.cppで詳細なヘッダをインクルードします
  • 名前空間の活用

プロジェクト固有の名前空間を使い、グローバル名前空間の汚染を防ぐ。

  • コメントやドキュメントの記述

ヘッダには関数やクラスの役割を簡潔にコメントしておくと、他の開発者や将来の自分に優しいコードになります。

これらの構成と整理を意識することで、dlibを使った顔認識プロジェクトの開発がスムーズに進み、拡張や保守も容易になります。

実行時検証

dlibを使った顔認識システムを開発したら、実際に動作を確認し性能を評価することが重要です。

ここではカメラ入力によるリアルタイム検証、画像バッチ処理テスト、そしてFPS計測とボトルネックの確認方法について詳しく説明します。

カメラ入力によるリアルタイム検証

リアルタイムで顔認識が正しく動作するかを確認するには、Webカメラなどのカメラ入力を使った検証が効果的です。

OpenCVを使うと簡単にカメラ映像を取得できます。

サンプルコード例

#include <dlib/image_processing.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/opencv.h>
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
    // カメラデバイスの初期化(0はデフォルトカメラ)
    cv::VideoCapture cap(0);
    if (!cap.isOpened()) {
        std::cerr << "カメラを開けませんでした。" << std::endl;
        return -1;
    }
    // dlibの顔検出器を取得
    dlib::frontal_face_detector detector = dlib::get_frontal_face_detector();
    cv::Mat frame;
    while (true) {
        cap >> frame;
        if (frame.empty()) break;
        // OpenCVのBGR画像をdlibの画像形式に変換
        dlib::cv_image<dlib::bgr_pixel> dlib_img(frame);
        // 顔検出
        std::vector<dlib::rectangle> faces = detector(dlib_img);
        // 検出した顔に矩形を描画
        for (const auto& face : faces) {
            cv::rectangle(frame,
                          cv::Point(face.left(), face.top()),
                          cv::Point(face.right(), face.bottom()),
                          cv::Scalar(0, 255, 0), 2);
        }
        // 結果を表示
        cv::imshow("リアルタイム顔検出", frame);
        // 'q'キーで終了
        if (cv::waitKey(1) == 'q') break;
    }
    cap.release();
    cv::destroyAllWindows();
    return 0;
}
  • cv::VideoCaptureでカメラ映像を取得し、1フレームずつ処理しています
  • dlibのfrontal_face_detectorで顔を検出し、OpenCVのrectangleで検出結果を描画
  • cv::imshowでリアルタイムに表示し、qキーで終了します

この方法で実際のカメラ映像に対して顔検出が動作するかを確認できます。

画像バッチ処理テスト

複数の画像ファイルに対して一括で顔認識処理を行い、精度や安定性を検証する方法です。

大量の画像を処理することで、例外やエラーの有無、処理速度の傾向を把握できます。

サンプルコード例

#include <dlib/image_processing.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/opencv.h>
#include <opencv2/opencv.hpp>
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main()
{
    std::string image_dir = "./test_images"; // 画像フォルダのパス
    dlib::frontal_face_detector detector = dlib::get_frontal_face_detector();
    for (const auto& entry : fs::directory_iterator(image_dir)) {
        if (!entry.is_regular_file()) continue;
        cv::Mat img = cv::imread(entry.path().string());
        if (img.empty()) {
            std::cerr << "画像を読み込めませんでした: " << entry.path() << std::endl;
            continue;
        }
        dlib::cv_image<dlib::bgr_pixel> dlib_img(img);
        std::vector<dlib::rectangle> faces = detector(dlib_img);
        std::cout << entry.path().filename() << ": 検出した顔の数 = " << faces.size() << std::endl;
    }
    return 0;
}
  • 指定したディレクトリ内の画像ファイルを順に読み込みます
  • 各画像に対してdlibの顔検出を実行し、検出した顔の数をコンソールに出力
  • 画像の読み込み失敗時はエラーメッセージを表示

このテストで大量の画像に対する処理の安定性や検出率を確認できます。

FPS計測とボトルネック確認

リアルタイム処理の性能を評価するために、1秒あたりのフレーム数(FPS)を計測し、処理のボトルネックを特定します。

FPS計測の基本的な方法

  1. 処理開始前にタイマーをスタート。
  2. 一定数のフレームを処理。
  3. 処理終了後に経過時間を計測。
  4. FPS = 処理したフレーム数 ÷ 経過時間(秒)で算出。

サンプルコード例(カメラ入力にFPS計測を追加)

#include <dlib/image_processing.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/opencv.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <chrono>
int main()
{
    cv::VideoCapture cap(0);
    if (!cap.isOpened()) {
        std::cerr << "カメラを開けませんでした。" << std::endl;
        return -1;
    }
    dlib::frontal_face_detector detector = dlib::get_frontal_face_detector();
    int frame_count = 0;
    const int test_frames = 100; // 計測するフレーム数
    auto start_time = std::chrono::high_resolution_clock::now();
    cv::Mat frame;
    while (frame_count < test_frames) {
        cap >> frame;
        if (frame.empty()) break;
        dlib::cv_image<dlib::bgr_pixel> dlib_img(frame);
        std::vector<dlib::rectangle> faces = detector(dlib_img);
        frame_count++;
    }
    auto end_time = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed = end_time - start_time;
    double fps = frame_count / elapsed.count();
    std::cout << "処理フレーム数: " << frame_count << std::endl;
    std::cout << "経過時間: " << elapsed.count() << " 秒" << std::endl;
    std::cout << "推定FPS: " << fps << std::endl;
    cap.release();
    return 0;
}

ボトルネック確認のポイント

  • CPU使用率の監視

タスクマネージャーやtopコマンドでCPU負荷を確認し、処理がCPUボトルネックか判断。

  • GPU利用状況の確認

CUDAを使っている場合はNVIDIAのnvidia-smiコマンドでGPU負荷をチェック。

  • 処理時間の詳細計測

顔検出、前処理、後処理など各ステップの処理時間を計測し、どこに時間がかかっているか特定。

  • 最適化の検討
    • 画像サイズの縮小
    • 並列処理の導入
    • CUDA有効化やOpenBLAS利用などの高速化手法

これらの実行時検証を通じて、顔認識システムの動作確認と性能評価ができ、実用的なアプリケーション開発に役立ちます。

よく遭遇するエラーと対処

dlibを使った顔認識開発では、ビルドや実行時に特有のエラーが発生することがあります。

ここでは代表的な3つのエラーとその対処法を詳しく説明します。

undefined reference問題

発生状況

undefined referenceエラーは、リンク時に関数や変数の定義が見つからない場合に発生します。

dlibを使う際によくある原因は以下の通りです。

  • dlibのライブラリがリンクされていない
  • 必要な依存ライブラリ(OpenCVなど)がリンクされていない
  • 静的ライブラリと共有ライブラリの混在による不整合
  • 関数の実装ファイルがビルド対象に含まれていない

対処法

  • ライブラリのリンク設定を確認する

CMakeLists.txtやIDEのリンカ設定でdlib.lib(Windows)やlibdlib.a(Linux/macOS)が正しくリンクされているか確認してください。

OpenCVを使う場合はOpenCVのライブラリも忘れずに追加します。

  • ビルドオプションの統一

静的ライブラリBUILD_SHARED_LIBS=OFFでビルドしたdlibを使う場合は、プロジェクトも同じ設定にすること。

共有ライブラリ(DLL)を使う場合はDLLのパスが通っているか確認。

  • ソースファイルの追加漏れを防ぐ

dlibのソースコードを直接プロジェクトに組み込む場合は、必要な.cppファイルがビルド対象に含まれているかチェック。

  • 名前空間や関数シグネチャの不一致を確認

ヘッダと実装の不一致がないか、関数名や引数の型が合っているかも確認してください。

CUDA関連のビルド失敗

発生状況

CUDAを有効にしてdlibをビルドする際、以下のようなエラーがよく発生します。

  • CUDA Toolkitやドライバのバージョン不一致
  • Visual StudioのバージョンとCUDA Toolkitの非対応
  • nvccコンパイラのパスが通っていない
  • CUDAのアーキテクチャ設定ミス
  • cuDNNが正しくインストールされていない

対処法

  • CUDA Toolkitとドライバのバージョンを合わせる

NVIDIAの公式サイトで対応表を確認し、ドライバとCUDA Toolkitのバージョンを整合させてください。

  • Visual Studioのバージョン確認

CUDA Toolkitは特定のVisual Studioバージョンにしか対応していません。

例えばCUDA 11.0はVisual Studio 2019まで対応。

CMakeのジェネレータ指定も正しく行いましょう。

  • 環境変数の設定

PATHにCUDAのbinディレクトリが含まれているか確認。

nvcc --versionでコンパイラが認識されているかチェック。

  • CMakeオプションの指定

-DDLIB_USE_CUDA=ONを指定し、必要に応じて-DCUDA_ARCH_BINでGPUアーキテクチャを明示的に設定します。

cmake -DDLIB_USE_CUDA=ON -DCUDA_ARCH_BIN="6.1" ..
  • cuDNNのインストール確認

cuDNNが必要な場合は正しいバージョンをインストールし、ライブラリパスが通っているか確認してください。

  • ログの詳細確認

ビルドエラーのログをよく読み、どの段階で失敗しているか特定しましょう。

AVX命令セットの不一致

発生状況

dlibはAVX(Advanced Vector Extensions)命令を使って高速化していますが、CPUがAVXに対応していない環境でビルドや実行すると以下のような問題が起きます。

  • ビルド時にAVX命令セットを有効にしているが、実行環境のCPUが対応していないためクラッシュや不正動作
  • 実行時にIllegal instructionエラーが発生

対処法

  • CPUのAVX対応状況を確認

Windowsではmsinfo32の「プロセッサ」欄、Linuxではlscpuコマンドでavxが含まれているか確認します。

  • CMakeでAVXを無効化する

AVX非対応CPU向けにビルドする場合は、CMakeオプションでAVXを無効にします。

cmake -DDLIB_DISABLE_AVX=ON ..
  • ビルド済みバイナリの利用に注意

他者がビルドしたdlibバイナリがAVX有効の場合、非対応CPUで動作しません。

自分の環境に合わせてビルドし直すことが安全です。

  • 実行環境の統一

開発環境と実行環境のCPU命令セットが一致しているか確認し、差異がある場合はビルド設定を調整してください。

これらのエラーはdlibのビルドや実行で頻繁に遭遇しますが、原因を正しく把握し適切に対処すれば解決可能です。

エラーメッセージやログを丁寧に読み、環境設定やビルドオプションを見直すことが重要です。

最適化のヒント

dlibを使った顔認識システムの性能を最大限に引き出すためには、CPUやGPUの設定、並列化の工夫が重要です。

ここでは推論速度を上げるためのCPU設定、GPUメモリ使用量の削減方法、そして並列化ライブラリの併用について具体的に解説します。

推論速度を上げるCPU設定

CPUでの推論速度を向上させるには、以下のポイントを押さえましょう。

  • AVXやSSE命令セットの活用

dlibはAVXやSSE命令を使って高速化しています。

ビルド時にこれらの命令セットを有効にすることで、CPUのSIMD機能を活用し処理速度が向上します。

CMakeでAVXを有効にするには特別な設定は不要ですが、DLIB_DISABLE_AVXがONになっていないか確認してください。

  • マルチスレッドの活用

dlibは内部でIntel TBB(Threading Building Blocks)を使ってマルチスレッド処理を行えます。

  • TBBをインストールし、CMakeでDLIB_USE_TBB=ONを指定してビルドすると、顔検出や特徴抽出が並列化されます
  • TBBがない場合はOpenMPも利用可能ですが、dlibの公式サポートはTBBが推奨です
  • スレッド数の調整

実行時に環境変数OMP_NUM_THREADSやTBBの設定でスレッド数を制御できます。

CPUコア数に合わせて最適なスレッド数を設定しましょう。

  • 画像サイズの最適化

入力画像の解像度が高すぎると処理時間が増加します。

必要に応じてリサイズして処理負荷を軽減してください。

  • コンパイラ最適化オプション

ビルド時に-O3/O2などの最適化フラグを有効にし、CPUの性能を最大限引き出します。

GPUメモリ使用量削減

CUDAを使ったGPUアクセラレーションでは、GPUメモリの使用量がパフォーマンスや安定性に影響します。

メモリ使用量を抑えるための工夫を紹介します。

  • バッチサイズの調整

顔認識処理で複数の画像や顔を一度に処理する場合、バッチサイズを小さくするとメモリ消費が減ります。

リアルタイム処理では1フレームずつ処理するのが一般的です。

  • モデルの軽量化

dlibの標準モデルは高精度ですが大きめです。

必要に応じて軽量モデルや量子化モデルを使うことでメモリ使用量を削減できます(ただしdlib標準では限定的)。

  • メモリの明示的解放

CUDAメモリは自動管理されますが、長時間動作するアプリケーションでは不要になったGPUメモリを明示的に解放する工夫が必要です。

dlibのAPIでは直接制御は難しいため、処理単位でオブジェクトを破棄しGCを促す形になります。

  • GPUメモリの監視

nvidia-smiコマンドでGPUメモリ使用量をリアルタイムに監視し、メモリリークや過剰使用を防ぎます。

  • CUDAストリームの活用

複数のCUDAストリームを使い、メモリ転送と計算を重ねることで効率的にメモリを使う方法もありますが、dlibの標準APIでは直接制御できないため、カスタム実装が必要です。

並列化ライブラリの併用

dlib単体でもマルチスレッド処理は可能ですが、さらに高速化を目指す場合は他の並列化ライブラリや技術と組み合わせる方法があります。

  • Intel TBB(Threading Building Blocks)
    • dlibはTBBを公式にサポートしており、ビルド時にDLIB_USE_TBB=ONを指定すると内部処理が並列化されます
    • TBBはタスクベースの並列化を提供し、CPUコアを効率的に使えます
  • OpenMP
    • 簡単にループ並列化が可能ですが、dlibの内部処理ではTBBが優先されます
    • 自作コードでOpenMPを使い、顔検出や特徴抽出の前後処理を並列化することも可能です
  • CUDAによるGPU並列化
    • CUDA対応GPUがあれば、dlibの推論処理がGPUで高速化されます
    • CUDAの並列処理能力を活かすことで、CPU負荷を大幅に軽減できます
  • マルチプロセス化
    • 複数のプロセスで画像処理を分散させる方法もあります。Pythonなどのラッパー言語でよく使われますが、C++でもIPCや共有メモリを使い実装可能です
  • 非同期処理との組み合わせ
    • 入力画像の取得や結果表示を非同期に行い、顔認識処理と並行して動作させることで全体のスループットを向上させられます

これらの最適化ヒントを活用し、CPUやGPUの性能を最大限に引き出すことで、dlibを使った顔認識システムの推論速度と安定性を大幅に向上させられます。

環境や用途に応じて適切な設定を選択してください。

保守とアップデート

dlibを使った顔認識システムを長期的に安定して運用するためには、ライブラリの更新状況を把握し、破壊的変更に対応しつつ、適切にバージョン管理を行うことが重要です。

ここではdlibの更新チェック方法、破壊的変更への追従方法、そしてバージョン固定のコツについて詳しく説明します。

dlib更新チェック方法

dlibはGitHub上で活発に開発が進められており、新機能の追加やバグ修正が頻繁に行われています。

最新の更新情報を効率よくチェックする方法は以下の通りです。

  • GitHubリポジトリのリリースページを定期的に確認する

https://github.com/davisking/dlib/releases

ここでは公式にリリースされた安定版のバージョンが一覧で確認でき、更新内容の概要や変更点も記載されています。

  • GitHubのWatch機能を利用する

dlibのリポジトリで「Watch」を設定すると、新しいリリースやプルリクエスト、Issueの更新通知を受け取れます。

これにより重要なアップデートを見逃しにくくなります。

  • RSSフィードやGitHub APIを活用する

自動化したい場合はGitHubのAPIやRSSフィードを使い、CI/CDパイプラインやチャットツールに通知を組み込むことも可能です。

  • コミュニティフォーラムやブログをチェックする

dlibのユーザーコミュニティや開発者ブログで、アップデートに関する解説や注意点が共有されることがあります。

破壊的変更への追従

dlibのアップデートには、APIの仕様変更や内部実装の大幅な改修など、既存コードに影響を与える破壊的変更(Breaking Changes)が含まれることがあります。

これに対応するためのポイントは以下の通りです。

  • リリースノートを必ず確認する

新バージョンを導入する前に、リリースノートやCHANGELOGを読み、破壊的変更の有無や影響範囲を把握します。

  • 段階的なアップデートを行う

大きなバージョンジャンプを避け、マイナーバージョン単位で段階的にアップデートし、問題がないか検証しながら進めます。

  • テストコードの充実

顔認識機能の動作確認用にユニットテストや統合テストを用意し、アップデート後に動作が変わっていないか自動で検証できる体制を整えます。

  • API変更に対応したコード修正

破壊的変更があった場合は、dlibの新しいAPI仕様に合わせてコードを修正します。

GitHubのIssueやPull Requestで変更例が共有されていることも多いので参考にしましょう。

  • バックアップとバージョン管理

アップデート前に現在の動作環境やコードをバックアップし、問題があればすぐに元のバージョンに戻せるようにします。

バージョン固定のコツ

安定した開発・運用環境を維持するためには、dlibのバージョンを固定することが重要です。

バージョン固定のポイントは以下の通りです。

  • Gitのタグやコミットハッシュで固定する

GitHubからdlibを取得する際は、特定のリリースタグや安定したコミットハッシュを指定してクローン・チェックアウトします。

git clone https://github.com/davisking/dlib.git
cd dlib
git checkout tags/v19.24
  • 依存管理ツールの活用

CMakeのExternalProject_AddFetchContent機能を使い、特定バージョンのdlibを自動で取得・ビルドする設定を行うと、環境の再現性が高まります。

  • モデルファイルのバージョン管理

顔認識に使う学習済みモデルもバージョンによって精度やAPIが変わることがあるため、モデルファイルのバージョンも明示的に管理し、コードとセットで運用します。

  • CI/CD環境でのバージョン固定

継続的インテグレーション環境でdlibのバージョンを固定し、ビルドやテストを自動化することで、意図しないアップデートによるトラブルを防ぎます。

  • ドキュメントにバージョン情報を明記

プロジェクトのREADMEやドキュメントに使用しているdlibのバージョンを記載し、チーム内で共通認識を持つようにします。

これらの保守とアップデートのポイントを押さえることで、dlibを使った顔認識システムを安定的かつ効率的に運用できます。

特に破壊的変更への対応とバージョン固定は、長期的なプロジェクト成功の鍵となります。

ライセンスと商用利用

dlibを利用する際には、そのライセンス条件を理解し、商用利用における注意点を把握しておくことが重要です。

ここではdlibのライセンスであるBoost Software License 1.0の概要と、顔認識に使うモデルファイルの再配布範囲について詳しく説明します。

Boost Software License 1.0の概要

dlibはBoost Software License 1.0(BSL 1.0)という非常に寛容なオープンソースライセンスのもとで配布されています。

BSL 1.0の主な特徴は以下の通りです。

  • 自由な利用が可能

個人利用、商用利用、教育目的、研究開発など、ほぼすべての用途で自由に使用できます。

  • ソースコードの改変・再配布が許可されている

dlibのソースコードを改変しても問題なく、改変版を配布することも可能です。

  • 著作権表示とライセンス文の保持が条件

ソフトウェアのコピーや派生物を配布する際には、元の著作権表示とライセンス文を含める必要があります。

具体的には、dlibのソースコードやバイナリに付属するLICENSE_1_0.txtを同梱することが求められます。

  • 無保証

ソフトウェアは「現状のまま」提供され、明示的または暗示的な保証はありません。

利用者は自己責任で使用します。

  • 特許権の許諾

BSL 1.0は特許権の許諾も含んでおり、dlibの利用に関して特許侵害のリスクが低減されています。

このように、BSL 1.0は非常に緩やかな条件で利用できるため、商用プロジェクトでも安心してdlibを組み込めます。

モデルファイルの再配布範囲

dlibの顔認識に使う学習済みモデルファイル(例:shape_predictor_68_face_landmarks.datdlib_face_recognition_resnet_model_v1.dat)は、dlib本体とは別に配布されています。

これらのモデルファイルのライセンスと再配布に関するポイントは以下の通りです。

  • 配布元とライセンス

モデルファイルはdlibの公式サイトやGitHubのリリースページからダウンロード可能ですが、モデル自体はdlibのソースコードとは別の著作権者が管理している場合があります。

多くの場合、モデルは研究目的で無償提供されていますが、明確なライセンス文書が付属していないこともあります。

  • 再配布の可否

モデルファイルを自分のプロジェクトに含めて配布する場合は、配布元の利用規約やライセンスを必ず確認してください。

  • 一般的には、非商用利用や研究目的での再配布は許可されていることが多いです
  • 商用製品に組み込む場合は、再配布の許可が明示されているか、または別途許諾を得る必要があります
  • モデルファイルの配布方法の工夫
    • モデルファイルを直接バイナリに同梱せず、インストール時や初回起動時にユーザーがダウンロードする仕組みを採用するケースが多いです
    • これによりライセンス違反のリスクを軽減できます
  • 利用時の注意点
    • モデルファイルの改変は原則として禁止されている場合が多いです
    • モデルの精度や動作保証は提供元に依存するため、商用利用時は十分な検証が必要です

dlib本体はBoost Software License 1.0のもとで自由に使えますが、顔認識モデルファイルの再配布には注意が必要です。

商用利用を検討する際は、モデルの配布元のライセンス条件を必ず確認し、適切な対応を行ってください。

まとめ

この記事では、C++でdlibを使った顔認識を始めるための環境構築からビルド設定、IDEごとの導入方法、OpenCVとの連携、モデル準備、実行時検証、よくあるエラー対処、最適化、保守・アップデート、ライセンス、そして追加リソースまで幅広く解説しました。

これらの情報を活用すれば、効率的にdlibを導入し、高性能な顔認識システムを開発・運用できます。

Back to top button
目次へ