10-9 顔認識機能サンプルチュートリアル
前の章では、AI に画面内の「 人、車、火、さらにはあらゆる物体 」を検出させる方法を学びました。しかし、考えたことはありませんか? AI は「 ここに顔がある 」と教えてくれますが、「 この顔が誰なのか 」までは教えてくれないのではないでしょうか?
本章では、画像解析の最も重要な応用分野である 顔認識 ( Face Recognition ) に入ります。強力な顔認識モデルを導入し、顔を検出するだけでなく、顔の主要な特徴点を正確に取得し、年齢と性別を判断し、さらに最も重要な機能として、顔の固有特徴ベクトルを抽出します。これから実装する UI ポップアップウィンドウと組み合わせることで、画面をクリックして名前を登録し、自動で来訪者を迎える VIP 認識システムを自分の手で構築できます。
学習目標
本章では、以下を学びます。
1. API パラメータの大幅アップグレード : QDEEP_OBJECT_DETECT_FLAG_FULL フラグの実際の意味を理解する。
2. 構造体の高度な解析 : AI の返却結果から 5 つの顔特徴点座標、年齢、性別情報を抽出する。
3. OpenCV 描画の大幅刷新 : cv::circle で顔特徴点を描画し、 cv::getTextSize を使って背景付きのきれいな文字ラベルを描画する。
4. 特徴比較 API と UI 操作の習得 : マウスクリックによる登録を実装し、 QDEEP_GET_OBJECT_RECOGNITION_COMPARISON を使って特徴類似度を計算し、本人確認ロジックを完成させる。
準備作業
今回のモデルパッケージは、複数の認識用重みファイルを組み合わせているため、これまでよりファイル数が多くなっています。Face Landmark 5KPS モデルの圧縮ファイルを探してください。ファイル名には FACE.LANDMARK.5KPSのような文字が含まれている場合があります。解凍後、 QDEEP.OD.FACE.LANDMARK.5KPS.CFG と対応するすべての重みファイルを、Qt プロジェクトのビルド出力ディレクトリにコピーしてください。

コア API はどのように変更するのか?
今回は検出器を作成する際に、これまでとは大きく異なるいくつかの点に注意する必要があります。
• モデル設定タイプの変更 : QDEEP_CREATE_OBJECT_DETECT の 3 番目の引数には、必ず専用の QDEEP_OBJECT_DETECT_CONFIG_MODEL_FACE_LANDMARK_5_KEYPOINTS を指定してください。
• dwFlags パラメータ : 以前は軌跡追跡 (_FLAG_TRAJECTORY_TRACKING)を渡していました。しかし今回は、AI に枠を描画させるだけでなく、特徴値と顔特徴点も計算させる必要があります。そのため、最後の引数を QDEEP_OBJECT_DETECT_FLAG_FULL に変更します。これによりエンジンは全機能を有効にし、すべてのサブ属性を計算して返します。
• 返却構造体に隠されたデータ : 引き続き QDEEP_OBJECT_DETECT_BOUNDING_BOX 構造体を使用しますが、dwFlags パラメータで複数の機能を有効にすることで、以下の隠れたデータが有効になります。
‧ nClassIDs : 付属属性を格納する配列です。このモデルでは、AI が判定した性別が格納されます。
‧ nSubClassIDs : 付属属性を格納する配列です。このモデルでは、AI が判定した年齢が格納されます。
‧ sKeypoints : 顔の 5 つの特徴点、つまり両目、鼻、口角の X/Y 座標を格納する配列です。
QDEEP_CREATE_OBJECT_DETECT
これは AI エンジンを作成し、モデルを読み込むための最も重要な API です。ユーザーはこの API を使用して検出器を初期化する必要があります。
QDEEP_GET_OBJECT_RECOGNITION_COMPARISON
2 つの異なる特徴ベクトル、例えばリアルタイムで撮影された顔と登録名簿内の顔をこの API に渡すと、両者の類似度スコアが即座に返されます。

QDEEP_OBJECT_DETECT_BOUNDING_BOX 構造体
顔認識モデルに切り替えると、AI エンジンが QDEEP_OBJECT_DETECT_BOUNDING_BOX を通じて返す nClassID、nSubClassIDs、sKeypoints は新しい意味を持ちます。


