ウェブサイト検索

パノプティック セグメンテーション: セマンティック セグメンテーションとインスタンス セグメンテーションの統合


導入

コンピューター ビジョンにおけるシーンの理解の探求は、多くのセグメンテーション タスクにつながりました。パノプティック セグメンテーションは、セマンティック セグメンテーションとインスタンス セグメンテーションを 1 つのフレームワークに組み合わせた新しいアプローチです。

この技術は、同じオブジェクト クラスに属する個別のインスタンスを区別しながら、画像内でキャプチャされた各ピクセルを識別します。この記事では、パノプティック セグメンテーション、アプリケーション、課題について詳しく説明します。

前提条件

パノプティック セグメンテーションを理解するには、次のことを理解してください。

  • セマンティック セグメンテーション - 画像内のすべてのピクセル (背景、道路、空など) にクラス ラベルを割り当てます。
  • インスタンスのセグメント化 - 各オブジェクト インスタンス (個々の車、人など) を識別してセグメント化します。

パノプティックセグメンテーション

パノプティック セグメンテーションは、最近のコンピューター ビジョンにおける非常に興味深い問題です。 目的は、画像をセマンティック領域とインスタンス領域の 2 つのタイプに分割することです。セマンティック領域は、人や車などの特定のオブジェクト クラスに属する画像の部分です。インスタンスのリージョンは、個々の人や車両のようなものです。

「人」や「車」などの特定のカテゴリに属するものとしてピクセルにラベルを付ける従来のセマンティック セグメンテーションとは異なり、パノプティック セグメンテーションはさらに深くなります。ピクセルにそのクラスのラベルを付け、画像内の個々のインスタンスを区別します。このアプローチは、単一の出力でより多くの情報を提供し、従来の方法よりもシーンをより詳細に理解することを目的としています。

タスク形式の説明

「stuff」の下のラベルは、空、道路、草などの境界や数えられる特徴のない連続した領域です。これらの領域は、広範囲の背景領域をセグメント化するのに適した完全畳み込みネットワーク (FCN) を使用してセグメント化されます。人、車、動物などの認識可能な特徴を持つ個別のオブジェクトの分類は、「物」というラベルに分類されます。 」

これらのオブジェクトは、個々のインスタンスを識別して分離できるインスタンス セグメンテーション ネットワークを使用してセグメント化されます。各オブジェクトに一意の ID を割り当てることもできます。これは二重ラベル付け方法を使用して、マップ内のすべてのオブジェクトが意味情報と正確なインスタンスの描写を確実に持つようにします。

パノプティック品質 (PQ) メトリックの概要

評価指標における最新のイノベーションは、パノプティック クオリティ (PQ) です。これは、従来のセグメンテーション評価方法の問題を解決するために構築されました。 PQ はパノプティック セグメンテーション用であり、画像内の各ピクセルにクラス ラベルとインスタンス ID を割り当てることでセマンティック セグメンテーションとインスタンス セグメンテーションを組み合わせます。

セグメントマッチングプロセス

PQ メトリック計算の最初のステップは、セグメント マッチング プロセスを実行することです。これには、Intersection over Union (IoU) 値に基づいて、予測されたセグメントをグラウンド トゥルース セグメントと照合することが含まれます。

Intersection over Union (IoU) 値 (予測セグメントとグランド トゥルース セグメント間の重複を測定する比率) が、一般的に 0.5 に設定されている事前定義されたしきい値を超えた場合、一致が発生したとみなされます。これは数学用語で次のように表現できます。

PQ メトリクスの IoU ベースのセグメント マッチング

前述のしきい値により、実質的な重複を示すセグメントのみが実行可能な一致とみなされます。その結果、誤検知や誤検知を軽減しながら、正しくセグメント化された領域を正確に識別できます。

PQ計算

セグメントのマッチングが成功すると、セグメンテーション品質 (SQ) と認識品質 (RQ) の評価を通じて PQ メトリックの計算が行われます。

セグメンテーション品質 (SQ) メトリクスは、一致セグメントの平均交差オーバーユニオン (IoU) を評価します。これは、予測されたセグメントがグラウンド トゥルースとどの程度重なり合っているかを示します。

セグメンテーションの品質

認識品質 (RQ) は、一致したセグメントの F1 スコアを測定し、精度と再現率のバランスをとります。

認識品質

ここで、TP は真陽性、FP は偽陽性、FN は偽陰性を表します。 PQ メトリックは、次の 2 つのコンポーネントの積として計算されます。

PQメトリクスの構成要素(画像ソース)

上記の式は、PQ メトリックのコンポーネントをカプセル化しています。以下の図で、PQ を計算するプロセスを視覚化できます。

PQ メトリクスの計算プロセスの可視化

既存の指標と比較した利点

