본문 바로가기
On Going/Computer Vision

[SAM2] segment anything 2

by 에아오요이가야 2024. 8. 8.

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

댓글