DUICUO

オープンソースの顔認識技術「SeetaFace」入門チュートリアル(パート1)

[[172192]]

簡単な

SeetaFaceは、中国科学院計算工学研究所のShan Shiguang教授率いる顔認識研究グループによって開発されました。コードはC++で実装されており、サードパーティ製のライブラリに依存していません。しかし、現在オープンソースとして公開されているコードはWindows Visual Studioでコンパイルされており、私たちのようなMac/Linuxユーザーにとっては非常に扱いにくいものでした。数日間の学習を経て、ようやくSeetaFaceを完全に理解することができました。それでは、説明しましょう。

注: この記事では、コードのロジックと原則については説明しません。Seetaface を使用して顔認識を行う方法のみを説明します。

エンジン

顔検出

  • 顔認識モジュールは、写真内の顔を識別し、各顔の座標と顔の総数を取得するために使用されます。

フェイスアライメント

  • 特徴点認識モジュールは、主に口の両端、鼻、両目の5点の座標を識別します。テストの結果、画像がぼやけている場合、認識精度が低下することが判明しました。

顔認証

  • 公式ドキュメントによると、顔比較モジュールはまず特徴値を抽出し、それらを比較します。提供されているテストプログラムは、Seetafaceによって抽出された特徴値をCaffeトレーニングライブラリの顔と比較します。

以下のチュートリアルはすべてmacOSで正常にコンパイル・実行されました。コンパイルにはcmakeとmakeを使用しています。

以下のコンパイル方法では、OpenCVに依存するFaceDetectテストプログラムもコンパイルされます。そのため、実行前にOpenCVがインストールされていることを確認してください。

顔認識チュートリアル

コンピレーション

コードは Windows プラットフォームでコンパイルされているため、ここでいくつかの変更を加える必要があります。

  1. FaceDetectionディレクトリに入る
  2. include/common.h、具体的には 38 行目を変更します。
  1. #ifdef SEETA_EXPORTS
  2.  
  3. #define SEETA_API __declspec(dllexport)
  4.  
  5. それ以外 
  6.  
  7. #SEETA_API __declspec(dllimport) を定義します。
  8.  
  9. #endif

