Edited at

アノテーションファイル変換(xmlからYOLOへ)


はじめに

LabelImgなどのアノテーションツールは(.xml)というPascalVOCに準拠した形式でアノテーションファイルが保存されますが,これはYOLO(You only look once)で使用できません.PascalVOC形式のアノテーションファイル(.xml)はSSD(Single Shot MultiBOX Detector)などで使われます.

YOLOは独自のアノテーションファイル形式(.txt)を持ちます.しかしSSDとYOLOの性能を比較したい際などでは,同じデータセットで比較することが必要になります.PascalVOCやCOCOなどの大きなデータセットなどはすでに(.xml)形式でアノテーションされたファイルが同梱されていることがほとんどなので問題ないのですが,自前のデータの場合,SSDのアノテーションファイル(.xml)をYOLO(.txt)でも扱いたい場合,BBox label toolなどのような別のツールで再びアノテーションという地味で辛い作業を行うなんていうこともあり得ます.

そこで,PascalVOC形式(.xml)からYOLO形式(.txt)のアノテーションファイルを自動生成するツールを作りました.

大元アノテーションツールは以下のgithubリンクになります.(https://github.com/blitzingeagle/xml2yolo

しかしこのツールは.xmlファイルへ.txt(YOLO形式)ファイルを入れていくという謎仕様だったのと,ファイルパスをいちいちコマンドライン入力しないといけないアレな仕様だっため,以下のリンクのように改良しました.ぜひこちらのgithubリンクをお使いください.(https://github.com/Ryo-Kawanami/xml2yolo


使い方(ディレクトリ構造)

例としてtrafficの画像のxmlファイルをYOLO形式にすることを扱っていきます..

1.上記のリンクからリポジトリをダウンロードします.

2.そしてダウンロードしたリポジトリ内に[traffic_label][traffic_img]というディレクトリを作り,さらにそのそれぞれのディレクトリの中に[20170271403]というディレクトリを作ります.

3.[traffic_label/20170271403]の中に画像データ,[traffic_label/20170271403]の中にPascal VOC形式のアノテーションデータ,つまり.xmlファイルを入れます.

ここまでで,

・README.md

・traffic_classes.txt

・xml2yolo.py

・xml2yolo_backup.py

・traffic_label/20170271403

・traffic_label/20170271403

の6点がxml2yoloのリポジトリに入っていると思います.

4.そしてxml2yoloのリポジトリの中に[traffic_format4yolo]というYOLO形式のファイルが出力されるディレクトリと,どの順番で物体をアノテーションしたかを示す[traffic_classes.txt]をきちんと書き換えて終わりです.

※traffic_classes.txtは例示的に入れてあるので,書き換えが必要です.


使い方(コードの書き換え)※簡単

上記ではtraffic_~という名前のファイルを例示的に用いましたが,自分のファイルの名前に応じてxml2yolo.pyの以下の部分を書き換えます.


parentpath = './' #"Directory path with parent dir before xml_dir or img_dir"
addxmlpath = parentpath + 'traffic_label/201702071403' #"Directory path with XML files"
addimgpath = parentpath + 'traffic_img/201702071403' #"Directory path with IMG files"
outputpath = parentpath + 'traffic_format4yolo' #"output folder for yolo format"
classes_txt = './traffic_classes.txt' #"File containing classes"
ext = '.png' #"Image file extension [.jpg or .png]"

拡張子は".jpg"か".png"などがあると思いますので,以下の部分を"."を含めて書き換えてください.


ext = '.png' #"Image file extension [.jpg or .png]"

ここまでできたらタウンロードしてきたリポジトリのファイルにcdして,

$ python xml2yolo.py

とターミナルに打ち込めば完了です.(お疲れ様でした.)

あとは以下のサイトを参考にYOLOv3の学習を行ってください.おそらくtraffic_classes.txtをtraffic_classes.namesなどと書き換えて使うことになると思います.

http://shibafu3.hatenablog.com/entry/2017/08/24/124826