アイリアSDKを試す<第28回>FeatureExtractorを使った人物検索

これまでは、ailia_1_5_0_trialのサンプル・プログラムを題材に、アプリを動作させるための環境構築手順を中心に紹介してきました。環境構築については一通りの解説が完了したので、今回からは実際にアイリアSDKの機能を活用する方法をメインに解説していきます。今回取り上げるのは、AiliaFeatureExtractorSampleです。
このサンプル・アプリは、カメラを利用して写した人物の顔を検出し、最初に登録した人物と同一かどうかを判定するアプリで、その内部ではアイリアSDKのFeatureExtractor(特徴抽出器)を用いて画像の特徴ベクトルを生成し、最初に登録した人物とを比較して一致度を評価しています。今回ではまず、FeatureExtractorの基本的な仕組みを簡単に解説したうえで、これを応用して集合写真の中から特定の人物を見つけ出せるかを試してみます。その過程で、特徴ベクトルのしきい値調整などのパラメータ設定を通して、FeatureExtractorの実践的な使いこなし方を解説していきます。

実験環境

今回の検証を行った実験環境を表1に示します。いずれも一般的な開発用PCの構成であり、同程度のGPUを搭載した環境であれば、同様の手順で再現可能です。

名称内容
OSWindows 11 Pro
CPUAMD Ryzen 5 3600
メモリ32GB
GPUNVIDIA GrForce RTX 3060 12GB
ailia-SDKAILIA_trial_1.5.0
Unity6.2(6000.2.9f1)
実験環境

特徴抽出器…ベクトル表現をもとに類似度を決める

特徴抽出器(FeatureExtractor)は、画像や音声などの入力データから特徴量(Feature Vector)を取り出す機能です。この特徴量とは、AIモデルが入力データの見た目の特徴を数値ベクトルとして表現したもので、同じ対象であれば似たベクトル、異なる対象であれば大きく異なるベクトルになります。

例えば、ある人物の顔画像を登録しておき、別の画像に写った顔の特徴量と比較すれば、同一人物かどうかやどの程度似ているかを判定できます。アイリアSDKでは、この特徴抽出を非常にシンプルなコードで扱えるよう設計されています。

ailiaの特徴抽出器の動作概要

ailiaが提供する特徴抽出器であるAiliaFeatureExtractorSampleは、このFeatureExtractor機能を応用したサンプル・プログラムです。アプリを起動すると、カメラで取得した人物の顔を自動検出し、最初に登録した顔画像と照合して同一人物である確率を算出します。この一連の処理では、

  • AiliaDetectorModelが顔領域を抽出
  • AiliaFeatureExtractorModelがその顔画像から特徴ベクトルを生成

します。

内部処理の流れは図1の通りです。

(図1)AiliaFeatureExtractorSampleの処理の流れ

1、顔領域の抽出

物体検出器であるAiliaDetectorModelと、顔検出用に学習されたモデルを使って画像内の人物の顔領域を抽出します。集合写真のように複数の人物が写っている場合には、それぞれの顔領域が個別に検出されます。

2、顔の特徴抽出

抽出された顔領域をAiliaFeatureExtractorModelに入力し、学習済みの特徴抽出モデルを用いて特徴ベクトルを生成します。特徴抽出モデルそのものは顔の特徴抽出の専用ではありませんが、特徴抽出を行うレイヤを顔要素の特徴抽出に有効に働く値に設定します。これにより、各顔画像は数百次元の数値ベクトルとして表現され、後の類似度判定に使われます。

3、集合写真からの検出と比較

このサンプル・アプリでは、集合写真に写っている複数の人物の顔を個別に抽出し、それぞれの特徴量を計算します。次に、抽出した各顔の特徴量と登録済みの対象人物の特徴量をAiliaFeatureExtractorModelのMatch関数で比較します。

プログラムの調整箇所

今回は、AiliaFeatureExtractorSampleをベースに、顔検出と類似度判定の精度を調整してみます。調整対象となるパラメータや最適化について次に示します。

1、顔が映っている領域の判定条件(検出しきい値)

顔検出モデル(YOLO系)の出力には、各検出領域ごとに信頼度(confidence)が付与されます。この値が高いほど、この領域は顔である可能性が高いと判断されます。

しきい値を高く設定すると、モデルが確実に顔と認識する範囲のみを検出するため、帽子/眼鏡/化粧/照明条件などが異なる顔は検出されにくくなります。次に、しきい値を低く設定すると、多少条件が異なる顔も検出できますが、背景の一部など顔以外の領域を誤検出する可能性が高まります。この値は、検出漏れと誤検出のバランスを取る重要なパラメータです。

2、顔の類似度を判定するしきい値

次に、FeatureExtractorが生成した特徴ベクトル同士の類似度に基づいて、同一人物と判定する基準値を調整します。しきい値を厳しく設定すると、他人を誤って同一人物と判定する確率が低くなりますが、撮影条件や表情の違いによって、本人でも一致しない場合があります。次に、しきい値を緩く設定すると、多少の違いを許容できますが、似ている別人を誤って「同一人物」と認識してしまう可能性が高くなります。

3、組み合わせによる最適化

特に集合写真のように多人数が写っている場合、環境光や顔の向きによって検出精度が変化します。そのため、両方のパラメータを組み合わせて調整し、検出漏れが少なく、誤検出も抑えられる最適値を探すことが重要です。

実際の検証では、次のような流れで調整を進めるとよいです。

  • 手順1:調整対象は検出しきい値で顔の検出数を増減させ見逃しを防ぐ
  • 手順2:調整対象は類似度しきい値で検出した顔の中から正しい人物を抽出する

