Mask2Former์™€ OneFormer: ๐Ÿค— Transformers์˜ ๋ฒ”์šฉ ์ด๋ฏธ์ง€ ๋ถ„ํ•  ๋ชจ๋ธ

TL;DR

Mask2Former์™€ OneFormer๊ฐ€ ์ด์ œ ๐Ÿค— Transformers์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์กŒ์œผ๋ฉฐ, ์ž‘์—…โ€‘ํŠน์ • ๋ชจ๋ธ ์—†์ด ์ธ์Šคํ„ด์Šค, ์˜๋ฏธ, ํŒŒ๋…ธํ”„ํ‹ฑ ๋ถ„ํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ๋ถ„ํ•  ์ž‘์—…

Instance segmentation์€ ๊ฐ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค(์˜ˆ: ๊ฐ ์‚ฌ๋žŒ)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ธ์Šคํ„ด์Šค๋‹น ์ด์ง„ ๋งˆ์Šคํฌ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Semantic segmentation์€ ๊ฐ ํ”ฝ์…€์— ๋‹จ์ผ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ํ• ๋‹นํ•˜๋ฉฐ, ๋™์ผ ํด๋ž˜์Šค์˜ ๋ณ„๋„ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Panoptic segmentation์€ ๋‘ ๊ฐ€์ง€๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค: ๊ฒน์น˜์ง€ ์•Š๋Š” ์„ธ๊ทธ๋จผํŠธ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•˜๊ณ , ๊ฐ ์„ธ๊ทธ๋จผํŠธ๋Š” ์ด์ง„ ๋งˆ์Šคํฌ์™€ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง€๋ฉฐ, โ€œthingsโ€(์ธ์Šคํ„ด์Šค)์™€ โ€œstuffโ€(๋ฐฐ๊ฒฝ ์นดํ…Œ๊ณ ๋ฆฌ)๋ฅผ ๋ชจ๋‘ ํฌ๊ด„ํ•ฉ๋‹ˆ๋‹ค.

์ด ์„ธ ๊ฐ€์ง€ ํ•˜์œ„ ์ž‘์—…์€ ๊ณผ๊ฑฐ์— ์„œ๋กœ ๋‹ค๋ฅธ ๋ชจ๋ธ๊ตฐ์„ ํ•„์š”๋กœ ํ–ˆ์ง€๋งŒ, ์ตœ๊ทผ ์—ฐ๊ตฌ๋Š” ๋ชจ๋“  ์ž‘์—…์„ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹จ์ผ โ€œ๋งˆ์Šคํฌ ๋ถ„๋ฅ˜โ€ ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ์ˆ˜๋ ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ”์šฉ ์ด๋ฏธ์ง€ ๋ถ„ํ• 

2020๋…„ ์ดํ›„ DETR๊ณผ ๊ฐ™์€ ๋ชจ๋ธ์€ ํŠธ๋žœ์Šคํฌ๋จธ ๊ธฐ๋ฐ˜ ๋””์ฝ”๋”๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ด์ง„ ๋งˆ์Šคํฌ์™€ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ” ์ง‘ํ•ฉ์„ ๋ณ‘๋ ฌ๋กœ ์˜ˆ์ธกํ•จ์œผ๋กœ์จ ํ†ตํ•ฉ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ํŒŒ๋…ธํ”„ํ‹ฑ ๋ถ„ํ• ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. MaskFormer๋Š” ๋™์ผํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ์˜๋ฏธ ๋ถ„ํ• ์—๋„ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

