PSPNetを実装するために使用するデータセットは、PASCAL VOC2021のデータセット使用して、PSPNetを実装していきます。
ここでは、PASCAL VOC2021のデータセットのダウンロード方法とデータセットがどのように格納されているかを紹介していきます。
1. データセットダウンロード
データセットは以下の場所で公開をされています。
上のリンクにアクセスしてもらい、「training/validation data」のリンクをクリックすれば、ダウンロードが開始されます。
ファイルサイズが2GBと大きいので、ダウンロードにはすこし時間がかかります。
2. データセットの確認
2.1. ディレクトリ構成
圧縮ファイルを解凍するとVOCDevkit/VOC2012
の中に次のようなファルダが格納されています。
VOCdevkit/VOC2012 ├─ Annotations ├─ ImageSets ├─ JPEGImages ├─ SegmentationClass └─ SegmentationObject
いろいろディレクトリが存在しますが、セグメンテーションで使用するディレクトリは主に次の二つになります。
- JPEGImages
- SegmentationClass
以下、JPEGImages
とSegmentationClass
を中心に解説していきます。
2.2. 画像データ
元画像はJPEGImages
の中に格納されています。
2.3. アノテーションデータ
セグメンテーションで使用するアノテーションデータはSegmentationClass
に格納されており、セグメンテーション後の画像データとなっています。
セグメンテーションタスクでは、アノテーションデータとしてこのセグメンテーション後の画像を使用します。
画像データだけを見ると、セグメンテーションはされてはいますが、各画素値がどのクラスに属しているかの情報が存在しないように見えるかもしれません。
実は、各画素値がクラスのインデックスに対応しています。
なので、この画像だけでセグメンテーションされた結果と各画素値がどのクラスに属しているかの情報がわかるわけです。
データは背景と境界線を除くと、全20クラスからなっています。
以下、各クラスを一覧としてまとめました。
http://host.robots.ox.ac.uk/pascal/VOC/voc2012/segexamples/index.html (元のドキュメントのリンク)
インデックス | クラス |
---|---|
0 | background |
1 | aeroplane |
2 | bicycle |
3 | bird |
4 | boad |
5 | bottle |
6 | bus |
7 | car |
8 | cat |
9 | chair |
10 | cow |
11 | dining table |
12 | dog |
13 | horse |
14 | motor bike |
15 | person |
16 | potted plant |
17 | sheep |
18 | sofa |
19 | train |
20 | tv/monitor |
255 | (void) |
3. アノテーションデータの取り扱い
アノテーションデータとして、セグメンテーション後の画像を使用すると解説しました。
ただ、セグメンテーション後の画像は取り扱いに少し注意が必要です。
元画像はjpeg形式ですが、セグメンテーション後の画像はpng形式となっています。
この違いとしてセグメンテーション後の画像はRGB形式ではなく、インデックスカラーを使って保存されているからです。
なので、RGB形式で読み込んでしまうと、アノテーションデータとして使えなくなってしまいます。セグメンテーション後の画像は、パレットモードで読み込む必要があります。
簡単にRGBで読み込んだ時とパレットモードで読み込んだ時の動作を実験してみます。
3.1. RGB形式で読み込んだ場合
まずは、OpenCVを使用して、RGB形式で読み込んでみます。
import cv2 img_rgb = cv2.imread('VOCdevkit/VOC2012/SegmentationClass/2007_000063.png') print(np.unique(img_rgb.reshape(-1)))
# Output [ 0 64 128 192 224]
画素値がクラスに対応しているので、1~20の画素値になるはずですが、RGB形式で読み込むと想定通りになっていません。
3.2. パレットモードで読み込んだ場合
一方で、Pillowを使ってパレットモードで読み込んでみます。
from PIL import Image img_p = Image.open('VOCdevkit/VOC2012/SegmentationClass/2007_000063.png') print(np.unique(np.array(img_p)))
# Output [ 0 9 12 255]
パレットモードで読み込むと、9(chair)、12(dog)、0(background)、255(void)として読み込めています。
上の二つの実験でわかるようにセグメンテーション後の画像は、パレットモードで読み込む必要があることがわかりました。
また、セグメンテーション後の画像は境界値も含まれているので、これを背景として少し前処理してやる必要もあります。
3. まとめ
今回の記事では、PASCAL VOC 2012のデータセットのダウンロード方法と、セグメンテーションで使用するデータセットの解説を行いました。
このデータを使用してセグメンテーションモデルを実装していきます。
4. 参考
論文
-
この論文の内容を紹介しています
-
-
https://github.com/hszhao/semseg
実装方法については、こちらのGithubのコードを参考にしています。
書籍
つくりながら学ぶ!PyTorchによる発展ディープラーニング
ファインチューニングの方法はこちらの書籍を参考にしています。