この2段階調整により、検出精度と判定精度のバランスを最適化できます。

使用する画像

今回は次の2種類の画像を使用します。いずれもAIで生成したサンプル画像です。

  1. 検出対象の人物の写真:FeatureExtractorに登録する基準画像(図2)。この人物を、後述の集合写真の中から探し出す
  2. 検出対象を含めた10人の集合写真:複数の人物が写っている画像(図3)。FeatureExtractorを用いて、登録済みの対象人物がどこにいるかを自動的に判定
(図2)検出対象の人物
(図3)検出対象を含めた10人の集合写真

この2枚の画像を使い、前節で説明した2つのしきい値(検出しきい値と類似度しきい値)をそれぞれ調整しながら、検出結果がどのように変化するかを確認します。特に、類似度しきい値を変化させることで、

  • 似ている人物を誤検出しやすいケース
  • 厳しすぎ見逃すケース

をFeatureExtractorを用いた人物検索におけるしきい値設定の重要性を実践的に理解できます。

本題…人物検索を試す

顔画像の登録

まず、検出対象の顔画像を登録します(図4)。この処理では、FeatureExtractorを用いて顔の特徴ベクトルを生成し、後の照合で使用できるように保存します。

(図4)検出対象の顔を登録する画面

集合写真の照合

次に、検出対象を含む集合写真をカメラで映します。アプリは写真内の各人物の顔を自動的に検出し、先ほど登録した顔画像と照合して同一人物を検索します(図5)。

(図5)集合写真から同一人物を検索する画面

パラメータ調整による検出精度の改善

初期設定のままでは、10人中5人しか顔が検出/判定できませんでした。これは、顔検出時のしきい値(threshold)が高く設定されているため、顔の向きや暗い環境など特徴の弱い顔が検出から外れてしまっていると考えられます。そこで、顔検出に使っているComputeFromImageB2Tメソッドのパラメータ(表2)を調整し、検出感度を上げてみます。

パラメータデフォルト値変更値説明
threshold  検出しきい値0.25f;0.10f顔と判断するための最小スコア.値を下げるとより多くの領域を検出するようになる
iou  重複除外しきい値0.25f;0.05f;顔領域が重なった際にどちらを残すかを決める基準.値を下げる(重複を許さない方向)と,それぞの別々の顔として残しやすくなる
ComputeFromImageB2Tメソッドのパラメータ

今回使用した集合写真では、全員の顔が比較的正面を向いており、重なりも少ない構図になっています。そのため、検出しきい値を下げて検出数を増やしつつ、重複除外のしきい値も厳しくすることで検出漏れを防ぎ且つ重複の無い設定としました(図6)。

なお、この設定は背景や他の物体を誤って検出するリスクも増えるため、撮影条件に応じて最適なしきい値を選択することが大事です。

(図6)重複除外の設定による違い(左:重複を許す、右:重複を制限)

調整後は、照明条件が悪い箇所や横を向いた顔も検出されるようになり、集合写真中の人物をほぼ全て抽出できました。図7に、しきい値を変更した後の検出結果を示します。

(図7)しきい値変更後の結果

登録済み人物の検索

続いて、登録しておいた人物が集合写真の中に存在するかを検索してみます。FeatureExtractorによる類似度判定が正常に機能し、登録した顔と一致する人物が自動的にマークされました(図8)。

(図8)しきい値変更後の顔検出結果

ただし、よく見ると隣の人物も誤って同一人物として認識している箇所がありました。これは、類似度のしきい値をやや緩めに設定しているため、似ている顔を誤認識してしまった可能性があります。また、初期状態では検出スコアやデバッグ・メッセージなどの情報が多数重なり、判定結果がやや見づらい状態でした。

このため、次のステップとして出力メッセージの内容を整理し、視認性を改善する調整を行いました。画面出力されるメッセージ量を制限し、検出結果のみをシンプルに表示するように修正しました(図9)。その結果、検出領域の位置関係や一致判定のマークがより見やすくなり、検索結果の確認が容易になりました。確かに隣の人が誤認されています。

(図9)検出結果のみをシンプルに表示

しきい値の再調整による精度改善

次に、類似度判定のしきい値を少し厳しく設定してみます。デフォルトでは、1.24fに設定されていましたが、これを1.20fに変更しました。

(図10)しきい値を変更した結果

調整後は、目的の人物だけを正しく検出できるようになりました。類似度の基準を厳しくすることで、似ている別人を誤って検出するケースが少なくなり、判定の信頼性が向上しました。

まとめ

FeatureExtractorを利用することで、人を見分ける、似ているものを探すといったアプリを作成し、その調整方法や精度改善の考え方を確認できました。アイリアSDKでは、顔検出/特徴抽出/類似度判定といった処理を一連のAPIとして簡潔に呼び出せるため、複雑な前処理を意識せずに応用開発を行えます。また、モデルの切り替えや入力データ形式の変更によって、顔認識だけでなく製品の外観検査や類似画像検索などにも応用が可能です。

ぜひ本稿の内容を参考に、独自の「探すAIアプリ」を開発してみてください。

氏森 充(うじもり・たかし)氏

約30年間、株式会社構造計画研究所にてIoT、ビッグデータ、機械学習、AI関連のシステム開発や実務応用に従事。退職後はLLM(大規模言語モデル)関連の情報収集や技術動向の調査・発信に注力し、雑誌『Interface』でもLLM技術に関する記事を執筆中。

SHARE THIS ARTICLE