Mask2Former๋Š” ๋ฐฑ๋ณธ, ํ”ฝ์…€ ๋””์ฝ”๋”, ํŠธ๋žœ์Šคํฌ๋จธ ๋””์ฝ”๋”๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์ด ์•„์ด๋””์–ด๋ฅผ ์ธ์Šคํ„ด์Šค ๋ถ„ํ• ์— ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹ค์Œ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  1. ๋ฐฑ๋ณธ(ResNet ๋˜๋Š” Swin Transformer)์œผ๋กœ ์ €ํ•ด์ƒ๋„ ํŠน์ง• ๋งต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ํ”ฝ์…€ ๋””์ฝ”๋”๊ฐ€ ์ด๋Ÿฌํ•œ ๋งต์„ ๊ณ ํ•ด์ƒ๋„ ํŠน์ง•์œผ๋กœ ์—…์ƒ˜ํ”Œ๋งํ•ฉ๋‹ˆ๋‹ค.
  3. ํŠธ๋žœ์Šคํฌ๋จธ ๋””์ฝ”๋”๊ฐ€ ๊ณ ์ •๋œ ์ฟผ๋ฆฌ ์ง‘ํ•ฉ์„ ๋ฐ›์•„ ์ด์ง„ ๋งˆ์Šคํฌ ์ œ์•ˆ๊ณผ ํด๋ž˜์Šค ๋กœ์ง“์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Mask2Former๋Š” ์—ฌ์ „ํžˆ ์ตœ์ฒจ๋‹จ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—…๋ณ„ ๋ณ„๋„ ํ•™์Šต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

OneFormer๋Š” Mask2Former์— ํ…์ŠคํŠธ ์ธ์ฝ”๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ชจ๋ธ์„ ์ž‘์—… ์„ค๋ช…(โ€œinstanceโ€, โ€œsemanticโ€, ๋˜๋Š” โ€œpanopticโ€)์— ์กฐ๊ฑดํ™”ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ๋…ธํ”„ํ‹ฑ ์Šคํƒ€์ผ ๋ฐ์ดํ„ฐ์…‹๋งŒ์œผ๋กœ ํ•™์Šต๋œ OneFormer๋Š” ์„ธ ์ž‘์—… ๋ชจ๋‘์—์„œ ์ตœ์ฒจ๋‹จ ๊ฒฐ๊ณผ๋ฅผ ๋‹ฌ์„ฑํ•˜์ง€๋งŒ, ์ถ”๊ฐ€ ํ…์ŠคํŠธ ์ธ์ฝ”๋”๋กœ ์ธํ•ด ์ถ”๋ก  ์ง€์—ฐ ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Swin Transformer ๋˜๋Š” DiNAT ๋ฐฑ๋ณธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Transformers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•œ ์ถ”๋ก 

๋‘ ๋ชจ๋ธ ๋ชจ๋‘ AutoImageProcessor(๋˜๋Š” OneFormerProcessor)์™€ ์ ์ ˆํ•œ ๋ชจ๋ธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ์ค„์˜ ์ฝ”๋“œ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

from transformers import AutoImageProcessor, Mask2FormerForUniversalSegmentation

processor = AutoImageProcessor.from_pretrained(
    "facebook/mask2former-swin-base-coco-panoptic"
)
model = Mask2FormerForUniversalSegmentation.from_pretrained(
    "facebook/mask2former-swin-base-coco-panoptic"
)

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ์…‹๊ณผ ๋ฐฑ๋ณธ์„ ํฌ๊ด„ํ•˜๋Š” 30๊ฐœ ์ด์ƒ์˜ ์‚ฌ์ „ ํ•™์Šต ์ฒดํฌํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ „ํ˜•์ ์ธ ์ถ”๋ก  ํŒŒ์ดํ”„๋ผ์ธ:

from PIL import Image, ImageDraw
import requests, torch

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

inputs = processor(image, return_tensors="pt")
with torch.no_grad():
    outputs = model(**inputs)

# Convert raw mask proposals to panoptic output
prediction = processor.post_process_panoptic_segmentation(
    outputs, target_sizes=[image.size[::-1]]
)[0]
print(prediction.keys())  # dict_keys(['segmentation', 'segments_info'])

prediction['segmentation']์€ ๊ฐ ํ”ฝ์…€ ๊ฐ’์ด ์ธ์Šคํ„ด์Šค ID๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” (H,โ€ฏW) ๋งต์ด๋ฉฐ, segments_info๋Š” ํด๋ž˜์Šค ID, ์ ์ˆ˜ ๋ฐ ๊ธฐํƒ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

