9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

YOLOv8を組み込んだアノテーション自動化ツールの制作

Posted at

この記事は、一関高専 Advent Calendar 2025 22日目の記事として執筆しました。(少し遅れてすみません...)

はじめに

高専の卒業研究でYOLOを転移学習する研究を行っています。この転移学習のためには、画像アノテーションを行う必要がありますが、ご存じのようにアノテーションは非常に手間がかかる作業です。
一時期、FastLabel様のアノテーションツールを試用できる機会があり、このツールを用いてアノテーションを1600枚ほどしました。FastLabelはブラウザ上で動作し、フォーマットの種類・対応するモデルも豊富で非常に便利です。しかしながら、有料であるという点では、我々学生やライトユーザーには手を出しにくいと思われます。
そこで、ないものは自作してしまおうということで、今回はFastLabelのUIを再現するつもりで簡単な画像アノテーションツールを自作しました。
記事の下部のリンクのGitHubで公開しています。ご自身のPCで仮想環境を立てて実行してみてください。
自分は情報系の学生ではなく電気系なので、技術・知識的に未熟な部分が多々あるかと思います。また、読みづらい箇所もあるかと思いますが、どうか最後までお読みいただけると幸いです。

image.png
自作アノテーションツール Annotation_Automation_Tool

機能

本アノテーションツールは、シンプルかつ、高速にアノテーションを行うために、「キーボードショートカットを多用できること」をコンセプトに開発しました。
Yoloに特化しているので、エクスポートされる形式は、Yolo形式です。
大まかな機能は、以下の通りです。

  • 画像を読み込み、組み込んだYoloがその画像に対して推論を行い、その結果をバウンディングボックスとして描画・保存する。
  • 人間は、Yoloの推論結果を確認し、クラス間違いや誤検出、ズレがあれば適宜修正する。
  • 1枚の画像が終わると、そのバウンディングボックスのデータを保存し、次のアノテーションに移行する。
  • 全画像のアノテーションが終了したら、「承認」機能で見直しを行うことができる。
  • 承認完了後、Yolo形式でデータセットをエクスポートする。

必要最低限の機能のみの実装なので、ローカル環境での実行となります。現段階では、バウンディングボックスの描画のみ対応です。セグメンテーションなどは未実装です。おまけ機能として、進捗表示の棒・円グラフ、モチベ維持のためのアノテーション速度表示(画像枚数/秒)、目標枚数達成時のゲーミング演出なども搭載しています。

実行方法

動作環境

  • Windows11、Ubuntu22.04で動作を確認しました。
  • Anaconda、python venvなどの仮想環境での実行をおすすめします。
  • python3.10以降の環境で動作します。
  • GPUは必須ではないですが、ある方が推論が速くなります(といっても、体感速度はあまり変わりません)。

インストール

以下のリポジトリからコード一式をダウンロードします(Windows PowerShellでの実行例)。

git cloneでのコマンド

git clone https://github.com/Meron3/Annotation_Automation_Tool
cd .\Annotation_Automation_Tool\

仮想環境を作ります(名前は自由)。

python3 -m venv Annotation

仮想環境を有効化します。
Linux・Macの場合

source Annotation/bin/activate

Windowsの場合

.\Annotation\Scripts\activate

以下のライブラリをインストールします。

pip install ultralytics customtkinter pillow pyyaml

main.pyを実行します。

cd .\code\
python .\main.py

基本的にはこれで起動すると思いますが、Windowsにpython3がインストールされていない、不足しているライブラリ・コードがある場合は、手動でインストールしてください(requirements.txtを参照)。

使い方

使い方について、順を追って説明します。

1. 起動画面

image.png
自作アノテーションツールの起動画面

起動画面では、はじめにプロジェクトの選択を行います。GitHubから落とした状態では、「MyProject」というディレクトリが存在しているので、それを選択します。中身は、「.test_images_approval.json」、「.test_images_session.json」、「classes.yaml」です。

  • 「.test_images_approval.json」は承認済みの画像ファイル名を管理します。
  • 「.test_images_session.json」はアノテーションの進捗管理、セーブポイントでの描画状態を保存します。
  • 「classes.yaml」は組み込んだYolov8のクラスのリストです。

もし、自作したyoloモデルに載せ替えて実行する場合は、その使用するモデルに対応したyamlファイルに書き換えてください(のちほど、ソースコードの章で説明します)。

