3歩進んで2歩下がる?
なかなか思ったようには行きませんねぇ…という話。
先の2回の投稿では、ベクトル検索の精度を上げるための施策として以下の画像加工に関して紹介しました。
- rembg:画像から背景(被写体以外)を削除する
- cv2.equalizeHist:ヒストグラム平坦化
自分で撮影したいくつかの画像に関してはかなり良い感じで機能していたので、弊社サイト(https://wine.swailife.com/)で販売しているワインの画像(約4000種)に対しても適用してみました。
ボトル全体を写した画像の加工に関しては比較的期待通りの結果が得られたのですが、ベクトル検索段階では異なる商品でも距離が近いと判断されるものが多数発見されました。
前回の投稿では距離が「0.09」未満かどうかを同一商品であることの閾値にしようとしていましたが、これだと論外レベルで多量の別商品がヒットしてしまいます。
閾値を「0.05」にしても数十個の別商品がヒットするような商品も相当数存在し、逆にこの閾値にしてしまうと同じ商品を撮影した別画像を異なる商品と判断してしまう確率もかなり高くなると思われ、この辺でボトル全体の画像での判別に限外を感じました。
エンベディングの際の画像サイズは224×224に縮小されるので、このサイズに当該商品の特徴を十分に反映することを考えると、ボトル全体像ではやはり無理があるのかもしれません。
と言うことで、最も商品の特徴を反映した部分であるラベル(エチケット)の画像を対象にしてみました。
実は、ラベルの比較は一番最初に考えたことですが、撮影状況によって結構違った感じの画像になってしまうのではないかという懸念がありました。
例えば以下のような感じで。
![]() | ![]() | ![]() |
上記のような懸念はありましたが、まずは弊社サイトで扱っているワインのラベル画像に関して前述の画像加工を実施してみました。
しかし、結果は残念なことに…
背景削除の限界
人間の感覚としては、ラベル画像の主な被写体はラベル部分であり、その他の部分が背景と認識します。
しかし、rembgはもう少し違った感性で処理を行うようです。
以下は一部の例です。
1 | 2 | 3 | 4 | 5 |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
1に関しては、妙に納得してしまう結果です。
ラベル内の白や青の部分も、改めて見ると確かに背景っぽいです。
2に関しては、当然とも言える結果です。
写真の中から人物のみを抽出するのはrembgに期待される機能の最たるものでしょう。
3に関しては、ラベルに描かれた糸屑のようなものを被写体と考えた場合、どこまでを残すかの判断がかなり難しい画像でしょうね。
4に関しては、なかなか不思議な結果です。
ラベルに描かれた絵の、上の部分の一部だけが背景と見做されています。
被写体と背景の境界もかなり曖昧です。
どうしてこのような境界になったのか、今ひとつ基準が想像できません。
5に関しては、3と似ていますが、被写体と背景の境界の判断がなかなか絶妙です。
そもそもラベルに描かれた絵が何であるか分からないのですが、切り取られた部分を見た後で元画像を見ると、確かに切り取られた部分が何かを意味するものであるよう独立して見えてきます。
いずれにしても、ラベル部分を被写体とし、その他の部分を背景と見做すという目論みは完全に失敗しています。
このようなケースがかなりの頻度で見受けられます。
ボトル全体を写した画像であれば、ボトル部分が被写体、その他の部分が背景と判断できるようですが、ラベルの画像に関してはラベル内に描かれたものの中から被写体を探そうとしてしまうようです。
ただ、例えば上記2番目の例のように人物が描かれたラベルでも、人物のみを抽出してしまうケースとそうでないケースがあり、今ひとつ基準が良く分かりません。
ヒストグラム平坦化の弊害
ヒストグラムの平坦化に関しては、見難い画像を見やすくする効果がある一方で、変な部分が悪目立ちしてしまう傾向もあるようです。
以下は一部の例です。
1 | 2 | 3 | 4 | 5 |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
1に関しては、背景に描かれた植物のような模様が強調されてしまっています。
これが商品判別に効果的であれば良いですが、逆に文字の部分などは見難くなっています。
エンベディングにおいてどのような処理が行われているか分からないので明確なことは言えませんが、人間の目で見た場合の「見難さ」から受ける印象としてはプラス面よりもマイナス面の方がありそうに感じてしまいます。
2に関しては、ラベルの表面にある横縞のかすかな凹凸が強調されてしまっています。
1と同様にラベル本来の絵や文字が見難くなっている印象です。
3に関しては、元画像を見る限り単純な白い背景であるにも関わらず、加工後はかなり黒ずんだような背景になってしまっています。
4に関しては、ラベル部分は問題ありませんが、ボトルの表面への写り込みが強調されています。
5に関しては、かなり意味不明な結果になってしまっています。
これはヒストグラム平坦化のみの問題ではなく、その前段階のrembgによる被写体の切り抜きの問題もあるように思いますが、いずれにしてもこのレベルで元画像が加工されてしまうようでは、同じ商品を写した別画像間の違いも大きくなってしまうように思います。
全般的に人間の目で見ると、加工後の画像は元画像よりも「汚い」との印象を持つのですが、それが商品判別の害になるのかどうかは正確には分かりません。
ただ、上記例の3や4のように本来は単調な部分(白い背景やボトルの表面)に模様のような情報が追加されてしまっていることはノイズと同じで邪魔な情報に思えます。
まとめ
実際にエンベディングするところまで至っていませんが、画像加工をした段階でかなり難ありの印象を受けたので、とりあえず現在の状況、問題点を記録しておきます。
ラベル画像でのベクトル検索に関しては引き続き模索したいと思っていますが、少なくともrembgでの背景除去は使用しない方が良さそうですし、ヒストグラム平坦化に関しても再度効果を検証した方が良さそうです。
やはり、もっとがっつりとAIを使わないと画像からの商品判別は難しいのかも、との疑念も生じつつありますが、それはそれで色々と難しい点も出てきますので、もう少し手の届く範囲での工夫で改善できる点を探してみようと思います。