[파이썬] fastai 객체 분할 및 인스턴스 분할

파이썬의 fastai 라이브러리는 딥러닝 모델을 구축하고 학습시키는 데 매우 유용한 도구입니다. 객체 분할과 인스턴스 분할은 fastai를 사용하여 이미지를 분류하는 데 자주 사용되는 기술입니다. 이 기술을 사용하면 이미지에 존재하는 객체나 인스턴스를 정확하게 식별하고 분류할 수 있습니다.

객체 분할

객체 분할은 이미지 내에서 특정 객체 영역을 표시하는 기술입니다. 예를 들어, 사람이 있는 이미지에서 사람의 윤곽을 표시하고 다른 객체의 윤곽을 나타내지 않습니다. fastai에서 객체 분할을 위해서는 이미지와 해당 객체의 윤곽에 대한 마스크가 필요합니다.

from fastai.vision import *
from fastai.callbacks import *

path = Path('path_to_image_folder')
codes = np.array(['person', 'cat', 'dog'])

def get_y_fn(x):
    return path/f'{x.stem}_mask{x.suffix}'

src = (SegmentationItemList.from_folder(path)
       .split_by_folder(valid='valid')
       .label_from_func(get_y_fn, classes=codes))

data = (src.transform(get_transforms(), size=128, tfm_y=True)
        .databunch(bs=16)
        .normalize(imagenet_stats))

learn = unet_learner(data, models.resnet34, metrics=[accuracy, dice])
learn.fit_one_cycle(5, max_lr=1e-3, callbacks=[SaveModelCallback(learn)])

위의 예시 코드는 모델을 학습시키기 위한 fastai의 객체 분할 코드입니다. path 변수는 이미지가 저장된 폴더의 경로를 지정하는 것입니다. codes 변수는 분류할 객체의 종류를 나타내는 라벨입니다. get_y_fn 함수는 마스크 이미지의 경로를 생성하는데 사용됩니다.

SegmentationItemList.from_folder() 함수를 사용하여 이미지를 불러온 다음, split_by_folder() 함수를 사용하여 훈련 및 검증 데이터로 나눕니다. label_from_func() 함수를 사용하여 마스크 이미지를 불러오고 클래스를 지정합니다.

데이터에 변환을 적용하고, databunch() 함수를 사용하여 데이터를 묶음으로 만들고, normalize() 함수를 사용하여 데이터를 정규화합니다. unet_learner() 함수를 사용하여 모델을 생성하고, fit_one_cycle() 함수를 사용하여 모델을 학습시킵니다.

인스턴스 분할

인스턴스 분할은 객체 분할과 유사하지만, 서로 다른 객체들 사이의 구분을 할 수 있습니다. 예를 들어, 사람과 고양이가 함께 있는 이미지에서 각 객체를 개별적으로 식별할 수 있습니다. fastai에서 인스턴스 분할을 위해서는 객체의 유일한 식별자(인스턴스 ID)를 갖고 있는 마스크가 필요합니다.

위의 객체 분할 예시 코드를 사용하여 객체 분할을 수행하되, classes 인자 대신 해당 객체의 식별자를 지정합니다.

from fastai.vision import *
from fastai.callbacks import *

path = Path('path_to_image_folder')
codes = np.array(['person', 'cat', 'dog'])
void_code = -1

def get_y_fn(x):
    return path/f'{x.stem}_mask{x.suffix}'

src = (SegmentationItemList.from_folder(path)
       .split_by_folder(valid='valid')
       .label_from_func(get_y_fn, classes=codes, void_code=void_code))

data = (src.transform(get_transforms(), size=128, tfm_y=True)
        .databunch(bs=16)
        .normalize(imagenet_stats))

learn = unet_learner(data, models.resnet34, metrics=[accuracy, dice])
learn.fit_one_cycle(5, max_lr=1e-3, callbacks=[SaveModelCallback(learn)])

위의 코드에서는 void_code 변수를 사용하여 배경을 나타내는 마스크 픽셀을 표시합니다. 배경은 식별할 객체가 없음을 의미합니다.

이제 객체 분할과 인스턴스 분할을 위한 fastai 코드의 예시를 살펴보았습니다. 이러한 기술을 사용하여 다양한 이미지 처리 작업을 수행할 수 있습니다. 객체 분할 및 인스턴스 분할에 대한 자세한 내용은 fastai 문서를 참조하시기 바랍니다.