Segment Anything (SAM): Tutorial Komprehensif
Daftar Isi
Pendahuluan
Segment Anything Model (SAM), dikembangkan oleh Meta AI, adalah model fondasi untuk segmentasi gambar. SAM memperkenalkan kemampuan segmentasi zero-shot, yang berarti model ini dapat melakukan segmentasi pada objek apapun dalam gambar apapun tanpa perlu dilatih secara khusus pada kelas objek tersebut. SAM dilatih menggunakan dataset SA-1B yang berisi lebih dari 1 miliar mask dari 11 juta gambar, menjadikannya salah satu model segmentasi paling serbaguna yang tersedia.
Tutorial ini menyediakan panduan komprehensif untuk menggunakan SAM, mulai dari prompting dasar hingga integrasi lanjutan, fine-tuning, dan deployment di lingkungan produksi.
Prasyarat
pip install segment-anything
pip install torch torchvision
pip install opencv-python numpy matplotlib
pip install Pillow
pip install onnxruntime # Untuk deployment berbasis ONNX
Persyaratan sistem:
- Python 3.8 atau lebih tinggi
- GPU dengan minimal 8 GB VRAM (untuk model ViT-H; model yang lebih kecil membutuhkan lebih sedikit)
- CUDA 11.7 atau lebih tinggi
Unduh checkpoint model:
# ViT-H (default, kualitas tertinggi) - 2.4 GB
wget https://dl.fbaipublicfiles.com/segmentanything/samvith4b8939.pth
ViT-L (besar) - 1.2 GB
wget https://dl.fbaipublicfiles.com/segmentanything/samvitl0b3195.pth
ViT-B (base, terkecil) - 375 MB
wget https://dl.fbaipublicfiles.com/segmentanything/samvitb01ec64.pth
Memahami Arsitektur SAM
SAM terdiri dari tiga komponen utama:
Keunggulan utama arsitektur SAM adalah desain yang terpisah: image encoder yang berat dijalankan sekali saja, sementara prompt encoder dan mask decoder yang ringan dapat dijalankan berkali-kali untuk prompt yang berbeda pada gambar yang sama.
Instalasi dan Setup
import torch
import numpy as np
import cv2
import matplotlib.pyplot as plt
from segmentanything import sammodelregistry, SamPredictor, SamAutomaticMaskGenerator
def muatmodelsam(checkpointpath, tipemodel="vith", device="cuda"):
"""
Memuat model SAM.
Pilihan tipemodel: 'vith', 'vitl', 'vitb'
"""
sam = sammodelregistrytipemodel
sam.to(device=device)
return sam
def tampilkanmask(mask, ax, warnaacak=False):
"""Fungsi utilitas untuk menampilkan mask segmentasi."""
if warnaacak:
warna = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
else:
warna = np.array([30 / 255, 144 / 255, 255 / 255, 0.6])
h, w = mask.shape[-2:]
maskimage = mask.reshape(h, w, 1) warna.reshape(1, 1, -1)
ax.imshow(maskimage)
def tampilkantitik(coords, labels, ax, ukuranmarker=375):
"""Menampilkan titik prompt pada gambar."""