のために

  1. #定義されている場合_WIN32
  2.  
  3. #ifdef SEETA_EXPORTS
  4.  
  5. #define SEETA_API __declspec(dllexport)
  6.  
  7. それ以外 
  8.  
  9. #SEETA_API __declspec(dllimport) を定義します。
  10.  
  11. #endif
  12.  
  13. それ以外 
  14.  
  15. #SEETA_API を定義する
  16.  
  17. #endif
  1. include/feat/surf_feature_map.h ファイルを変更し、先頭に #include <cstring> を追加します。
  2. include/util/image_pyramid.h ファイルを変更し、先頭に #include <cstring> を追加します。
  3. src/feat/surf_feature_map.cpp ファイルを変更し、先頭に #include <cmath> を追加します。
  4. 次の内容を含む CMakeLists.txt を追加します。
    1. cmake_minimum_required(バージョン3.3)
    2. プロジェクト(seeta_facedet_lib)
    3. オプション(BUILD_EXAMPLES "例をビルドするにはONに設定" ON)
    4. オプション(USE_OPENMP "OpenMP を使用するには ON に設定" ON)
    5. 設定(CMAKE_CXX_STANDARD 11)
    6. 設定(CMAKE_CXX_STANDARD_REQUIRED ON)
    7. メッセージ(ステータス「C++11 サポートはデフォルトで有効になっています。」)
    8. CMAKE_CXX_FLAGS を "${CMAKE_CXX_FLAGS} -msse4.1" に設定します
    9.  
    10. (USE_OPENMP)の場合
    11. find_package(OpenMP QUIET)
    12. (OpenMP_FOUND) の場合
    13. メッセージ(STATUS "OpenMPを使用する")
    14. 定義の追加(-DUSE_OPENMP)
    15. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    16. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    17. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
    18. 終了()
    19. 終了()
    20.  
    21. include_directories(含める)
    22.  
    23. set(src_files
    24. src/util/nms.cpp
    25. src/util/image_pyramid.cpp
    26. src/io/lab_boost_model_reader.cpp
    27. src/io/surf_mlp_model_reader.cpp
    28. src/feat/lab_feature_map.cpp
    29. src/feat/surf_feature_map.cpp
    30. src/classifier/lab_boosted_classifier.cpp
    31. src/分類器/mlp.cpp
    32. src/classifier/surf_mlp.cpp
    33. src/顔検出.cpp
    34. src/fust.cpp
    35.  
    36. add_library(face_detect 共有 ${src_files})
    37. set(facedet_required_libs face_detect)
    38.  
    39. (BUILD_EXAMPLES) の場合
    40. メッセージ(STATUS "例を使用してビルドします。")
    41. find_package(OpenCV)
    42. (OpenCV_FOUND ではない)
    43. メッセージ(警告「OpenCV が見つかりません。テストはビルドされません。」)
    44. それ以外()
    45. include_directories(${OpenCV_INCLUDE_DIRS})
    46. リスト(append facedet_required_libs ${OpenCV_LIBS})
    47.  
    48. add_executable(facedet_test src/test/facedetection_test.cpp)
    49. target_link_libraries(facedet_test ${facedet_required_libs})
    50. 終了()
    51. 終了()
  5. ビルドディレクトリを作成します: mkdir build
  6. コンパイル: `cd build && cmake .. && make`
  7. 実行ファイルは現在のディレクトリに生成されます。

走る

  1. make コマンドを実行すると、現在のディレクトリに実行可能ファイル facedet_test が生成されます。
  2. デフォルトのプログラムは、現在のパスから test_image.jpg と seeta_fd_frontal_v1.0.bin を読み取ります。test_image.jpg は顔画像で、seeta_fd_frontal_v1.0 は認識エンジンです。
  3. 上記の 2 つのファイルが現在のパスに存在することを確認したら、`./facedet_test` を実行できます。
  4. 希望する結果を得るために、src/test ディレクトリにあるファイルを変更できます。

使用

顔認識の目標を達成するには、テスト プログラム src/test/facedetection_test.cpp を参照できます。

ヘッダーファイル

  1. #include "opencv2/highgui/highgui.hpp"  
  2. #include "opencv2/imgproc/imgproc.hpp"  
  3. #include "顔検出.h"  
  4. OpenCV ヘッダー ファイルは主に画像の読み込みに使用され、face_detection.h は顔認識のメイン プログラムです。

顔認識エンジンをロードする

  1. seeta::FaceDetection 検出器('seeta_fd_frontal_v1.0');

最小の顔のサイズを設定する

  1. detector.SetMinFaceSize(40);
  2. この値は実際の状況に応じて調整されます。画像では、顔が大きいほどこの値も大きくなります。この値が小さいほど、顔認識速度が遅くなるためです。

画像内の顔を認識する

  1. std::vector<seeta::FaceInfo> faces = detector.Detect(img_data);

先に進む前に画像を処理する必要がありますが、ここでは省略します。

顔認識の結果を出力する

  1. (int32_t i = 0; i < num_face; i++)の場合{
  2. face_rect.x = faces[i].bbox.x;
  3. face_rect.y = faces[i].bbox.y;
  4. face_rect.width = faces[i].bbox.width;
  5. face_rect.height = faces[i].bbox.height;
  6. cv::rectangle(画像、face_rect、CV_RGB(0, 0, 255)、4、8、0);
  7. }
  8. s[i].bbox.x; faces[i].bbox.y; は、面の左上隅の座標です。 faces[i].bbox.width; faces[i].bbox.height; は、面の長さと幅です。

結論

SeetaFaceは実に便利な顔認識ライブラリです。使い方もコンパイルも簡単です。しかし、ドキュメントが不足しているため、最初はかなり混乱し、どこから始めればいいのか分からなくなるかもしれません。この記事では主にFaceDetectの使い方を紹介します。次に、顔の特徴点、つまり口、鼻、目を識別する方法を説明します。どうぞお楽しみに。