物体検出用アノテーションツール「labelImg」の使い方(YOLO対応)

物体検出のアノテーション作業は、各物体に枠をつけるという非常に手間のかかるプロセスです。しかし、専用ツールを使用すれば、その作業効率を大幅に向上させることが可能です。この記事では、YOLO、PascalVOC、CreateMLフォーマットに対応したアノテーションツール「labelImg」のインストール方法から、実際の使い方までを詳しく解説します。
残念なことに現在はlabelimgの開発は積極的に行われておらず、LabelStudioに統合されたようです。LabelImgの機能が統合されたより高機能なアノテーションツールLabel Studioについては以下の記事を参考にしてください。

また、YOLOv8と組み合わせてアノテーションを効率化する方法も紹介しています。こちらについては以下の記事を参考にしてください。

物体検出のアノテーションとは?
ディープラーニングにおけるアノテーション(annotation)とは、テキストや音声・画像といったデータに、ラベル・タグやメタデータを付ける作業のことを指します。
例えば、画像のクラス分類タスクのアノテーションとは、各画像に対して「これは犬」、「これは猫」というようにラベルをつける作業になります。
物体検出タスクの場合、アノテーションとは「この場所に写っているのは猫」というラベル付を行うことなります。つまり、物体検出のアノテーションでは、「この場所」という場所の情報と「猫」という分類情報を、つけていく作業が必要となるわけです。
つまり物体検出タスクのアノテーションは、「ターゲットとする物体を囲む枠と名前(ラベル)をつける」作業になります。

物体検出のアノテーションでは、「場所」と「何か」のペアをラベリングする
この作業、かなり面倒です。専用ツールなしで行う場合は、画像エディタで検出したい物体の座標を調べて、それを囲む枠を計算し、エクセルシートやテキストデータとして保存する作業が必要になります。
少しやってみたらわかりますが、専用ツールなしのアノテーションは非常に苦痛です。このため、物体検出のアノテーションでは、専用のアノテーションツールを用いるのが一般的です。
アノテーションツールを使えば、マウス操作で直感的にターゲットのオブジェクトを囲うことができるので、枠とラベルをつける作業がかなり楽になります。
このようなアノテーションツールのうち、操作が比較的簡単で覚えやすいツールとしてlabelImgがあります。
この記事では、labelImgの使い方について解説します。
アノテーションしたデータはYOLOなどで利用することが可能です。YOLOv8を使って学習する方法については、以下の記事を参考にしてください。

※labelImgで枠をつけた場合は、フォーマットの変換をせずに直接学習させることが可能です。
labelImgとは
labelImgは、物体検出タスクのためのオープンソースのアノテーションツールです。主に機械学習の訓練データを作成するために利用されますが、YOLOなどの枠情報データを読み込むことができますので、推論結果のビューアーとしても利用することも可能です。

私は、検出結果のビューワとしても利用しています
labelImgを利用すると、マウス操作で画像内のオブジェクトに対して枠をつけ、ラベル付けをすることが可能です。
既に開発は終了している(積極的な開発は行われていない)のですが、シンプルで使いやすく、ちょっとしたアノテーションがやりやすいので、私は、いまだに少量のアノテーションで活用しています。
なお、labelImgが対応するフォーマットは、PASCAL VOC形式、YOLO形式、CreateML形式です。
LabelImgの開発は止まっているようです(LabelStudioのコミュニティに吸収)


上で書いたように、開発は終了しているようです
labelimgを取り込んだ先のツールで「LabelStudio」は、非常に多機能なツールです。Label Studioについては以下の記事を参考にしてください。

labelImgをインストール
Python環境があるのであれば、以下のpip
コマンドでインストールできます。
pip3 install labelimg
m1 mac等でインストールでエラーが発生する場合は、PySide6を使ったバージョンのインストールを試してみてください
ネットにいくつか情報がありましたが、このやり方でうまくいきました。
git clone --depth=1 --branch pyside6 --single-branch https://github.com/tzutalin/labelImg.git
cd labelImg
pip install pyside6 lxml
make pyside6
python labelImg.py
labelImgの利用手順
ここでは、labelImgの利用手順を説明します。
ここに書いた手順以外でも使うことができますが、個人的にはこのやり方が一番ミスが少なかったです。
labelImgを起動する前に、アノテーションを行う画像を入れた画像フォルダを作り、アノテーション結果を格納するためのフォルダも作成しておいてください。
画像フォルダ(images)と、アノテーション結果フォルダ(labels)の配置例です。以下のような感じでフォルダを作成しておくと良いです。

