Skip to main content

MMDetectionでWeights & Biasesを使用する方法

このレポートでは、MMDetectionを使用してオブジェクト検出モデルをトレーニングし、 MMDetWandbHookを使用する方法を学びます。
Created on June 17|Last edited on June 17
このレポートは、Ayush Thakurによる「How to Use Weights & Biases with MMDetection」の翻訳です。




目次



はじめに

今日のゴールは、シンプルです。MMDetectionを使用してオブジェクト検出モデルをトレーニングし、Weights&Biasesがトレーニングと検証の指標の記録、モデル予測の視覚化、生の検証データセットのバージョンなどにどのように役立つかを確認します。より具体的には、小さなバルーンデータセットでMask RCNNモデルをトレーニングしていきます。ただし、始める前に、 MMDetectionについてもう少し詳しく話していきたいと思います。
MMDetectionとは、 OpenMMLabsによるPyTorchに基づくオブジェクト検出タスク用の、人気のあるオープンソースリポジトリです。MMDetectionは、カスタムオブジェクト検出パイプラインを簡単に構築するために使用できる、構成可能でモジュール式のAPI設計を提供します。 100を超える事前トレーニング済みモデルがあり、すぐに使用できる標準のデータセットがあります。さらに、シングルGPUとマルチGPUの両方のトレーニングに対応しています。こちらからGitHubリポジトリをご覧いただけます。
W&B側のこの投稿では、次の目的で使用できるMMDetection専用のMMDetWandbHookを紹介します:
✅トレーニングと評価の指標を記録する。
✅バージョン管理されたモデルのチェックポイントをログに記録する。
✅グラウンドトゥルースバウンディングボックスを使用して、バージョン管理された検証データセットをログに記録する。
✅モデルの予測をログに記録して視覚化する。
それでは、始めましょう。

セットアップ


それでは、カスタムデータセットでMMDetectionを使用してトレーニングを開始するために必要なものをすばやく設定していきます。実行可能なコードをフォローしたい場合は、上記のColabリンクから始めることができます。

MMDetectionのインストール

MMDetectionは、 MMCVライブラリに大きく依存しています。初めての方向けに説明させていただきますが、MMCVとはOpenMMLabsのほとんどのプロジェクト(リポジトリ)で使用される基本的なライブラリのことです。ただし、指定されたPyTorchバージョンと互換性のある正しいバージョンのMMCVをインストールする必要があります。 MMCVとMMDetectionはどちらもpipでインストールが可能です。詳しくは、インストールドキュメントページをご覧ください。
次のコードをインストールする必要があります:
# Install PyTorch.
!pip install -qq torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html

# Install mmcv-full.
!pip install -qq mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html

# Install mmdetection
!git clone https://github.com/open-mmlab/mmdetection
%cd mmdetection
!pip install -e .

Weights & Biasesのインストール

Python用のpipパッケージインストーラーを使用して、Weights & Biasesを簡単にインストールできます。 W&Bアカウントをまだ作成していない場合は、サインアップページにアクセスして作成することができます。シークレット認証トークンを使用してログインすることにより、マシンを認証してW&Bへの実行(メトリクス、データなど)のログ記録を始められます。
!pip install -q --upgrade wandb

import wandb
wandb.login()

データセット


上記のように、小さなバルーンデータセットを使用します。以下に示すコードスニペットを使用して、データセットをダウンロードすることができます。
!wget https://github.com/matterport/Mask_RCNN/releases/download/v2.1/balloon_dataset.zip
!unzip -q balloon_dataset.zip
新しいデータ形式をサポートするには、注釈をCOCO形式またはPASCAL VOC形式に変換しましょう。注釈をCOCO形式に変換する場合は、オフラインで行い、CocoDatasetクラスを使用してください。PASCAL形式に変換する場合は、 VOCDatasetクラスを使用してください。これらのクラスは、以下に示す構成システムを使用して割り当てることができます。このレポートに関連付けられているColabノートブックをご確認の上、 Balloonデータセットの形式の変換方法をご覧ください。カスタムデータセットの使用の詳細については、こちらをチェックしてください。
MMDetWandbHookは、検証データを自動的にログに記録します。サンプル数は、 num_eval_samplesを使用して決定できます。間もなくMMDetWandbHookについて詳しく見ていきますが、データセットの簡単なプレビューを次に紹介します。以下に示すパネルは、検証データがログに記録されるW&Bテーブルとなります。

Run set
0


モデル


