メインコンテンツにスキップ

顔認識

概要

Immichは写真や動画内の顔を認識し、それらを人ごとにグループ化します。その後、人々に名前を割り振り、検索することができます。

探索ページで人物のリストが表示されます。

人物をクリックすると、その人物の顔を含む資産のリストが表示されます。

資産の詳細ビューでは、その資産内で認識された顔も表示されます。

操作

実行可能な追加の操作には以下が含まれます:

  • 人物の特徴写真を変更する
  • 人物の誕生日を設定する
  • 検出された複数の顔を1人に統合する
  • 探索ページおよび詳細ビューから人物の顔を非表示にする
  • 認識されていない顔を人物に割り振る

人物の詳細ビューにアクセスするとき、アプリバーからアクセス可能です。

顔検出の仕組み

顔検出では、生成されたプレビュー画像を機械学習サービスに送信し解析します。サービスは関連モデルがダウンロードされているか確認し、ない場合ダウンロードします。画像は解読され、前処理され、顔検出モデル(設定されていればハードウェア加速使用)に送られます。モデルから出力されたバウンディングボックスとスコアを使って画像をトリミングし、さらに前処理された後、顔認識モデルに送られます(同様に加速可能)。認識モデルの埋め込みデータ、バウンディングボックス、スコアはサーバーへ送られ、データベースに追加されます。特に埋め込みデータは素早い検索が可能なようにインデックス化されます。

顔認識の仕組み

顔認識アルゴリズムは、人気のクラスタリングアルゴリズムであるDBSCANに由来しています。基本的に検出された各顔をグラフのポイントとして扱い、近接するポイントをグループ化します。

ノート

重要な概念は、何かが_コアポイント_であるかどうかです。コアポイントは、一定距離内に最低限のポイントが存在する場合に成立します。コアポイントではないポイントは、コアポイントに接続できる場合のみクラスタに割り当てられます。Immichでは、_認識された最小顔数_設定がコアポイントとしてみなされる閾値を制御します。

各顔について、周囲の一定距離内に他の顔があるかを探します。この範囲内の顔は類似しているとされ、その後これらの顔が人物に関連付けられているか確認されます。

既存の人物がいる場合、処理中の顔に最も類似した顔の人物が割り当てられます。

存在しない場合、DBSCANアルゴリズムから何かを決定する必要があります。その顔が_コアポイント_かどうかです。特定数の類似顔(デフォルトで考慮する顔自身を含む3つ)がある場合、この顔はコアポイントとみなされます。この顔用に新しい人物が作成され、その顔が割り当てられます。他の顔が処理されると、それらがこの顔に類似していれば、関連する人物を見つけてその人物に割り当てます。

しかし、十分に類似した顔がいない場合、新しい人物は作成されません。代わりに、その顔はすべての他の顔が処理されるのを待ち、以前に関連付けされていなかった人物に関連付けられるか確認します。もし関連付けがあるなら、その顔がその人物に割り当てられます。なければこの顔はアウトライヤーとみなされ、画像の背景にいるような見知らぬ人となります。

このアルゴリズムはDBSCANとは少し異なる点があります:

  • DBSCANは増分クラスタリングの概念を持ちません。一度にすべてのポイントをクラスタリングします。対照的に、顔認識は資産が追加されるたびにすべてを再クラスタリングすることなく進化する必要があります。
    • 上記のアルゴリズムはキューに入れられた資産のセット内で動作します。一度これらの顔が処理され、新しいラウンドで顔が検出されると、従来のDBSCANとは異なる動作を示します。前のラウンドで生成されたクラスタ(人物)を維持するためです。
      • このため、顔検出とサムネイル生成が完了するのを待ってから開始するように顔認識が試みられます:キュー内の顔セットが大きいほど、結果は良くなります。
      • その後、すべての資産に対して顔認識を再実行するとDBSCANのように動作します。
  • DBSCANは距離ベースの検索(つまり、一定距離内のポイント)を目的としていますが、高次元ベクトルインデックスは通常、最も近いKの結果を取得するよう最適化されています。認識アルゴリズムは性能上の理由から、一定距離内の_すべて_の類似顔を取得しようとはしません。代わりに各顔に対し少数の一致を検索します。最終結果は非常によく似ているか、実質同じになりますが、異なる性能特性を持つ可能性があります。
    • このため、未割り当ての顔を認識できるよう毎晩のジョブで一部の認識プロセスが実行されます。
ヒント

資産を一度にインポートしなかった場合や、サーバーがジョブをアップロード速度を上回る速度で処理できた場合、クラスタリングが最適でない可能性があります。現在の結果に労力を費やしていない場合、すべての資産で顔認識を再実行することで最適なスタート地点を得ることが価値があるかもしれません。それが遅すぎる場合、認識されていない顔を選択的に手動で割り当て、「欠けている」顔認識をキューに入れることで学習し、より多くの顔を自動的に割り当てることができます。

設定

管理 > 設定 > 機械学習設定 > 顔認識から利用可能なオプションを確認できます。

ヒント

ここでパラメータを大きく変えるのではなく、調整するのが良いです。厳しい設定にしたい場合、他の設定を緩和して補正するか、逆にすることでバランスを取ることができます。

ガイドで結果の調整方法について学ぶことができます。

顔認識モデル

いくつかのモデルが利用可能で、デフォルトが通常最適とされています。デフォルトが負荷が大きすぎる場合、より小さいモデルを選択することができます。

最小検出スコア

この設定では、顔検出モデルの結果を誤検出としてフィルタリングするかどうかが影響します。より多くの顔を検出したい場合、低く設定するのは魅力的にも見えますが、扱いにくい誤検出が生じる可能性があり、顔認識に悪影響を及ぼします。この設定を0.5以下に設定することは強く推奨されません。また、非常に高い値(例えば0.9)に設定することも推奨されません。デフォルトは精度寄りに設定されており、それほど高い閾値では多くの顔が検出されなくなります。

この設定を変更した後、新しい顔検出ジョブにのみ適用されます。すべての資産に新しい設定を適用するには、すべての資産に対して顔検出を再実行する必要があります。

最大認識距離

「顔認識の仕組み」で説明されている距離閾値です。デフォルトは大多数の人に対してうまく機能しますが、ライブラリに双子や非常によく似た人物がいる場合は下げる価値があります。閾値が低すぎるだけなら顔認識後に重複する人物を統合する必要がありますが、閾値が高すぎると修正不能な結果が生じる可能性があります。0.3以下または0.7以上には設定しないことを強く推奨します。

認識された最小顔数

「顔認識の仕組み」で説明されているコアポイント閾値です。この設定にはいくつかの影響があります。まず、この設定が即座に有効になり、この閾値以下の顔数しかない人物が表示されなくなります。また、一定密度を要求することにより、それらの顔が疎に関連しているためにリンクされることを防ぎ、クラスタリングをより堅牢にします。

この設定を増加させることは、認識距離を増加させたり、最小検出スコアを減少させた場合の良いアイデアです。1に設定するとコアポイントの概念が効果的に無効になりますが、より手作業のアプローチを好む場合に選択肢として利用できます。