kaleido_annotation 操作手順書

Flask 製の COCO 1.0 互換 矩形アノテーションツールです。CVAT バックアップとの相互運用、水増し画像の出力、EXIF 回転の自動修正に対応しています。

本書の対象バージョン 初版(kaleido_annotation 1.0)。画面のキャプション・ボタン位置が異なる場合はリポジトリ最新版の templates/ をご確認ください。

1. インストールと起動

必要環境

セットアップ

git clone https://github.com/takashide/kaleido_annotation.git
cd kaleido_annotation
python -m venv .venv

# Linux / macOS
source .venv/bin/activate
# Windows PowerShell
.venv\Scripts\Activate.ps1

pip install -r requirements.txt

起動

# 同梱の起動スクリプト
./run_ubuntu.sh         # Linux/macOS
run_windows.bat         # Windows

# または直接
python app.py

ブラウザで http://127.0.0.1:5000 を開きます。

注意 instance/ 配下はランタイムデータ(DB・アップロード画像・エクスポート ZIP)です。GB 規模になるため Git には含まれません。共有スナップショットは README に記載の ownCloud から取得してください。

2. ログイン

環境変数 REQUIRE_LOGIN=1 でログインを要求できます。未設定なら匿名アクセスです。

項目初期値
管理者ユーザー初回起動時に admin アカウントが自動作成(パスワードはコンソール出力)
一般ユーザー追加管理者ログイン後、/admin/users から

3. プロジェクト管理

プロジェクトはデータ集合の単位です。クラス(カテゴリ)はプロジェクトごとに独立します。

新規プロジェクトの作成

  1. トップ / または「プロジェクト一覧」を開く
  2. + 新規作成 をクリック
  3. プロジェクト名・説明を入力 → 作成

ZIP / バックアップから作成

同じ画面から、既存の COCO ZIP や CVAT タスクバックアップを取り込んで新規プロジェクトを起こせます。詳細は 第10章。


4. データ登録

4.1 画像のアップロード

  1. プロジェクト画面の「画像アップロード」セクション
  2. 複数ファイル選択可(.jpg .jpeg .png .bmp .webp)
  3. 登録ボタン → サムネイル付きで一覧に表示
自動正規化 アップロード時に EXIF 回転タグを実ピクセルに焼き込み、ファイルサイズ=表示サイズ になるよう自動正規化します。スマホ撮影の縦写真でも以後の bbox が必ず正しい位置になります。

4.2 動画からフレーム抽出

  1. 「動画 → フレーム分割」セクションに動画ファイルを選択
  2. 抽出間隔(秒)を入力(例: 1.0 で1秒ごと)
  3. 「キューに追加」→ バックグラウンドで JPEG 化されアノテーション対象になる

対応形式: .mp4 .mov .avi .mkv .webm


5. クラス管理

「クラス管理」セクションで追加・削除します。クラスは プロジェクトごとに独立。

追加

  1. クラス名を入力
  2. カラーピッカーで bbox 描画色を選択
  3. 追加ボタン

削除

クラス右の ✕ をクリック。そのクラスのアノテーションが1件でも存在する場合は削除できません。先にアノテーションを別クラスに変えるか削除してください。

命名の注意 CVAT から取り込んだクラス名にタイポ(eesp32 など)や表記揺れ(Insta360X5)が混入することがあります。学習側設定の class_list と完全一致させる必要があるため、取り込み後に名前を確認してください。

6. アノテーション作成

6.1 基本操作

  1. サムネイル一覧から画像をクリック → アノテーション画面へ
  2. 左のクラスパレットから描きたいクラスを選択
  3. 画像上で左クリックドラッグ → 矩形を描画
  4. マウスを離すと矩形確定 → サーバ保存

編集

動作操作
選択矩形内をクリック
移動矩形内をドラッグ
サイズ変更四隅・四辺のハンドルをドラッグ
クラス変更矩形選択中に左パレットの別クラスをクリック
削除矩形選択中に Delete または右クリック→削除

6.2 ショートカット

キー動作
← / →前の画像 / 次の画像
Ctrl+C / Ctrl+V選択 bbox のコピー / ペースト
Delete選択 bbox を削除
Esc選択解除 / 描画キャンセル

6.3 ONNX 自動アノテーション

事前学習済み ONNX モデルを使って bbox 候補を自動生成できます。auto_annotate.py が YOLOv5/YOLOv8 系の典型的な出力をデコードします。