image.png
3つのファイルを含むプロジェクトフォルダを読み込む

2. 画像選択

アノテーションの対象となる画像が入ったディレクトリを選択します。読み込むと、総画像枚数が表示されます。

image.png
画像を読み込む
image.png
読み込み完了

3. アノテーション実行

「3. アノテーション開始(全件)」を押すと、以下のような画面になります。ここで、前回のセッションを復元するか聞かれた場合は、「はい」で前回のセッションの続きから、「いいえ」でリセットされ、1枚目からスタートになります。
画像を読み込む順番は、画像ファイル名の昇順(0→9, A→Z)です。

image.png
アノテーション画面

アノテーション画面では、マウス操作でバウンディングボックスの設置・移動・削除を行えます。また、左下のオブジェクト一覧と画面上でバウンディングボックスを選択できます。ここでいう「保存」とは、labelファイル「[画像名].txt」にYolo形式で書き込むことを指しています。

カーソル操作に関しては、他のアノテーションツールとほぼ同様です。

各ボタンの説明<ショートカット>

  • プロジェクト選択画面に戻る:保存せず、最初の起動画面に戻ります。
  • オプション設定:UIを微調整できます。
    • 線の幅:バウンディングボックスの線幅変更
    • 文字サイズ:バウンディングボックス左上の文字サイズ変更
    • ログ表示行数:画面上でのアクションや、保存などの動作のログを表示します。ログは、ターミナルにも同様のものが表示され、プロジェクトフォルダにも保存されます。表示行数はデフォルトで4行で、0で非表示です。実行環境の解像度やOSによってまちまちでした。
    • 目標完了枚数:棒・円グラフ描画のための数値設定です。
    • 自動保存間隔:後述の「プロジェクトを途中保存」とおなじ機能を自動で行います(オートセーブ)。デフォルトは5分に1回実行します。
    • 進捗表示スタイル:設定した目標枚数に対する、現在の進捗状況を可視化します。個人的には円グラフがおすすめ。
  • 前へ・次へ:保存せず、画像戻し・送りができます。<十字キー左右>
  • 保存して次へ:保存して次の画像に移ります。基本的にはこれを多用することになります。<Enterキー>
  • 保存のみ:今の画像を保存します。<Ctrl+S>
  • プロジェクトを途中保存:プロジェクトの進捗を途中保存します(動作的には、.test_images_session.jsonに書き込む)。

このほか、操作に関してEscで選択解除、Deleteで、選択状態のバウンディングボックスの削除を行うことができます。

4. 承認機能

すべての画像のアノテーションが終わったら、承認作業を行います。画面は似ていますが、承認画面はいままでのアノテーションでのバウンディングボックスをプレビューする機能です。良い画像はOK、悪い画像がNGとします。ここは手動で人間が確認する必要があります。キーボードショートカットの実装を忘れてました(マウスクリックだけでい良いため)。

image.png
承認画面。よく見ると、busとtruckが重なっているのでNG

5. 修正機能

アノテーション→承認のあと、rejectedとなった画像はここで再アノテーションをします。この画面は3.のアノテーションと基本的に同様なので割愛します。

6. エクスポート

すべて承認済みになったら、黄色いエクスポートボタンを押します。ボタンを押すと、フォルダ選択画面になるので、フォルダを作成or選択します。保存を押すと、アノテーションしたオリジナル画像とYolo形式のlabelファイルがそれぞれエクスポートされます。ちなみに、全画像が承認済みになっていない場合は、承認済みの画像のみエクスポートされます。

実際に使ってみた

卒業研究のために約20,000枚のアノテーションをおこないました。とてもつらかったですが、約3週間で完了しました。換算すると一日約1500~2000枚のペースで、一枚あたり約5秒でできました(途中でサボってます)。使い勝手に関しては、自分でアノテーションしながら改良を重ねていったので、ある程度は問題ないと思います。動作やUIは好みの問題だと考えますので、適宜ソースコードを編集してカスタマイズしてご使用ください。
画面録画 2025-12-23 082719.gif
annotation.png

ログにはユーザー名が出るので、取り扱い注意!

ソースコードについて

main.py

基本的に実行コマンドで呼び出します。
Yolov8モデルのパスを選択します。デフォルトでは、「yolov8n.pt」となっています。例えば、インターネット上で公開されている転移学習orファインチューニング済yoloモデルを組み込む場合、以下のようにファイルパスを書き換えてください。