labelImgを起動
コマンドラインで、以下のコマンドを実行すると起動します。
labelImg
起動すると、下記のような画面が表示されます(画面はMacです)。

フォルダを設定する
保存先を変更する
で、ラベルを格納するフォルダ(例ではlabelsフォルダ)を指定します

ディレクトリを開く
で、画像が入ったフォルダ(例ではImagesフォルダ)を指定します

アノテーションデータのフォーマットを指定します。最初は、Pascal VOCになっていると思います。これを、Yoloに変更します

これで、準備はOKです。ここまでの操作後、フォルダ(Images)に入った画像が表示されていると思います。

アノテーションをしていく
画像の上で右クリックすると「矩形を作成する
」と言うメニューが現れますので、これを選択します。

猫の囲むように枠をつけるとウィンドウが表示されるので、ここにラベル(cat)を入れます。

同じ要領で人にも、ラベル(human)をつけます。
これで人と猫それぞれに枠が作成できました。
右のウィンドウにcat
とhuman
のラベルがついていることを確認してください。サンプルでは画像が1枚しかありませんが、フォルダ内に画像が複数枚ある場合は、左側の矢印アイコン()をクリックすることで画像を変更できます。
また、画面右下の枠に「ファイル一覧」が表示されます。こちらに表示されたファイル名をクリックすることでも画像を変更できます。

変更後は、左にある保存アイコンするをクリックして、アノテーションデータを保存します。
ちなみに、メニューの自動で保存するを設定しておけば、画像を切り替えるタイミングなどで自動で保存されるようになります。便利なので、ONにしておいた方が良いです。

保存されたファイルを確認する
Yoloフォーマットで保存した場合、保存先に指定したフォルダにclasses.txt
と、画像ファイルと同名のtxt
ファイルが作成されます。classes.txt
はクラス名が列挙したファイルで、上のアノテーション例では以下のようなものが作成されます。
cat
human
上からクラス0のラベル、クラス1のラベル・・・と並びます。
画像ファイルと同名のテキストファイルがアノテーション結果で、以下のようなフォーマットです。
0 0.296810 0.801875 0.540915 0.356250
1 0.742718 0.497500 0.514563 0.945000
今回は、Yoloフォーマットなので、(class number, center x, center y, width, height)の順に並びます。
座標や幅・高さは画像の幅、高さを1.0とした場合の値となります。例えば、100×100ピクセルのサイズの画像で、(20,20)で、幅と高さが10ピクセルの場合は、center x, center yは0.2,0.2で幅と高さは0.1, 0.1になります。
画像とアノテーションファイルを揃えたら、物体検出タスクの学習を行うことができます。
YOLOv8を使った学習については以下の記事を参考にしてください

ショットカットキー(HotKeys)
labelImgのショットカットキーは以下になります。ショートカットを活用することで、アノテーションの効率が上がりますのでうまく活用しましょう。
linux/windosの場合 | macの場合 | 説明 |
Ctrl + u | ⌘ + u | ディレクトリを開く |
Ctrl + r | ⌘ + r | 保存先を変更 |
Ctrl + s | ⌘ + s | 保存 |
Ctrl + d | ⌘ + d | 選択した枠をコピー |
Ctrl + Shift + d | ⌘ + shift + u | 現在の画像を削除 |
スペース | スペース | 現在の画像に確認済みフラグをつける |
w | w | 枠を作成 |
d | d | 次の画像 |
a | a` | 前の画像 |
del | del | 選択した枠を削除 |
Ctrl + + | ⌘ + + | 拡大 |
Ctrl + - | ⌘ + - | 縮小 |
カーソルキー | カーソルキー | 選択された枠を矢印キーで移動 |
まとめ
labelImgは手軽にインストール、操作ができるのでちょっとしたアノテーションに向いています。まとまった量のアノテーションを行う場合は、分担してアノテーションを行う場合などは、分担作業に向いたアノテーションツールを使う方が良いかと思いますが、個人でちょっと使うには便利です。

更新が止まりそうなので、Label Studioへ乗り換えてもよいかもしれません。こちらも、pip install label-studio
でインストールできます。
LabelImg(GitHub):https://github.com/HumanSignal/labelImg
LabelStudio(GitHub):https://github.com/HumanSignal/label-studio