ModelZooを通じてMMDetectionによって提供される100を超える事前トレーニング済みのオブジェクト検出器があります。こちらのドキュメントページからご覧いただけます。
モデルのバックボーン、ネック、ヘッド、ROI、ロスを簡単にカスタマイズできます。モデルのカスタマイズについての詳細は、こちらをご覧ください。このチュートリアルでは、事前にトレーニングされたモデルチェックポイントを使用して、カスタムデータセットで微調整します。それでは、checkpointsディレクトリにモデルをダウンロードしましょう:
!mkdir checkpoints
!wget -c https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth \
-O checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth

構成


MMDetectionは、構成システムに大きく依存しています。構成システムは、 MMDetectionのすべてのコンポーネントを繋ぎます。 Faster R-CNN、Mask R-CNN、Cascade R-CNN、RPN、SSD、YOLOなどのすべてのオブジェクト検出フレームワークには、独自の構成ファイルがあります。選択したファイルをロードし、必要に応じてメソッドを変更することが可能です。MMDetection Configシステムの詳細については、こちらをご覧ください。
現在、ほとんどの構成ファイルは、 config/__base__- datasetmodelscheduledefault_runtime下の4つの基本コンポーネントタイプを使用して構成されています。以下に紹介するように、ファイル内の必要なメソッドを直接変更するか、構成ファイルをロードして、 cfgオブジェクトを使用して必要なメソッドにアクセスすることで、変更することが可能です。
config_file = 'mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py'
cfg = Config.fromfile(config_file)
ここでは、COCODatasetが使用されています:

# Define type and path to the images.
cfg.dataset_type = 'COCODataset'

cfg.data.test.ann_file = 'balloon/val/annotation_coco.json'
cfg.data.test.img_prefix = 'balloon/val/'
cfg.data.test.classes = ('balloon',)

cfg.data.train.ann_file = 'balloon/train/annotation_coco.json'
cfg.data.train.img_prefix = 'balloon/train/'
cfg.data.train.classes = ('balloon',)

cfg.data.val.ann_file = 'balloon/val/annotation_coco.json'
cfg.data.val.img_prefix = 'balloon/val/'
cfg.data.val.classes = ('balloon',)
データセットにはクラスが1つしかないため(もちろんバルーン)、それに応じてバウンディングボックスヘッドとマスクヘッドを構築するモデルを指定します。また、前のセクションでダウンロードしたモデルチェックポイントの使用にもご注意ください:
# modify num classes of the model in box head and mask head
cfg.model.roi_head.bbox_head.num_classes = 1
cfg.model.roi_head.mask_head.num_classes = 1

# Use the pretrained model.
cfg.load_from = 'checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth'
次に、トレーニング構成を定義しましょう。 checkpoint_config.intervalevaluation.intervalの使用に注意してください。あとできっと役に立ちます!
# The original learning rate (LR) is set for 8-GPU training.
# We divide it by 8 since we only use one GPU.
cfg.optimizer.lr = 0.02 / 8
cfg.lr_config.warmup = None
cfg.log_config.interval = 10

# Epochs
cfg.runner.max_epochs = 12

# Set seed thus the results are more reproducible
cfg.seed = 0
set_random_seed(0, deterministic=False)
cfg.gpu_ids = range(1)

# ⭐️ Set the checkpoint interval.
cfg.checkpoint_config.interval = 4

# Set up working dir to save files and logs.
cfg.work_dir = './tutorial_exps'
cfg.device = 'cuda'

# ⭐️ Set the evaluation interval.
cfg.evaluation.interval = 2
ML実験を複製するには、構成を適切にフォローする必要があります。後のセクションで、 MMDetWandbHookを使用して構成をW&Bに記録する方法を説明します。しかし、 MMDetWandbHookについて説明する前に、 MMDetectionのコンテキストでフックのTL;DRを入手しましょう:

フック

一般に、フックは特定のイベントの後に自動的に実行される機能です。 MMDetectionは、構成システムのdefault_runtimeコンポーネントからアクセスできるさまざまな標準フックを提供します。いくつかの設定方法(このチュートリアルにとって重要)を以下に紹介します:
  • log_config - これを使用して、TextLoggerHookMMDetWandbHookなどのさまざまなロガーフックを初期化します。
  • checkpoint_config-これを使用して、MMCVのCheckpointHookを初期化します。このフックは、上記の構成セクションで定義された間隔でモデルチェックポイントを保存します。
  • evaluation -これを使用して、使用可能なGPUの数に応じてMMCVのEvalHookまたはDistEvalHookを初期化します。このフックは、上記の構成セクションで定義された間隔で検証データのモデルを評価します。