# 自動アノテーションに使うYOLOv8転移学習モデルのパス
# オリジナルのモデルを使わない場合は 'yolov8n.pt' のままでOK
# YOUR_MODEL_PATH = "best.pt" 
YOUR_MODEL_PATH = "yolov8n.pt" 

また、プロジェクトフォルダ以下の「classes.yaml」をパスを指定したyoloモデルのクラスと対応するように書き直してください。
デフォルトでは、以下の通りです。

classes.yaml
classes.yaml
names:
  0: person
  1: bicycle
  2: car
  3: motorcycle
  4: airplane
  5: bus
  6: train
  7: truck
  8: boat
  9: traffic light
  10: fire hydrant
  11: stop sign
  12: parking meter
  13: bench
  14: bird
  15: cat
  16: dog
  17: horse
  18: sheep
  19: cow
  20: elephant
  21: bear
  22: zebra
  23: giraffe
  24: backpack
  25: umbrella
  26: handbag
  27: tie
  28: suitcase
  29: frisbee
  30: skis
  31: snowboard
  32: sports ball
  33: kite
  34: baseball bat
  35: baseball glove
  36: skateboard
  37: surfboard
  38: tennis racket
  39: bottle
  40: wine glass
  41: cup
  42: fork
  43: knife
  44: spoon
  45: bowl
  46: banana
  47: apple
  48: sandwich
  49: orange
  50: broccoli
  51: carrot
  52: hot dog
  53: pizza
  54: donut
  55: cake
  56: chair
  57: couch
  58: potted plant
  59: bed
  60: dining table
  61: toilet
  62: tv
  63: laptop
  64: mouse
  65: remote
  66: keyboard
  67: cell phone
  68: microwave
  69: oven
  70: toaster
  71: sink
  72: refrigerator
  73: book
  74: clock
  75: vase
  76: scissors
  77: teddy bear
  78: hair drier
  79: toothbrush
  

例として、クラス0がcat、クラス1がdogを返すyoloモデルの場合、以下のように書き換えます。

classes.yaml
names:
  0: cat
  1: dog

app_ui.py

アノテーションツールのUIと機能を実装しています。詳細な説明は省きますが、825行目のcolorリストの順序を変更することで、自動アノテーション時のバウンディングボックスの色の順序を変更できます。数を増やしてもよいです。
重視したいクラスを目立つ色、それ以外を目立たない色などに変更すると作業効率があがるかもしれません。

    def get_color_for_class(self, class_id):
        colors = ["#FF3838", "#00C2FF", "#FF9D97", "#FF701F", "#FFB21D", "#CFD231", "#48F90A", "#92CC17", "#3DDB86", "#1A9334", "#00D4BB",
                  "#2C99A8", "#344593", "#6473FF", "#0018EC", "#8438FF", "#520085", "#CB38FF", "#FF95C8", "#FF37C7"]
        return colors[class_id % len(colors)]

event_handlers.py

キーボードショートカットやマウス操作のイベントハンドラです。キーボードショートカットのキーを変更したい場合は、対応する部分を変更してください。

utils.py

その他使い回し可能な関数やファイルの読み書きを担当しています。

今後の改良点

  • バウンディングボックスの回転機能の搭載。
  • サーバ上で動かして、複数人同時アノテーションに対応させる。
  • yolo以外のモデルにも対応させる。

今後の研究の進捗次第で開発を行うつもりです。

おわりに

プログラミングに関してはまだまだ初心者ですので、バグや良くない記法が含まれているかもしれません。
また、信頼できるアノテーションツールでデータ確認を行うようにお願いします。自分でも確認しモデルの学習で使用しましたが、今のところ問題は無くアノテーションできていました。
機能改善や質問等ありましたら、コメントまでよろしくお願いします。
さいごに、本ツールはMTI LICENSEで公開しております。改変、再配布等は自由に行っていただいてかまいません。
長くなりましたが、最後までお読みいただきありがとうございました。

GitHubリポジトリ

参考文献

[1] https://github.com/ultralytics/ultralytics

[2] https://dev.classmethod.jp/articles/yolov8-trial-custom-dataset/

[3] https://qiita.com/ryuka0610/items/a47fd253708a98d3726c

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?