PyTorchで実装するPSPNet データセット準備偏 ③

PSPNetを実装するために使用するデータセットは、PASCAL VOC2021のデータセット使用して、PSPNetを実装していきます。

ここでは、PASCAL VOC2021のデータセットのダウンロード方法とデータセットがどのように格納されているかを紹介していきます。




1. データセットダウンロード

データセットは以下の場所で公開をされています。

host.robots.ox.ac.uk

f:id:venoda:20210724185635p:plain

上のリンクにアクセスしてもらい、「training/validation data」のリンクをクリックすれば、ダウンロードが開始されます。

ファイルサイズが2GBと大きいので、ダウンロードにはすこし時間がかかります。


2. データセットの確認

2.1. ディレクトリ構成

圧縮ファイルを解凍するとVOCDevkit/VOC2012の中に次のようなファルダが格納されています。

VOCdevkit/VOC2012
├─ Annotations
├─ ImageSets
├─ JPEGImages
├─ SegmentationClass
└─ SegmentationObject

いろいろディレクトリが存在しますが、セグメンテーションで使用するディレクトリは主に次の二つになります。

  • JPEGImages
  • SegmentationClass

以下、JPEGImagesSegmentationClassを中心に解説していきます。


2.2. 画像データ

元画像はJPEGImagesの中に格納されています。

f:id:venoda:20210724185741j:plain


2.3. アノテーションデータ

セグメンテーションで使用するアノテーションデータはSegmentationClassに格納されており、セグメンテーション後の画像データとなっています。

f:id:venoda:20210724185803p:plain

セグメンテーションタスクでは、アノテーションデータとしてこのセグメンテーション後の画像を使用します。

画像データだけを見ると、セグメンテーションはされてはいますが、各画素値がどのクラスに属しているかの情報が存在しないように見えるかもしれません。

実は、各画素値がクラスのインデックスに対応しています。

なので、この画像だけでセグメンテーションされた結果と各画素値がどのクラスに属しているかの情報がわかるわけです。

データは背景と境界線を除くと、全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. 参考