1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🎯 GPUなしでも戦える!YOLO完結型アノテーション&トレーニングツールを作った話

Posted at

はじめに - なぜこのツールを作ったのか 🤔

YOLOで物体検出モデルを訓練しようとしたことがある人なら、誰もが経験する「あの面倒さ」。

  • データセット用のフォルダ構造を手動で作成
  • 画像を撮影して、適切なディレクトリに配置
  • アノテーションツールを別途起動
  • ラベルファイルのフォーマットが合っているか確認
  • 訓練スクリプトを書いて実行
  • 「あ、クラス名間違えた」で最初からやり直し

この無限ループに嫌気が差した僕は、「撮影からアノテーション、訓練まで全部一つのツールでやりたい」 という野望を抱き、このツールを開発しました。

そして何より重要なのは、GPUがないPCでも十分に動作するという点です。YOLOv8/v11のnanoやsmallモデルなら、CPUだけで実用的な訓練が可能です。高価なGPUを買う前に、まずは手元のPCで試してみませんか?

🚀 このツールの特徴

1. オールインワンワークフロー 📸➡️🖊️➡️🤖

従来のワークフロー:

カメラアプリ → ファイル管理 → アノテーションツール → 
コードエディタ → ターミナル → 「なんかエラー出た...」

このツール:

ブラウザ一つで全部完結 ✨

Flaskベースのウェブアプリケーションなので、ブラウザだけあれば全ての作業が可能です。プロジェクトの作成、画像キャプチャ、アノテーション、訓練の設定、そして訓練の実行まで、すべてが統合されたインターフェースで完結します。

2. リアルタイムカメラキャプチャ 📷

WebSocketを使ったリアルタイムカメラフィード機能を搭載しています。

何が嬉しいのか?

  • USBカメラや内蔵Webカメラから直接撮影可能
  • 4K解像度に自動対応(カメラが対応していれば)
  • 撮影した画像は自動的に正しいディレクトリに保存
  • Train/Valの振り分けもワンクリック

データセット作成の最初の難関である「画像収集」が驚くほど楽になります。特に、リアルタイムで被写体を確認しながら、ベストなアングルで撮影できるのは大きなアドバンテージです。

3. マルチタスク対応アノテーション 🎨

このツールは単なるバウンディングボックスツールではありません:

Detection (BBox) 📦

通常の矩形バウンディングボックス。クリック&ドラッグで簡単に描画できます。

Segmentation (Polygon) 🔷

ポリゴンベースのセグメンテーション用アノテーション。クリックで頂点を追加し、ダブルクリックで完了。複雑な形状の物体も正確にラベリング可能です。

OBB (Oriented Bounding Box) 🔄

回転した矩形にも対応。4つの角をクリックするだけで、任意の角度のバウンディングボックスを作成できます。

操作性へのこだわり:

  • ズーム&パン機能で細かい部分も正確にアノテーション
  • 選択したアノテーションのリサイズ・移動が可能
  • 右クリックで削除
  • キーボードショートカット完備(Ctrl+S保存、矢印キーで画像移動など)
  • クロスヘア表示で正確な位置決め

アノテーション作業は単調で退屈になりがちですが、このツールは「快適さ」を最優先に設計しました。

4. プロジェクト管理システム 📁

YOLOの標準的なディレクトリ構造を自動生成:

project_name/
├── train/
│   ├── images/
│   └── labels/
├── val/
│   ├── images/
│   └── labels/
├── classes.txt
└── data.yaml

data.yamlは自動生成・自動更新されるので、手動で編集する必要はありません。クラスを追加・削除すれば、即座に反映されます。

5. フル機能トレーニング設定 ⚙️

Ultralyticsの訓練パラメータをほぼすべてGUIから制御可能:

基本設定:

  • モデル選択(YOLOv8/v11のnano, small等)
  • エポック数、バッチサイズ、画像サイズ
  • デバイス選択(CPU/GPU)

詳細設定(展開可能):

  • 学習率、モーメンタム、重み減衰
  • 損失関数の重み(cls, box, obj/dfl)
  • データ拡張パラメータ(HSV調整、回転、スケーリング等)
  • 各種閾値設定

設定は保存・読み込みが可能なので、実験的な訓練を繰り返す際に便利です。

6. 自動ラベリング(Relabel)機能 🏷️

これが本当にゲームチェンジャーです。

