画像認識を機械学習で実行する機会がありました。
以前から気になっていたのが、RGBというコンピューターに都合の良い色の形式と、より直感的なHSV(色相・彩度・明度)で、認識精度に差が出るのでは?という疑問を持っていたのです。
HSV以外にも、Labや、XYZなど、色を数値化する方法はいろいろありますが、とりあえず、RGBとHSVで差が出るのか?という点について検証してみました。
HSVとは
これを読んでいる方は、RGBが何たるかはご理解いただいている想定です。
HSVは、だいたいこんなイメージで、RGBの時の「RとGを足すと黄色に...」のようなややこしいことを考えないで済む便利さがあります。
- 色相: 赤~緑~青~ を環状につなげたどの色に属するか
- 彩度: 色の鮮やかさ 言い換えるとその色の白っぽさ(例:赤⇒ピンク⇒白)
- 明度: 明るさ 明るさを下げていくと、暗くなって黒になる
もっと詳しい説明は Wiki 等をご覧ください。
とりあえず試してみた
img = Image.open(os.path.join(path, filename))
img_rgb = np.array(img)
img_hsv = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2HSV)
上記の通り OpenCV で、RGB から HSV に簡単に変換できたので、画像認識のタスクにかけてみました。
グリーン:RGB
オレンジ:HSV
うーん、、、、試行する毎に変動もあるので、ほぼ同じ結果と言ってよさそうです。
もうちょっと変化でてくれないかしら?と期待していたのですが、残念。
いったん結論
どうも機械学習にかける画像は、RGB でも HSV でも差がなさそう。
ということになりました。
見た限りほとんどの画像認識タスクがRGBで行われていたので、そんなこともあるのかなあ、と何となく考えていたのですが、どうやら、その通りのようです。
「RGBの画像で十分」
ということでした。
もし他に私のように、HSVなどの違う画像フォーマットで認識精度アップを企んで😎いたら、無駄な検証を減らせるように…ということでメモ書きさせていただきました。
↑と書きましたが、データの使い方・加工・学習方法によっては、HSVなど色空間変換をしたほうが良いケースもあるのではと思います。あくまでシンプルな画像認識のシナリオの場合のお話ということでご了承ください。
ChatGPTにも質問してみました
とても的確な回答をいただいたので、そのまま引用させていただきます。
画像認識において、RGB形式とHSV形式の違いが認識精度に大きな影響を与えない理由はいくつか考えられます。
1. モデルの特性
多くの機械学習モデルは、入力データの形式に対して比較的ロバストです。特に、ディープラーニングモデル(例えば、畳み込みニューラルネットワーク(CNN))は、学習の過程で特徴量を自動的に抽出するため、入力データがRGB形式であってもHSV形式であっても、最終的には同様の有用な特徴を学習することができます。
2. データの再スケーリング
RGBとHSVは異なる色空間を表しますが、ピクセルごとの情報量は変わりません。データが同じ情報を含んでいるため、モデルは同じように学習し、同じようなパフォーマンスを示すことがよくあります。
3. 前処理とデータ拡張
モデルの前処理やデータ拡張技術(例えば、正規化、ランダムクロップ、フリップなど)が効果的である場合、入力データの形式の違いはさらに影響を受けにくくなります。これにより、RGBとHSVの違いが緩和され、モデルの認識精度にはほとんど影響しません。
4. 実際の色相の重要性
HSV形式は色相(Hue)、彩度(Saturation)、明度(Value)に基づいていますが、多くの画像認識タスクでは、実際の色相や彩度よりも形状やエッジなどの特徴が重要です。このため、RGBとHSVの違いが認識精度に影響を与えにくい場合があります。
5. データセットのバランス
使用しているデータセットのバランスや多様性も影響を与える可能性があります。データセットが非常に多様であれば、入力形式の違いは相対的に小さな要因となります。
まとめると、RGBとHSVの形式の違いが認識精度に大きな影響を与えない理由は、モデルの特性や前処理技術、データの情報量、特徴抽出の重要性に依存しているからです。これらの要因が組み合わさることで、最終的には入力形式の違いが緩和され、同様のパフォーマンスを示す結果となります。
ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。