harugonos
@harugonos

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

画像同士の類似度の値を取得する方法

解決したいこと

現在pythonを用いてQiitaを参考にしながらArcFaceを実装しています.

最終的にArcFaceから画像同士の類似度の値を取得できないかと考えております.

発生している問題・エラー

参考サイトでは,推論用のモデルは次のようにベースネットの最終出力を取り出すようなモデルとなっていました.

# predict用のmodel. ArcFaceLayerを除き,重みはloadして使用する
def create_predict_model(n_categories, file_path):
    arcface_model = create_mobilenet_with_arcface(n_categories, file_path) #学習と同じlayer数
    predict_model = Model(arcface_model.get_layer(index=0).input, arcface_model.get_layer(index=-4).output) # MobileNetV2の出力までにして再構築
    predict_model.summary()

    return predict_model

そこで疑問に思ったことは,このモデルから画像同士の類似度を評価したいときは,このモデルの出力ベクトル同士でcos類似度やユークリッド距離などを計算し評価する必要があるのでしょうか.

自分で試したこと

自分なりに考えてみたのですが,ArcFaceの内部でcos類似度を計算しているため出力ベクトル同士での計算もcos類似度がいいのかなと(大変浅はかですが)思ったり,この場合ベクトルの大きさも考慮するためにユークリッド距離にした方がいいとも思ったり…どうなのでしょうか.

つまりこのモデルを用いた場合,どのような方法で画像同士の類似度を算出することができるのかをアドバイスいただきたいです.

0

1Answer

ArcFaceの内部でcos類似度を計算しているため出力ベクトル同士での計算もcos類似度がいいのかなと(大変浅はかですが)思ったり

ご推察のとおりで、ArcFaceでは似ている画像同士で出力ベクトルのコサイン類似度を高めるように学習が進むので、モデル学習後の出力ベクトルを利用するときもコサイン類似度を使うのが自然だと思います。

この場合ベクトルの大きさも考慮するためにユークリッド距離にした方がいいとも思ったり

ユークリッド距離を使うのでも問題ありません。

ArcFaceでは通常、途中でベクトルをL2正規化し、大きさを1にしています。こうしてL2正規化されたベクトル同士では、コサイン類似度が高くなるのに伴い、ユークリッド距離は短くなります(反対も同様です)。したがって、例えばある画像をクエリとし、複数の画像を類似度順に並び替えるユースケースを考えると、類似度の指標としてコサイン類似度を使ってもユークリッド距離を使っても、画像の順番が入れ替わることはありません。ただし値域の観点からは、ユークリッド距離の [0, 2] に対し、コサイン類似度の [0, 1] の方が扱いやすい場合が多いとは思います。

0Like

Comments

  1. @harugonos

    Questioner

    取得したベクトルをL2正規化しコサイン類似度を求めることで無事類似度を算出することができました.
    丁寧な対応ありがとうございました.

Your answer might help someone💌