ハードウェア: RTX3070 i9-11900H メモリ 16G
目次
2. テスト --predictor_example.ipynb を使用します。
2.SAM と環境セットアップによるプロンプトからのオブジェクト マスク
3. テスト --automatic_mask_generator_example.ipynb を使用します。
1. 環境構築
まず公式 github からダウンロードし、公式 github URL のディレクトリに解凍します。
GitHub - facebookresearch/segment-anything https://github.com/facebookresearch/segment-anything以下の環境構成:
1. Conda は仮想環境を作成します。Python バージョンは 3.8 以上であることに注意してください (公式要件は Python>=3.8 です)。
conda create -n segment python=3.8 -y
2. 作成したばかりの仮想環境をアクティブ化し、pytorch をインストールし、公式の要件に注意しますpytorch>=1.7
torchvision>=0.8。
conda activate segment
pip install torch==1.10.1+cu113 torchvision==0.11.2+cu113 torchaudio==0.10.1+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
3. この記事では、pycharm IDE でデバッグし、解凍ディレクトリで pycharm を開いて先ほど構成した環境を構成し、その後の環境構成を実行します。
pycharm は conda 仮想環境を呼び出します
後続のインストールのために pycharm ターミナルを入力します
pip install -e .
公式はインストールライブラリの詳細なバージョンを提供していません。公式の指示に従って実行してください
pip install opencv-python pycocotools matplotlib onnxruntime onnx
この時点で、環境設定は完了します。その後の課題は、環境に不足しているライブラリを補完するか、プログラムのエラー レポートを通じてライブラリのバージョンを調整することです。
2. テスト --predictor_example.ipynb を使用します。
1. Jupyter Notebookの準備作業
公式のテストプロセスはjupyter Notebookで提供されており、まずターミナルを起動して仮想環境に入ります。
conda activate segment
公式の jupyter ノートブックのディレクトリを入力し、xxx を実際のディレクトリに合わせて cd で調整します
cd xxx:\xxx\segment-anything-main\segment-anything-main\notebooks
注: jupyter Notebook の仮想環境を呼び出す方法はインターネット上にたくさんあります。ライブラリを仮想環境にインストールするのが最善だと思います。インストールが間違っている場合は、フォールト トレランスを残して仮想環境を直接削除できます。 conda ベース環境をシンプルに保ち、conda ベース環境に冗長なライブラリをインストールしないようにし、conda ベース環境は仮想環境を作成するためのベース環境としてのみ使用します。
仮想環境に ipykernel をインストールします インストールされていない場合、端末が仮想環境を起動していても、jupyter Notebook は作成したばかりの仮想環境を認識できません。
pip install ipykernel
作成した仮想環境をjupyter Notebookに書き込む
レンプレート:
python -m ipykernel install --user --name 虚拟环境名 --display-name "显示名"
実際の操作:
python -m ipykernel install --user --name segment --display-name "segment"
jupyter Notebookを起動します。起動後はターミナルを閉じないでください。
jupyter notebook
この図では、セグメント仮想環境が見つかり、jupyter Notebook 認識環境の構成は成功しましたが、仮想環境を構成する必要があることを示しています。
仮想環境名は図の右側に表示されます。
公式の jupyter ノートブックに詳細が記載されています。最初のノートは、predictor_example です。
次に、タイトルに従って公式の例を参照してください
2.SAM と環境セットアップによるプロンプトからのオブジェクト マスク
Google colab 上で実行される操作については、ローカルで実行されるため、これらの操作は必要ありません。
3.セットアップ
ライブラリを呼び出して、マスク、点、および四角形のプロット関数を定義します。
4.サンプル画像
サンプル画像として、Opencv で読み込んで表示します。
5.SAMによるオブジェクトの選択
検出テストを複数のステップに分けて行う
(1) 学習済みネットワークモデルをダウンロードし、プロジェクトのモデルフォルダーに置き、プログラム内のパスを変更します
パスを変更してエスケープ文字を追加します。H ラージ モデルを使用するためにモデル タイプを変更する必要はありません。
sam_checkpoint = "D:\\segment-anything-main\\segment-anything-main\\model\\sam_vit_h_4b8939.pth"
model_type = "vit_h"
(2)官方:まず、SAMモデルと予測子を読み込みます。SAM チェックポイントを指すように以下のパスを変更します。最良の結果を得るには、CUDA 上で実行し、デフォルトのモデルを使用することをお勧めします。
翻訳: まず、SAM モデルと予測子をロードします。SAM チェックポイントを指すように以下のパスを変更します。最良の結果を得るには、CUDA で実行し、デフォルトのモデルを使用することをお勧めします。
ステップ(1)が完了しました。
(3)官方: を呼び出して画像を処理して画像埋め込みを生成します SamPredictor.set_image
。 SamPredictor
はこの埋め込みを記憶し、後続のマスク予測に使用します。
翻訳: SamPredictor.set_image を呼び出して、画像を処理して画像埋め込みを生成します。SamPredictor はこの埋め込みを記憶し、後続のマスク予測に使用します。
「イメージの例」ステップで導入されたイメージは、segment_anything/predictor.py の SamPredictor クラスを呼び出します。
opencvで読み込んだ画像を受け取るset_image関数。
(4)官方:トラックを選択するには、トラック上の点を選択します。点は (x,y) 形式でモデルに入力され、1 (前景点) または 0 (背景点) のラベルが付いています。複数の点を入力できます。ここでは 1 つだけを使用します。選択した点は画像上に星として表示されます。
翻訳: トラックを選択するには、トラック上の点を選択します。点は (x,y) 形式でモデルに入力され、ラベル 1 (前景点) または 0 (背景点) が付けられます。複数のポイントを入力できますが、ここでは 1 つだけを使用します。選択した点が画像上に星として表示されます。
この文から、プロンプト ポイントを指定する必要があることがわかります。プロンプト ポイントは、画像座標系の座標を使用し、左上隅がゼロ点であり、この点が前景であるか背景であるかがわかります。プログラムで与えられるものは次のとおりです。
input_point = np.array([[500, 375]])
input_label = np.array([1])
プログラムは結果も表示し、元のイメージにポイントを追加します。描画関数はセットアップ ステップで指定されます。
plt.imshow(image)
show_points(input_point, input_label, plt.gca())
(5)官方: で予想します SamPredictor.predict
。モデルは、マスク、それらのマスクの品質予測、および予測の次の反復に渡すことができる低解像度マスク ロジットを返します。
翻訳: SamPredictor.predictor を使用して予測を行います。モデルは、マスク、それらのマスクの品質予測、および次の予測反復に渡すことができる低解像度のマスク ログを返します。
予測セクションを入力します。
masks, scores, logits = predictor.predict(
point_coords=input_point,
point_labels=input_label,
multimask_output=True,
)
予測されたイメージは、predictor.set_image(image) を介して予測子に配置され、次に、predictor.predict() を介してキュー ポイントとポイント ラベルに配置されます。
その中multimask_output官方给出解释: multimask_output=True
(デフォルト設定) では、SAM は 3 つのマスクを出力します。ここで、 scores
これらのマスクの品質についてのモデル独自の推定が得られます。この設定は、あいまいな入力プロンプトを対象としており、モデルがプロンプトと一致するさまざまなオブジェクトを明確にするのに役立ちます。の場合 False
、単一のマスクが返されます。multimask_output=True
単一点などのあいまいなプロンプトの場合は、単一のマスクのみが必要な場合でも使用することをお勧めします 。で返された最高スコアを持つマスクを選択することで、最適な単一マスクを選択できます scores
。多くの場合、これによりより優れたマスクが得られます。
翻訳: multimask_output=True (デフォルト設定) の場合、SAM は 3 つのマスクを出力します。スコアはこれらのマスクの品質に関するモデル独自の推定値を示します。この設定は、曖昧な入力プロンプトに適しており、モデルがプロンプトと一致するさまざまなオブジェクトを明確にするのに役立ちます。False の場合、マスクを返します。単一ポイントなどのあいまいなキューの場合は、必要なマスクが 1 つだけの場合でも multimask_output=True を使用することをお勧めします。最も高いスコアを持つマスクを選択することで、最適な単一マスクを選択できます。通常、これによりより優れたマスクが生成されます。
masks.shape # (number_of_masks) x H x W
(3, 1200, 1800)
出力マスク、高さ 1200、幅 1800 の 3 つのマスク。これらのマスクを使用するために、公式は次のように与えています。
for i, (mask, score) in enumerate(zip(masks, scores)):
plt.figure(figsize=(10,10))
plt.imshow(image)
show_mask(mask, plt.gca())
show_points(input_point, input_label, plt.gca())
plt.title(f"Mask {i+1}, Score: {score:.3f}", fontsize=18)
plt.axis('on')
plt.show()
マスクの表示を実現するにはどうすればよいですか? show_mask() 関数のマスク_イメージ = マスク.reshape(h, w, 1) * color.reshape(1, 1, -1) を参照してください。具体的には、コード内の reshape 関数は、マスク配列を形状 ( A h、w、1 の 3 次元配列)。3 番目の次元のサイズは 1 で、マスク値を表します。次に、カラー配列を (1, 1, N) の形状を持つ 3 次元配列に変換します。最初の 2 次元のサイズは 1、3 次元のサイズは N で、カラー値を表します。最後に、2 つの 3 次元配列を要素ごとに乗算して、形状 (h、w、N) の 3 次元配列マスクイメージを取得します。ここで、行 i と列 j の要素は行内のピクセルの色を表します。 i と列 j の値。対応するマスク値が N の場合、ピクセルの N。この操作は、画像にマスクを適用して画像にマスキング効果を与えるためによく使用されます。
公式オリジナルの結果:
試み 1: マスクの表示を理解して、二値化を実現するようにマスクを変更しました。
show_maskをshow_mask1に変更し、マスク関数を表示して色を変更し、すべての白の透明度を1に変更します。
def show_mask1(mask, ax, random_color=False):
if random_color:
color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
else:
# color = np.array([30/255, 144/255, 255/255, 0.6])
color = np.array([255/255, 255/255, 255/255, 1])
h, w = mask.shape[-2:]
mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
ax.imshow(mask_image)
背景は黒に設定されています。
for i, (mask, score) in enumerate(zip(masks, scores)):
plt.figure(figsize=(10,10))
image1 = np.zeros((1200, 1800), dtype=np.int8)
plt.imshow(image1,cmap="gray")
show_mask1(mask, plt.gca())
show_points(input_point, input_label, plt.gca())
plt.title(f"Mask {i+1}, Score: {score:.3f}", fontsize=18)
plt.axis('on')
plt.show()
二値化結果。
試み 2: 公式結果に従って最大スコア マスクを返します。
plt.figure(figsize=(10,10))
plt.imshow(image)
show_mask(masks[np.argmax(scores)], plt.gca())
show_points(input_point, input_label, plt.gca())
plt.title(f"Best Mask Score: {scores[np.argmax(scores)]:.3f}", fontsize=18)
plt.axis('on')
plt.show()
6.追加点による特定のオブジェクトの指定
接続点を使用して特定のオブジェクトを指定する
官方: 単一の入力点があいまいで、モデルはそれと一致する複数のオブジェクトを返しました。単一のオブジェクトを取得するために、複数のポイントを指定できます。利用可能な場合は、予測を支援するために、前の反復のマスクをモデルに提供することもできます。複数のプロンプトで単一のオブジェクトを指定する場合、「multimask_output=False」を設定することで単一のマスクを要求できます。
翻訳: 単一の入力ポイントがあいまいで、モデルはそれと一致する複数のオブジェクトを返しました。単一のオブジェクトを取得するために、複数のポイントを指定できます。利用可能な場合は、以前の反復のマスクをモデルに供給して、予測を支援することもできます。複数のヒントを持つ単一のオブジェクトを指定する場合、「multimask_output=False」を設定することで単一のマスクを要求できます。
公式は 2 つの方法を示しています。1 つは 2 つの点のラベルをすべて前景 1 にする方法、もう 1 つは 1 つの点を前景 1、もう 1 つの点を背景 0 とする方法です。ここで、プロンプト点のラベルには意味があります。
すべて前景 1
1 つは、1 つのポイント ラベルが前景 1 で、1 つのポイント ラベルが背景 0 であることです。
7.ボックスで特定のオブジェクトを指定する
ボックスを使用して特定のオブジェクトを指定する
この記事では長方形のボックスの表現をテストします
input_box = np.array([425, 600, 700, 875])
4つの値は長方形の枠の左上隅と右下隅の座標(x,y)を表しており、show_points()関数を呼び出すと点が表示されることが直感的に証明されています。
plt.figure(figsize=(10, 10))
plt.imshow(image)
show_mask(masks[0], plt.gca())
show_box(input_box, plt.gca())
input_point1 = np.array([[425, 600]])
input_label1 = np.array([1])
input_point2 = np.array([[700, 875]])
input_label2 = np.array([1])
show_points(input_point1, input_label2, plt.gca())
show_points(input_point2, input_label2, plt.gca())
plt.axis('on')
plt.show()
8.ポイントとボックスの組み合わせ
ドットとボックスを組み合わせる
プロンプト長方形ボックスに基づいてプロンプト ポイントを追加し、背景 0 というラベルの付いたプロンプト ポイントを車のホイール ハブに正式に追加します。
input_box = np.array([425, 600, 700, 875])
input_point = np.array([[575, 750]])
input_label = np.array([0])
テストのためにフォアグラウンド 1 に変更しました
input_box = np.array([425, 600, 700, 875])
input_point = np.array([[575, 750]])
input_label = np.array([1])
9.バッチプロンプト入力
バッチ入力プロンプト
官方:SamPredictor は、メソッドを使用して、同じ画像に対して複数の入力プロンプトを取得できます predict_torch
。このメソッドは、入力ポイントがすでにトーチ テンソルであり、入力フレームにすでに変換されていることを前提としています。たとえば、物体検出器からのボックス出力がいくつかあると想像してください。
翻訳: SamPredictor は、predict_torch メソッドを使用して、同じ画像に対する複数の入力ヒントを取得できます。このメソッドは、入力ポイントがすでにテンソルであり、入力フレームに変換されていることを前提としています。たとえば、オブジェクト検出器からのボックス出力がいくつかあるとします。
input_boxes = torch.tensor([
[75, 275, 1725, 850],
[425, 600, 700, 875],
[1375, 550, 1650, 800],
[1240, 675, 1400, 750],
], device=predictor.device)
官方:ボックスを入力フレームに変換してから、マスクを予測します。 SamPredictor
は、簡単にアクセスできるように必要な変換を transform
フィールドとして保存しますが、データローダーなどで使用するために直接インスタンス化することもできます (「 」を参照 segment_anything.utils.transforms
)。
変換: ボックスを入力フレームに変換し、マスクを予測します。SamPredictor は、簡単にアクセスできるように必要な変換を変換フィールドとして保存しますが、データ ローダーなどで使用するために直接インスタンス化することもできます (segment_anything.utils.transforms を参照)。
複数の長方形を最初に変換する必要があります
transformed_boxes = predictor.transform.apply_boxes_torch(input_boxes, image.shape[:2])
for ループを使用してすべてのマスクと四角形を表示します
for mask in masks:
show_mask(mask.cpu().numpy(), plt.gca(), random_color=True)
for box in input_boxes:
show_box(box.cpu().numpy(), plt.gca())
前のステップのキューポイントを追加してみました
transformed_boxes = predictor.transform.apply_boxes_torch(input_boxes, image.shape[:2])
masks, _, _ = predictor.predict_torch(
point_coords=input_point,
point_labels=input_label,
boxes=transformed_boxes,
multimask_output=False,
)
エラーが発生しました。これは許可されません。
10.エンドツーエンドのバッチ推論
エンドツーエンドのバッチ推論
官方:すべてのプロンプトが事前に利用可能であれば、SAM をエンドツーエンド方式で直接実行することが可能です。これにより、画像のバッチ処理も可能になります。
翻訳: すべてのヒントが事前に利用可能であれば、SAM をエンドツーエンド方式で直接実行することが可能です。これにより、画像のバッチ処理も可能になります。
この記事のテストのこの部分ではビデオ メモリが直接爆発し、8G ビデオ メモリでは不十分です。単純なアプリケーションにはバッチ処理は必要ありません。処理には単一の画像を使用してみてください。
3. テスト --automatic_mask_generator_example.ipynb を使用します。
SAM を使用してオブジェクト マスクを自動生成する SAM を使用してオブジェクト マスクを自動生成する
正式:
SAM はプロンプトを効率的に処理できるため、画像上で多数のプロンプトをサンプリングすることで画像全体のマスクを生成できます。この方法は、データセット SA-1B の生成に使用されました。
SamAutomaticMaskGenerator クラスはこの機能を実装します。これは、画像上のグリッド内の単一点入力プロンプトをサンプリングすることによって機能し、SAM はそれぞれのプロンプトから複数のマスクを予測できます。次に、マスクは品質のためにフィルタリングされ、非最大抑制を使用して重複が排除されます。追加のオプションにより、画像の複数のクロップに対して予測を実行したり、マスクの後処理を行って小さな切断された領域や穴を除去したりするなど、マスクの品質と量をさらに向上させることができます。
翻訳:
SAM はキューを効率的に処理できるため、画像上の多数のキューをサンプリングすることで画像全体のマスクを生成できます。このメソッドは、データセット SA-1B の生成に使用されました。SamAutomaticMaskGenerator クラスはこの機能を実装します。これは、画像上のグリッド内の単一点入力キューをサンプリングすることで機能し、SAM はそこから複数のマスクを予測できます。次に、マスクは品質フィルタリングされ、非最大抑制を使用して重複が排除されます。追加のオプションを使用すると、画像の複数のクロップに対して予測を実行したり、マスクを後処理して小さな切断領域や穴を除去したりするなど、マスクの品質と量をさらに調整できます。
翻訳から、データセット SA-1B の生成に使用された方法は、論文でも説明されている大量のデータセットを生成する機能を実現していることがわかります。
または、タイトルのフォームを通じてテストします
1.環境設定
これは Google colab での操作であり、このテキスト マシン テストにはこの手順は必要ありません。
2.セットアップ
必要なライブラリをいくつかインポートし、同時に複数のマスクを描画する機能を与えます。これまでのセットアップとは異なり、点の描画、四角形の描画、単一のマスク関数の描画を行いました。ここからは、以前の機能とは異なります。
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.35]])
img[m] = color_mask
ax.imshow(img)
3.サンプル画像
前と同じように、opencv を使用して画像をインポートします。
4.マスクの自動生成
次のキーを含む辞書であるマスクを自動的に生成します。
['segmentation', 'area', 'bbox', 'predicted_iou', 'point_coords', 'stability_score', 'crop_box']
segmentation
: マスクarea
: ピクセル単位のマスクの領域bbox
: XYWH 形式のマスクの境界ボックスpredicted_iou
: マスクの品質に関するモデル自身の予測point_coords
: このマスクを生成したサンプリングされた入力ポイントstability_score
: マスク品質の追加の尺度crop_box
: XYWH 形式でこのマスクを生成するために使用される画像のトリミング
以前の長方形と点を描画する機能をインポートし、予測長方形を描画します
5.自動マスク生成オプション
自動マスク生成オプション
官方:自動マスク生成には、ポイントのサンプリング密度と、低品質または重複したマスクを削除するためのしきい値を制御する調整可能なパラメータがいくつかあります。さらに、画像の切り抜きに対して生成を自動的に実行して、より小さなオブジェクトのパフォーマンスを向上させることができ、後処理で散在ピクセルや穴を除去することもできます。より多くのマスクをサンプリングする構成例を次に示します。
翻訳: 自動マスク生成には、サンプリング ポイントの密度と、低品質または重複したマスクを削除するためのしきい値を制御するための調整可能なパラメーターがいくつかあります。さらに、画像の切り抜きに対して生成を自動的に実行して、小さなオブジェクトのパフォーマンスを向上させることができます。また、後処理により、浮遊ピクセルや穴を除去することもできます。より多くのマスクをサンプリングするための設定例を次に示します。
自動マスク生成は調整できることを説明します。