通常、フックには関連付けられた優先ステータスがあります。この場合、 log_configの優先度は、VERY_LOWになりますが、他のフックの優先度はNORMALとなります。

専用のWeights and Biasesフック


MMDetectionには、 MMDetWandHookと呼ばれる専用のWeights & Biasesフックが付属しています。この専用フックを使用すると、次のことが可能になります:
  • システム(CPU / GPU)メトリクスと共に、トレニングおよび評価メトリクスをログに記録する
  • モデルのチェックポイントをW&Bアーティファクトとして保存する
  • 検証データセットをインタラクティブなW&Bテーブルとして視覚化する
  • モデル予測をインタラクティブなW&Bテーブルとして視覚化する
MMDetWandbHookはロガーフックのため、 log_configメソッドを使用して初期化できます。

使用

cfg.log_config.hooks = [
dict(type='TextLoggerHook'),
dict(type='MMDetWandbHook',
init_kwargs={'project': 'MMDetection-tutorial'},
interval=10,
log_checkpoint=True,
log_checkpoint_metadata=True,
num_eval_images=100)]
MMDetWandbHookには、 MMDetectionを最大限に活用するのに役立つ4つの重要な引数があります。では、それらについて見てきましょう。

ログメトリクス

トレーニングと評価メトリクスをシステムメトリクスとともにログに記録する方法は、 init_kwargs引数を使用するだけです。この引数は、キーと値のペアのディクショナリを取り込み、それがwandb.initに渡ります。これを使用して、W&Bプロジェクト名の設定、実行をチームアカウントに記録する場合はチーム名(entity)の設定、構成の受け渡しなどを行うことができます。 wandb.initに渡すことができるものについては、こちらからご確認ください。

トレーニングメトリクス:


Run set
1


検証メトリクス:




システムメトリクス+その他:




チェックポイント

MMDetectionでは、MMCVのCheckpointHookを使用して、モデルのチェックポイントを定期的に保存します。期間はcheckpoint_config.intervalによって決まります。ただし、これらのチェックポイントはローカルに保存され、新しい実験によって上書きされる可能性があります。
log_checkpoint = True引数を使用すると、これらのチェックポイントをW&Bアーティファクトとして確実に保存することができます。それらをW&Bアーティファクトとして保存することにより、チェックポイントをマシン間で簡単に転送し、異なるモデルのアイデアを個別に保持し、バリアント間で比較することが可能になります。
図1:W&BアーティファクトUI。チェックポイントは、左側のペインにさまざまなバージョンとして表示される。 [ファイル]タブからモデルをダウンロードするか、APIを使用してプログラムでモデルをダウンロードできる。
ここでいくつかの注目すべき点があります:
  • 上記のように、UIには3つのバージョンのチェックポイントがある。これは、モデルがcheckpoint_ config.interval =4で12エポックに対してトレーニングされたため。
  • 各バージョンにはエイリアスepoch_xがある。xは現在のエポック。
  • 最新のチェックポイントはlatestとマークされている。
ローカルとW&Bの両方のストレージスペースを節約するために、チェックポイント間隔を慎重に設定してください。

メタデータでのチェックポイント

チェックポイントに有用なメタデータが関連付けられている場合、チェックポイントはさらに意味のあるものになります。 log_checkpoint_metadataTrueの場合、すべてのチェックポイントバージョンにメタデータが関連付けられます。
メタデータは、現在のエポックとともにそのチェックポイントを使用して検証データで計算された評価メトリクスを含むキーと値のペアのディクショナリです。
図2:W&BアーティファクトUI。ログに記録されたメタデータは、[メタデータ]タブに表示される。
この機能は、 CheckpointHookEvalHookまたはDistEvalHook次第です。メタデータは、チェックポイント間隔が評価間隔で割り切れる場合にのみログに記録されます(つまり、ckpt_interval % eval_interval == 0)。

データセットとモデル予測の視覚化

