้กน็›ฎๆ–‡ไปถๅคน

ๆ–‡ไปถ
wehub-resource-sync e06fe8e8c6
Secret Leaks / trufflehog (push) Failing after 1s
Build documentation / build (push) Failing after 1s
Build documentation / build_other_lang (push) Failing after 0s
CodeQL Security Analysis / CodeQL Analysis (push) Failing after 0s
PR CI / pr-ci (push) Failing after 1s
Slow tests on important models (on Push - A10) / Get all modified files (push) Failing after 1s
Slow tests on important models (on Push - A10) / Model CI (push) Has been skipped
Self-hosted runner (benchmark) / Benchmark (aws-g5-4xlarge-cache) (push) Has been cancelled
New model PR merged notification / Notify new model (push) Has been cancelled
Update Transformers metadata / build_and_package (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 11:57:37 +08:00

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์˜ ํ•ต์‹ฌ ์žฅ์ ์ธ ํ”„๋กฌํ”„ํŠธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„, ํšจ์œจ์„ฑ, ์ œ๋กœ์ƒท ์ผ๋ฐ˜ํ™” ๋Šฅ๋ ฅ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ํ›จ์”ฌ ๋” ๋†’์€ ํ’ˆ์งˆ์˜ ๋ถ„ํ•  ๋งˆ์Šคํฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํŠน์ง•์ž…๋‹ˆ๋‹ค.

example image

SAM-HQ๋Š” ๊ธฐ์กด SAM ๋ชจ๋ธ ๋Œ€๋น„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ 5๊ฐ€์ง€ ํ•ต์‹ฌ ๊ฐœ์„  ์‚ฌํ•ญ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ณ ํ’ˆ์งˆ ์ถœ๋ ฅ ํ† ํฐ: SAM-HQ๋Š” SAM์˜ ๋งˆ์Šคํฌ ๋””์ฝ”๋”์— ํ•™์Šต ๊ฐ€๋Šฅํ•œ ํ† ํฐ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ† ํฐ์€ ๋ชจ๋ธ์ด ๋” ๋†’์€ ํ’ˆ์งˆ์˜ ๋ถ„ํ•  ๋งˆ์Šคํฌ๋ฅผ ์˜ˆ์ธกํ•˜๋„๋ก ๋•๋Š” ํ•ต์‹ฌ์ ์ธ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
  2. ์ „์—ญ-์ง€์—ญ ํŠน์ง• ์œตํ•ฉ: ๋ชจ๋ธ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ๊ณ„์—์„œ ์ถ”์ถœ๋œ ํŠน์ง•๋“ค์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ถ„ํ•  ๋งˆ์Šคํฌ์˜ ์„ธ๋ถ€์ ์ธ ์ •ํ™•๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์˜ ์ „์ฒด์ ์ธ ๋งฅ๋ฝ ์ •๋ณด์™€ ๊ฐ์ฒด์˜ ๋ฏธ์„ธํ•œ ๊ฒฝ๊ณ„ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ํ™œ์šฉํ•˜์—ฌ ๋งˆ์Šคํฌ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ๊ฐœ์„ : SAM ๋ชจ๋ธ์ด SA-1B์™€ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, SAM-HQ๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ๋ณ„๋œ 44,000๊ฐœ์˜ ๊ณ ํ’ˆ์งˆ ๋งˆ์Šคํฌ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ์…‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํ›ˆ๋ จ๋ฉ๋‹ˆ๋‹ค.
  4. ๋†’์€ ํšจ์œจ์„ฑ: ๋งˆ์Šคํฌ ํ’ˆ์งˆ์„ ์ƒ๋‹นํžˆ ๊ฐœ์„ ํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ถ”๊ฐ€๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‹จ 0.5%์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.
  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 ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ (๐ŸŒŽ๋กœ ํ‘œ์‹œ) ์ž๋ฃŒ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

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