Notebooks
H
Hugging Face
Semantic Segmentation

Semantic Segmentation

hf-notebookstransformers_docjapytorch

Semantic segmentation

[ ]

セマンティック セグメンテーションでは、画像の個々のピクセルにラベルまたはクラスを割り当てます。セグメンテーションにはいくつかのタイプがありますが、セマンティック セグメンテーションの場合、同じオブジェクトの一意のインスタンス間の区別は行われません。両方のオブジェクトに同じラベルが付けられます (たとえば、car-1car-2の代わりにcar)。セマンティック セグメンテーションの一般的な現実世界のアプリケーションには、歩行者や重要な交通情報を識別するための自動運転車のトレーニング、医療画像内の細胞と異常の識別、衛星画像からの環境変化の監視などが含まれます。

このガイドでは、次の方法を説明します。

  1. SceneParse150 データセットの SegFormer を微調整します。
  2. 微調整したモデルを推論に使用します。

このタスクと互換性のあるすべてのアーキテクチャとチェックポイントを確認するには、タスクページ を確認することをお勧めします。

始める前に、必要なライブラリがすべてインストールされていることを確認してください。

pip install -q datasets transformers evaluate

モデルをアップロードしてコミュニティと共有できるように、Hugging Face アカウントにログインすることをお勧めします。プロンプトが表示されたら、トークンを入力してログインします。

[ ]

Load SceneParse150 dataset

まず、SceneParse150 データセットの小さいサブセットを 🤗 データセット ライブラリから読み込みます。これにより、完全なデータセットのトレーニングにさらに時間を費やす前に、実験してすべてが機能することを確認する機会が得られます。

[ ]

train_test_split メソッドを使用して、データセットの train 分割をトレイン セットとテスト セットに分割します。

[ ]

次に、例を見てみましょう。

[ ]
{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x683 at 0x7F9B0C201F90>,
, 'annotation': <PIL.PngImagePlugin.PngImageFile image mode=L size=512x683 at 0x7F9B0C201DD0>,
, 'scene_category': 368}
  • image: シーンの PIL イメージ。
  • annotation: セグメンテーション マップの PIL イメージ。モデルのターゲットでもあります。
  • scene_category: "kitchen"や"office"などの画像シーンを説明するカテゴリ ID。このガイドでは、imageannotationのみが必要になります。どちらも PIL イメージです。

また、ラベル ID をラベル クラスにマップする辞書を作成することもできます。これは、後でモデルを設定するときに役立ちます。ハブからマッピングをダウンロードし、id2label および label2id ディクショナリを作成します。

[ ]

Preprocess

次のステップでは、SegFormer 画像プロセッサをロードして、モデルの画像と注釈を準備します。このデータセットのような一部のデータセットは、バックグラウンド クラスとしてゼロインデックスを使用します。ただし、実際には背景クラスは 150 個のクラスに含まれていないため、do_reduce_labels=Trueを設定してすべてのラベルから 1 つを引く必要があります。ゼロインデックスは 255 に置き換えられるため、SegFormer の損失関数によって無視されます。

[ ]

モデルを過学習に対してより堅牢にするために、画像データセットにいくつかのデータ拡張を適用するのが一般的です。このガイドでは、torchvisionColorJitter 関数を使用します。 ) を使用して画像の色のプロパティをランダムに変更しますが、任意の画像ライブラリを使用することもできます。

[ ]

次に、モデルの画像と注釈を準備するための 2 つの前処理関数を作成します。これらの関数は、画像をpixel_valuesに変換し、注釈をlabelsに変換します。トレーニング セットの場合、画像を画像プロセッサに提供する前に jitter が適用されます。テスト セットの場合、テスト中にデータ拡張が適用されないため、画像プロセッサはimagesを切り取って正規化し、ラベルのみを切り取ります。

[ ]

データセット全体にjitterを適用するには、🤗 Datasets set_transform 関数を使用します。変換はオンザフライで適用されるため、高速で消費するディスク容量が少なくなります。

[ ]

Evaluate

