【YOLOv3 データセット作成の旅②】OIDv4_Toolkitで取得したアノテーションデータを変換する

忘備録に残しておきます。

Google Open Images Dataset で任意のクラスの画像とアノテーションだけダウンロードしたい!

こちらの記事で、OIDv4_Toolkit で Dolphin のみ画像とアノテーションデータを取得することができました。

もともと下記の公開モデルでYOLOv3 の再学習をさせたいというモチベーションでデータを集めていました。

https://github.com/eriklindernoren/PyTorch-YOLOv3

こちらでは、アノテーションデータは [ label_idx x_center y_center width height ] のtxtファイルで与えてあげる必要があると書いてあります。また、各座標は 0 ~ 1 のスケールに変換されています。

一方で、OIDv4_Toolkit で取得したアノテーションファイルを見てみると、[ label_name left top right bottom] というふうになっています。

このように取得したアノテーションデータをそのまま使用することができないため、今回はこちらをすべて指定された形に変換をしてあげたいと思います。

 

やりたいこと

① 各座標を 0 ~ 1 の範囲にスケール変換

② [ label_name left top right bottom] → [label_idx x_center y_center width height]

 

各座標を 0 ~ 1 の範囲にスケール変換

まず①についてですが、OIDv4-Toolkit を使うと、

OID > csv_folder > validation-annotations-bbox.csv

に 0 ~ 1 スケールでのすべてのファイルのアノテーション座標情報がまとまっています。こちらを利用したいと思います。解決。

(訓練画像のものに関しては train-annotations-bbox.csv、テスト画像のものについては test-annotations-bbox.csv とあります。)

 

csv ファイルの中身はこんなです。

ImageID 列の値と、画像のファイル名が一致しています。この csv ファイルには Open Images Dataset のすべての画像の座標情報が乗っているので、まずはこの csv ファイルの中で、イルカの画像のアノテーション情報以外を削除します。

同じ ImageID で複数行あるのは、1枚の画像の中に物体が複数存在していて、それぞれの座標情報があるためですね。

今 tmp に残っているのは、イルカのみの座標情報です。

 

[ label_name left top right bottom] → [label_idx x_center y_center width height]

 

では変換しましょう。

x_center = ( XMax + XMin ) / 2

y_center = (YMax + YMin ) / 2

width = XMax – XMin

height = YMax – YMin

です。まとめて計算します。

result には必要な情報の列だけ残しました。

最後に一枚のファイルに一枚のアノテーション情報が記載されるかたちで保存してきたいと思います。

これで output > validation > Dolphin 配下に画像ごとのアノテーションデータを作成することができました。

各ファイルの中身はこんなかんじです。

いいかんじですね。

今回は検証データについてのみのスクリプトですが、訓練データのものを変換したければ、 validation としていたところを全部 train と変えてあげればうまくいきます。テストデータに関しても同様です。

 

全体を通してはこうなります。

 

おわり