モデル登録

  1. /models 画面で ONNX モデルファイル(.onnx)と クラス名(カンマ区切り)を登録
  2. 登録モデルはプロジェクト共通で使える

1画像で実行

アノテーション画面の「ONNX自動」ボタン → モデル選択 → 信頼度しきい値を指定して実行。

全画像に一括実行

プロジェクト画面の「全画像に自動注釈」セクションで、モデルと信頼度を指定して開始。バックグラウンドジョブで進行します。

ONNX の出力形状 モデルによって出力テンソルの形状や前処理が異なります。動かない場合は auto_annotate.py の preprocess() と postprocess() を調整してください。

7. Train/Val 分割

各画像に train / val / test のラベルを付けて、エクスポート時に分割出力できます。

個別指定

アノテーション画面右の split セレクトボックスで切り替え。

一括指定

  1. 「登録データ」セクションでサムネイル左上のチェックボックスを選択
  2. 「全選択」も可
  3. 「一括 split」セレクトで対象(train/val/test/未割当)を選び「適用」
割合の目安 小規模データ(100枚以下)でも val は最低 5〜10 枚は確保してください。val が空だと AP/AR が常に 0 になります。

8. EXIF 回転を修正(重要)

スマホやデジカメで縦撮影した画像は、ファイル実体は横向きのまま EXIF タグで「90度回転して表示せよ」と指示しているものがあります。古い経路で取り込んだデータがこの状態だと bbox が左下にズレて見える 問題が起きます。

症状 正しい位置に bbox がある画像と、左下にズレている画像が「混在」している場合は、これが原因です。

仕組み

項目正常EXIF 回転あり(壊れた状態)
ファイル実体3000×4000 portrait4000×3000 landscape + EXIF=6
ブラウザ表示3000×40003000×4000(EXIF 適用)
DB 記録 dim3000×40004000×3000 ← 不整合
bbox 座標系portraitportrait(CVAT 由来) vs landscape DB

修正手順

  1. プロジェクト画面の CVAT バックアップ欄にある EXIF回転を修正 ボタンを押す
  2. 確認ダイアログで「OK」
  3. 対象画像が pixel レベルで portrait に焼き込まれ、DB の width/height も更新
  4. アノテーション画面で bbox が正しい位置に表示されるようになる

事前ブロック機能

EXIF 回転が残っている状態で COCO JSON / COCO ZIP / CVAT バックアップ のいずれかをエクスポートしようとすると、警告画面が表示されてブロックされます。画面の EXIF回転を修正する から1クリックで修正できます。

冪等 ボタンは何度押しても安全です。すでに正規化済みの画像はスキップされます。

9. エクスポート

すべてプロジェクト画面の「エクスポート」セクションにあります。

9.1 COCO JSON / ZIP

ボタン内容用途
全件 COCO JSONJSON のみ(画像なし)。全画像確認用
注釈済み JSONJSON のみ。注釈のある画像のみ確認用
train JSON / val JSONJSON のみ。split で絞り込み確認用
学習用 ZIP (全画像 train扱い)画像 + JSON。全画像を train として学習投入(split 未使用時)
train ZIP / val ZIP画像 + JSON。split で絞り込み学習投入

ZIP の中身は以下の構造(YOLO / MMDetection 等の COCO ローダーが直接読める):

coco_pN_xxx_YYYYMMDD_HHMMSS.zip
├── annotations/
│   └── instances_train.json   (または instances_val.json)
└── images/
    ├── img_001.jpg
    └── ...

9.2 水増し画像(オフライン augmentation)

ZIP エクスポートに対してのみ適用されます。チェックボックスで切り替え:

項目初期値動作
左右反転(hflip)ONbbox の x をミラー
明暗 (×0.7 / ×1.3)ON明・暗の2枚を生成、bbox 変化なし
上下反転(vflip)OFFbbox の y をミラー
上下反転の使い方 「自然界に上下対称な物体しかない」シーンでのみ ON にしてください。ESP32 や名前シートなど向きが固定の物体では 逆効果 になります。

使い方:

  1. 「エクスポート」セクション上の水増しチェックボックスを設定
  2. 「train ZIP」等の ZIP ボタンを押す
  3. output は coco_pN_train_aug_TS.zip として保存

val ZIP では水増しは 強制的に無効化 されます(val を膨らませると AP が不当に上がるため)。

出力量の目安(39枚に対して)

有効化出力枚数
何もなし39
左右反転のみ78
左右 + 明暗195
全部 ON234

9.3 CVAT バックアップ

