Sam2가 공개됐습니다. https://sam2.metademolab.com/demo <감사합니다 메타>
직접해보시면 아시겠지만 성능이 매우 뛰어납니다. 없어졌다 다시 나오는것도 찾아 tracking하구요.
이름은 Segment anything인데 yolo도 씹어먹을 tracking성능까지 뛰어난것을 확인 할 수 있습니다.
https://github.com/facebookresearch/segment-anything-2
또한, 빅테크에서 시원하게 오픈한 기술답게 github를 통해 쉽게 사용할 수있습니다.
환경설정도 쉽고 ipynb예시도 줘서 간단하게 사용해 볼 수 있습니다.
notebook폴더에 들어있는 ipynb를 사용할 때 한가지 기본적인 내용은 ipynb파일들이 notebook보다 상위 폴더에서 실행된다는 것입니다. <sam이라는 폴더를 import해야하기 때문이죠>
간단하게 오픈된 위성영상 데이터로 한번 실험을 진행해봤습니다.
사실 개인적으론 좀 어이가 없습니다.
중간에 다리로인해 강이 끊겨보이는데 어떻게 하나의 object라고 인식을 하는것입니까?
모델부분 코드를 살짝 보면 head를 포함한거 보니 transformer계열인거 같은데(정확하지 않습니다), 아무튼 이게 어떻게 되는건지 잘 모르겠습니다. 데이터를 기깔나게 잘 만들었나?
무튼 여기서 끝이 아닙니다.
Sam2의 진가는 video에서 드러나는데요. 객체를 잡고 전경(foreground)/배경(background)로 나눠서 효과를 줄수있습니다. 효과는 blur, 모자이크, 전경만 보기, 배경만 보기 등등 다양하게 실험해볼수있습니다.
모쪼록 segmentation일을 하셔야하는 분들은 반드시 사용해보시길 바라고 foundation 모델 개발, 연구분야는 이제 아득히 따라갈 수 없는 수준이 된것 같습니다.
새로운 모델을 보고 활용하여 적합하게 활용처를 찾아 사용하는것이 인공지능 개발자가 해야할일 인것 같습니다. 하하
걍 써보시라고 ipynb code block올려보겠습니다.
우선 설치 하겠습니다.
https://github.com/facebookresearch/segment-anything-2.git
cd segment-anything-2
pip install -e. . 로 하거나
pip install -e ".[demo]" 로 하시면 됩니다.
설치가 완료 된뒤에 segment-anything-2 폴더 안에서 하위폴더로 가지 마시고 test.ipynb를 만들어서 해보시면 되겠습니다.
제가 지금 실행하고있는 실행 가능항 환경의 환경변수들은 댓글로 공유하겠습니다.
#필요한 패키지를 설치해주겠습니다
import torch
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from sam2.build_sam import build_sam2
from sam2.sam2_image_predictor import SAM2ImagePredictor
#gpu관련 설정해주겠습니다
# use bfloat16 for the entire notebook
torch.autocast(device_type="cuda", dtype=torch.bfloat16).__enter__()
if torch.cuda.get_device_properties(0).major >= 8:
# turn on tfloat32 for Ampere GPUs (https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices)
torch.backends.cuda.matmul.allow_tf32 = True
torch.backends.cudnn.allow_tf32 = True
#시각화를 위한 함수들 입니다.
def show_mask(mask, ax, random_color=False, borders = True):
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])
h, w = mask.shape[-2:]
mask = mask.astype(np.uint8)
mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
if borders:
import cv2
contours, _ = cv2.findContours(mask,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
# Try to smooth contours
contours = [cv2.approxPolyDP(contour, epsilon=0.01, closed=True) for contour in contours]
mask_image = cv2.drawContours(mask_image, contours, -1, (1, 1, 1, 0.5), thickness=2)
# print(len(contours[0]))
# # print('here')
# # Img = Image.fromarray(((contours[0])* 255).astype(np.uint8),mode='RGBA')
# # Img.save('./output.png',format="PNG")
ax.imshow(mask_image)
def show_points(coords, labels, ax, marker_size=375):
pos_points = coords[labels==1]
neg_points = coords[labels==0]
ax.scatter(pos_points[:, 0], pos_points[:, 1], color='green', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)
ax.scatter(neg_points[:, 0], neg_points[:, 1], color='red', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)
def show_box(box, ax):
x0, y0 = box[0], box[1]
w, h = box[2] - box[0], box[3] - box[1]
ax.add_patch(plt.Rectangle((x0, y0), w, h, edgecolor='green', facecolor=(0, 0, 0, 0), lw=2))
def show_masks(image, masks, scores, point_coords=None, box_coords=None, input_labels=None, borders=True):
for i, (mask, score) in enumerate(zip(masks, scores)):
plt.figure(figsize=(10, 10))
plt.imshow(image)
show_mask(mask, plt.gca(), borders=borders)
if point_coords is not None:
assert input_labels is not None
show_points(point_coords, input_labels, plt.gca())
if box_coords is not None:
# boxes
show_box(box_coords, plt.gca())
if len(scores) > 1:
plt.savefig(f"Mask {i+1}")
plt.title(f"Mask {i+1}, Score: {score:.3f}", fontsize=18)
plt.axis('off')
plt.show()
이제 이미지를 받아오겠습니다.
image = Image.open('./test_image/23319.jpg')
image = np.array(image.convert("RGB"))
모델을 설정해주겠습니다.
sam2_checkpoint = "./checkpoints/sam2_hiera_large.pt"
model_cfg = "sam2_hiera_l.yaml"
sam2_model = build_sam2(model_cfg, sam2_checkpoint, device="cuda")
predictor = SAM2ImagePredictor(sam2_model)
실행에 필요한 코드들을 진행시켜 보겠습니다
predictor.set_image(image)
#segment하고자 하는 물체를 point로 찍습니다.
input_point = np.array([[75, 75]])
#point로 찍힌 물체의 경계를 Mask로 사용하고자 하면 1 그것을 제외한 부분을 찾고자 한다면 0으로 주면 됩니다.
input_label = np.array([1])
#실제 연산을 해줍니다. 생각보다 빠르다는사실..
#여기서multimaks_output = True로하면 Mask가 3개가 나오게 설정돼있습니다
masks, scores, logits = predictor.predict(
point_coords=input_point,
point_labels=input_label,
multimask_output=True,
)
sorted_ind = np.argsort(scores)[::-1]
masks = masks[sorted_ind]
scores = scores[sorted_ind]
logits = logits[sorted_ind]
#시각화 부분입니다,
show_masks(image, masks, scores, point_coords=input_point, input_labels=input_label, borders=True)
끝났습니다.
행복하세요~
댓글이 천자이상 안달린다네요
여기에 환경변수 공유하겠습니다.
복사해서 requirements.txt로 만들어서 쓰셔도 되겠습니다잇
#
# Name Version Build Channel
_libgcc_mutex 0.1 conda_forge conda-forge
_openmp_mutex 4.5 2_gnu conda-forge
antlr4-python3-runtime 4.9.3 pypi_0 pypi
asttokens 2.4.1 pyhd8ed1ab_0 conda-forge
beautifulsoup4 4.12.3 pypi_0 pypi
blosc 1.21.6 hef167b5_0 conda-forge
bzip2 1.0.8 h4bc722e_7 conda-forge
c-ares 1.32.3 h4bc722e_0 conda-forge
ca-certificates 2024.7.4 hbcca054_0 conda-forge
certifi 2024.7.4 pypi_0 pypi
charset-normalizer 3.3.2 pypi_0 pypi
comm 0.2.2 pyhd8ed1ab_0 conda-forge
contourpy 1.2.1 pypi_0 pypi
cycler 0.12.1 pypi_0 pypi
debugpy 1.8.3 py312hca68cad_0 conda-forge
decorator 5.1.1 pyhd8ed1ab_0 conda-forge
exceptiongroup 1.2.2 pyhd8ed1ab_0 conda-forge
executing 2.0.1 pyhd8ed1ab_0 conda-forge
filelock 3.13.1 pypi_0 pypi
fonttools 4.53.1 pypi_0 pypi
freexl 2.0.0 h743c826_0 conda-forge
fsspec 2024.2.0 pypi_0 pypi
gdown 5.2.0 pypi_0 pypi
geos 3.12.2 he02047a_1 conda-forge
geotiff 1.7.3 hf7fa9e8_2 conda-forge
giflib 5.2.2 hd590300_0 conda-forge
hydra-core 1.3.2 pypi_0 pypi
icu 75.1 he02047a_0 conda-forge
idna 3.7 pypi_0 pypi
importlib-metadata 8.2.0 pyha770c72_0 conda-forge
importlib_metadata 8.2.0 hd8ed1ab_0 conda-forge
ipykernel 6.29.5 pyh3099207_0 conda-forge
ipython 8.26.0 pyh707e725_0 conda-forge
jedi 0.19.1 pyhd8ed1ab_0 conda-forge
jinja2 3.1.3 pypi_0 pypi
json-c 0.17 h1220068_1 conda-forge
jupyter_client 8.6.2 pyhd8ed1ab_0 conda-forge
jupyter_core 5.7.2 py312h7900ff3_0 conda-forge
keyutils 1.6.1 h166bdaf_0 conda-forge
kiwisolver 1.4.5 pypi_0 pypi
krb5 1.21.3 h659f571_0 conda-forge
ld_impl_linux-64 2.40 hf3520f5_7 conda-forge
lerc 4.0.0 h27087fc_0 conda-forge
libarchive 3.7.4 hfca40fe_0 conda-forge
libblas 3.9.0 23_linux64_openblas conda-forge
libcblas 3.9.0 23_linux64_openblas conda-forge
libcurl 8.9.1 hdb1bdb2_0 conda-forge
libdeflate 1.21 h4bc722e_0 conda-forge
libedit 3.1.20191231 he28a2e2_2 conda-forge
libev 4.33 hd590300_2 conda-forge
libexpat 2.6.2 h59595ed_0 conda-forge
libffi 3.4.2 h7f98852_5 conda-forge
libgcc-ng 14.1.0 h77fa898_0 conda-forge
libgdal-core 3.9.1 hba09cee_11 conda-forge
libgfortran-ng 14.1.0 h69a702a_0 conda-forge
libgfortran5 14.1.0 hc5f4f2c_0 conda-forge
libgomp 14.1.0 h77fa898_0 conda-forge
libiconv 1.17 hd590300_2 conda-forge
libjpeg-turbo 3.0.0 hd590300_1 conda-forge
libkml 1.3.0 hbbc8833_1020 conda-forge
liblapack 3.9.0 23_linux64_openblas conda-forge
libnghttp2 1.58.0 h47da74e_1 conda-forge
libnsl 2.0.1 hd590300_0 conda-forge
libopenblas 0.3.27 pthreads_hac2b453_1 conda-forge
libpng 1.6.43 h2797004_0 conda-forge
librttopo 1.1.0 hc670b87_16 conda-forge
libsodium 1.0.18 h36c2ea0_1 conda-forge
libspatialite 5.1.0 h15fa968_9 conda-forge
libsqlite 3.46.0 hde9e2c9_0 conda-forge
libssh2 1.11.0 h0841786_0 conda-forge
libstdcxx-ng 14.1.0 hc0a3c3a_0 conda-forge
libtiff 4.6.0 h46a8edc_4 conda-forge
libuuid 2.38.1 h0b41bf4_0 conda-forge
libwebp-base 1.4.0 hd590300_0 conda-forge
libxcrypt 4.4.36 hd590300_1 conda-forge
libxml2 2.12.7 he7c6b58_4 conda-forge
libzlib 1.3.1 h4ab18f5_1 conda-forge
lz4-c 1.9.4 hcb278e6_0 conda-forge
lzo 2.10 hd590300_1001 conda-forge
markupsafe 2.1.5 pypi_0 pypi
matplotlib 3.9.0 pypi_0 pypi
matplotlib-inline 0.1.7 pyhd8ed1ab_0 conda-forge
minizip 4.0.7 h401b404_0 conda-forge
mpmath 1.3.0 pypi_0 pypi
ncurses 6.5 h59595ed_0 conda-forge
nest-asyncio 1.6.0 pyhd8ed1ab_0 conda-forge
networkx 3.2.1 pypi_0 pypi
numpy 1.26.3 pypi_0 pypi
nvidia-cublas-cu12 12.1.3.1 pypi_0 pypi
nvidia-cuda-cupti-cu12 12.1.105 pypi_0 pypi
nvidia-cuda-nvrtc-cu12 12.1.105 pypi_0 pypi
nvidia-cuda-runtime-cu12 12.1.105 pypi_0 pypi
nvidia-cudnn-cu12 9.1.0.70 pypi_0 pypi
nvidia-cufft-cu12 11.0.2.54 pypi_0 pypi
nvidia-curand-cu12 10.3.2.106 pypi_0 pypi
nvidia-cusolver-cu12 11.4.5.107 pypi_0 pypi
nvidia-cusparse-cu12 12.1.0.106 pypi_0 pypi
nvidia-nccl-cu12 2.20.5 pypi_0 pypi
nvidia-nvjitlink-cu12 12.1.105 pypi_0 pypi
nvidia-nvtx-cu12 12.1.105 pypi_0 pypi
omegaconf 2.3.0 pypi_0 pypi
opencv-python 4.10.0.84 pypi_0 pypi
openssl 3.3.1 h4bc722e_2 conda-forge
packaging 24.1 pyhd8ed1ab_0 conda-forge
parso 0.8.4 pyhd8ed1ab_0 conda-forge
pcre2 10.44 h0f59acf_0 conda-forge
pexpect 4.9.0 pyhd8ed1ab_0 conda-forge
pickleshare 0.7.5 py_1003 conda-forge
pillow 10.2.0 pypi_0 pypi
pip 24.2 pyhd8ed1ab_0 conda-forge
platformdirs 4.2.2 pyhd8ed1ab_0 conda-forge
proj 9.4.1 h54d7996_1 conda-forge
prompt-toolkit 3.0.47 pyha770c72_0 conda-forge
psutil 6.0.0 py312h9a8786e_0 conda-forge
ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge
pure_eval 0.2.3 pyhd8ed1ab_0 conda-forge
pygments 2.18.0 pyhd8ed1ab_0 conda-forge
pyparsing 3.1.2 pypi_0 pypi
pysocks 1.7.1 pypi_0 pypi
python 3.12.4 h194c7f8_0_cpython conda-forge
python-dateutil 2.9.0 pyhd8ed1ab_0 conda-forge
python_abi 3.12 4_cp312 conda-forge
pyyaml 6.0.1 pypi_0 pypi
pyzmq 26.0.3 py312h8fd38d8_0 conda-forge
readline 8.2 h8228510_1 conda-forge
requests 2.32.3 pypi_0 pypi
setuptools 72.1.0 pyhd8ed1ab_0 conda-forge
six 1.16.0 pyh6c4a22f_0 conda-forge
snappy 1.2.1 ha2e4443_0 conda-forge
soupsieve 2.5 pypi_0 pypi
sqlite 3.46.0 h6d4b2fc_0 conda-forge
stack_data 0.6.2 pyhd8ed1ab_0 conda-forge
sympy 1.12 pypi_0 pypi
tk 8.6.13 noxft_h4845f30_101 conda-forge
torch 2.4.0+cu121 pypi_0 pypi
torchvision 0.19.0+cu121 pypi_0 pypi
tornado 6.4.1 py312h9a8786e_0 conda-forge
tqdm 4.66.5 pypi_0 pypi
traitlets 5.14.3 pyhd8ed1ab_0 conda-forge
triton 3.0.0 pypi_0 pypi
typing_extensions 4.12.2 pyha770c72_0 conda-forge
tzdata 2024a h0c530f3_0 conda-forge
uriparser 0.9.8 hac33072_0 conda-forge
urllib3 2.2.2 pypi_0 pypi
wcwidth 0.2.13 pyhd8ed1ab_0 conda-forge
wheel 0.44.0 pyhd8ed1ab_0 conda-forge
xerces-c 3.2.5 h666cd97_1 conda-forge
xz 5.2.6 h166bdaf_0 conda-forge
zeromq 4.3.5 h75354e8_4 conda-forge
zipp 3.19.2 pyhd8ed1ab_0 conda-forge
zlib 1.3.1 h4ab18f5_1 conda-forge
zstd 1.5.6 ha6fb4c9_0 conda-forge
'On Going > Computer Vision' 카테고리의 다른 글
[SAM2] SAM2 transfer learning with custom datasets, .py format (1) | 2024.09.09 |
---|---|
[SAM2] Custom 학습 - SAM2 transfer learning with custom datasets, .ipynb (0) | 2024.09.09 |
[ECW] ECW 파일포맷을 다루고싶어!! (0) | 2024.08.06 |
[ECW] ECW file 포맷을 다루고 싶어! (0) | 2024.08.06 |
History of Super Resolution AI (0) | 2024.07.17 |
댓글