使い方:

  1. 少量の画像(50〜100枚程度)を手動でアノテーション
  2. モデルを訓練
  3. 訓練したモデルを使って新しい画像を自動ラベリング
  4. 自動生成されたラベルを確認・修正
  5. 再訓練してさらに精度向上

モード選択:

  • All Images: すべての画像を再ラベリング
  • Only Labeled: 既存のラベルのみ更新
  • Only Unlabeled: 未ラベリング画像のみに適用

安心のバックアップ機能:
再ラベリング前に自動でバックアップを作成するオプションがあるので、「やっぱり元に戻したい」も可能です。

信頼度・IoU閾値の調整:
検出の厳しさを調整できるので、用途に応じて柔軟に対応できます。

この機能により、初期の手動アノテーション作業を大幅に削減できます。特に大規模データセットを作成する際に威力を発揮します。

7. オートトレーニング機能 🤖✨

究極の自動化がここにあります。

オートトレーニングは、「検出→訓練」のサイクルを完全自動化した機能です:

実行フロー:

  1. 既存のbest.ptモデルを選択
  2. すべての画像を自動検出&ラベリング
  3. 自動生成されたラベルで新しいモデルを訓練

これは特に以下のシナリオで有効です:

  • 初期モデルで大量の画像を一括ラベリングしたい
  • 定期的にデータセットを更新して再訓練したい
  • 人間の介入を最小限にして反復訓練したい

設定可能なパラメータ:

  • エポック数、バッチサイズ、画像サイズ
  • 学習率、パシエンス(早期停止)
  • 検出閾値(Confidence/IoU)
  • バックアップの有効化

注意点:
自動ラベリングの精度は元のモデルに依存します。完全に正確ではないため、重要なデータセットでは必ず人間の目で確認することをお勧めします。しかし、「8割は自動、2割だけ手直し」というワークフローは、作業効率を劇的に向上させます。

🎯 GPUなしでも実用的な理由

多くの人が誤解しているのですが、YOLOの訓練には必ずしもGPUは必要ありません

なぜCPUでも十分なのか?

Nano/Smallモデルの軽量性:

  • YOLOv8n/YOLOv11nは非常にコンパクト
  • パラメータ数が少ないため、CPUでも合理的な時間で訓練可能
  • 推論速度も十分に速い

実用的なユースケース:

  • プロトタイプ開発
  • 小規模データセット(数百〜数千画像)
  • 個人プロジェクト
  • 教育目的

実際の戦略:

  1. CPUで初期モデルを訓練
  2. 概念実証(PoC)を完成
  3. 必要に応じてクラウドGPUで大規模訓練

このアプローチにより、初期投資なしでYOLOプロジェクトを開始できます。

訓練の最適化

このツールは訓練パラメータの完全な制御を提供するため、CPU訓練を最適化できます:

  • バッチサイズを小さくしてメモリ使用量を削減
  • 画像サイズを調整(640→320など)
  • データ拡張を活用して小規模データセットでも高精度を実現
  • パシエンス設定で無駄な訓練を回避

🛠️ 技術スタック

バックエンド

  • Flask: 軽量で拡張性の高いWebフレームワーク
  • Flask-SocketIO: リアルタイムカメラフィードに使用
  • Ultralytics YOLO: 訓練・推論エンジン
  • OpenCV: 画像処理・カメラキャプチャ
  • eventlet: 非同期処理

フロントエンド

  • バニラJavaScript(依存関係最小限)
  • HTML5 Canvas(アノテーション描画)
  • Bootstrap 5(UI)
  • Socket.IO(リアルタイム通信)

なぜこの構成?

シンプルさ重視:
複雑なフレームワークを避け、誰でも理解・改造できるコードベースを目指しました。ReactやVueを使わなかったのは、依存関係を最小限にし、デプロイを簡単にするためです。

拡張性:
Flaskのシンプルな構造により、新機能の追加が容易です。APIエンドポイントを追加するだけで、機能を拡張できます。

📚 使い方の基本フロー

1. プロジェクト作成

Projects画面 → Create New Project → プロジェクト名入力

自動的にYOLO標準のディレクトリ構造が生成されます。

2. クラス定義

Classes パネル → クラス名を入力 → 追加

クラスは後からいつでも追加・削除可能です。

3. タスクタイプ選択

Task Type パネル → Detection/Segmentation/OBBを選択

プロジェクトの途中でも変更可能(既存のラベルには影響しません)。

