๋ฌด์์ด๋ ์ธ๊ทธ๋จผํธ ๋ชจ๋ธ (SAM)
์ด๋ฏธ์ง ์ธ๊ทธ ๋จผํ ์ด์ ์ ์๋ก์ด ์งํ์ ์ฐ Segment Anything ๋ชจ๋ธ( SAM)์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค. ์ด ํ์ ์ ์ธ ๋ชจ๋ธ์ ์ค์๊ฐ ์ฑ๋ฅ์ ๊ฐ์ถ ์ ์ํ ์ด๋ฏธ์ง ์ธ๊ทธ๋จผํ ์ด์ ์ ๋์ ํ์ฌ ์ ๊ณ์ ํ๋๋ฅผ ๋ฐ๊พธ๊ณ ์ด ๋ถ์ผ์ ์๋ก์ด ํ์ค์ ์ธ์ ์ต๋๋ค.
์๊ฐ SAM: ์ธ๊ทธ๋จผํธ ์ ๋์ฝ ๋ชจ๋ธ
์ธ๊ทธ๋จผํธ ์ ๋์ฝ ๋ชจ๋ธ( SAM)์ ์ด๋ฏธ์ง ๋ถ์ ์์ ์์ ๋น๊ตํ ์ ์๋ ๋ค์ฉ๋์ฑ์ ์ ๊ณตํ๋ฉฐ ์ฆ๊ฐ์ ์ธ ๋ถํ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ต์ฒจ๋จ ์ด๋ฏธ์ง ๋ถํ ๋ชจ๋ธ๋ก, ์ด๋ฏธ์ง ๋ถํ ์ ์ํ ์๋ก์ด ๋ชจ๋ธ, ์์ ๋ฐ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋์ ํ๋ ํ๊ธฐ์ ์ธ ํ๋ก์ ํธ์ธ ์ธ๊ทธ๋จผํธ ์ ๋์ฝ ์ด๋์ ํฐ๋ธ( SAM )์ ํต์ฌ์ ํ์ฑํ๊ณ ์์ต๋๋ค.
SAM์ ๊ณ ๊ธ ์ค๊ณ ๋๋ถ์ ์ฌ์ ์ง์ ์์ด๋ ์๋ก์ด ์ด๋ฏธ์ง ๋ถํฌ์ ์์ ์ ์ ์ํ ์ ์์ผ๋ฉฐ, ์ด ๊ธฐ๋ฅ์ ์ ๋ก ์ท ์ ์ก์ด๋ผ๊ณ ํฉ๋๋ค. 1,100๋ง ๊ฐ์ ์์ ๋ ์ด๋ฏธ์ง์ 10์ต ๊ฐ ์ด์์ ๋ง์คํฌ๊ฐ ํฌํจ๋ ๋ฐฉ๋ํ SA-1B ๋ฐ์ดํฐ ์ธํธ์์ ํ์ต๋ SAM ์ ๋ง์ ๊ฒฝ์ฐ ์ด์ ์ ์์ ๊ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฅ๊ฐํ๋ ์ธ์์ ์ธ ์ ๋ก ์ท ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค.
SA-1B ์์ ์ด๋ฏธ์ง. ์๋ก ๋์ ๋ SA-1B ๋ฐ์ดํฐ ์ธํธ์ ๋ง์คํฌ๋ฅผ ์ค๋ฒ๋ ์ดํ ๋ฐ์ดํฐ ์ธํธ ์ด๋ฏธ์ง. SA-1B์๋ 1100๋ง ๊ฐ์ ๋ค์ํ ๊ณ ํด์๋, ๋ผ์ด์ ์ค ๋ฐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ๊ฐ ์ ์ฉ๋ ์ด๋ฏธ์ง์ 11์ต ๊ฐ์ ๊ณ ํ์ง ์ธ๋ถํ ๋ง์คํฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ๋ง์คํฌ๋ SAM ์ ์ํด ์์ ์๋์ผ๋ก ์ฃผ์์ ๋ฌ์์ผ๋ฉฐ, ์ฌ๋์ ํ๊ฐ์ ์๋ง์ ์คํ์ ํตํด ํ์ธ๋ ๋ฐ์ ๊ฐ์ด ๋์ ํ์ง๊ณผ ๋ค์์ฑ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค. ์ด๋ฏธ์ง๋ ์๊ฐํ๋ฅผ ์ํด ์ด๋ฏธ์ง๋น ๋ง์คํฌ ์์ ๋ฐ๋ผ ๊ทธ๋ฃนํ๋ฉ๋๋ค(ํ๊ท ์ ์ผ๋ก ์ด๋ฏธ์ง๋น 100๊ฐ ์ ๋์ ๋ง์คํฌ๊ฐ ์์).
์ธ๊ทธ๋จผํธ ์ ๋์ฝ ๋ชจ๋ธ์ ์ฃผ์ ๊ธฐ๋ฅ (SAM)
- ํ๋กฌํํธ ๊ฐ๋ฅํ ์ธ๊ทธ๋ฉํ ์ด์ ์์ : SAM ์ ํ๋กฌํํธ ๊ฐ๋ฅํ ์ธ๊ทธ๋ฉํ ์ด์ ์์ ์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์ด ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ ๊ณต๊ฐ ๋๋ ํ ์คํธ ๋จ์ ๋ฑ ์ฃผ์ด์ง ํ๋กฌํํธ์์ ์ ํจํ ์ธ๊ทธ๋ฉํ ์ด์ ๋ง์คํฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ๊ณ ๊ธ ์ํคํ ์ฒ: Segment Anything ๋ชจ๋ธ์ ๊ฐ๋ ฅํ ์ด๋ฏธ์ง ์ธ์ฝ๋, ํ๋กฌํํธ ์ธ์ฝ๋, ๊ฒฝ๋ ๋ง์คํฌ ๋์ฝ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๊ณ ์ ํ ์ํคํ ์ฒ๋ ์ ์ฐํ ํ๋กฌํํธ, ์ค์๊ฐ ๋ง์คํฌ ๊ณ์ฐ, ์ธ๊ทธ๋จผํธ ์์ ์ ๋ชจํธ์ฑ ์ธ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- SA-1B ๋ฐ์ดํฐ ์ธํธ: Segment Anything ํ๋ก์ ํธ์์ ๋์ ํ SA-1B ๋ฐ์ดํฐ ์ธํธ๋ 1100๋ง ๊ฐ์ ์ด๋ฏธ์ง์ 10์ต ๊ฐ ์ด์์ ๋ง์คํฌ๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค. ํ์ฌ๊น์ง ๊ฐ์ฅ ํฐ ๊ท๋ชจ์ ์ธ๋ถํ ๋ฐ์ดํฐ ์ธํธ์ธ ์ด ๋ฐ์ดํฐ ์ธํธ๋ SAM ์ ๋ค์ํ๊ณ ๋๊ท๋ชจ์ ํ์ต ๋ฐ์ดํฐ ์์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ ๋ก ์ท ์ฑ๋ฅ: SAM ์ ๋ค์ํ ์ธ๋ถํ ์์ ์์ ๋ฐ์ด๋ ์ ๋ก ์ท ์ฑ๋ฅ์ ๋ณด์ฌ ์ฃผ๋ฉฐ, ์ ์ํ ์์ง๋์ด๋ง ์์ด๋ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ๋๊ตฌ์ ๋๋ค.
์ธ๊ทธ๋จผํธ ์ ๋์ฝ ๋ชจ๋ธ๊ณผ SA-1B ๋ฐ์ดํฐ ์ธํธ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ์ธ๊ทธ๋จผํธ ์ ๋์ฝ ์น์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ์ฌ ์ฐ๊ตฌ ๋ ผ๋ฌธ ' ์ธ๊ทธ๋จผํธ ์ ๋์ฝ'์ ํ์ธํ์๊ธฐ ๋ฐ๋๋๋ค.
์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ธ, ์ง์๋๋ ์์ ๋ฐ ์๋ ๋ชจ๋
์ด ํ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ธ๊ณผ ํจ๊ป ํน์ ์ฌ์ ํ์ต๋ ๊ฐ์ค์น, ์ง์๋๋ ์์ , ์ถ๋ก , ๊ฒ์ฆ, ํ์ต ๋ฐ ๋ด๋ณด๋ด๊ธฐ์ ๊ฐ์ ๋ค์ํ ์๋ ๋ชจ๋์์ ํธํ์ฑ์ด ํ์๋์ด ์์ผ๋ฉฐ, ์ง์๋๋ ๋ชจ๋์ ๊ฒฝ์ฐ โ ์ด๋ชจํฐ์ฝ, ์ง์๋์ง ์๋ ๋ชจ๋์ ๊ฒฝ์ฐ โ ์ด๋ชจํฐ์ฝ์ผ๋ก ํ์๋์ด ์์ต๋๋ค.
๋ชจ๋ธ ์ ํ | ์ฌ์ ํ์ต๋ ๊ฐ์ค์น | ์ง์๋๋ ์์ | ์ถ๋ก | ์ ํจ์ฑ ๊ฒ์ฌ | ๊ต์ก | ๋ด๋ณด๋ด๊ธฐ |
---|---|---|---|---|---|---|
SAM base | sam_b.pt | ์ธ์คํด์ค ์ธ๋ถํ | โ | โ | โ | โ |
SAM large | sam_l.pt | ์ธ์คํด์ค ์ธ๋ถํ | โ | โ | โ | โ |
์ฌ์ฉ ๋ฐฉ๋ฒ SAM: ์ด๋ฏธ์ง ์ธ๋ถํ์ ๋ค์์ฑ๊ณผ ๊ฐ๋ ฅํจ
์ธ๊ทธ๋จผํธ ์ ๋์ฝ ๋ชจ๋ธ์ ํ์ต ๋ฐ์ดํฐ๋ฅผ ๋์ด์๋ ๋ค์ํ ๋ค์ด์คํธ๋ฆผ ์์ ์ ํ์ฉํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์์ง ๊ฐ์ง, ๊ฐ์ฒด ์ ์ ์์ฑ, ์ธ์คํด์ค ์ธ๋ถํ, ์๋น ํ ์คํธ-๋ง์คํฌ ์์ธก ๋ฑ์ด ํฌํจ๋ฉ๋๋ค. ์ ์ํ ์์ง๋์ด๋ง์ ํตํด SAM ์๋ก์ด ์์ ๊ณผ ๋ฐ์ดํฐ ๋ฐฐํฌ์ ์ ๋ก ์ท ๋ฐฉ์์ผ๋ก ์ ์ํ๊ฒ ์ ์ํ ์ ์์ผ๋ฏ๋ก ๋ชจ๋ ์ด๋ฏธ์ง ์ธ๋ถํ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ ๋ค์ฌ๋ค๋ฅํ๊ณ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก ์๋ฆฌ๋งค๊นํ ์ ์์ต๋๋ค.
SAM ์์ธก ์์
ํ๋กฌํํธ๊ฐ ์๋ ์ธ๊ทธ๋จผํธ
์ฃผ์ด์ง ํ๋กฌํํธ์ ๋ฐ๋ผ ์ด๋ฏธ์ง๋ฅผ ๋ถํ ํฉ๋๋ค.
from ultralytics import SAM
# Load a model
model = SAM("sam_b.pt")
# Display model information (optional)
model.info()
# Run inference with bboxes prompt
results = model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# Run inference with single point
results = model(points=[900, 370], labels=[1])
# Run inference with multiple points
results = model(points=[[400, 370], [900, 370]], labels=[1, 1])
# Run inference with multiple points prompt per object
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# Run inference with negative points prompt
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
๋ชจ๋ ๊ฒ์ ์ธ๋ถํ
์ ์ฒด ์ด๋ฏธ์ง๋ฅผ ๋ถํ ํฉ๋๋ค.
- ์ฌ๊ธฐ์ ๋ก์ง์ ํ๋กฌํํธ(b๋ฐ์ค/ํฌ์ธํธ/๋ง์คํฌ)๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฉด ์ ์ฒด ์ด๋ฏธ์ง๋ฅผ ๋ถํ ํ๋ ๊ฒ์ ๋๋ค.
SAMPredictor ์์
์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฏธ์ง ์ธ์ฝ๋๋ฅผ ์ฌ๋ฌ ๋ฒ ์คํํ์ง ์๊ณ ๋ ์ด๋ฏธ์ง๋ฅผ ํ ๋ฒ ์ค์ ํ๊ณ ํ๋กฌํํธ ์ถ๋ก ์ ์ฌ๋ฌ ๋ฒ ์คํํ ์ ์์ต๋๋ค.
from ultralytics.models.sam import Predictor as SAMPredictor
# Create SAMPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="mobile_sam.pt")
predictor = SAMPredictor(overrides=overrides)
# Set image
predictor.set_image("ultralytics/assets/zidane.jpg") # set with image file
predictor.set_image(cv2.imread("ultralytics/assets/zidane.jpg")) # set with np.ndarray
results = predictor(bboxes=[439, 437, 524, 709])
# Run inference with single point prompt
results = predictor(points=[900, 370], labels=[1])
# Run inference with multiple points prompt
results = predictor(points=[[400, 370], [900, 370]], labels=[[1, 1]])
# Run inference with negative points prompt
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
# Reset image
predictor.reset_image()
์ถ๊ฐ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํญ๋ชฉ์ ์ธ๋ถํํฉ๋๋ค.
from ultralytics.models.sam import Predictor as SAMPredictor
# Create SAMPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="mobile_sam.pt")
predictor = SAMPredictor(overrides=overrides)
# Segment with additional args
results = predictor(source="ultralytics/assets/zidane.jpg", crop_n_layers=1, points_stride=64)
์ฐธ๊ณ
๋ฐํ๋ ๋ชจ๋ results
์์ ์์์ ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์์ธก๋ ๋ง์คํฌ์ ์์ค ์ด๋ฏธ์ง์ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์์ต๋๋ค.
- ๋ค์์ ๋ํ ์ถ๊ฐ ์ธ์
Segment everything
์ฐธ์กฐPredictor/generate
์ฐธ์กฐ.
SAM ๋น๊ต ๋ YOLOv8
YOLOv8n์ฌ๊ธฐ์๋ Meta์ ๊ฐ์ฅ ์์ SAM ๋ชจ๋ธ์ธ SAM-b์ ๊ฐ์ฅ ์์ ์ธ๋ถํ ๋ชจ๋ธ์ธ Ultralytics -seg๋ฅผ ๋น๊ตํฉ๋๋ค :
๋ชจ๋ธ | ํฌ๊ธฐ (MB) |
๋งค๊ฐ๋ณ์ (M) |
์๋ (CPU) (ms/im) |
---|---|---|---|
๋ฉํ SAM-b | 358 | 94.7 | 51096 |
MobileSAM | 40.7 | 10.1 | 46122 |
FastSAM-s์ YOLOv8 ๋ฐฑ๋ณธ | 23.7 | 11.8 | 115 |
Ultralytics YOLOv8n-seg | 6.7 (53.4๋ฐฐ ์์์ง) | 3.4 (27.9๋ฐฐ ๊ฐ์) | 59 (866๋ฐฐ ๋นจ๋ผ์ง) |
์ด ๋น๊ต๋ ๋ชจ๋ธ ๊ฐ์ ๋ชจ๋ธ ํฌ๊ธฐ์ ์๋์์ ์์ฒญ๋ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค. SAM ์ ์๋ ์ธ๊ทธ๋จผํธ๋ฅผ ์ํ ๊ณ ์ ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ๋ ์๊ณ ๋น ๋ฅด๋ฉฐ ํจ์จ์ ์ธ YOLOv8 ์ธ๊ทธ๋จผํธ ๋ชจ๋ธ๊ณผ ์ง์ ์ ์ผ๋ก ๊ฒฝ์ํ๋ ๊ฒ์ ์๋๋๋ค.
ํ ์คํธ๋ 16GB RAM์ด ์ฅ์ฐฉ๋ 2023๋ ํ Apple M2 Macbook์์ ์คํ๋์์ต๋๋ค. ์ด ํ ์คํธ๋ฅผ ์ฌํํฉ๋๋ค:
์
from ultralytics import ASSETS, SAM, YOLO, FastSAM
# Profile SAM-b, MobileSAM
for file in ["sam_b.pt", "mobile_sam.pt"]:
model = SAM(file)
model.info()
model(ASSETS)
# Profile FastSAM-s
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)
# Profile YOLOv8n-seg
model = YOLO("yolov8n-seg.pt")
model.info()
model(ASSETS)
์๋ ์ฃผ์: ์ธ๋ถํ ๋ฐ์ดํฐ ์งํฉ์ ๋ํ ๋น ๋ฅธ ๊ฒฝ๋ก
์๋ ์ฃผ์์ SAM ์ ํต์ฌ ๊ธฐ๋ฅ์ผ๋ก, ์ฌ์ฉ์๊ฐ ์ฌ์ ํ์ต๋ ๊ฐ์ง ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์ธ๋ถํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋ง์ ์์ ์ด๋ฏธ์ง์ ๋น ๋ฅด๊ณ ์ ํํ๊ฒ ์ฃผ์์ ๋ฌ ์ ์์ด ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์๋ ๋ผ๋ฒจ๋ง ์์ ์ ์๋ตํ ์ ์์ต๋๋ค.
ํ์ง ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์ธ๋ถํ ๋ฐ์ดํฐ ์ธํธ ์์ฑํ๊ธฐ
Ultralytics ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์งํฉ์ ์๋ ์ฃผ์์ ๋ฌ๋ ค๋ฉด, ๋ค์์ ์ฌ์ฉํ์ญ์์ค. auto_annotate
ํจ์๋ฅผ ํธ์ถํฉ๋๋ค:
์
์ธ์ | ์ ํ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
---|---|---|---|
data |
str |
์ฃผ์์ ๋ฌ ์ด๋ฏธ์ง๊ฐ ํฌํจ๋ ํด๋์ ๊ฒฝ๋ก์ ๋๋ค. | |
det_model |
str ์ ํ ์ฌํญ |
์ฌ์ ํ์ต๋ YOLO ํ์ง ๋ชจ๋ธ. ๊ธฐ๋ณธ๊ฐ์ 'yolo11x.pt'์ ๋๋ค. | 'yolo11x.pt' |
sam_model |
str ์ ํ ์ฌํญ |
์ฌ์ ํ์ต๋ SAM ์ธ๋ถํ ๋ชจ๋ธ. ๊ธฐ๋ณธ๊ฐ์ 'sam_b.pt'์ ๋๋ค. | 'sam_b.pt' |
device |
str ์ ํ ์ฌํญ |
๋ชจ๋ธ์ ์คํํ ์ฅ์น์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ๋น ๋ฌธ์์ด(CPU ๋๋ GPU, ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ)์ ๋๋ค. | |
conf |
float ์ ํ ์ฌํญ |
ํ์ง ๋ชจ๋ธ์ ๋ํ ์ ๋ขฐ๋ ์๊ณ๊ฐ, ๊ธฐ๋ณธ๊ฐ์ 0.25์ ๋๋ค. | 0.25 |
iou |
float ์ ํ ์ฌํญ |
ํ์ง ๊ฒฐ๊ณผ์์ ๊ฒน์น๋ ์์๋ฅผ ํํฐ๋งํ๊ธฐ ์ํ IoU ์๊ณ๊ฐ(๊ธฐ๋ณธ๊ฐ์ 0.45)์ ๋๋ค. | 0.45 |
imgsz |
int ์ ํ ์ฌํญ |
์ด๋ฏธ์ง ํฌ๊ธฐ ์กฐ์ ์น์๋ฅผ ์ ๋ ฅํฉ๋๋ค(๊ธฐ๋ณธ๊ฐ์ 640). | 640 |
max_det |
int ์ ํ ์ฌํญ |
์ด๋ฏธ์ง๋น ๊ฐ์ง๋ฅผ ์ ํํ์ฌ ๋ฐ์ง๋ ์ฅ๋ฉด์์ ์ถ๋ ฅ์ ์ ์ดํฉ๋๋ค. | 300 |
classes |
list ์ ํ ์ฌํญ |
์์ธก์ ์ง์ ๋ ํด๋์ค ID๋ก ํํฐ๋งํ์ฌ ๊ด๋ จ ํ์ง๋ง ๋ฐํํฉ๋๋ค. | None |
output_dir |
str , ์์, ์ ํ ์ฌํญ |
๋๋ ํฐ๋ฆฌ์ ์ฃผ์์ด ๋ฌ๋ฆฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ '๋ฐ์ดํฐ'์ ๊ฐ์ ๋๋ ํฐ๋ฆฌ์ ์๋ '๋ ์ด๋ธ' ํด๋์ ๋๋ค. | None |
๊ทธ๋ฆฌ๊ณ auto_annotate
ํจ์๋ ์ด๋ฏธ์ง ๊ฒฝ๋ก์ ํจ๊ป ์ฌ์ ํ์ต๋ ํ์ง ๋ฐ SAM ์ธ๋ถํ ๋ชจ๋ธ, ๋ชจ๋ธ์ ์คํํ ์ฅ์น, ์ฃผ์์ด ๋ฌ๋ฆฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ์ถ๋ ฅ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํ๊ธฐ ์ํ ์ ํ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค.
์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์ฌ์ฉํ ์๋ ์ฃผ์์ ์ฌ์ฉํ๋ฉด ๊ณ ํ์ง์ ์ธ๋ถํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋๊ท๋ชจ ์ด๋ฏธ์ง ์ปฌ๋ ์ ์ ๋ค๋ฃจ๋ ์ฐ๊ตฌ์์ ๊ฐ๋ฐ์๊ฐ ์๋ ์ฃผ์ ์์ ๋์ ๋ชจ๋ธ ๊ฐ๋ฐ๊ณผ ํ๊ฐ์ ์ง์คํ ์ ์๊ฒ ํด์ฃผ๋ฏ๋ก ํนํ ์ ์ฉํฉ๋๋ค.
์ธ์ฉ ๋ฐ ๊ฐ์ฌ
์ฐ๊ตฌ ๋๋ ๊ฐ๋ฐ ์์ ์ SAM ์ด ์ ์ฉํ๋ค๊ณ ์๊ฐ๋๋ฉด ์ ํฌ ๋ ผ๋ฌธ์ ์ธ์ฉํด ์ฃผ์ธ์:
@misc{kirillov2023segment,
title={Segment Anything},
author={Alexander Kirillov and Eric Mintun and Nikhila Ravi and Hanzi Mao and Chloe Rolland and Laura Gustafson and Tete Xiao and Spencer Whitehead and Alexander C. Berg and Wan-Yen Lo and Piotr Dollรกr and Ross Girshick},
year={2023},
eprint={2304.02643},
archivePrefix={arXiv},
primaryClass={cs.CV}
}
์ปดํจํฐ ๋น์ ์ปค๋ฎค๋ํฐ๋ฅผ ์ํด ์ด ๊ท์คํ ๋ฆฌ์์ค๋ฅผ ๋ง๋ค๊ณ ์ ์ง ๊ด๋ฆฌํด ์ฃผ์ Meta AI์ ๊ฐ์ฌ์ ๋ง์์ ์ ํฉ๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
Ultralytics ์ ์ธ๊ทธ๋จผํธ ์ ๋์ฝ ๋ชจ๋ธ(SAM)์ด๋ ๋ฌด์์ธ๊ฐ์?
Ultralytics Segment Anything Model(SAM)์ ํ๋กฌํํธ ๋ถํ ์์ ์ ์ํด ์ค๊ณ๋ ํ์ ์ ์ธ ์ด๋ฏธ์ง ๋ถํ ๋ชจ๋ธ์ ๋๋ค. ์ด ๋ชจ๋ธ์ ๊ฒฝ๋ ๋ง์คํฌ ๋์ฝ๋์ ๊ฒฐํฉ๋ ์ด๋ฏธ์ง ๋ฐ ํ๋กฌํํธ ์ธ์ฝ๋๋ฅผ ํฌํจํ ๊ณ ๊ธ ์ํคํ ์ฒ๋ฅผ ํ์ฉํ์ฌ ๊ณต๊ฐ ๋๋ ํ ์คํธ ๋จ์์ ๊ฐ์ ๋ค์ํ ํ๋กฌํํธ์์ ๊ณ ํ์ง ์ธ๊ทธ๋จผํ ์ด์ ๋ง์คํฌ๋ฅผ ์์ฑํฉ๋๋ค. ๋ฐฉ๋ํ SA-1B ๋ฐ์ดํฐ ์ธํธ์์ ํ์ต๋ SAM ์ ์ ๋ก ์ท ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ฌ์ ์ง์ ์์ด๋ ์๋ก์ด ์ด๋ฏธ์ง ๋ถํฌ์ ์์ ์ ์ ์ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ์์ธํ ์์๋ณด์ธ์.
์ด๋ฏธ์ง ๋ถํ ์ ์ํด Segment Anything ๋ชจ๋ธ(SAM)์ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
๊ฒฝ๊ณ ์์๋ ์ ๊ณผ ๊ฐ์ ๋ค์ํ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ก ์ ์คํํ์ฌ ์ด๋ฏธ์ง ๋ถํ ์ ์ํด Segment Anything ๋ชจ๋ธ(SAM)์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์์ Python ์ ์ฌ์ฉํ ์์์ ๋๋ค:
from ultralytics import SAM
# Load a model
model = SAM("sam_b.pt")
# Segment with bounding box prompt
model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# Segment with points prompt
model("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])
# Segment with multiple points prompt
model("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[[1, 1]])
# Segment with multiple points prompt per object
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# Segment with negative points prompt.
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
๋๋ ๋ช ๋ น์ค ์ธํฐํ์ด์ค(CLI)์์ SAM ๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ก ์ ์คํํ ์ ์์ต๋๋ค:
์์ธํ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ธ๋ถํ ์น์ ์ ์ฐธ์กฐํ์ธ์.
SAM ์ YOLOv8 ์ ์ฑ๋ฅ์ ์ด๋ป๊ฒ ๋น๊ต๋๋์?
YOLOv8, SAM ๊ณผ ๋น๊ตํ๋ฉด SAM-b ๋ฐ FastSAM-s์ ๊ฐ์ ๋ชจ๋ธ์ ๋ ํฌ๊ณ ๋๋ฆฌ์ง๋ง ์๋ ์ธ๋ถํ๋ฅผ ์ํ ๊ณ ์ ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด Ultralytics YOLOv8n -seg๋ SAM-b๋ณด๋ค 53.4๋ฐฐ ์๊ณ 866๋ฐฐ ๋น ๋ฆ ๋๋ค. ํ์ง๋ง SAM ์ ์ ๋ก ์ท ์ฑ๋ฅ์ ํ๋ จ๋์ง ์์ ๋ค์ํ ์์ ์์ ๋งค์ฐ ์ ์ฐํ๊ณ ํจ์จ์ ์ ๋๋ค. SAM ์ YOLOv8 ์ ์ฑ๋ฅ ๋น๊ต์ ๋ํ ์์ธํ ๋ด์ฉ์์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
SAM ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์งํฉ์ ์๋ ์ฃผ์์ ๋ฌ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
Ultralytics' SAM ์์๋ ์ฌ์ ํ์ต๋ ํ์ง ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์ธ๋ถํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์์ฑํ ์ ์๋ ์๋ ์ฃผ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ค์์ Python ์ ์๋ ์์ ์ ๋๋ค:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolov8x.pt", sam_model="sam_b.pt")
์ด ํจ์๋ ์ด๋ฏธ์ง ๊ฒฝ๋ก์ ์ฌ์ ํ์ต๋ ๊ฐ์ง ๋ฐ SAM ์ธ๋ถํ ๋ชจ๋ธ์ ๋ํ ์ ํ์ ์ธ์๋ฅผ ์ฅ์น ๋ฐ ์ถ๋ ฅ ๋๋ ํ ๋ฆฌ ์ฌ์๊ณผ ํจ๊ป ๊ฐ์ ธ์ต๋๋ค. ์ ์ฒด ๊ฐ์ด๋๋ ์๋ ์ฃผ์์ ์ฐธ์กฐํ์ธ์.
์ธ๊ทธ๋จผํธ ์ ๋์ฝ ๋ชจ๋ธ(SAM)์ ํ์ตํ๋ ๋ฐ ์ด๋ค ๋ฐ์ดํฐ ์ธํธ๊ฐ ์ฌ์ฉ๋๋์?
SAM ๋ 1100๋ง ๊ฐ์ ์ด๋ฏธ์ง์ ๊ฑธ์ณ 10์ต ๊ฐ ์ด์์ ๋ง์คํฌ๋ก ๊ตฌ์ฑ๋ ๋ฐฉ๋ํ SA-1B ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ต๋ฉ๋๋ค. SA-1B๋ ํ์ฌ๊น์ง ๊ฐ์ฅ ํฐ ์ธ๋ถํ ๋ฐ์ดํฐ ์ธํธ๋ก, ๊ณ ํ์ง์ ๋ค์ํ ํ์ต ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ์ฌ ๋ค์ํ ์ธ๋ถํ ์์ ์์ ์ธ์์ ์ธ ์ ๋ก ์ท ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ฐ์ดํฐ ์ธํธ ์น์ ์ ์ฐธ์กฐํ์ธ์.