遅れ馳せながらYOLOv5の転移学習をオリジナルのデータを使って実施してみたのですが、あまりの手軽さに驚きました。
ネット上にはYOLOv5の転移学習に関する優れた事例や紹介記事が多数ありますので、ここではその内容については触れませんが、AIに関する知識が無い人でも、手順通りに実施すればオリジナルのAIモデルが作れてしまいます。すごい。
殆どの作業が自動化されているので、特に問題となるような事は少ないのですが、それらの事例をトレースした際に「ちょっと面倒だな」と感じたデータセットの変換処理に関して、より作業を簡略化できるようにpythonスクリプトを作成しました。
私はアノテーションツールとしてVoTT v2.2.0を使用したのですが、出力されるデータセットのファイル形式がYOLOv5用のファイル形式に対応していないため、別途変換する必要があります。
変換の方法はいろいろあるみたいですが、代表的な方法としては以下が挙げられます。
私の場合は、ネット上にデータを上げるのは少し気が引けたので、有志の方々が開発したスクリプト(ssaru氏やRyo-Kawanami氏)を利用させてもらったのですが、今回使用したケースではhoge.mp4#t=0.033333.xmlというようなドットが複数含まれるファイル名で問題が発生しました。
上記プログラムを一部書き換えれば適切に処理できることも確認したのですが、ディレクトリの指定方法などをより簡便に行いたかったので、勉強も兼ねてYOLO用の変換スクリプトを自分で作成することにしました。
1. VoTT v2 によるデータセット(Pascal VOC形式)の生成
まずはVoTTでタグ付けを行いデータセットを生成します。その際に、出力形式として「Pascal VOC」を選択してエクスポートしてください。
VoTTで指定した出力先に下記のような構成でデータセットが生成されていると思います。以下の例では****-PascalVOC-exportが変換データの解析を行う際のターゲットディレクトリとなります。
.
└── ****-PascalVOC-export
├── Annotations
│ └── ****.xml
├── ImageSets
├── JPEGImages
│ └── ****.jpg
└── pascal_label_map.pbtxt
2. 変換スクリプトによるYOLO形式ファイル(.txtと.yaml)の生成
作成したスクリプトを用いてアノテーションデータ(*xml)の変換を行います。
よろしければダウンロードしてご利用ください(動作は保証できませんが・・・)。
dataclassesを利用しているのでPython3.7以降の環境が必要です。またlxmlとpyyamlを利用しているのでpip等で導入してください。
2.1 使用方法
VoTTで出力したディレクトリをターゲットとして指定します。
ターゲットディレクトリが I:\origin_data\hoge-PascalVOC-export の場合、実行例は下記のようになります。(デフォルトの変換ファイル出力先は.\yolo_outです)
$ python vott2yolo_cv.py -t I:\origin_data\hoge-PascalVOC-export
その他のオプションは下記にてご確認ください。
$ python vott2yolo_cv.py -h
2.2 出力ファイル
指定したディレクトリ(.\yolo_out)に、YOLO形式のアノテーションデータ(*txt)とdata.yamlが生成されます。
以下は出力されるdata.yamlの例です。
ファイル名や内容を適宜修正してご利用ください。
names:
- hoge
- fuga
nc: 2
train: data/train/images
val: data/valid/images
お疲れさまでした。
