画像検索の精度確認(2)

Date:

Share post:

先の投稿で、類似度の高い画像の識別にチャレンジし、残念ながら玉砕しましたが、他の方式だったら結果が違ってくるかもしれません。
と言うことで、今回は深層学習モデルを色々と変えながら、結果がどの程度変化するかを見ていきたいと思います。

深層学習モデル

Gemini先生に、TensorFlow/Kerasで今回のResNet50と同様の用法で使用できる深層学習モデルを紹介してもらったところ、以下のようなものがリストアップされました。

ResNet シリーズResNet101, ResNet152 
EfficientNet シリーズEfficientNetB0, EfficientNetB1, EfficientNetB2
VGG シリーズVGG16, VGG19
Inception シリーズInceptionV3, InceptionResNetV2
MobileNet シリーズMobileNetV2, MobileNetV3

上記のうち、「MobileNet シリーズ」は「モバイルデバイスでの利用を想定した軽量なモデル」とのことなので今回は除外し、他の4シリーズに関して試してみたいと思います。

実験方法

先の投稿で利用した以下の18枚の画像を使用します。

1.jpg2.jpg3.jpg4.jpg5.jpg6.jpg7.jpg8.jpg9.jpg
10.jpg11.jpg12.jpg13.jpg14.jpg15.jpg16.jpg17.jpg18.jpg

1.jpg〜9.jpgが1月のカレンダー、10.jpg〜18.jpgが2月のカレンダーです。
今回は1.jpgとの比較で1月のカレンダーに関する画像をどれだけ類似性が高いと判断できるかを見ていきます。

ResNet101

1.JPG0.01月
2.JPG0.023277248786100271月
3.JPG0.023277248786100271月
12.JPG0.03009997940976472
10.JPG0.03465741195846839
11.JPG0.03808098038477825
4.JPG0.048338763672901351月
5.JPG0.05390315176876571月
6.JPG0.065134494176125381月
18.JPG0.08185179208733429
14.JPG0.0864636185124743
13.JPG0.08824673135373573
17.JPG0.09046287459695934
15.JPG0.09166650476023819
16.JPG0.11575934411277244
9.JPG0.129070745051348751月
7.JPG0.15713805906075151月
8.JPG0.161053630147149681月

後半の順位がResNet50と若干違っていますが、概ね同じ結果と言えます。
つまり識別精度的にはあまり向上していません。

ResNet152

1.JPG0.01月
2.JPG0.036749841055594311月
3.JPG0.038021036938863271月
12.JPG0.04893414523916506
11.JPG0.049248573145582064
10.JPG0.06376065026984501
17.JPG0.07741713592857524
18.JPG0.09124131251189171
15.JPG0.10504679187009369
13.JPG0.10873224661311975
16.JPG0.1112194560324139
5.JPG0.112065756153958751月
6.JPG0.113032035961497361月
14.JPG0.1201699253922528
4.JPG0.136932131708867531月
9.JPG0.14754810773332351月
8.JPG0.173795171704419831月
7.JPG0.18217533458165271月

ResNet50と比較して、むしろ悪化した結果と言えます。

EfficientNetB0

EfficientNetB0に関しては、出力されるベクトルが1280次元なので出力先テーブルの該当カラムの型を調整する必要があります。

1.JPG0.01月
2.JPG0.0239823437527472151月
3.JPG0.033259414725826941月
12.JPG0.051623968651842156
11.JPG0.05591873687504745
15.JPG0.06100042587388177
10.JPG0.06486174055234883
14.JPG0.08924122218088015
4.JPG0.090718372296283881月
5.JPG0.091638403484316291月
17.JPG0.0960218786183783
6.JPG0.096585804806888161月
13.JPG0.10371871473312488
8.JPG0.109394704400028521月
18.JPG0.11020145688390492
9.JPG0.112570432382937291月
7.JPG0.113811049641965871月
16.JPG0.12647192023065035

ResNetシリーズと違った傾向が見られますね。
ただ、1月のカレンダーを識別するという目的に対しては不十分な結果ですが。

EfficientNetB1

出力されるベクトルはEfficientNetB0と同様に1280次元とのことです。

1.JPG0.01月
2.JPG0.034246581224506081月
12.JPG0.03521517452605416
3.JPG0.050278484532283561月
11.JPG0.05268084509683191
10.JPG0.07118870290303081
5.JPG0.079245972860652821月
4.JPG0.08683711072585721月
14.JPG0.10042606768130069
6.JPG0.102431214490572911月
15.JPG0.10407702236263094
13.JPG0.1109789335679423
18.JPG0.14675259922750383
17.JPG0.1561581934405849
8.JPG0.233569640704736851月
7.JPG0.236350980851569141月
9.JPG0.25452350630054291月
16.JPG0.26300481357241745

EfficientNetB0の結果と比較して、若干の順位の違いはありますが、全体的な精度としてはあまり変わらないようです。

EfficientNetB2

出力されるベクトルはEfficientNetB0,B1と異なり、1408次元とのことです。
入力する画像サイズは厳密には260×260が最適らしいのですが、224×224でも「実用上は十分な性能が得られる」(Gemini先生談)とのことなので、従来の処理と同様に224×224に変換します。

