元画像と,生成されたセグメンテーションマスク
Segment Anything(SA)は、画像セグメンテーションのための基盤モデルを構築することを目的としたプロジェクトである。このプロジェクトでは、新しいデータ分布とタスクに一般化できるプロンプト可能なセグメンテーションモデルSegment Anything Model(SAM)が開発された。Segment Anything Model(SAM)はゼロショットでのセグメンテーションが可能である。さらに、1100万枚以上の画像と、それらの画像に対する10億以上のマスクを含むセグメンテーションデータセットSA-1Bデータセットが構築された。
【文献】
Alexander Kirillov, Eric Mintun, Nikhila Ravi, Hanzi Mao, Chloe Rolland, Laura Gustafson, Tete Xiao, Spencer Whitehead, Alex Berg, Wan-Yen Lo, Piotr Dollar, Ross Girshick, Segment Anything, arXiv:2304.02643, 2023.
https://arxiv.org/pdf/2304.02643v1.pdf
【関連する外部ページ】
【インストールの判断】 Build Tools for Visual Studio は,開発ツールセットである. Visual Studio は統合開発環境であり,いくつかの種類があり,Build Tools for Visual Studioの機能を含むか連携して使用するものである.インストールは以下の基準で判断してください:
Visual Studio 2022 をインストールする際に,「C++ によるデスクトップ開発」を選択することで, Build Tools for Visual Studio 2022 の機能も一緒にインストールされる.
不明な点がある場合は,Visual Studio 全体をインストール を行う方が良い.
コマンドプロンプトを管理者として実行: 別ページ »で説明
次のコマンドを実行
次のコマンドは,Build Tools for Visual Studio 2022と VC2015 再配布可能パッケージをインストールするものである.
起動方法: スタートメニューの「Visual Studio Installer」を選ぶ.
コマンドプロンプトを管理者として実行: 別ページ »で説明
次のコマンドを実行
次のコマンドは,Visual Studio Community 2022と VC2015 再配布可能パッケージをインストールするものである.
起動方法: スタートメニューの「Visual Studio Installer」を選ぶ.
Pythonは,プログラミング言語の1つ. Gitは,分散型のバージョン管理システム.
【手順】
コマンドプロンプトを管理者として実行: 別ページ »で説明
次のコマンドを実行
次のコマンドは,Python ランチャーとPython 3.10とGitをインストールし,Gitにパスを通すものである.
次のコマンドでインストールされるGitは 「git for Windows」と呼ばれるものであり, Git,MinGW などから構成されている.
winget install --scope machine Python.Launcher winget install --scope machine Python.Python.3.10 winget install --scope machine Git.Git powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";c:\Program Files\Git\cmd\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"
【関連する外部ページ】
【サイト内の関連ページ】
【関連項目】 Python, Git バージョン管理システム, Git の利用
【サイト内の関連ページ】 NVIDIA グラフィックスボードを搭載しているパソコンの場合には, NVIDIA ドライバ, NVIDIA CUDA ツールキット, NVIDIA cuDNN のインストールを行う.
【関連する外部ページ】
コマンドプロンプトを管理者として実行: 別ページ »で説明
次のコマンドを実行することにより, PyTorch 2.3 (NVIDIA CUDA 11.8 用)がインストールされる. 但し,Anaconda3を使いたい場合には別手順になる.
事前に NVIDIA CUDA のバージョンを確認しておくこと(ここでは,NVIDIA CUDA ツールキット 11.8 が前もってインストール済みであるとする).
PyTorch で,GPU が動作している場合には,「torch.cuda.is_available()」により,True が表示される.
python -m pip install -U --ignore-installed pip python -m pip uninstall -y torch torchvision torchaudio torchtext xformers python -m pip install -U torch torchvision torchaudio numpy --index-url https://download.pytorch.org/whl/cu118 python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
Anaconda3を使いたい場合には, Anaconda プロンプト (Anaconda Prompt) を管理者として実行し, 次のコマンドを実行する. (PyTorch と NVIDIA CUDA との連携がうまくいかない可能性があるため,Anaconda3を使わないことも検討して欲しい).
conda install -y pytorch torchvision torchaudio pytorch-cuda=11.8 cudnn -c pytorch -c nvidia py -c "import torch; print(torch.__version__, torch.cuda.is_available())"
【サイト内の関連ページ】
【関連する外部ページ】
公式の GitHub ページ: https://github.com/facebookresearch/segment-anything の記載に従う.
コマンドプロンプトを管理者として実行: 別ページ »で説明
cd /d c:%HOMEPATH% rmdir /s /q segment-anything git clone --recursive https://github.com/facebookresearch/segment-anything cd segment-anything python -m pip install -e . python -m pip install -U opencv-python pycocotools matplotlib onnxruntime onnx gdown mkdir pretrained_checkpoint
エラーメッセージが出ていないこと.
次のコマンドを実行することにより, 公式ページで公開されている学習済みモデル vit_b: ViT-B SAM model, vit_l: ViT-L SAM model, vit_h: ViT-H SAM model をダウンロードする.
cd /d c:%HOMEPATH%\segment-anything cd pretrained_checkpoint curl -L -O https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth curl -L -O https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth curl -L -O https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
cd /d c:%HOMEPATH%\segment-anything python -m pip install -U timm python scripts/amg.py --checkpoint ./pretrained_checkpoint/sam_vit_l_0b3195.pth --model-type vit_l --input ./notebooks/images --output ./results
元画像の画像ファイルは,notebooks\images にある
結果の画像ファイルは,results にある
実行時にファイルを選択する.ファイルは複数選択可能である.
cd /d c:%HOMEPATH%\segment-anything notepad segment.py
このプログラムは,公式の Sement Anything のページで公開されていたものを参考に作成.
from segment_anything import SamAutomaticMaskGenerator, sam_model_registry import numpy as np import torch import matplotlib.pyplot as plt import cv2 import tkinter as tk from tkinter import filedialog def main(): sam_checkpoint = "./pretrained_checkpoint/sam_vit_h_4b8939.pth" model_type = "vit_h" # "vit_l/vit_b/vit_h" device = "cuda" sam = sam_model_registry[model_type](checkpoint=sam_checkpoint) sam.to(device=device) mask_generator = SamAutomaticMaskGenerator(sam) root = tk.Tk() root.withdraw() fpaths = filedialog.askopenfilenames() 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) i = 0 for fpath in root.tk.splitlist(fpaths): print("file name: ", fpath) bgr = cv2.imread(fpath) rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB) plt.figure(figsize=(20, 20)) plt.imshow(rgb) plt.axis('off') plt.show() masks = mask_generator.generate(rgb) plt.figure(figsize=(20, 20)) plt.imshow(rgb) show_anns(masks) plt.axis('off') plt.savefig(str(i) + ".png", bbox_inches='tight', pad_inches=0, transparent=True) print(str(i) + ".png" + " saved.") plt.show() plt.close() # グラフを閉じる i = i + 1 if __name__ == "__main__": main()
Python プログラムの実行
Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.
Python のまとめ: 別ページ »にまとめ
プログラムを segment.pyのようなファイル名で保存したので, 「python segment.py」のようなコマンドで行う.
python segment.py
確認したら,右上の「x」をクリックする.右上の「x」をクリックするまでは,プログラム実行は中断している.
確認したら,右上の「x」をクリックする.右上の「x」をクリックするまでは,プログラム実行は中断している.
ファイル名は,0.png, 1.png, 2.png, ... のようになっている.
パソコンのビデオカメラで実行する.
cd /d c:%HOMEPATH%\segment-anything notepad vidcam.py
このプログラムは,公式の Sement Anything のページで公開されていたものを参考に作成.
学習済みモデルは最も軽量なものを選んでいる.
from segment_anything import SamAutomaticMaskGenerator, sam_model_registry import numpy as np import torch import matplotlib.pyplot as plt import cv2 def main(): sam_checkpoint = "./pretrained_checkpoint/sam_vit_b_01ec64.pth" model_type = "vit_b" # "vit_l/vit_b/vit_h" device = "cuda" sam = sam_model_registry[model_type](checkpoint=sam_checkpoint) sam.to(device=device) mask_generator = SamAutomaticMaskGenerator(sam) def get_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 return img print("Prease press q to exit") cap = cv2.VideoCapture(0) while (cap.isOpened()): r, f = cap.read() if (r == False): print("Video Capture Error") break else: cv2.imshow('Video Capture', f) if cv2.waitKey(1) & 0xFF == ord('q'): break masks = mask_generator.generate(f) img = get_anns(masks) cv2.imshow('SAM Result', img) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() if __name__ == "__main__": main()
Python プログラムの実行
Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.
Python のまとめ: 別ページ »にまとめ
プログラムを vidcam.pyのようなファイル名で保存したので, 「python vidcam.py」のようなコマンドで行う.
python vidcam.py
q キーで終了する.