はじめに
VoTTでTFRecordを出力できるのですが、画像ごとにTFRecordファイルが出力される仕様となっているようです。使おうとしているモデルの学習インタフェースが単独のTFRecordのみ対応しているようだったので、一旦VoTTからPascal VOC形式でエクスポートし、それを単独のTFRecordファイルに変換しました。
この記事では、TensorFlow Object Detectionに入っているスクリプト(create_pascal_tf_record.py)を使って、Pascal VOC形式のアノテーションファイルから単一のTFRecordファイルを生成する方法について説明します。
事前準備
以下のバージョンで動作を確認しています。
- Ubuntu v.20.04
- Python v.3.9.7
- TensorFlow v.2.7.0
- Protocol Buffers v.3.14.0
上記バージョンのモジュールをインストールし、TensorFlow Model Gardenをチェックアウトした環境を構築します。この環境を構築する手順は、以前に投稿した**YOLO形式のアノテーションファイルをTFRecordに変換する**の事前準備で書いたものと同じです。
変換するPascal VOC形式のアノテーションデータを用意します。ディレクトリ構造は下のとおりです。'/home/hoge'の部分は任意で構いません。VoTTからエクスポートしたものを利用する場合、出力されたルートディレクトリの名前を'VOC2012'に変更して、任意のディレクトリに置けば大丈夫です。
/home/hoge/VOC2012/
|-- Annotations
| `-- traffic_light_0001.xml # For Example
|-- ImageSets
| `-- Main
| |-- signal_blue_train.txt # For Example
| `-- signal_blue_val.txt # For Example
|-- JPEGImages
| `-- traffic_light_0001.jpg # For Example
`-- pascal_label_map.pbtxt
アノテーションデータを変換するにあたって、いくつか事前処理が必要です。まず、VoTTから出力されるアノテーションデータを利用する場合、XMLファイルのfolderタグの内容を'VOC2012'に変更しておく必要があります。'VOC2012'になっていないと変換時にエラーが発生するので、VoTTを使っていなくても事前に確認しておくと安心です。下のコマンドを実行することで、すべてのXMLファイルのタグを置換できます。
$ cd /home/hoge/VOC2012/Annotations
$ find *.xml | xargs sed -i 's/<folder>.*<\/folder>/<folder>VOC2012<\/folder>/g'
次に、ImageSets/Mainディレクトリに'aeroplane_train.txt'を新しく作成し、訓練データの画像ファイル名(拡張子なし)を行ごとに指定します。なお、'aeroplane'はスクリプトで名前が固定されてしまっていますので変えられません。
これらのファイルは、VoTTから出力されるtxtファイルから作ることができます。VoTTから出力されるtxtファイルは、画像ファイル名の後ろに存在有無を示すフラグが入っているので、これを下のようなコマンドで削除します。
$ cd /home/hoge/VOC2012/ImageSets/Main
$ cp -p signal_blue_train.txt aeroplane_train.txt
$ sed -i 's/\.jpg .*$//g' aeroplane_train.txt
$ cat aeroplane_train.txt
traffic_light_0001
traffic_light_0002
...
必要に応じて、'aeroplane_val.txt'を作成し、検証データの画像ファイル名を同様に指定しておきます。
使い方
下のコマンドを実行すると、単一のTFRecordファイルが生成されます。
$ cd ~/models/research
$ python3 object_detection/dataset_tools/create_pascal_tf_record.py \
--data_dir=/home/hoge --year=VOC2012 \
--label_map_path=/home/hoge/VOC2012/pascal_label_map.pbtxt --set=train \
--output_path=/home/hoge/train.tfrecord
また、setをvalに変更すれば'aeroplane_val.txt'が読み込まれ、検証データのTFRecordファイルを生成することができます。
$ python3 object_detection/dataset_tools/create_pascal_tf_record.py \
--data_dir=/home/hoge --year=VOC2012 \
--label_map_path=/home/hoge/VOC2012/pascal_label_map.pbtxt --set=val \
--output_path=/home/hoge/val.tfrecord
オプション
- data_dir:変換対象のデータセット(VOC2012)が置かれたディレクトリを指定します。
- year:VOC2007かVOC2012が指定できます。ここでは、VOC2012を設定します。ディレクトリ構造に登場するフォルダ名に対応している模様。
- label_map_path:ラベルデータを記述したファイルを指定します。形式は、models/research/object_detection/data/pascal_label_map.pbtxtと同じです。VoTTからエクスポートした場合は、そのルートディレクトリに出力されています。
- set:変換するデータセットの種類を指定します。trainは訓練データ、valは検証データを意味します。他にもtrainvalやtestを設定できるようです。
- output_path:出力されるTFRecordファイルのパスを指定します。