PascalVOC 形式のアノテーションデータから、物体検出用のカスタムデータセットを作成する【PyTorch】

物体検出を改めてお勉強し直しています。

自前のデータセットで再学習をさせる場合には、レポジトリの案内に従って所定の位置にファイル配置したりすれば学習は回ってしまったりしますが、一からカスタムデータセット作成まで隠れた部分をきちんと実装するとどうなるのか、見ていきたいと思います。

Oxford-IIIT Pet Dataset のデータを使って見ていきます。こちらは37種類の犬猫のデータセットです。(物体検出にも対応)

 

おしながき

・アノテーションデータのフォーマット

・XMLファイルをパースして必要な情報を取り出す

・カスタムデータセットクラスの作成

 

アノテーションデータのフォーマット

 

アノテーションデータは、Pascal VOC形式のものは以下のような xml ファイルで得られます。

画像のサイズや、バウンディングボックスの座標の位置などが記載されています。

truncated はオブジェクトが部分的に見えている場合は0、完全に見えていてbboxで完全に囲えている場合は1とつく。

difficult はオブジェクトの認識が困難であれば1、そうでなければ0とつくそうです。

このままでは使用できないため、中から使用する情報だけを取り出して上げる必要があります。

 

XMLファイルをパースして必要な情報を取り出す

 

今回は、画像のサイズ(width, height)とbboxの座標、クラスの番号を取り出します。

※「作りながら学ぶ!PyTorchによる発展ディープラーニング」のコードをもとに微修正

パースするクラスを定義し、試しに1つのxmlファイルに対して実行して、のぞみの情報が帰ってくるか確認します。

すべての画像の情報を取り出して、データフレームで見やすくします。

使用するモデルに応じて、バウンディングボックスに与える座標の形式が異なります。今回のような [xmin, ymin, xmax, ymax] (あるいは[x1, y1, x2, y2])のような座標は Faster R-CNN 等で使えますが、YOLO を使う際には、[center_x, center_y, width, height] のような形式で座標情報を与える必要があるため、計算をして上げる必要があります。

 

カスタムデータセットクラスの作成

アノテーションデータに関しては、boxes, area, labels, image_id 等の情報を辞書型で整理して渡してあげる必要があります。

各情報は下記のとおり。

target: a dict containing the following fields

  • boxes (FloatTensor[N, 4]): the coordinates of the N bounding boxes in [x0, y0, x1, y1] format, ranging from 0 to W and 0 to H
  • labels (Int64Tensor[N]): the label for each bounding box. 0 represents always the background class.
  • image_id (Int64Tensor[1]): an image identifier. It should be unique between all the images in the dataset, and is used during evaluation
  • area (Tensor[N]): The area of the bounding box. This is used during evaluation with the COCO metric, to separate the metric scores between small, medium and large boxes.
  • iscrowd (UInt8Tensor[N]): instances with iscrowd=True will be ignored during evaluation.
  • (optionally) masks (UInt8Tensor[N, H, W]): The segmentation masks for each one of the objects
  • (optionally) keypoints (FloatTensor[N, K, 3]): For each one of the N objects, it contains the K keypoints in [x, y, visibility] format, defining the object. visibility=0 means that the keypoint is not visible. Note that for data augmentation, the notion of flipping a keypoint is dependent on the data representation, and you should probably adapt references/detection/transforms.py for your new keypoint representation

TORCHVISION OBJECT DETECTION FINETUNING TUTORIAL

 

いったんここまで。

最後まで読んでいただきありがとうございました。

 

参考

作りながら学ぶ!PyTorchによる発展ディープラーニング

COCO and Pascal VOC data format for Object detection

TORCHVISION OBJECT DETECTION FINETUNING TUTORIAL

kaggle Global Wheat Detection