はじめに
物体検出で公開されているデータセットを使いたいとき,YOLOを使って物体検出をしたいのにデータセットがPascalVOC形式なんてことがよくあります.私も最初はネットで転がっているものを使おうとしたのですが,使い方が分かりにくいものが多く,バグだらけのものばかりだったので自分で書くことにしました.今回,同じような人がいれば力になれるのではないかと思い,記事にすることにしました.
以下の記事も良ければ参照ください.
PascalVOC形式をYOLO形式に変換
コードは以下の私のGitHubレポジトリで公開しています.
使い方
コードの一番上の部分にそれぞれの絶対パスを記入して,このスクリプトを実行するだけです.XMLファイルと画像ファイルが同じディレクトリ内に混ざっていても問題ありません.画像の形式はJPEG,PNG,その他大体のものに対応しています.
以下にそれぞれの項目についての説明を載せます.
※ パスの最後には/
をつけるようにしてください.例)/Users/datasets/xmls/
-
absolutepath_of_directory_with_xmlfiles
: ここにはXMLファイルが入っているディレクトリの絶対パスを記入してください. -
absolutepath_of_directory_with_imgfiles
: ここには画像ファイルが入っているディレクトリの絶対パスを記入してください. -
absolutepath_of_directory_with_yolofiles
: ここにはYOLOファイルの出力先のディレクトリの絶対パスを入れていください.ここで指定したディレクトリにYOLO形式に変換されたファイルが出力されます. -
absolutepath_of_directory_with_classes_txt
:classes.txt
の出力先のディレクトリの絶対パスを入れていください.ここで指定したディレクトリに,クラスの一覧が書かれたテキストファイル(classes.txt
)が出力されます. -
absolutepath_of_directory_with_error_txt
: ここで指定したディレクトリに,対応する画像ファイルが見つからなかったなどの理由でYOLO形式に変換できなかったXMLファイル名の一覧が書かれたテキストファイルが出力されます.絶対パスで記入.
変換できなかったら
- 記入したパスがあっているか確認してください
- パスの最後に
/
がついているか - パスをコピペするときにクオーテーションとパスとの間に空白が生じていないか
- パスに誤字脱字がないか
- パスで指定したディレクトリにファイルがきちんと入っているか
- パスの最後に
- XMLファイルのパース(読み取り)がうまくいっていない可能性があります.コードの
GetDataFromXMLfile
クラスを確認してそこに書かれている項目が自分のXMLファイルに存在するか確かめてください. - それでもエラーが起きる場合はコメントお願いします.
おわりに
コードの中身としてはXMLファイルをパースして座標等の情報を抜き取った後,YOLOの形式に座標を計算し直しているだけです.ちょうど一年前に実装したのですが,XMLファイルの構成だったりとかYOLOファイルの仕組み等々を知れて楽しかった記憶があります.