8.4 KiB
์ด ๋ชจ๋ธ์ 2023-06-02์ ๋ฐํ๋์์ผ๋ฉฐ 2025-04-28์ Hugging Face Transformers์ ์ถ๊ฐ๋์์ต๋๋ค.
SAM-HQsam_hq
๊ฐ์overview
SAM-HQ (High-Quality Segment Anything Model)๋ Lei Ke, Mingqiao Ye, Martin Danelljan, Yifan Liu, Yu-Wing Tai, Chi-Keung Tang, Fisher Yu๊ฐ ์ ์ํ Segment Anything in High Quality ๋ ผ๋ฌธ์์ ์๊ฐ๋์์ต๋๋ค.
์ด ๋ชจ๋ธ์ ๊ธฐ์กด SAM(Segment Anything Model)์ ํฅ์๋ ๋ฒ์ ์ ๋๋ค. SAM-HQ๋ SAM์ ํต์ฌ ์ฅ์ ์ธ ํ๋กฌํํธ ๊ธฐ๋ฐ ์ค๊ณ, ํจ์จ์ฑ, ์ ๋ก์ท ์ผ๋ฐํ ๋ฅ๋ ฅ์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์๋ ํจ์ฌ ๋ ๋์ ํ์ง์ ๋ถํ ๋ง์คํฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ํน์ง์ ๋๋ค.
SAM-HQ๋ ๊ธฐ์กด SAM ๋ชจ๋ธ ๋๋น ๋ค์๊ณผ ๊ฐ์ 5๊ฐ์ง ํต์ฌ ๊ฐ์ ์ฌํญ์ ๋์ ํ์ต๋๋ค.
- ๊ณ ํ์ง ์ถ๋ ฅ ํ ํฐ: SAM-HQ๋ SAM์ ๋ง์คํฌ ๋์ฝ๋์ ํ์ต ๊ฐ๋ฅํ ํ ํฐ์ ์ฃผ์ ํฉ๋๋ค. ์ด ํ ํฐ์ ๋ชจ๋ธ์ด ๋ ๋์ ํ์ง์ ๋ถํ ๋ง์คํฌ๋ฅผ ์์ธกํ๋๋ก ๋๋ ํต์ฌ์ ์ธ ์์์ ๋๋ค.
- ์ ์ญ-์ง์ญ ํน์ง ์ตํฉ: ๋ชจ๋ธ์ ์๋ก ๋ค๋ฅธ ๋จ๊ณ์์ ์ถ์ถ๋ ํน์ง๋ค์ ๊ฒฐํฉํ์ฌ ๋ถํ ๋ง์คํฌ์ ์ธ๋ถ์ ์ธ ์ ํ๋๋ฅผ ํฅ์์ํต๋๋ค. ์ด๋ฏธ์ง์ ์ ์ฒด์ ์ธ ๋งฅ๋ฝ ์ ๋ณด์ ๊ฐ์ฒด์ ๋ฏธ์ธํ ๊ฒฝ๊ณ ์ ๋ณด๋ฅผ ํจ๊ป ํ์ฉํ์ฌ ๋ง์คํฌ ํ์ง์ ๊ฐ์ ํฉ๋๋ค.
- ํ๋ จ ๋ฐ์ดํฐ ๊ฐ์ : SAM ๋ชจ๋ธ์ด SA-1B์ ๊ฐ์ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, SAM-HQ๋ ์ ์คํ๊ฒ ์ ๋ณ๋ 44,000๊ฐ์ ๊ณ ํ์ง ๋ง์คํฌ๋ก ๊ตฌ์ฑ๋ ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํ์ฌ ํ๋ จ๋ฉ๋๋ค.
- ๋์ ํจ์จ์ฑ: ๋ง์คํฌ ํ์ง์ ์๋นํ ๊ฐ์ ํ์์๋ ๋ถ๊ตฌํ๊ณ , ์ถ๊ฐ๋ ๋งค๊ฐ๋ณ์๋ ๋จ 0.5%์ ๋ถ๊ณผํฉ๋๋ค.
- ์ ๋ก์ท ์ฑ๋ฅ: SAM-HQ๋ ์ฑ๋ฅ์ด ๊ฐ์ ๋์์์๋ ๋ถ๊ตฌํ๊ณ , SAM ๋ชจ๋ธ์ ๊ฐ๋ ฅํ ์ ๋ก์ท ์ผ๋ฐํ ๋ฅ๋ ฅ์ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค.
๋ ผ๋ฌธ ์ด๋ก ๋ด์ฉ:
- ์ต๊ทผ ๋ฐํ๋ SAM(Segment Anything Model)์ ๋ถํ ๋ชจ๋ธ์ ๊ท๋ชจ๋ฅผ ํ์ฅํ๋ ๋ฐ ์์ด ํ๊ธฐ์ ์ธ ๋ฐ์ ์ด๋ฉฐ, ๊ฐ๋ ฅํ ์ ๋ก์ท ๊ธฐ๋ฅ๊ณผ ์ ์ฐํ ํ๋กฌํํธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง SAM์ 11์ต ๊ฐ์ ๋ง์คํฌ๋ก ํ๋ จ๋์์์๋ ๋ถ๊ตฌํ๊ณ , ํนํ ๋ณต์กํ๊ณ ์ ๊ตํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ถํ ํ ๋ ๋ง์คํฌ ์์ธก ํ์ง์ด ๋ฏธํกํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ ํฌ๋ HQ-SAM์ ์ ์ํ๋ฉฐ, SAM์ ๊ธฐ์กด ์ฅ์ ์ธ ํ๋กฌํํธ ๊ธฐ๋ฐ ์ค๊ณ, ํจ์จ์ฑ, ์ ๋ก์ท ์ผ๋ฐํ ๋ฅ๋ ฅ์ ๋ชจ๋ ์ ์งํ๋ฉด์๋ ์ด๋ค ๊ฐ์ฒด๋ ์ ํํ๊ฒ ๋ถํ ํ ์ ์๋ ๋ฅ๋ ฅ์ ๋ถ์ฌํฉ๋๋ค. ์ ํฌ๋ ์ ์คํ ์ค๊ณ๋ฅผ ํตํด SAM์ ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ ๊ฐ์ค์น๋ฅผ ์ฌ์ฌ์ฉํ๊ณ ๋ณด์กดํ๋ฉฐ ์ต์ํ์ ์ถ๊ฐ์ ์ธ ๋งค๊ฐ๋ณ์์ ์ฐ์ฐ๋ง์ ๋์ ํ์ต๋๋ค. ํต์ฌ์ ์ผ๋ก ์ ํฌ๋ ํ์ต ๊ฐ๋ฅํ ๊ณ ํ์ง ์ถ๋ ฅ ํ ํฐ์ ์ค๊ณํ์ต๋๋ค. ์ด ํ ํฐ์ SAM์ ๋ง์คํฌ ๋์ฝ๋์ ์ฃผ์ ๋์ด ๊ณ ํ์ง ๋ง์คํฌ๋ฅผ ์์ธกํ๋ ์ญํ ์ ๋ด๋นํฉ๋๋ค. ๋ง์คํฌ์ ์ธ๋ถ ์ฌํญ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ด ํ ํฐ์ ๋ง์คํฌ ๋์ฝ๋ ํน์ง์๋ง ์ ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ์ด๊ธฐ ๋ฐ ์ต์ข ViT ํน์ง๊ณผ ๋จผ์ ์ตํฉํ์ฌ ์ฌ์ฉํฉ๋๋ค. ๋์ ๋ ํ์ต ๊ฐ๋ฅํ ๋งค๊ฐ๋ณ์๋ฅผ ํ๋ จํ๊ธฐ ์ํด ์ ํฌ๋ ์ฌ๋ฌ ์ถ์ฒ์์ ๊ฐ์ ธ์จ 44,000๊ฐ์ ๋ฏธ์ธ ์กฐ์ ๋ ๋ง์คํฌ ๋ฐ์ดํฐ์ ์ ๊ตฌ์ฑํ์ต๋๋ค. HQ-SAM์ ์ค์ง ์ด 44,000๊ฐ ๋ง์คํฌ ๋ฐ์ดํฐ์ ๋ง์ผ๋ก ํ๋ จ๋๋ฉฐ GPU 8๋๋ฅผ ์ฌ์ฉํ์ ๋ ๋จ 4์๊ฐ์ด ์์๋ฉ๋๋ค.
SAM-HQ ์ฌ์ฉ ํ:
- SAM-HQ๋ ๊ธฐ์กด SAM ๋ชจ๋ธ๋ณด๋ค ๋ ๋์ ํ์ง์ ๋ง์คํฌ ์์ฑํ๋ฉฐ, ํนํ ๋ณต์กํ ๊ตฌ์กฐ์ ๋ฏธ์ธํ ์ธ๋ถ ์ฌํญ์ ๊ฐ์ง ๊ฐ์ฒด์ ๋ํด ์ฑ๋ฅ์ด ์ฐ์ํฉ๋๋ค.
- ์ด ๋ชจ๋ธ์ ๋์ฑ ์ ํํ ๊ฒฝ๊ณ์ ์์ ๊ตฌ์กฐ์ ๋ํ ๋ ๋์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๊ฐ์ถ ์ด์ง ๋ง์คํฌ๋ฅผ ์์ธกํฉ๋๋ค.
- SAM๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ธ์ ์ ๋ ฅ์ผ๋ก 2์ฐจ์ ํฌ์ธํธ ๋ฐ ๋ฐ์ด๋ฉ ๋ฐ์ค๋ฅผ ์ฌ์ฉํ ๋ ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค.
- ํ๋์ ์ด๋ฏธ์ง์ ๋ํด ๋ค์์ ํฌ์ธํธ๋ฅผ ํ๋กฌํํธ๋ก ์ ๋ ฅํ์ฌ ๋จ์ผ์ ๊ณ ํ์ง ๋ง์คํฌ๋ฅผ ์์ธกํ ์ ์์ต๋๋ค.
- ์ด ๋ชจ๋ธ์ SAM์ ์ ๋ก์ท ์ผ๋ฐํ ๋ฅ๋ ฅ์ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค.
- SAM-HQ๋ SAM ๋๋น ์ฝ 0.5%์ ์ถ๊ฐ ๋งค๊ฐ๋ณ์๋ง์ ๊ฐ์ง๋๋ค.
- ํ์ฌ ๋ชจ๋ธ์ ๋ฏธ์ธ ์กฐ์ ์ ์ง์๋์ง ์์ต๋๋ค.
์ด ๋ชจ๋ธ์ sushmanth๋๊ป์ ๊ธฐ์ฌํด์ฃผ์ จ์ต๋๋ค. ์๋ณธ ์ฝ๋๋ ์ฌ๊ธฐ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
์๋๋ ์ด๋ฏธ์ง์ 2์ฐจ์ ํฌ์ธํธ๊ฐ ์ฃผ์ด์ก์ ๋, ๋ง์คํฌ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์์ ๋๋ค.
import torch
from PIL import Image
import requests
from transformers import infer_device, SamHQModel, SamHQProcessor
device = infer_device()
model = SamHQModel.from_pretrained("syscv-community/sam-hq-vit-base").to(device)
processor = SamHQProcessor.from_pretrained("syscv-community/sam-hq-vit-base")
img_url = "https://huggingface.co/ybelkada/segment-anything/resolve/main/assets/car.png"
raw_image = Image.open(requests.get(img_url, stream=True).raw).convert("RGB")
input_points = [[[450, 600]]] # ์ด๋ฏธ์ง ๋ด ์ฐฝ๋ฌธ์ 2์ฐจ์ ์์น
inputs = processor(raw_image, input_points=input_points, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model(**inputs)
masks = processor.image_processor.post_process_masks(
outputs.pred_masks.cpu(), inputs["original_sizes"].cpu(), inputs["reshaped_input_sizes"].cpu()
)
scores = outputs.iou_scores
๋ํ, ํ๋ก์ธ์์์ ์ ๋ ฅ ์ด๋ฏธ์ง์ ํจ๊ป ์ฌ์ฉ์์ ๋ง์คํฌ๋ฅผ ์ง์ ์ฒ๋ฆฌํ์ฌ ๋ชจ๋ธ์ ์ ๋ฌํ ์๋ ์์ต๋๋ค.
import torch
from PIL import Image
import requests
from transformers import infer_device, SamHQModel, SamHQProcessor
device = infer_device()
model = SamHQModel.from_pretrained("syscv-community/sam-hq-vit-base").to(device)
processor = SamHQProcessor.from_pretrained("syscv-community/sam-hq-vit-base")
img_url = "https://huggingface.co/ybelkada/segment-anything/resolve/main/assets/car.png"
raw_image = Image.open(requests.get(img_url, stream=True).raw).convert("RGB")
mask_url = "https://huggingface.co/ybelkada/segment-anything/resolve/main/assets/car.png"
segmentation_map = Image.open(requests.get(mask_url, stream=True).raw).convert("1")
input_points = [[[450, 600]]] # ์ด๋ฏธ์ง ๋ด ์ฐฝ๋ฌธ์ 2์ฐจ์ ์์น
inputs = processor(raw_image, input_points=input_points, segmentation_maps=segmentation_map, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model(**inputs)
masks = processor.image_processor.post_process_masks(
outputs.pred_masks.cpu(), inputs["original_sizes"].cpu(), inputs["reshaped_input_sizes"].cpu()
)
scores = outputs.iou_scores
์๋ฃresources
๋ค์์ SAM-HQ ์ฌ์ฉ์ ์์ํ๋ ๋ฐ ๋์์ด ๋๋ ๊ณต์ Hugging Face ๋ฐ ์ปค๋ฎค๋ํฐ (๐๋ก ํ์) ์๋ฃ ๋ชฉ๋ก์ ๋๋ค.
- ๋ชจ๋ธ ์ฌ์ฉ์ ์ํ ๋ฐ๋ชจ ๋ ธํธ๋ถ (์ถ์ ์์ )
- ๋ ผ๋ฌธ ๊ตฌํ ๋ฐ ์ฝ๋: SAM-HQ ๊นํ๋ธ ์ ์ฅ์
SamHQConfigtransformers.SamHQConfig
autodoc SamHQConfig
SamHQVisionConfigtransformers.SamHQVisionConfig
autodoc SamHQVisionConfig
SamHQMaskDecoderConfigtransformers.SamHQMaskDecoderConfig
autodoc SamHQMaskDecoderConfig
SamHQPromptEncoderConfigtransformers.SamHQPromptEncoderConfig
autodoc SamHQPromptEncoderConfig
SamHQProcessortransformers.SamHQProcessor
autodoc SamHQProcessor
SamHQVisionModeltransformers.SamHQVisionModel
autodoc SamHQVisionModel
SamHQModeltransformers.SamHQModel
autodoc SamHQModel - forward