データセット、特にモデル予測をインタラクティブに視覚化する機能は、より優れたモデルの構築とデバッグに役立ちます。 MMDetectionは、 GPUが1つしかない場合はEvalHookを使用し、複数のGPUを使用する場合はDistEvalHookを使用して、検証データのモデルを定期的に評価します。期間は、 evaluation.interval (上記の通り)によって制御されます。
MMDetWandbHookを使用すれば、検証データをW&Bテーブルとしてログに記録し、モデル予測用のバージョン管理されたW&Bテーブルを作成できるようになりました。 W&Bテーブルは、データの2次元グリッドであり、各列には、画像、テキスト、スカラーなどの単一のタイプのデータがあります。
MMDetWandbHooknum_eval_images引数は、W&Bテーブルとしてログに記録される検証サンプルの数を制御します。
ここで注意すべき点がいくつかあります:
  • num_eval_images = 0の場合、検証データとモデル予測はログに記録されない。
  • mmdet.core.train_detector APIのvalidate =Falseの場合、検証データとモデル予測はログに記録されない。
  • num_eval_imagesが検証サンプルの総数よりも大きい場合、完全な検証データセットがログに記録される。
上記のW&Bテーブルとしてログに記録された検証データについては、すでに確認しました。すべての評価間隔で、予測されたバウンディングボックスと正解データ(Ground Truth)がW&Bテーブルとしてログに記録されます。以下の表でモデルの予測をご確認ください。

Run set
0


ストレージに関するクイックノート

各評価間隔の予測テーブルは、一意のバージョンとしてログに記録されます。 media/ディレクトリのストレージフットプリントはわずか数KBです。これらの数KBは、予測されたセグメンテーションマスクのロギングによるものです。また、W&Bテーブルおよび後続のテーブルは、そのデータへの参照を使用するため、検証データは1回だけログに記録されます。
図3:W&BアーティファクトUI。 [Files]タブで、ログに記録されたテーブルのメモリフットプリントを確認できる。

Weights & Biasesでのトレーニング


このセクションでは、 MMDetectionが提供するモジュラーAPIを使用してトレーニングパイプラインを構築します。他のトレーニングパイプラインと同様に、データローダー、モデル、トレーニングループが必要です。ただし、モデルをトレーニングする前に、構成をログに記録する方法を見てみましょう:

ロギング構成

tools/train.pyを使用する場合、構成は自動的にログに記録されます。ただし、独自のトレーニングパイプラインを使用している場合は、必ず次の手順に従ってください:
  • exp_nameをキーとして、構成ファイルの名前を値とするディクショナリ、 metaを作成します。
meta = dict()
meta['exp_name'] = os.path.basename(config_file)
  • work_dir /meta[' exp_name '] dirに構成を出力います。 MMDetWandbHookは、保存された構成ファイルを自動的に読み取り、ログに記録します。

トレーニング

以下のコードスニペットでご覧いただけるように、 MMDetectionは、トレーニングパイプラインの必要なコンポーネントを構築するためのすぐに使用できるAPIを提供しています。
def train(cfg, meta):
# Build dataset
datasets = [mmdet.datasets.build_dataset(cfg.data.train)]

# Build the detector
model = mmdet.models.build_detector(
cfg.model, train_cfg=cfg.get('train_cfg'), test_cfg=cfg.get('test_cfg'))
model.CLASSES = datasets[0].CLASSES

# Dump config for logging
mmcv.mkdir_or_exist(os.path.abspath(cfg.work_dir))
cfg.dump(os.patg.join(cfg.work_dir, meta['exp_name']))

# Train the model.
mmdet.apis.train_detector(model, datasets, cfg, distributed=False, validate=True, meta=meta)
train_detector APIを使用して、 distributed = Trueを指定することにより、マルチGPU設定でモデルをトレーニングできます。検証データセットでモデルを評価したくない場合は、 validate=Falseをターンします。 validateFalseの場合、 EvalHookまたはDistEvalHookは初期化されません。トレーニングするには、次のように実行するだけです:
train(cfg, meta)
上記のログに記録されたメトリクス、データ、およびモデルの予測をすでに確認したので、以下のログに記録された構成をチェックしましょう:



まとめ

MMDetectionとは、オブジェクト検出およびセグメンテーションタスクの一般的なフレームワークです。専用のMMDetWandbHookは、このフレームワークの一部になっているため、ワークフローでさらに活用することが可能です。上記で紹介したように、構成ファイルのlog_configメソッドを更新するのと同じくらい簡単に使用することができます。


この機能があなたのワークフローに付加価値をもたらすことができれば幸いです。ご不明な点がございましたら、下にコメントを残すか、こちらまたはこちらに質問を投稿してください。また、YOLOv5やPaddleDetectionなどの他の一般的なオブジェクト検出フレームワークとの統合もあります。それらについては以下でチェックしてみてください:

関連記事


Iterate on AI agents and models faster. Try Weights & Biases today.