Matplotlib์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์„ธ๊ทธ๋จผํŠธ ID๋ฅผ ๊ณ ์œ  ์ƒ‰์ƒ์— ๋งคํ•‘ํ•˜๊ณ , ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ ˆ์ „๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OneFormer ์ถ”๋ก ์€ ๋™์ผํ•œ API๋ฅผ ๋”ฐ๋ฅด์ง€๋งŒ ์ถ”๊ฐ€ ํ…์ŠคํŠธ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŒŒ๋…ธํ”„ํ‹ฑ์€ "segment everything", ์ธ์Šคํ„ด์Šค๋Š” "segment instances", ์˜๋ฏธ ๋ถ„ํ• ์€ "segment semantics"์™€ ๊ฐ™์ด ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ฐ๋ชจ ๋…ธํŠธ๋ถ์€ Hugging Face Transformersโ€‘Tutorials ์ €์žฅ์†Œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํŒŒ์ธํŠœ๋‹

ํŒŒ์ธํŠœ๋‹์€ MaskFormer์™€ ๋™์ผํ•œ ๊ณ ์ˆ˜์ค€ API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. MaskFormerForInstanceSegmentation์„ Mask2FormerForUniversalSegmentation ๋˜๋Š” OneFormerForUniversalSegmentation์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ ํด๋ž˜์Šค๋„ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค:

  • Mask2FormerImageProcessor(๋˜๋Š” AutoImageProcessor)๋Š” Mask2Former์šฉ์ž…๋‹ˆ๋‹ค.
  • OneFormerProcessor๋Š” OneFormer์šฉ์œผ๋กœ ์ด๋ฏธ์ง€์™€ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ ๋…ธํŠธ๋ถ์€ ๋ฐ์ดํ„ฐ์…‹ ์ค€๋น„, ํ•™์Šต ๋ฃจํ”„ ๋ฐ ์„ธ ๊ฐ€์ง€ ๋ถ„ํ•  ์ž‘์—…์— ๋Œ€ํ•œ ํ‰๊ฐ€ ๊ณผ์ •์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

์˜๋ฏธ์™€ ์ค‘์š”์„ฑ

  • ํ†ตํ•ฉ ์›Œํฌํ”Œ๋กœ์šฐ โ€“ ์—ฐ๊ตฌ์ž์™€ ์‹ค๋ฌด์ž๋Š” ์ด์ œ ๊ฐ ๋ถ„ํ•  ์ž‘์—…๋งˆ๋‹ค ๋ณ„๋„์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์—”์ง€๋‹ˆ์–ด๋ง ๋น„์šฉ ๊ฐ์†Œ โ€“ ๋‹จ์ผ ๋ชจ๋ธ ์ฒดํฌํฌ์ธํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์˜ˆ: ์ž์œจ ์ฃผํ–‰, ์˜๋ฃŒ ์˜์ƒ, ์ฝ˜ํ…์ธ  ๋ชจ๋”๋ ˆ์ด์…˜)์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ตœ์ฒจ๋‹จ ์„ฑ๋Šฅ โ€“ OneFormer๋Š” ๋‹จ์ผ ํŒŒ๋…ธํ”„ํ‹ฑ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ํ•™์Šต๋˜๋ฉด์„œ๋„ ํŠนํ™”๋œ ๋ชจ๋ธ์„ ๋Šฅ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋™๋“ฑํ•œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜คํ”ˆ์†Œ์Šค ์ ‘๊ทผ์„ฑ โ€“ ์ด๋Ÿฌํ•œ ๋ชจ๋ธ์„ ๐Ÿค— Transformers์— ํ†ตํ•ฉํ•จ์œผ๋กœ์จ Hugging Face๋Š” ๊ณ ํ’ˆ์งˆ ๋ถ„ํ• ์˜ ์ง„์ž… ์žฅ๋ฒฝ์„ ๋‚ฎ์ถ”๊ณ , ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘๊ณผ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์—ฐ๊ตฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค

Sources