画像の類似度を測りたいなーと思い、何か楽な方法はないかと調べるとimgsimというものがありました。
参考にしました方の記事を載せます。
参考元
インストール編
さっそく使おうと思い、インストール
pip install imgsim
で、さっそくインポート
import imgsim
動くか見てみると
Traceback (most recent call last):
省略
ModuleNotFoundError: No module named 'torchvision'
ありゃ、なんかエラー出る
torchvisionがないというのでインストール
pip install tourchvision
するとエラーが出る
ERROR: Could not find a version that satisfies the requirement tourchvision
ERROR: No matching distribution found for tourchvision
pip installじゃダメなのか、なぜだ、、
ではconda installで
conda install torchvision -c pytorch
これで入ったので、動くようになりました!
実行編
MNISTで挙動を見てみたいと思います。
(60000,28,28)から(60000,786)に変換して、正規化
def preprocess_images(images):
images = images.reshape((images.shape[0], images.shape[1]*images.shape[2])) / 255.
return images
train_images = preprocess_images(train_image)
さて類似度を測っていきます。結果をdistという変数に入れます。
dist = imgsim.distance(train_images[0], train_images[0])
print(dist)
結果:0
類似度が高ければ、値は小さく、類似度が低ければ、値は大きくなるようです。
これは同じ画像をみているので当然、値は0になりますね
次に、この0番目の画像に対して、一番似ている画像を探しましょう。
dist_list=[]
for number in range(train_images.shape[0]):
dist = imgsim.distance(train_images[0], train_images[number])
dist_list.append(dist)
np.where(dist_list==np.sort(dist_list)[1])[0][0]
結果:32248
np.whereを使って一番近い画像のナンバーを表示しました。(これ以外のやり方を知らない)
さて、一番近い画像の番号がわかったことですし、これを可視化してみましょう。
0番目の画像
32248番目の画像
ふむ、似てますね。これは信頼してもいいのでは。
以上です。
カラー画像もできるみたいですね。カラー画像を使う際は、参考元にやり方が載っています。