PQ メトリクスには、セグメンテーション タスクの評価に利用される既存のメトリクスに比べて、いくつかの利点があります。 和集合に対する平均積分数 (mIoU) や平均精度 (AP) などの従来のメトリクスは、セマンティック セグメンテーションまたは個別のインスタンス セグメンテーションのみに焦点を当てています。 、しかし両方ではありません。

PQ メトリクスは、パノプティック セグメンテーション モデルのパフォーマンスを評価する統合された評価フレームワークを示します。このアプローチは、シーンを徹底的に理解することが不可欠なアプリケーションに特に有利であることがわかります。例としては、自動運転やロボット工学などが挙げられます。このようなシナリオでは、オブジェクトの分類と個々のインスタンスの識別が極めて重要な意味を持ちます。

パノプティックセグメンテーションにおけるマシンパフォーマンス

最先端のパノプティック セグメンテーション手法は、ヒューリスティック マージ プロセスを通じて、最新のインスタンスとセマンティック セグメンテーション手法を組み合わせます。

この方法は、最新の技術を使用してモノものについて個別の重複しない予測を生成することから始まります。これらは次に結合されて、画像のパノラマ セグメンテーションが得られます。

モノモノの予測の間に矛盾がある場合、ヒューリスティックなアプローチはモノクラスを優先します。この結果、モノクラス (PQTh) では一貫したパフォーマンスが得られますが、モノ クラス (PQSt) ではパフォーマンスがわずかに低下します。

さまざまなデータセットにわたって、マシンのパフォーマンスと人間の一貫性を比較すると、顕著な差異が見られます。 Cityscapes、ADE20k、および Mapillary Vista では、人間は機械に比べて優れた結果をもたらします。

このギャップは、F1 スコアの精度を測定する認識品質 (RQ) 指標で特に顕著です。 ADE20k データセットでは、人間の RQ は 78.6%、マシンの RQ は約 43.2% になります。

一致するセグメントの平均 IoU を測定するセグメンテーション品質 (SQ) メトリクスは、人間とマシンの間のギャップが小さいことを示しています。 マシンのセグメンテーションは向上していますが、オブジェクトや領域を認識して分類するのは困難です。

上の表は、さまざまなデータセットと指標における人間とマシンのパフォーマンスを示しています。この調査結果は、マシンのパノプティック セグメンテーション アルゴリズムにとって改善が不可欠な重要な領域を強調しています。

DETR を使用したパノプティック セグメンテーション

DETR のパノプティック セグメンテーション機能を探索する方法を示します。予測はいくつかのステップで行われます。

必要なパッケージのインストールと必要なライブラリのインポート

以下のコードは、コンピューター ビジョンや画像処理タスクで一般的に使用される Python のインポートと構成のセットです。

from PIL import Image
import requests
import io
import math
import matplotlib.pyplot as plt
%config InlineBackend.figure_format = 'retina'

import torch
from torch import nn
from torchvision.models import resnet50
import torchvision.transforms as T
import numpy
torch.set_grad_enabled(False);

COCO 2018 パノプティック セグメンテーション タスク API をインストールする

次のコマンドは、COCO 2018 Panoptic Segmentation Task API をインストールします。この API は、大規模なオブジェクト検出、セグメンテーション、およびキャプション データセットである COCO データセットを操作するために使用されます。

pip install git+https://github.com/cocodataset/panopticapi.git

COCO 2018 Panoptic Segmentation Task API とそのユーティリティ関数をインポートする

以下のコードは、COCO 2018 Panoptic Segmentation Task API とそのユーティリティ関数 id2rgb および rgb2id をインポートします。

id2rgb は、各ピクセルの ID 番号を使用するパノプティック セグメンテーション マップを取得し、それを RGB イメージに変換します。入力は、クラス ID を表す整数の 2D 配列です。出力は整数の 3D 配列で、各整数は対応するピクセルの RGB カラーです。各ピクセルがどのオブジェクトまたはクラスを表すかを示すマップから、実際の色が表示される画像に変換します。

rgb2id 関数は、パノプティック セグメンテーション マップを RGB 表現から ID 表現に変換します。

import panopticapi
from panopticapi.utils import id2rgb, rgb2id

COCO データセットと API を使用するための開始点

以下のコードでは、CLASSES リストに COCO データセット内のさまざまなオブジェクトの名前がすべて含まれています。 coco2d2 ディクショナリは、COCO データセット内のクラス ID を、Detectron2 ライブラリで使用される別の番号付けスキームに変換します。 変換は、モデルに入力する前に画像を準備する PyTorch ライブラリです。サイズを 800x800 に変更し、テンソル変数に変換し、ImageNet データセットの平均と標準偏差を使用してピクセル値を正規化します。