4. 画像収集

Camera パネル → カメラ選択 → Start → Capture

または、既存の画像をtrain/imagesフォルダに直接配置してもOKです。

5. アノテーション

画像を選択 → クラスを選択 → 描画
  • Detection: クリック&ドラッグ
  • Segmentation: クリックで頂点追加、ダブルクリックで完了
  • OBB: 4つの角をクリック

6. 訓練

Training Configuration → パラメータ設定 → Start Training

訓練結果はproject_name/training_run_YYYYMMDD_HHMMSS/に保存されます。

7. 自動ラベリング(オプション)

Relabel Images → モデル選択 → パラメータ設定 → Start Relabeling

8. オートトレーニング(オプション)

Auto Training → best.ptを確認 → パラメータ設定 → Start Auto Training

🎨 便利な機能たち

キーボードショートカット

  • ←/→: 前/次の画像
  • Ctrl/Cmd + S: ラベル保存
  • Delete: 選択中のアノテーション削除
  • Esc: 選択解除

ラベル状態の視覚化

画像リストで、ラベル済み画像には ✓ マーク、未ラベル画像には ○ マークが表示されます。進捗が一目でわかります。

ズーム&パン

  • マウスホイール: ズームイン/アウト
  • Shift + ドラッグ or 中ボタンドラッグ: パン
  • リセットボタン: 元の表示に戻る

細かい部分も正確にアノテーションできます。

訓練設定の保存・読み込み

実験的な訓練を行う際、設定を保存しておけば、後から同じ設定で再実行できます。

🔮 Version 2 で予定している機能(Coming Soon!)

1. ライセンス分離 📜

現在、このプロジェクトは全体がAGPLライセンスで提供されています。しかし、より柔軟な利用を可能にするため、以下のようなライセンス構成を検討中です:

コアツール(AGPL):

  • アノテーション機能
  • 基本的な訓練機能
  • プロジェクト管理

拡張機能(MIT/Apache):

  • エクスポート機能
  • API連携
  • カスタムプラグイン

これにより、商用プロジェクトでも使いやすくなる予定です。

2. Raspberry Pi対応 🍓

既にテスト済み、リリース準備中!

Raspberry Pi 4/5で動作するバージョンを開発中です。エッジデバイスでのリアルタイム推論とデータ収集が可能になります。

ユースケース:

  • IoTデバイスでのリアルタイム検出
  • 工場での品質検査
  • 農業での作物モニタリング
  • 野生動物の監視

Raspberry Piでは訓練は現実的ではありませんが、推論とデータ収集に特化したバージョンを提供予定です。収集したデータは、PCで訓練してモデルを更新、再びRaspberry Piにデプロイ、という循環が可能になります。

3. Google Colab自動コード生成 ☁️

これが最もエキサイティングな機能です!

このツールで作成したデータセットを、ワンクリックでGoogle Colabで訓練可能なコードに変換します。

どういうことか?

  1. ローカルでデータセット作成&小規模訓練(nano/smallモデル)
  2. 「Generate Colab Code」ボタンをクリック
  3. データセットアップロード用スクリプトとトレーニングノートブックを自動生成
  4. Google Colabで大規模モデル(medium/large)を訓練
  5. 訓練済みモデルをダウンロードして、ローカルで推論

メリット:

  • 無料のGPU(T4/P100)を活用
  • ローカルPCのリソースを節約
  • より大きなモデルで高精度を実現
  • コードを書く必要なし(自動生成)

生成されるもの:

  • データセットのGoogle Drive/Colab Storageへのアップロードコード
  • data.yamlの自動調整
  • 訓練パラメータの引き継ぎ
  • TensorBoard設定
  • モデルダウンロードコード

この機能により、「ローカルで快適に作業、ヘビーな訓練はクラウドで」という理想的なワークフローが実現します。

4. その他の改善予定

  • バッチアノテーション: 同じクラスの複数オブジェクトを一度に描画
  • アノテーション履歴: Undo/Redo機能
  • データセットの統計情報: クラスバランス、画像サイズ分布などの可視化
  • モデル比較ツール: 複数の訓練結果を並べて比較
  • エクスポート機能: COCO形式、Pascal VOC形式への変換

🎓 推奨ワークフロー

初心者向け:少数データから始める

