この記事は、一関高専 Advent Calendar 2025 22日目の記事として執筆しました。(少し遅れてすみません...)
はじめに
高専の卒業研究でYOLOを転移学習する研究を行っています。この転移学習のためには、画像アノテーションを行う必要がありますが、ご存じのようにアノテーションは非常に手間がかかる作業です。
一時期、FastLabel様のアノテーションツールを試用できる機会があり、このツールを用いてアノテーションを1600枚ほどしました。FastLabelはブラウザ上で動作し、フォーマットの種類・対応するモデルも豊富で非常に便利です。しかしながら、有料であるという点では、我々学生やライトユーザーには手を出しにくいと思われます。
そこで、ないものは自作してしまおうということで、今回はFastLabelのUIを再現するつもりで簡単な画像アノテーションツールを自作しました。
記事の下部のリンクのGitHubで公開しています。ご自身のPCで仮想環境を立てて実行してみてください。
自分は情報系の学生ではなく電気系なので、技術・知識的に未熟な部分が多々あるかと思います。また、読みづらい箇所もあるかと思いますが、どうか最後までお読みいただけると幸いです。
![]() |
| 自作アノテーションツール 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. 起動画面
![]() |
| 自作アノテーションツールの起動画面 |
起動画面では、はじめにプロジェクトの選択を行います。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ファイルに書き換えてください(のちほど、ソースコードの章で説明します)。
![]() |
| 3つのファイルを含むプロジェクトフォルダを読み込む |
2. 画像選択
アノテーションの対象となる画像が入ったディレクトリを選択します。読み込むと、総画像枚数が表示されます。
![]() |
| 画像を読み込む |
![]() |
| 読み込み完了 |
3. アノテーション実行
「3. アノテーション開始(全件)」を押すと、以下のような画面になります。ここで、前回のセッションを復元するか聞かれた場合は、「はい」で前回のセッションの続きから、「いいえ」でリセットされ、1枚目からスタートになります。
画像を読み込む順番は、画像ファイル名の昇順(0→9, A→Z)です。
![]() |
| アノテーション画面 |
アノテーション画面では、マウス操作でバウンディングボックスの設置・移動・削除を行えます。また、左下のオブジェクト一覧と画面上でバウンディングボックスを選択できます。ここでいう「保存」とは、labelファイル「[画像名].txt」にYolo形式で書き込むことを指しています。
カーソル操作に関しては、他のアノテーションツールとほぼ同様です。
各ボタンの説明<ショートカット>
- プロジェクト選択画面に戻る:保存せず、最初の起動画面に戻ります。
- オプション設定:UIを微調整できます。
- 線の幅:バウンディングボックスの線幅変更
- 文字サイズ:バウンディングボックス左上の文字サイズ変更
- ログ表示行数:画面上でのアクションや、保存などの動作のログを表示します。ログは、ターミナルにも同様のものが表示され、プロジェクトフォルダにも保存されます。表示行数はデフォルトで4行で、0で非表示です。実行環境の解像度やOSによってまちまちでした。
- 目標完了枚数:棒・円グラフ描画のための数値設定です。
- 自動保存間隔:後述の「プロジェクトを途中保存」とおなじ機能を自動で行います(オートセーブ)。デフォルトは5分に1回実行します。
- 進捗表示スタイル:設定した目標枚数に対する、現在の進捗状況を可視化します。個人的には円グラフがおすすめ。
![]() |
- 前へ・次へ:保存せず、画像戻し・送りができます。<十字キー左右>
- 保存して次へ:保存して次の画像に移ります。基本的にはこれを多用することになります。<Enterキー>
- 保存のみ:今の画像を保存します。<Ctrl+S>
- プロジェクトを途中保存:プロジェクトの進捗を途中保存します(動作的には、.test_images_session.jsonに書き込む)。
このほか、操作に関してEscで選択解除、Deleteで、選択状態のバウンディングボックスの削除を行うことができます。
4. 承認機能
すべての画像のアノテーションが終わったら、承認作業を行います。画面は似ていますが、承認画面はいままでのアノテーションでのバウンディングボックスをプレビューする機能です。良い画像はOK、悪い画像がNGとします。ここは手動で人間が確認する必要があります。キーボードショートカットの実装を忘れてました(マウスクリックだけでい良いため)。
![]() |
| 承認画面。よく見ると、busとtruckが重なっているのでNG |
5. 修正機能
アノテーション→承認のあと、rejectedとなった画像はここで再アノテーションをします。この画面は3.のアノテーションと基本的に同様なので割愛します。
6. エクスポート
すべて承認済みになったら、黄色いエクスポートボタンを押します。ボタンを押すと、フォルダ選択画面になるので、フォルダを作成or選択します。保存を押すと、アノテーションしたオリジナル画像とYolo形式のlabelファイルがそれぞれエクスポートされます。ちなみに、全画像が承認済みになっていない場合は、承認済みの画像のみエクスポートされます。
実際に使ってみた
卒業研究のために約20,000枚のアノテーションをおこないました。とてもつらかったですが、約3週間で完了しました。換算すると一日約1500~2000枚のペースで、一枚あたり約5秒でできました(途中でサボってます)。使い勝手に関しては、自分でアノテーションしながら改良を重ねていったので、ある程度は問題ないと思います。動作やUIは好みの問題だと考えますので、適宜ソースコードを編集してカスタマイズしてご使用ください。


ログにはユーザー名が出るので、取り扱い注意!
ソースコードについて
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
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モデルの場合、以下のように書き換えます。
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/