# These are the COCO classes
CLASSES = [
    'N/A', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',
    'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'N/A',
    'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse',
    'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'N/A', 'backpack',
    'umbrella', 'N/A', 'N/A', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis',
    'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove',
    'skateboard', 'surfboard', 'tennis racket', 'bottle', 'N/A', 'wine glass',
    'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich',
    'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake',
    'chair', 'couch', 'potted plant', 'bed', 'N/A', 'dining table', 'N/A',
    'N/A', 'toilet', 'N/A', 'tv', 'laptop', 'mouse', 'remote', 'keyboard',
    'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'N/A',
    'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier',
    'toothbrush'
]
Detectron2 uses a different numbering scheme, we build a conversion table
coco2d2 = {}
count = 0
for i, c in enumerate(CLASSES):
  if c != "N/A":
    coco2d2[i] = count
    count+=1
standard PyTorch mean-std input image normalization
transform = T.Compose([
    T.Resize(800),
    T.ToTensor(),
    T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

パノプティックセグメンテーション用の DETR モデルのロード

以下のコードは、PyTorch Hub API を使用して Facebook Research GitHub リポジトリからパノプティック セグメンテーション用の DETR モデルを読み込みます。コードの概要は次のとおりです。

model, postprocessor = torch.hub.load('facebookresearch/detr', 'detr_resnet101_panoptic', pretrained=True, return_postprocessor=True, num_classes=250)
model.eval();

注: ここで使用されている画像はそのソースから取得したものです

画像をダウンロードして開きます

以下のコードは、Pillow ライブラリを使用して COCO データセットから画像をダウンロードして開きます。

url = "http://images.cocodataset.org/val2017/000000281759.jpg"
im = Image.open(requests.get(url, stream=True).raw)
  • requests.get() 関数は、HTTP GET リクエストを URL に送信し、画像データを取得します。 stream=True 引数は、応答を同時にダウンロードするのではなくストリーミングすることを指定します。
  • 応答オブジェクトの raw 属性は、生の画像データにアクセスするために使用されます。
  • Pillow ライブラリの Image.open() 関数は、生の画像データを開いて新しい Image オブジェクトを作成するために使用されます。 Image オブジェクトは、さまざまな画像処理および操作タスクを実行できます。

予測を実行する

コード img =transform(im).unsqueeze(0) は、PyTorch 変換を使用して画像を前処理し、テンソルに変換するために使用されます。 im 変数には、画像データが Pillow Image オブジェクトとして含まれています。

# mean-std normalize the input image (batch-size: 1)
img = transform(im).unsqueeze(0)
out = model(img)

予測されたセグメンテーション マスクをプロットする

次のコードは、パノプティック セグメンテーションの DETR モデルを使用して、画像内で検出されたオブジェクトの予測セグメンテーション マスクのプロットに関連しています。コードの概要は次のとおりです。

# compute the scores, excluding the "no-object" class (the last one)
scores = out["pred_logits"].softmax(-1)[..., :-1].max(-1)[0]threshold the confidence
keep = scores > 0.85
Plot all the remaining masks
ncols = 5
fig, axs = plt.subplots(ncols=ncols, nrows=math.ceil(keep.sum().item() / ncols), figsize=(18, 10))
for line in axs:
    for a in line:
        a.axis('off')
for i, mask in enumerate(out["pred_masks"][keep]):
    ax = axs[i // ncols, i % ncols]
    ax.imshow(mask, cmap="cividis")
    ax.axis('off')
fig.tight_layout()

このコードは、まず、オブジェクトなしカテゴリを含まない、予測マスクのスコアを計算します。次に、スコアが 0.85 より高いマスクのみの信頼性を維持するためのしきい値を設定します。残りのマスクは 5 列のグリッドにプロットされ、行数はしきい値を満たしたマスクの数に基づいて計算されます。渡される out 変数は、予測されたマスクとロジット値を含む辞書であると想定されます。

DETR のポストプロセッサ

# the post-processor expects as input the target size of the predictions (which we set here to the image size)
result = postprocessor(out, torch.as_tensor(img.shape[-2:]).unsqueeze(0))[0]

上記のコードは出力を取り出してポストプロセッサーで実行し、結果を生成します。画像サイズをポストプロセッサ関数に渡します。この関数は、意図した予測サイズを入力として受け取り、処理された出力を吐き出します。 result 変数には、入力画像に適用されたポストプロセッサの処理された出力が含まれます。

視覚化

以下のコードは、itertools ライブラリと seaborn ライブラリをインポートし、itertools.cycle と seaborn.color_palette()。次に、特殊形式の PNG ファイルを開いて、各マスクに対応する ID を取得します。最後に、カラー パレットを使用して各マスクを個別に色付けし、matplotlib を使用して結果のイメージを表示します。結果を簡単に視覚化できます

import itertools
import seaborn as sns
palette = itertools.cycle(sns.color_palette())
The segmentation is stored in a special-format png
panoptic_seg = Image.open(io.BytesIO(result['png_string']))
panoptic_seg = numpy.array(panoptic_seg, dtype=numpy.uint8).copy()We retrieve the ids corresponding to each mask
panoptic_seg_id = rgb2id(panoptic_seg)
Finally we color each mask individually
panoptic_seg[:, :, :] = 0
for id in range(panoptic_seg_id.max() + 1):
  panoptic_seg[panoptic_seg_id == id] = numpy.asarray(next(palette)) * 255
plt.figure(figsize=(15,15))
plt.imshow(panoptic_seg)
plt.axis('off')
plt.show()

出力:

Detectron2 によるパノプティック セグメンテーション

このセクションでは、Detectron2 のプロット ユーティリティを活用して、より見栄えの良いビジュアライゼーションを取得する方法を説明します。

ライブラリのインポート

以下のコードは、GitHub リポジトリから detectron2 をインストールします。検出結果の効率的な視覚化を容易にするために、detectron2utils モジュールの Visualizer クラスがインポートされます。データセットに関連するメタデータにアクセスするために、detectron2 のデータ モジュールからの MetadataCatalog がインポートされます。

# Install detectron2
pip install 'git+https://github.com/facebookresearch/detectron2.git'
from copy import deepcopy
import io
import numpy as np
import torch
from PIL import Image
import matplotlib.pyplot as plt
from detectron2.data import MetadataCatalog
from detectron2.utils.visualizer import Visualizer

DETR と Detectron2 を使用したパノプティック セグメンテーション予測の視覚化

このコードは、DETR の予測からセグメンテーション データを抽出して処理し、detectron2 と一致するようにクラス ID を調整します。 rgb2id 関数を定義し、セグメント情報をコピーし、PNG 画像からパノラマ結果を読み取り、numpy とそれを使用してそれを ID マップに変換します。 トーチ。次に、クラス ID は、detectron2 のビジュアライザーを使用して結果を視覚化する前に、detectron2 の COCO 形式に合わせて変換されます。

# Define the rgb2id function
def rgb2id(color):
    if isinstance(color, np.ndarray) and len(color.shape) == 3:
        color = color.astype(np.int32)
        return color[:, :, 0] + 256 * color[:, :, 1] + 256 * 256 * color[:, :, 2]
    return color
We extract the segments info and the panoptic result from DETR's prediction
segments_info = deepcopy(result["segments_info"])Panoptic predictions are stored in a special format png
panoptic_seg = Image.open(io.BytesIO(result['png_string']))
final_w, final_h = panoptic_seg.sizeWe convert the png into a segment id map
panoptic_seg = np.array(panoptic_seg, dtype=np.uint8)
panoptic_seg = torch.from_numpy(rgb2id(panoptic_seg))
Detectron2 uses a different numbering of coco classes, here we convert the class ids accordingly
meta = MetadataCatalog.get("coco_2017_val_panoptic_separated")
for i in range(len(segments_info)):
    c = segments_info[i]["category_id"]
    segments_info[i]["category_id"] = meta.thing_dataset_id_to_contiguous_id[c] if segments_info[i]["isthing"] else meta.stuff_dataset_id_to_contiguous_id[c]
Finally we visualize the prediction
v = Visualizer(np.array(im.copy().resize((final_w, final_h)))[:, :, ::-1], meta, scale=1.0)
v._default_font_size = 20
v = v.draw_panoptic_seg_predictions(panoptic_seg, segments_info, area_threshold=0)
Display the image using matplotlib
result_img = v.get_image()
plt.figure(figsize=(12, 8))
plt.imshow(result_img)
plt.axis('off')  # Turn off axis
plt.show()

出力:

結論

パノプティック セグメンテーションは、セマンティック セグメンテーションとインスタンス セグメンテーションを統合されたフレームワークの下で統合することにより、コンピュータ ビジョンの分野で顕著な進歩を遂げました。このアプローチにより、ピクセルのラベル付けと、類似したオブジェクト クラスのさまざまなインスタンス間の区別を通じて、シーンを広範囲に理解することができます。

パノプティック品質 (PQ) メトリクスは、改善すべき領域を特定しながら、パノプティック モデルの有効性を評価するのに役立ちます。進歩は見られますが、機械のパフォーマンスは人間の一貫性に比べれば不十分です。 DETR と Detectron2 の統合により、自動運転やロボット工学アプリケーションに向けてさらなる開発をどのように活用できるかが浮き彫りになります。

参考文献

  • DETR Github
  • パノプティックセグメンテーションの研究論文