はじめに
セマンティックセグメンテーションの学習モデルとして使用されている「PASCAL VOC 2012」では、色とクラスが以下のようにマッピングされています。

これらがどのように決められているのかを書かせていただきます。
インデックス値とクラスの紐付け
現在の「PASCAL VOC 2012」では20のクラスと1つの背景、および、1つの未設定の合計22クラスが設定されています。
これらはカラーマップのインデックス値と紐づいています。
| インデックス値 | クラス |
|---|---|
| 0 | 背景 |
| 1 | 飛行機 |
| 2 | 自転車 |
| 3 | 鳥 |
| 4 | ボート |
| 5 | ビン |
| 6 | バス |
| 7 | 自動車 |
| 8 | 猫 |
| 9 | 椅子 |
| 10 | 牛 |
| 11 | テーブル |
| 12 | 犬 |
| 13 | 馬 |
| 14 | バイク |
| 15 | 人 |
| 16 | 鉢植え |
| 17 | 羊 |
| 18 | ソファー |
| 19 | 電車 |
| 20 | テレビ |
| 21 | 未設定 |
これらは固定となっています。
インデックス値と色の紐付け
学習データでは、各ピクセルが上記の値になっているわけではなく、人が見て区別できるような色が設定されています。

これらの色とインデックス値は、以下の法則で決まっています。
- 黒(0,0,0)は0(背景)
- それ以外は、赤・緑・青のそれぞれの上位ビットから順番に、インデックス値の下位ビットに割り当てる
- 上記から、255(未設定)は明るいグレーっぽい色(224,224,192)
具体的には、以下の値が紐づいています。
| 赤 | 緑 | 青 | インデックス値 |
|---|---|---|---|
| 0x00 | 0x00 | 0x00 | 0(背景) |
| 0x80 | 0x00 | 0x00 | 1 |
| 0x00 | 0x80 | 0x00 | 2 |
| 0x80 | 0x80 | 0x00 | 3 |
| 0x00 | 0x00 | 0x80 | 4 |
| 0x80 | 0x00 | 0x80 | 5 |
| 0x00 | 0x80 | 0x80 | 6 |
| 0x80 | 0x80 | 0x80 | 7 |
| 0x40 | 0x00 | 0x00 | 8 |
| (以下省略、(224,224,192):255(未設定)まで設定可能) |
※こちらで取得できるデータでは、インデックスカラーで指定されているため、いちいちRGBのビットを見て変換とかしなくても、インデックスの値そのまま使えます
おまけ
PILでインデックスカラーの画像ファイルを読み込むと、そのままインデックス値が取得できる。
OpenCVでインデックスカラーの画像ファイルを読み込むと、RGBに変換されたものしか取得できないので注意。
まとめ
色とインデックス値の紐付けが分かったので、これで独自データを学習させてセグメンテーションできますね。
(学習データを用意するのがめんどくさいのですが...)