1. 50〜100枚の画像を手動でアノテーション
2. YOLOv8n/YOLOv11nで訓練(CPU可)
3. 結果を確認、問題があればデータを追加
4. 再訓練
5. ある程度の精度が出たら、自動ラベリングを活用

中級者向け:反復改善

1. 初期データセット(200〜500枚)を用意
2. 初期モデルを訓練
3. 自動ラベリングで1000枚に拡張
4. 手動で確認・修正(2割程度)
5. 再訓練して精度向上
6. 必要に応じてクラスを追加・調整
7. オートトレーニングで定期更新

上級者向け:大規模データセット

1. 少量の高品質データで初期モデル作成
2. 自動ラベリングで大量データを生成(5000枚以上)
3. サンプリングして手動検証(10〜20%)
4. ローカルでsmallモデルまで訓練
5. Version 2のColab機能でmedium/largeモデルを訓練
6. デプロイ

🐛 既知の制限と注意点

ブラウザストレージ非対応

このツールは、あえてlocalStoragesessionStorageを使用していません。すべてのデータはサーバーサイドで管理されます。これは、データの永続性と複数デバイス間の一貫性を保証するためです。

大規模画像の扱い

非常に高解像度の画像(8K以上)は、ブラウザのCanvasレンダリングが遅くなる可能性があります。実用上は問題になりませんが、超高解像度で作業する場合は注意が必要です。

訓練中のリソース

訓練中はCPU/メモリを大量に使用します。他の重い作業との並行は避けることを推奨します。

カメラの互換性

すべてのUSBカメラが完璧に動作するわけではありません。特に古いドライバや特殊なカメラでは問題が発生する可能性があります。

🚀 今すぐ始めよう

インストール

git clone https://github.com/Rikiza89/Labeling_for_YOLO
cd Labeling_for_YOLO
pip install flask flask-socketio opencv-python ultralytics pyyaml eventlet
python app_segmentation.py

ブラウザでhttp://127.0.0.1:5000にアクセスすれば、すぐに使い始められます。

YOLOモデルの準備

models/ディレクトリに、使用したいYOLOモデル(.ptファイル)を配置してください:

  • Detection: yolov8n.pt, yolov11n.pt
  • Segmentation: yolov8n-seg.pt, yolov11n-seg.pt
  • OBB: yolov8n-obb.pt, yolov11n-obb.pt

Ultralyticsから公式モデルをダウンロードできます。

💡 Tips & Tricks

データセットの質を高める

  • 多様性: 様々な角度、照明、背景で撮影
  • バランス: 各クラスの画像数を均等に
  • バリエーション: オクルージョン(遮蔽)やスケールの変化を含める

効率的なアノテーション

  • 最初に簡単な画像からアノテーション
  • ショートカットキーを活用
  • 疲れたら休憩(精度が落ちます)
  • 10〜20枚ごとに保存する習慣

訓練の最適化

  • 小さいバッチサイズから始める
  • パシエンス設定で無駄な訓練を回避
  • データ拡張を活用(特に小規模データセット)
  • 定期的にValidationセットで評価

モデルの選び方

  • nano (n): 最速推論、プロトタイプに最適
  • small (s): バランス型、多くのケースで十分
  • medium (m): より高精度が必要な場合
  • large (l): 最高精度が必要な場合(GPU推奨)

🤝 コントリビューション歓迎

このプロジェクトはオープンソースです。バグ報告、機能リクエスト、プルリクエスト、すべて歓迎します!

特に募集中:

  • UI/UXの改善提案
  • 新機能のアイデア
  • ドキュメントの改善
  • 他言語への翻訳

GitHubでスターをいただけると、開発の励みになります ⭐

おわりに 🎉

YOLOの物体検出は、もはやGPUを持つ一部の人だけのものではありません。このツールを使えば、誰でも、どんなPCでも、今すぐYOLOプロジェクトを始められます。

撮影からアノテーション、訓練まで、すべてがブラウザ一つで完結する時代が来ました。

小さく始めて、大きく育てる。それがこのツールのコンセプトです。

あなたのYOLOプロジェクトが、このツールで少しでも楽になれば幸いです。

Happy Labeling! 🏷️✨


リンク:

次回予告:
Version 2の機能紹介記事をお楽しみに!特にGoogle Colab連携は、みなさんのワークフローを大きく変えると確信しています。


この記事は2025年12月19日時点の情報に基づいています。最新の情報は、GitHubリポジトリをご確認ください。

1
3
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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?