先の投稿で、類似度の高い画像の識別にチャレンジし、残念ながら玉砕しましたが、他の方式だったら結果が違ってくるかもしれません。
と言うことで、今回は深層学習モデルを色々と変えながら、結果がどの程度変化するかを見ていきたいと思います。
深層学習モデル
Gemini先生に、TensorFlow/Kerasで今回のResNet50と同様の用法で使用できる深層学習モデルを紹介してもらったところ、以下のようなものがリストアップされました。
ResNet シリーズ | ResNet101, ResNet152 |
EfficientNet シリーズ | EfficientNetB0, EfficientNetB1, EfficientNetB2 |
VGG シリーズ | VGG16, VGG19 |
Inception シリーズ | InceptionV3, InceptionResNetV2 |
MobileNet シリーズ | MobileNetV2, MobileNetV3 |
上記のうち、「MobileNet シリーズ」は「モバイルデバイスでの利用を想定した軽量なモデル」とのことなので今回は除外し、他の4シリーズに関して試してみたいと思います。
実験方法
先の投稿で利用した以下の18枚の画像を使用します。
1.jpg | 2.jpg | 3.jpg | 4.jpg | 5.jpg | 6.jpg | 7.jpg | 8.jpg | 9.jpg |
10.jpg | 11.jpg | 12.jpg | 13.jpg | 14.jpg | 15.jpg | 16.jpg | 17.jpg | 18.jpg |
1.jpg〜9.jpgが1月のカレンダー、10.jpg〜18.jpgが2月のカレンダーです。
今回は1.jpgとの比較で1月のカレンダーに関する画像をどれだけ類似性が高いと判断できるかを見ていきます。
ResNet101
1.JPG | 0.0 | 1月 |
2.JPG | 0.02327724878610027 | 1月 |
3.JPG | 0.02327724878610027 | 1月 |
12.JPG | 0.03009997940976472 | |
10.JPG | 0.03465741195846839 | |
11.JPG | 0.03808098038477825 | |
4.JPG | 0.04833876367290135 | 1月 |
5.JPG | 0.0539031517687657 | 1月 |
6.JPG | 0.06513449417612538 | 1月 |
18.JPG | 0.08185179208733429 | |
14.JPG | 0.0864636185124743 | |
13.JPG | 0.08824673135373573 | |
17.JPG | 0.09046287459695934 | |
15.JPG | 0.09166650476023819 | |
16.JPG | 0.11575934411277244 | |
9.JPG | 0.12907074505134875 | 1月 |
7.JPG | 0.1571380590607515 | 1月 |
8.JPG | 0.16105363014714968 | 1月 |
後半の順位がResNet50と若干違っていますが、概ね同じ結果と言えます。
つまり識別精度的にはあまり向上していません。
ResNet152
1.JPG | 0.0 | 1月 |
2.JPG | 0.03674984105559431 | 1月 |
3.JPG | 0.03802103693886327 | 1月 |
12.JPG | 0.04893414523916506 | |
11.JPG | 0.049248573145582064 | |
10.JPG | 0.06376065026984501 | |
17.JPG | 0.07741713592857524 | |
18.JPG | 0.09124131251189171 | |
15.JPG | 0.10504679187009369 | |
13.JPG | 0.10873224661311975 | |
16.JPG | 0.1112194560324139 | |
5.JPG | 0.11206575615395875 | 1月 |
6.JPG | 0.11303203596149736 | 1月 |
14.JPG | 0.1201699253922528 | |
4.JPG | 0.13693213170886753 | 1月 |
9.JPG | 0.1475481077333235 | 1月 |
8.JPG | 0.17379517170441983 | 1月 |
7.JPG | 0.1821753345816527 | 1月 |
ResNet50と比較して、むしろ悪化した結果と言えます。
EfficientNetB0
EfficientNetB0に関しては、出力されるベクトルが1280次元なので出力先テーブルの該当カラムの型を調整する必要があります。
1.JPG | 0.0 | 1月 |
2.JPG | 0.023982343752747215 | 1月 |
3.JPG | 0.03325941472582694 | 1月 |
12.JPG | 0.051623968651842156 | |
11.JPG | 0.05591873687504745 | |
15.JPG | 0.06100042587388177 | |
10.JPG | 0.06486174055234883 | |
14.JPG | 0.08924122218088015 | |
4.JPG | 0.09071837229628388 | 1月 |
5.JPG | 0.09163840348431629 | 1月 |
17.JPG | 0.0960218786183783 | |
6.JPG | 0.09658580480688816 | 1月 |
13.JPG | 0.10371871473312488 | |
8.JPG | 0.10939470440002852 | 1月 |
18.JPG | 0.11020145688390492 | |
9.JPG | 0.11257043238293729 | 1月 |
7.JPG | 0.11381104964196587 | 1月 |
16.JPG | 0.12647192023065035 |
ResNetシリーズと違った傾向が見られますね。
ただ、1月のカレンダーを識別するという目的に対しては不十分な結果ですが。
EfficientNetB1
出力されるベクトルはEfficientNetB0と同様に1280次元とのことです。
1.JPG | 0.0 | 1月 |
2.JPG | 0.03424658122450608 | 1月 |
12.JPG | 0.03521517452605416 | |
3.JPG | 0.05027848453228356 | 1月 |
11.JPG | 0.05268084509683191 | |
10.JPG | 0.07118870290303081 | |
5.JPG | 0.07924597286065282 | 1月 |
4.JPG | 0.0868371107258572 | 1月 |
14.JPG | 0.10042606768130069 | |
6.JPG | 0.10243121449057291 | 1月 |
15.JPG | 0.10407702236263094 | |
13.JPG | 0.1109789335679423 | |
18.JPG | 0.14675259922750383 | |
17.JPG | 0.1561581934405849 | |
8.JPG | 0.23356964070473685 | 1月 |
7.JPG | 0.23635098085156914 | 1月 |
9.JPG | 0.2545235063005429 | 1月 |
16.JPG | 0.26300481357241745 |
EfficientNetB0の結果と比較して、若干の順位の違いはありますが、全体的な精度としてはあまり変わらないようです。
EfficientNetB2
出力されるベクトルはEfficientNetB0,B1と異なり、1408次元とのことです。
入力する画像サイズは厳密には260×260が最適らしいのですが、224×224でも「実用上は十分な性能が得られる」(Gemini先生談)とのことなので、従来の処理と同様に224×224に変換します。
1.JPG | 0.0 | 1月 |
2.JPG | 0.04661384699578597 | 1月 |
3.JPG | 0.05538359686408756 | 1月 |
12.JPG | 0.058677008880514525 | |
10.JPG | 0.06790239283566035 | |
11.JPG | 0.07010270094551863 | |
15.JPG | 0.08927818836143397 | |
5.JPG | 0.10097487610076661 | 1月 |
4.JPG | 0.10324752110289326 | 1月 |
6.JPG | 0.1174192425681162 | 1月 |
14.JPG | 0.1220069673095685 | |
13.JPG | 0.15209762578714492 | |
17.JPG | 0.15658856537368482 | |
18.JPG | 0.171294572872284 | |
16.JPG | 0.19083580442485903 | |
7.JPG | 0.20124390154430027 | 1月 |
8.JPG | 0.2292854839243046 | 1月 |
9.JPG | 0.2348438798264224 | 1月 |
若干の順位の違いはありますが、ResNet50の結果に近い印象です。
結局、期待した結果は得られていないのですが。
VGG16
出力されるベクトルは512次元とのことです。
1.JPG | 0.0 | 1月 |
2.JPG | 0.01985837184854433 | 1月 |
3.JPG | 0.024482085326894554 | 1月 |
12.JPG | 0.03265132736708065 | |
10.JPG | 0.03696391118086939 | |
11.JPG | 0.04407630182378408 | |
14.JPG | 0.05434004956156513 | |
5.JPG | 0.05793149299709632 | 1月 |
4.JPG | 0.06772617674302162 | 1月 |
15.JPG | 0.07370650211015206 | |
6.JPG | 0.07534155984553992 | 1月 |
13.JPG | 0.07679211617756154 | |
7.JPG | 0.10681795633549229 | 1月 |
18.JPG | 0.11560610430596441 | |
17.JPG | 0.1172654747922679 | |
9.JPG | 0.12415982183107299 | 1月 |
8.JPG | 0.14753471754963565 | 1月 |
16.JPG | 0.16341637664072617 |
例によって、若干の順位の違いはありませが、全体的な傾向(精度)に大差はありませんね。
VGG19
出力されるベクトルは512次元とのことです。
1.JPG | 0.0 | 1月 |
2.JPG | 0.013768865402594699 | 1月 |
3.JPG | 0.014052155404651323 | 1月 |
11.JPG | 0.027420718445977155 | |
12.JPG | 0.03432138246400318 | |
10.JPG | 0.03647648944753168 | |
5.JPG | 0.04131211761433806 | 1月 |
4.JPG | 0.05542300559579583 | 1月 |
17.JPG | 0.061643022399294645 | |
6.JPG | 0.062365107778861284 | 1月 |
15.JPG | 0.06545457774885777 | |
14.JPG | 0.06551502191323488 | |
18.JPG | 0.06977337680320439 | |
13.JPG | 0.07254694790148197 | |
7.JPG | 0.10484232765392909 | 1月 |
9.JPG | 0.11784995754854899 | 1月 |
8.JPG | 0.12021340907886469 | 1月 |
16.JPG | 0.13668184657284244 |
例によって…(以下略)
InceptionV3
入力画像サイズが299×299、出力ベクトルの次元数が2048となるようです。
1.JPG | 0.0 | 1月 |
12.JPG | 0.0060804828840949066 | |
3.JPG | 0.007608874621485295 | 1月 |
11.JPG | 0.00808879494449799 | |
2.JPG | 0.013352384806143425 | 1月 |
10.JPG | 0.016674162478093946 | |
15.JPG | 0.021140900464763135 | |
4.JPG | 0.023392430724136992 | 1月 |
13.JPG | 0.026825210137682465 | |
5.JPG | 0.030475220033907457 | 1月 |
6.JPG | 0.031159590979310536 | 1月 |
14.JPG | 0.04625269263077303 | |
16.JPG | 0.06590965831411544 | |
18.JPG | 0.06915861948188007 | |
17.JPG | 0.07151025815090561 | |
8.JPG | 0.07925932127006763 | 1月 |
7.JPG | 0.07960222133605666 | 1月 |
9.JPG | 0.08068146443075619 | 1月 |
他のモデルでは1.jpgに最も近いとされていた2.jpgが5位に転落しています。
距離も他のモデルと比較して全般的に小さいので、個々の画像の細かな特徴があまり反映されていないということでしょうかね?
良くも悪くも個性的なモデルのようです。
InceptionResNetV2
入力画像サイズが299×299、出力ベクトルの次元数が1536となるようです。
1.JPG | 0.0 | 1月 |
2.JPG | 1.4708799026319497e-05 | 1月 |
12.JPG | 5.3570312902984085e-05 | |
3.JPG | 5.8476327443823806e-05 | 1月 |
13.JPG | 5.9978413332273384e-05 | |
10.JPG | 6.492441059791076e-05 | |
11.JPG | 6.790175568083257e-05 | |
18.JPG | 8.068363158453273e-05 | |
15.JPG | 9.458173224263788e-05 | |
17.JPG | 0.00011013793399017313 | |
16.JPG | 0.00011689968797312655 | |
14.JPG | 0.0001295033780684962 | |
9.JPG | 0.00015844986360047386 | 1月 |
4.JPG | 0.0001669447488125142 | 1月 |
8.JPG | 0.00017747445982574384 | 1月 |
5.JPG | 0.00019458369889902016 | 1月 |
7.JPG | 0.00021361202281267033 | 1月 |
6.JPG | 0.00024484377402500535 | 1月 |
距離の数字がさらに極端な状態になっています。
精度的には他のモデルと比較して最も期待外れと言って良いでしょう。
まとめ
残念ながらモデルを変えることでは期待していたような結果は得られませんでした。
ということで、内容的には今後の参考になるような点はあまりないのですが、各種深層学習モデルの紹介という程度の意味で記録を残しておきます。
全体的な傾向も、モデルによって大きな違いはないように思います。
まずは、2.jpg, 3.jpgが近いと判断される点は良いとして、その次に近いと判断されるのは概ね10.jpg, 11.jpg, 12.jpg辺りで、これはつまり対象物の絵柄(1月か2月か)よりも全体の構図の類似性の方が重視されているということかと思います。
画像を俯瞰的に捉えている(つまり細部の違いはあまり重視されない)と言うことでしょうか。
この傾向が共通しているということは、画像の特徴ベクトルの抽出とはそういうものだと割り切るべきなのでしょう。
前回の投稿でも触れましたが、エンベディングの際に画像サイズを224×224に変換(縮小)している段階で細部の情報がかなりロストしているように思いますし、その他の観点も含めて事前の画像加工部分にも着目してみるべきかもしれません。
いずれにしても、現状では十分な精度を得られていないため、引き続き方策を検討していきたいと思います。