|
[[172192]] 簡単な SeetaFaceは、中国科学院計算工学研究所のShan Shiguang教授率いる顔認識研究グループによって開発されました。コードはC++で実装されており、サードパーティ製のライブラリに依存していません。しかし、現在オープンソースとして公開されているコードはWindows Visual Studioでコンパイルされており、私たちのようなMac/Linuxユーザーにとっては非常に扱いにくいものでした。数日間の学習を経て、ようやくSeetaFaceを完全に理解することができました。それでは、説明しましょう。 注: この記事では、コードのロジックと原則については説明しません。Seetaface を使用して顔認識を行う方法のみを説明します。 エンジン 顔検出 - 顔認識モジュールは、写真内の顔を識別し、各顔の座標と顔の総数を取得するために使用されます。
フェイスアライメント - 特徴点認識モジュールは、主に口の両端、鼻、両目の5点の座標を識別します。テストの結果、画像がぼやけている場合、認識精度が低下することが判明しました。
顔認証 - 公式ドキュメントによると、顔比較モジュールはまず特徴値を抽出し、それらを比較します。提供されているテストプログラムは、Seetafaceによって抽出された特徴値をCaffeトレーニングライブラリの顔と比較します。
以下のチュートリアルはすべてmacOSで正常にコンパイル・実行されました。コンパイルにはcmakeとmakeを使用しています。 以下のコンパイル方法では、OpenCVに依存するFaceDetectテストプログラムもコンパイルされます。そのため、実行前にOpenCVがインストールされていることを確認してください。 顔認識チュートリアル コンピレーション コードは Windows プラットフォームでコンパイルされているため、ここでいくつかの変更を加える必要があります。 - FaceDetectionディレクトリに入る
- include/common.h、具体的には 38 行目を変更します。
- #ifdef SEETA_EXPORTS
-
- #define SEETA_API __declspec(dllexport)
-
- #それ以外
-
- #SEETA_API __declspec(dllimport) を定義します。
-
- #endif
のために - #定義されている場合_WIN32
-
- #ifdef SEETA_EXPORTS
-
- #define SEETA_API __declspec(dllexport)
-
- #それ以外
-
- #SEETA_API __declspec(dllimport) を定義します。
-
- #endif
-
- #それ以外
-
- #SEETA_API を定義する
-
- #endif
- include/feat/surf_feature_map.h ファイルを変更し、先頭に #include <cstring> を追加します。
- include/util/image_pyramid.h ファイルを変更し、先頭に #include <cstring> を追加します。
- src/feat/surf_feature_map.cpp ファイルを変更し、先頭に #include <cmath> を追加します。
- 次の内容を含む CMakeLists.txt を追加します。
- cmake_minimum_required(バージョン3.3)
- プロジェクト(seeta_facedet_lib)
- オプション(BUILD_EXAMPLES "例をビルドするにはONに設定" ON)
- オプション(USE_OPENMP "OpenMP を使用するには ON に設定" ON)
- 設定(CMAKE_CXX_STANDARD 11)
- 設定(CMAKE_CXX_STANDARD_REQUIRED ON)
- メッセージ(ステータス「C++11 サポートはデフォルトで有効になっています。」)
- CMAKE_CXX_FLAGS を "${CMAKE_CXX_FLAGS} -msse4.1" に設定します
-
- (USE_OPENMP)の場合
- find_package(OpenMP QUIET)
- (OpenMP_FOUND) の場合
- メッセージ(STATUS "OpenMPを使用する")
- 定義の追加(-DUSE_OPENMP)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
- 終了()
- 終了()
-
- include_directories(含める)
-
- set(src_files
- src/util/nms.cpp
- src/util/image_pyramid.cpp
- src/io/lab_boost_model_reader.cpp
- src/io/surf_mlp_model_reader.cpp
- src/feat/lab_feature_map.cpp
- src/feat/surf_feature_map.cpp
- src/classifier/lab_boosted_classifier.cpp
- src/分類器/mlp.cpp
- src/classifier/surf_mlp.cpp
- src/顔検出.cpp
- src/fust.cpp
- )
-
- add_library(face_detect 共有 ${src_files})
- set(facedet_required_libs face_detect)
-
- (BUILD_EXAMPLES) の場合
- メッセージ(STATUS "例を使用してビルドします。")
- find_package(OpenCV)
- (OpenCV_FOUND ではない)
- メッセージ(警告「OpenCV が見つかりません。テストはビルドされません。」)
- それ以外()
- include_directories(${OpenCV_INCLUDE_DIRS})
- リスト(append facedet_required_libs ${OpenCV_LIBS})
-
- add_executable(facedet_test src/test/facedetection_test.cpp)
- target_link_libraries(facedet_test ${facedet_required_libs})
- 終了()
- 終了()
- ビルドディレクトリを作成します: mkdir build
- コンパイル: `cd build && cmake .. && make`
- 実行ファイルは現在のディレクトリに生成されます。
走る - make コマンドを実行すると、現在のディレクトリに実行可能ファイル facedet_test が生成されます。
- デフォルトのプログラムは、現在のパスから test_image.jpg と seeta_fd_frontal_v1.0.bin を読み取ります。test_image.jpg は顔画像で、seeta_fd_frontal_v1.0 は認識エンジンです。
- 上記の 2 つのファイルが現在のパスに存在することを確認したら、`./facedet_test` を実行できます。
- 希望する結果を得るために、src/test ディレクトリにあるファイルを変更できます。
使用 顔認識の目標を達成するには、テスト プログラム src/test/facedetection_test.cpp を参照できます。 ヘッダーファイル - #include "opencv2/highgui/highgui.hpp"
- #include "opencv2/imgproc/imgproc.hpp"
- #include "顔検出.h"
- OpenCV ヘッダー ファイルは主に画像の読み込みに使用され、face_detection.h は顔認識のメイン プログラムです。
顔認識エンジンをロードする - seeta::FaceDetection 検出器('seeta_fd_frontal_v1.0');
最小の顔のサイズを設定する - detector.SetMinFaceSize(40);
- この値は実際の状況に応じて調整されます。画像では、顔が大きいほどこの値も大きくなります。この値が小さいほど、顔認識速度が遅くなるためです。
画像内の顔を認識する - std::vector<seeta::FaceInfo> faces = detector.Detect(img_data);
先に進む前に画像を処理する必要がありますが、ここでは省略します。 顔認識の結果を出力する - (int32_t i = 0; i < num_face; i++)の場合{
- face_rect.x = faces[i].bbox.x;
- face_rect.y = faces[i].bbox.y;
- face_rect.width = faces[i].bbox.width;
- face_rect.height = faces[i].bbox.height;
- cv::rectangle(画像、face_rect、CV_RGB(0, 0, 255)、4、8、0);
- }
- s[i].bbox.x; faces[i].bbox.y; は、面の左上隅の座標です。 faces[i].bbox.width; faces[i].bbox.height; は、面の長さと幅です。
結論 SeetaFaceは実に便利な顔認識ライブラリです。使い方もコンパイルも簡単です。しかし、ドキュメントが不足しているため、最初はかなり混乱し、どこから始めればいいのか分からなくなるかもしれません。この記事では主にFaceDetectの使い方を紹介します。次に、顔の特徴点、つまり口、鼻、目を識別する方法を説明します。どうぞお楽しみに。 |