CVAT 公式の「Task Backup」ZIP 形式で出力します。CVAT に直接インポート可能。

cvat_backup_pN_YYYYMMDD_HHMMSS.zip
├── task.json          (ラベル定義 + フレーム範囲)
├── annotations.json   (shapes, xyxy points, frame=整数)
└── data/
    ├── original_filename_1.jpg
    └── ...

用途:


10. インポート / 復元

10.1 COCO ZIP インポート

既存プロジェクトに追記する場合: プロジェクト画面の「COCO ZIP インポート」セクション。新規プロジェクトとして取り込む場合: プロジェクト一覧画面の「ZIP からインポート」ボタン。

受け付け構造:

any_name.zip
├── annotations/
│   ├── instances_default.json  (または instances_train.json / instances_val.json)
└── images/
    └── *.jpg

10.2 CVAT バックアップ復元

既存プロジェクトに復元: 「CVAT バックアップ」セクションの このプロジェクトに復元。新規プロジェクトとして作成: プロジェクト一覧の CVATバックアップから復元。

CVAT 名の指定省略 「プロジェクト名」を空欄で復元すると、task.json 内の name が自動採用されます。

11. 削除

画像の削除

サムネイル右上の「✕」または、まとめて選択して「一括削除」。該当画像のアノテーションも DB から消えます。

動画の削除

動画リストから削除。元動画 + 抽出フレーム + 該当アノテーション をすべて物理削除。

プロジェクトの削除

プロジェクト一覧画面の 削除。復元不能。事前に CVAT バックアップを取得しておくと安全です。


12. 学習データとして使う

当ツールから出力した ZIP は YOLO / MMDetection / Detectron2 など標準的な COCO ローダーで読めます。MultimediaTechLab/YOLO(YOLOv9)への投入手順例:

データセット配置

dataset_root/
├── images/
│   ├── train/   ← train ZIP の images/ 中身
│   └── val/     ← val ZIP の images/ 中身
└── annotations/
    ├── instances_train.json
    └── instances_validation.json

dataset YAML

path: /path/to/dataset_root
train: train
validation: validation
class_num: 3
class_list: ["metron", "esp32", "insta360x5"]
auto_download:
必ず一致させる class_num と class_list はエクスポート時のクラス数・名前と完全一致が必要です。1個でもズレると学習ヘッドが空になり AP=0 のままになります。

train.yaml の落とし穴

項目注意
weight未指定はスクラッチ学習。少データなら必ず pretrained 指定 (weight: v9-t.pt 等)
batch_size / equivalent_batch_size勾配累積に注意。学習画像が少ない時に equivalent_batch_size を大きくすると 1epoch あたりの optimizer.step が極端に減り loss が動かない
image_size4000×3000 → 640 は小物体が消える。小物体が含まれるなら 1280 推奨
lrnano モデルの head 再初期化時は 0.001 程度が安全

13. トラブルシューティング

Q. アノテーションした bbox が左下にズレて表示される

A. EXIF 回転が残っています。第8章 の「EXIF回転を修正」ボタンを押してください。

Q. エクスポートを押したらオレンジの警告ページが出た

A. EXIF 不整合の事前ブロックです。ページ内のボタンから修正してそのまま再エクスポートしてください。

Q. ONNX 自動アノテーションでエラーが出る

A. ONNX_MODEL_PATH が未設定か、モデルの出力形状が auto_annotate.py の前提と異なります。コンソール出力を確認し、必要なら auto_annotate.py を調整してください。

Q. 学習させても AP/AR が 0 のまま

以下を順に確認:

  1. val セットがあるか(5枚以上推奨)
  2. class_num と DB のクラス数が一致
  3. EXIF 回転を修正済みか
  4. pretrained weight 指定済みか
  5. equivalent_batch_size が画像数に対して妥当か(少データなら batch_size と同値推奨)
  6. warmup epoch 比率が高すぎないか

Q. 動画フレーム抽出が終わらない

A. バックグラウンドジョブで進行します。「動画」セクションに進捗が表示されます。長尺動画は時間がかかります。

Q. CVAT バックアップを CVAT に取り込むと向きが違う

A. 当ツールが EXIF 焼き込みを終えた画像は EXIF タグなしです。CVAT 側で正しく portrait/landscape として扱われるはず。もしずれている場合は、当ツールでアノテーション後に CVAT に渡したものではなく、別経路(手元のスマホ画像を CVAT に直接アップ等)でズレが起きている可能性があります。


© kaleido_annotation. ドキュメントの修正提案は Issues へお願いします。