はじめに
画像からプロンプトを考えて最も似ている画像を生成した人が勝ちのゲームでは、SSIMを使用しており、似ていない画像でも優勝してしまうことがありました。下記は、おそらく一致する輝度が多かった例。
他の手法を用いて改善していきます。
開発環境
- Windows 11 PC
- Python 3.11
LPIPS
LPIPSは、AlexNetやVGGなどの学習済み画像分類ネットワークの畳み込み層が出力する特徴量を基に類似度を算出する手法です
こちらを参考に実装します
1.ライブラリをインストール
$ pip install lpips==0.1.3
2.プログラムを作成
.py
import lpips
import torch
import torchvision.transforms.functional as TF
from PIL import Image
loss_fn_alex = lpips.LPIPS(net='alex') # best forward scores
#loss_fn_vgg = lpips.LPIPS(net='vgg') # closer to "traditional" perceptual loss, when used for optimization
path_img0 = "groundtruth.png"
path_img1 = "1.png"
# Variables im0, im1 is a PyTorch Tensor/Variable with shape Nx3xHxW
# (N patches of size HxW, RGB images scaled in [-1,+1])
img0 = Image.open(path_img0)
img0 = img0.convert("RGB")
img0 = (TF.to_tensor(img0) - 0.5) * 2
img0.unsqueeze(0)
img1 = Image.open(path_img1)
img1 = img1.convert("RGB")
img1 = (TF.to_tensor(img1) - 0.5) * 2
img1.unsqueeze(0)
# Higher means further/more different. Lower means more similar.
d = loss_fn_alex(img0, img1)
print("Perceptual loss",1-d.item()) # 1に近づくほど似ているように変更
※RGBAの画像があったため、convert("RGB")で変換しています
実行
エンジニアの輪@福岡
お題 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
SSIM | 0.153 | 0.367 | 0.360 | 0.391 | 0.305 |
LPIPS | 0.228 | 0.200 | 0.221 | 0.179 | 0.185 |
6 | 7 | 8 | 9 | 10 | |
SSIM | 0.364 | 0.268 | 0.297 | 0.322 | 0.295 |
LPIPS | 0.160 | 0.232 | 0.235 | 0.174 | 0.222 |
AIミーティング
お題 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
SSIM | 0.165 | 0.175 | 0.121 | 0.111 | 0.164 |
LPIPS | 0.182 | 0.189 | 0.227 | 0.222 | 0.190 |
6 | 7 | 8 | 9 | 10 | |
SSIM | 0.192 | 0.156 | 0.265 | 0.162 | 0.171 |
LPIPS | 0.187 | 0.204 | 0.096 | 0.251 | 0.235 |
個人的には7番の画像が一番近いと思ったのですが、、いかがでしょうか?
お題 | 7 |
---|---|
特徴点のマッチングやセグメンテーションされた領域同士の比較、配置の近さなどを考慮してみたいです。
お疲れ様でした。