高解像度のリモートセンシング画像のセグメント化と効果の比較のためにあらゆるものをセグメント化します

1. SAM モデルの概要

  1. SAM と呼ばれる Segment Anything Model は、4 月初めに Meta によってリリースされた史上初の基本的な画像セグメンテーション モデルです。これは、タスク、モデル、データという 3 つの相互に関連する要素を組み合わせて形成される大規模なモデルです。
    ここに画像の説明を挿入します
    タスクの構成は下図の通りで、マーク点、規則/不規則フレーム境界、入力単語などのセグメンテーションプロンプトや絵を入力することで、モデル演算によりマスクSAMが生成されます。「Cat」と入力すると、モデルが猫を認識してマスクを生成します。

モデルの主な操作は単語と画像であり、そのアーキテクチャを次の図に示します。
ここに画像の説明を挿入します

最後のデータはモデル トレーニングの入力として使用され、モデルの最適化を達成するためにトレーニング プロセス中にデータに注釈が付けられます。SAM による Data の説明は次のとおりです。
ここに画像の説明を挿入します

2.モデルの使用

  1. 設定
import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2

# 用来显示掩膜
def show_anns(anns):
    if len(anns) == 0:
        return
    sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True)
    ax = plt.gca()
    ax.set_autoscale_on(False)

    img = np.ones((sorted_anns[0]['segmentation'].shape[0], sorted_anns[0]['segmentation'].shape[1], 4))
    img[:,:,3] = 0
    for ann in sorted_anns:
        m = ann['segmentation']
        color_mask = np.concatenate([np.random.random(3), [0.65]])
        img[m] = color_mask
    ax.imshow(img)
  1. サンプル画像画像のインポート
image = cv2.imread('images/lzu.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
  1. 自動マスク生成自動マスク生成
import sys
sys.path.append("..")
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictor

sam_checkpoint = "sam_vit_b_01ec64.pth" # 模型
model_type = "vit_b"

device = "cuda" # 使用GPU

sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)

mask_generator = SamAutomaticMaskGenerator(sam)

注:SamAutomaticMaskGeneratorジェネレーターには、サンプリング密度を制御したり、低品質のマスクや重複したマスクを削除したり、パフォーマンスを向上させるためにクロップした後、小さなオブジェクトに対してジェネレーターを実行するように設定したり、浮遊ピクセルを除去するための後処理を行うために使用できる調整可能なパラメーターがいくつかあります。 、発生した穴など。SamAutomaticMaskGeneratorパラメータ設定は次のとおりです。

# SamAutomaticMaskGenerator 参数输入
mask_generator_2 = SamAutomaticMaskGenerator(
    model=sam,
    points_per_side=32,
    pred_iou_thresh=0.86,
    stability_score_thresh=0.92,
    crop_n_layers=1,
    crop_n_points_downscale_factor=2,
    min_mask_region_area=100,  # Requires open-cv to run post-processing
)
  1. メソッドを呼び出してgenerateマスクを生成します。ここで、カスタム パラメーターを含むジェネレーターを使用する場合はmask_generator_2 masks = mask_generator_2.generate(image)マスクを生成するためにそれを置き換えます。
masks = mask_generator.generate(image)
  1. イメージの表示 (セグメンテーション イメージとマスクを含む)
plt.figure(figsize=(20,20))
plt.imshow(image)
show_anns(masks2)
plt.axis('off')
plt.show() 

3. 結果の比較

1. 都市の複雑な画像セグメンテーション: 目標は建物の抽出です

図 1. デフォルトのパラメーター セグメンテーションの結果 (mask_generatorジェネレーター)デフォルトのパラメータのセグメンテーション結果
図 2. カスタム パラメーターのセグメンテーションの結果 (mask_generator_2ジェネレーター)
ここに画像の説明を挿入します

2. シンプルなカテゴリによる高解像度リモートセンシング画像のセグメント化: 目標は水の抽出です

図1. デフォルトパラメータによるセグメンテーション結果 (mask_generatorジェネレータ)
ここに画像の説明を挿入します

図2. カスタマイズされたパラメーターのセグメンテーションの結果 (mask_generator_2ジェネレーター)
ここに画像の説明を挿入します

3. 結論

(1) 複雑な都市画像の場合
: デフォルト パラメータでは建物の認識が失われる可能性があり、カスタム パラメータ認識の整合性は比較的高い; (2) 単純な内容の画像の場合: デフォルト パラメータまたはカスタム パラメータを使用
する結果には大きな違いはありません;
(3) スキーム 1 とスキーム 2 を比較すると、モデルによる複雑な画像 (都市など) のセグメンテーションの精度は、単純な画像ほど高くないことがわかります; (4) ) つまり、
このモデルは自動セグメンテーションに使用でき、その後人工セグメンテーションの結果が処理されます。一方では、画像の分割と認識の効率を向上させることができ、他方では、手動デジタル化と比較して精度を向上させることができます; (5)
SAM の公式例から判断すると、公式例で使用されているデータセットは次のとおりです。これも比較的複雑ですが、セグメンテーションの効果はあまり良くありません。私たちの実験と公式の例の違いは、公式の実験ではすべて写真が撮影されているのに対し、この例では高解像度のリモート画像を使用していることです。例 1 と例 2 の結果を組み合わせると、これはこれら 2 つの画像のピクセルの問題に関連している可能性があるため、セグメンテーション効果は公式の例ほど良くないと推測されます。後で、リモート センシング画像のセグメンテーション効果と写真の効果を比較してみることができます。

おすすめ

転載: blog.csdn.net/qq_29517595/article/details/131188625