QDEEP_OBJECT_DETECT_KEYPOINT 構造体
全機能フラグ (FLAG_FULL) を有効にすると、 QDEEP_OBJECT_DETECT_BOUNDING_BOX 内で sKeypoints[ QDEEP_MAX_KEYPOINY_SIZE ] という配列が使用可能になります。この配列の各要素は、単一の「特徴点」を表すための構造体 QDEEP_OBJECT_DETECT_KEYPOINT です。
この構造体には、非常に重要な 4 つのパラメータが含まれています。定義は以下の通りです。

コアコードの作成
プロジェクトを開き、最も重要なコード変更を行いましょう。
特徴ベクトルを保存するデータ構造を追加する
AI に人物を認識させるには、メモリ内に「名簿」を作成する必要があります。 mainwindow.h に、「名前」と「特徴ベクトル」を紐付ける構造体を宣言し、比較用のしきい値を設定してください。

モデル読み込みを変更する
コンストラクタ内で、先ほど説明した「モデル設定」と「全機能 Flag」を適用します。

クラス名を拡張する
描画ループの前に、男性と女性それぞれの色を定義します。0 : 男性 Male(緑色)、1 : 女性 Female(赤色)。

OpenCV 描画と特徴比較ロジック
AI エンジンからオブジェクトの詳細情報を取得したら、OpenCV API を使って画面に描画できます。ただし今回は「顔認識」なので、描画の前に中核となる「特徴比較」を完了する必要があります。以下の 4 つの標準的な開発手順を定義します。
1. 顔特徴ベクトルを取得する : FLAG_FULL が有効な状態では、AI はその顔固有の特徴を構造体内の fFeatureVectors 配列に保存します。
2. 特徴比較を行い、最も一致する人物を探す : QDEEP_GET_OBJECT_RECOGNITION_COMPARISON を使い、「リアルタイム特徴ベクトル」と名簿 (m_registeredFaces) 内の特徴を一つずつ比較します。返された類似度スコアが設定したしきい値、例えば 0.75 を超えれば、その VIP を認識できたことになります。

3. オブジェクト位置を取得し、OpenCV でマーキングする : 比較結果と顔座標を取得した後、追跡枠と 5 つの顔特徴点を描画します。
4. オブジェクト情報を含むテキストを重ねる : 比較で得られた「名前、信頼度、性別、年齢」などの総合情報を、背景付きラベルとして画面上にきれいに重ねて表示します。

UI ポップアップウィンドウと特徴登録機能を追加する
「知らない人」を「知っている人」にするにはどうすればよいでしょうか? キャンバス上のマウスクリックイベントを取得する必要があります。「画面上の顔枠をクリック」したとき、その構造体から特徴ベクトルを取り出し、入力された名前と紐付けます。Qt の mousePressEvent をオーバーライドし、以下のようなロジックを追加できます。

最終確認
左下の 「Build and RUN」 をクリックしてプロジェクトを実行します。
1. 受信と検出を開始すると、画面上の顔が枠で囲まれ、両目、鼻、口角に 5 つの円点が正確に描画されます。文字ラベルには AI が判定した年齢 (Age) が表示され、顔枠の色は男性(緑色)または女性(赤色)を示します。
2. 次に、画面上の自分の顔をマウスでクリックします。
3. すぐに UI input window (QInputDialog) が表示されます。名前を入力して OK を押してください。
4. 次の瞬間、頭上のラベルが "Age: 27" から "Arya (Age: 27)" に変わります。

➤ 重要なお知らせ : 初めてこのソフトウェアを 起動する(プログラムを実行する)瞬間 、画面が表示されるまで少し時間がかかる場合がありますが、心配しないでください。これは「AI モデルの読み込み」処理をプログラムのコンストラクタ内に書いているためです。初回実行時、モデルは初期化設定を行う必要があり、その間システムは巨大なニューラルネットワークの重みファイルを GPU に読み込んでいます。ソフトウェアが正常に起動すれば、AI の頭脳はバックグラウンドで準備完了です。次回以降は、この初期化待ち時間は不要になります。
カメラの前でどのように動いても、少し顔の向きを変えても、システムは深層特徴ベクトルによってあなたをしっかり記憶します。
おめでとうございます! この章を通じて、API パラメータ操作、OpenCV の高度な描画、そして Qt UI のインタラクションロジックを見事に融合できました。あなたが開発したこのプログラムは、すでにスマート入退室管理システムの原型を備えています。