1.JPG0.01月
2.JPG0.046613846995785971月
3.JPG0.055383596864087561月
12.JPG0.058677008880514525
10.JPG0.06790239283566035
11.JPG0.07010270094551863
15.JPG0.08927818836143397
5.JPG0.100974876100766611月
4.JPG0.103247521102893261月
6.JPG0.11741924256811621月
14.JPG0.1220069673095685
13.JPG0.15209762578714492
17.JPG0.15658856537368482
18.JPG0.171294572872284
16.JPG0.19083580442485903
7.JPG0.201243901544300271月
8.JPG0.22928548392430461月
9.JPG0.23484387982642241月

若干の順位の違いはありますが、ResNet50の結果に近い印象です。
結局、期待した結果は得られていないのですが。

VGG16

出力されるベクトルは512次元とのことです。

1.JPG0.01月
2.JPG0.019858371848544331月
3.JPG0.0244820853268945541月
12.JPG0.03265132736708065
10.JPG0.03696391118086939
11.JPG0.04407630182378408
14.JPG0.05434004956156513
5.JPG0.057931492997096321月
4.JPG0.067726176743021621月
15.JPG0.07370650211015206
6.JPG0.075341559845539921月
13.JPG0.07679211617756154
7.JPG0.106817956335492291月
18.JPG0.11560610430596441
17.JPG0.1172654747922679
9.JPG0.124159821831072991月
8.JPG0.147534717549635651月
16.JPG0.16341637664072617

例によって、若干の順位の違いはありませが、全体的な傾向(精度)に大差はありませんね。

VGG19

出力されるベクトルは512次元とのことです。

1.JPG0.01月
2.JPG0.0137688654025946991月
3.JPG0.0140521554046513231月
11.JPG0.027420718445977155
12.JPG0.03432138246400318
10.JPG0.03647648944753168
5.JPG0.041312117614338061月
4.JPG0.055423005595795831月
17.JPG0.061643022399294645
6.JPG0.0623651077788612841月
15.JPG0.06545457774885777
14.JPG0.06551502191323488
18.JPG0.06977337680320439
13.JPG0.07254694790148197
7.JPG0.104842327653929091月
9.JPG0.117849957548548991月
8.JPG0.120213409078864691月
16.JPG0.13668184657284244

例によって…(以下略)

InceptionV3

入力画像サイズが299×299、出力ベクトルの次元数が2048となるようです。

1.JPG0.01月
12.JPG0.0060804828840949066
3.JPG0.0076088746214852951月
11.JPG0.00808879494449799
2.JPG0.0133523848061434251月
10.JPG0.016674162478093946
15.JPG0.021140900464763135
4.JPG0.0233924307241369921月
13.JPG0.026825210137682465
5.JPG0.0304752200339074571月
6.JPG0.0311595909793105361月
14.JPG0.04625269263077303
16.JPG0.06590965831411544
18.JPG0.06915861948188007
17.JPG0.07151025815090561
8.JPG0.079259321270067631月
7.JPG0.079602221336056661月
9.JPG0.080681464430756191月

他のモデルでは1.jpgに最も近いとされていた2.jpgが5位に転落しています。
距離も他のモデルと比較して全般的に小さいので、個々の画像の細かな特徴があまり反映されていないということでしょうかね?

良くも悪くも個性的なモデルのようです。

InceptionResNetV2

入力画像サイズが299×299、出力ベクトルの次元数が1536となるようです。

1.JPG0.01月
2.JPG1.4708799026319497e-051月
12.JPG5.3570312902984085e-05
3.JPG5.8476327443823806e-051月
13.JPG5.9978413332273384e-05
10.JPG6.492441059791076e-05
11.JPG6.790175568083257e-05
18.JPG8.068363158453273e-05
15.JPG9.458173224263788e-05
17.JPG0.00011013793399017313
16.JPG0.00011689968797312655
14.JPG0.0001295033780684962
9.JPG0.000158449863600473861月
4.JPG0.00016694474881251421月
8.JPG0.000177474459825743841月
5.JPG0.000194583698899020161月
7.JPG0.000213612022812670331月
6.JPG0.000244843774025005351月

距離の数字がさらに極端な状態になっています。
精度的には他のモデルと比較して最も期待外れと言って良いでしょう。

まとめ

残念ながらモデルを変えることでは期待していたような結果は得られませんでした。
ということで、内容的には今後の参考になるような点はあまりないのですが、各種深層学習モデルの紹介という程度の意味で記録を残しておきます。

全体的な傾向も、モデルによって大きな違いはないように思います。
まずは、2.jpg, 3.jpgが近いと判断される点は良いとして、その次に近いと判断されるのは概ね10.jpg, 11.jpg, 12.jpg辺りで、これはつまり対象物の絵柄(1月か2月か)よりも全体の構図の類似性の方が重視されているということかと思います。
画像を俯瞰的に捉えている(つまり細部の違いはあまり重視されない)と言うことでしょうか。
この傾向が共通しているということは、画像の特徴ベクトルの抽出とはそういうものだと割り切るべきなのでしょう。

前回の投稿でも触れましたが、エンベディングの際に画像サイズを224×224に変換(縮小)している段階で細部の情報がかなりロストしているように思いますし、その他の観点も含めて事前の画像加工部分にも着目してみるべきかもしれません。

いずれにしても、現状では十分な精度を得られていないため、引き続き方策を検討していきたいと思います。

Related articles

画像検索の精度確認(1)

先の投稿では画像検索に関する基本的な...

画像検索

昨今の投稿で触れてきたエンベディング...

画像データのエンベディング

昨今、ベクトル検索に絡む投稿を続けて...

PostgreSQLでベクトル検索

先にPostgreSQL関連の記事を...