トレーニング中にメトリクスを含めると、多くの場合、モデルのパフォーマンスを評価するのに役立ちます。 🤗 Evaluate ライブラリを使用して、評価メソッドをすばやくロードできます。このタスクでは、Mean Intersection over Union (IoU) メトリックをロードします (🤗 Evaluate クイック ツアー を参照して、メトリクスをロードして計算する方法の詳細を確認してください)。

[ ]

次に、メトリクスを compute する関数を作成します。予測を次のように変換する必要があります 最初にロジットを作成し、次に compute を呼び出す前にラベルのサイズに一致するように再形成します。

[ ]

これでcompute_metrics関数の準備が整いました。トレーニングをセットアップするときにこの関数に戻ります。

Train

Trainer を使用したモデルの微調整に慣れていない場合は、ここ の基本的なチュートリアルをご覧ください。

これでモデルのトレーニングを開始する準備が整いました。 AutoModelForSemanticSegmentation を使用して SegFormer をロードし、ラベル ID とラベル クラス間のマッピングをモデルに渡します。

[ ]

この時点で残っている手順は次の 3 つだけです。

  1. TrainingArguments でトレーニング ハイパーパラメータを定義します。 image 列が削除されるため、未使用の列を削除しないことが重要です。 image 列がないと、pixel_values を作成できません。この動作を防ぐには、remove_unused_columns=Falseを設定してください。他に必要なパラメータは、モデルの保存場所を指定する output_dir だけです。 push_to_hub=Trueを設定して、このモデルをハブにプッシュします (モデルをアップロードするには、Hugging Face にサインインする必要があります)。各エポックの終了時に、Trainer は IoU メトリックを評価し、トレーニング チェックポイントを保存します。
  2. トレーニング引数を、モデル、データセット、トークナイザー、データ照合器、および compute_metrics 関数とともに Trainer に渡します。
  3. train() を呼び出してモデルを微調整します。
[ ]

トレーニングが完了したら、 push_to_hub() メソッドを使用してモデルをハブに共有し、誰もがモデルを使用できるようにします。

[ ]

Inference

モデルを微調整したので、それを推論に使用できるようになりました。

推論のために画像をロードします。

[ ]
Image of bedroom

推論用に微調整されたモデルを試す最も簡単な方法は、それを pipeline() で使用することです。モデルを使用して画像セグメンテーション用の pipelineをインスタンス化し、それに画像を渡します。

[ ]
[{'score': None,
,  'label': 'wall',
,  'mask': <PIL.Image.Image image mode=L size=640x427 at 0x7FD5B2062690>},
, {'score': None,
,  'label': 'sky',
,  'mask': <PIL.Image.Image image mode=L size=640x427 at 0x7FD5B2062A50>},
, {'score': None,
,  'label': 'floor',
,  'mask': <PIL.Image.Image image mode=L size=640x427 at 0x7FD5B2062B50>},
, {'score': None,
,  'label': 'ceiling',
,  'mask': <PIL.Image.Image image mode=L size=640x427 at 0x7FD5B2062A10>},
, {'score': None,
,  'label': 'bed ',
,  'mask': <PIL.Image.Image image mode=L size=640x427 at 0x7FD5B2062E90>},
, {'score': None,
,  'label': 'windowpane',
,  'mask': <PIL.Image.Image image mode=L size=640x427 at 0x7FD5B2062390>},
, {'score': None,
,  'label': 'cabinet',
,  'mask': <PIL.Image.Image image mode=L size=640x427 at 0x7FD5B2062550>},
, {'score': None,
,  'label': 'chair',
,  'mask': <PIL.Image.Image image mode=L size=640x427 at 0x7FD5B2062D90>},
, {'score': None,
,  'label': 'armchair',
,  'mask': <PIL.Image.Image image mode=L size=640x427 at 0x7FD5B2062E10>}]

必要に応じて、pipelineの結果を手動で複製することもできます。画像を画像プロセッサで処理し、pixel_values を GPU に配置します。

[ ]

入力をモデルに渡し、logitsを返します。

[ ]

次に、ロジットを元の画像サイズに再スケールします。

[ ]

結果を視覚化するには、データセット カラー パレット を、それぞれをマップする ade_palette() としてロードします。クラスを RGB 値に変換します。次に、画像と予測されたセグメンテーション マップを組み合わせてプロットできます。

[ ]
Image of bedroom overlaid with segmentation map