Path: blob/main/transformers_doc/ko/tensorflow/semantic_segmentation.ipynb
4537 views
의미적 분할(Semantic segmentation)[[semantic-segmentation]]
의미적 분할(semantic segmentation)은 이미지의 각 픽셀에 레이블 또는 클래스를 할당합니다. 분할(segmentation)에는 여러 종류가 있으며, 의미적 분할의 경우 동일한 물체의 고유 인스턴스를 구분하지 않습니다. 두 물체 모두 동일한 레이블이 지정됩니다(예시로, "car-1" 과 "car-2" 대신 "car"로 지정합니다). 실생활에서 흔히 볼 수 있는 의미적 분할의 적용 사례로는 보행자와 중요한 교통 정보를 식별하는 자율 주행 자동차 학습, 의료 이미지의 세포와 이상 징후 식별, 그리고 위성 이미지의 환경 변화 모니터링등이 있습니다.
이번 가이드에서 배울 내용은 다음과 같습니다:
SceneParse150 데이터 세트를 이용해 SegFormer 미세 조정하기.
미세 조정된 모델을 추론에 사용하기.
이 작업과 호환되는 모든 아키텍처와 체크포인트를 보려면 작업 페이지를 확인하는 것이 좋습니다.
시작하기 전에 필요한 모든 라이브러리가 설치되었는지 확인하세요:
커뮤니티에 모델을 업로드하고 공유할 수 있도록 Hugging Face 계정에 로그인하는 것을 권장합니다. 프롬프트가 나타나면 토큰을 입력하여 로그인하세요:
SceneParse150 데이터 세트 불러오기[[load-sceneparse150-dataset]]
🤗 Datasets 라이브러리에서 SceneParse150 데이터 세트의 더 작은 부분 집합을 가져오는 것으로 시작합니다. 이렇게 하면 데이터 세트 전체에 대한 훈련에 많은 시간을 할애하기 전에 실험을 통해 모든 것이 제대로 작동하는지 확인할 수 있습니다.
데이터 세트의 train
을 train_test_split
메소드를 사용하여 훈련 및 테스트 세트로 분할하세요:
그리고 예시를 살펴보세요:
image
: 장면의 PIL 이미지입니다.annotation
: 분할 지도(segmentation map)의 PIL 이미지입니다. 모델의 타겟이기도 합니다.scene_category
: "주방" 또는 "사무실"과 같이 이미지 장면을 설명하는 카테고리 ID입니다. 이 가이드에서는 둘 다 PIL 이미지인image
와annotation
만을 사용합니다.
나중에 모델을 설정할 때 유용하게 사용할 수 있도록 레이블 ID를 레이블 클래스에 매핑하는 사전도 만들고 싶을 것입니다. Hub에서 매핑을 다운로드하고 id2label
및 label2id
사전을 만드세요:
전처리하기[[preprocess]
다음 단계는 모델에 사용할 이미지와 주석을 준비하기 위해 SegFormer 이미지 프로세서를 불러오는 것입니다. 우리가 사용하는 데이터 세트와 같은 일부 데이터 세트는 배경 클래스로 제로 인덱스를 사용합니다. 하지만 배경 클래스는 150개의 클래스에 실제로는 포함되지 않기 때문에 do_reduce_labels=True
를 설정해 모든 레이블에서 배경 클래스를 제거해야 합니다. 제로 인덱스는 255
로 대체되므로 SegFormer의 손실 함수에서 무시됩니다:
이미지 데이터 세트에 데이터 증강을 적용하여 과적합에 대해 모델을 보다 강건하게 만드는 것이 일반적입니다. 이 가이드에서는 tf.image
를 사용하여 이미지의 색상 속성을 임의로 변경합니다. 하지만, 자신이 원하는 이미지 라이브러리를 사용할 수도 있습니다.
별개의 두 변환 함수를 정의합니다:
이미지 증강을 포함하는 학습 데이터 변환
🤗 Transformers의 컴퓨터 비전 모델은 채널 우선 레이아웃을 기대하기 때문에, 이미지만 바꾸는 검증 데이터 변환
그런 다음 모델을 위해 두 개의 전처리 함수를 만들어 이미지 및 주석 배치를 준비합니다. 이 함수들은 이미지 변환을 적용하고 이전에 로드한 image_processor
를 사용하여 이미지를 pixel_values
로, 주석을 label
로 변환합니다. ImageProcessor
는 이미지의 크기 조정과 정규화도 처리합니다.
전체 데이터 집합에 전처리 변환을 적용하려면 🤗 Datasets set_transform
함수를 사용하세요. 즉시 변환이 적용되기 때문에 더 빠르고 디스크 공간을 덜 차지합니다:
평가하기[[evaluate]]
훈련 중에 메트릭을 포함하면 모델의 성능을 평가하는 데 도움이 되는 경우가 많습니다. 🤗 Evaluate 라이브러리를 사용하여 평가 방법을 빠르게 로드할 수 있습니다. 이 태스크에서는 mean Intersection over Union (IoU) 메트릭을 로드하세요 (메트릭을 로드하고 계산하는 방법에 대해 자세히 알아보려면 🤗 Evaluate quick tour를 살펴보세요).
그런 다음 메트릭을 compute
하는 함수를 만듭니다. 예측을 먼저 로짓으로 변환한 다음, 레이블의 크기에 맞게 모양을 다시 지정해야 compute
를 호출할 수 있습니다:
이제 compute_metrics
함수를 사용할 준비가 되었습니다. 트레이닝을 설정할 때 이 함수로 돌아가게 됩니다.
학습하기[[train]]
Keras로 모델을 미세 조정하는 데 익숙하지 않은 경우, 먼저 기본 튜토리얼을 확인해보세요!
TensorFlow에서 모델을 미세 조정하려면 다음 단계를 따르세요:
학습 하이퍼파라미터를 정의하고 옵티마이저와 학습률 스케쥴러를 설정하세요.
사전 학습된 모델을 인스턴스화하세요.
🤗 Dataset을
tf.data.Dataset
로 변환하세요.모델을 컴파일하세요.
콜백을 추가하여 메트릭을 계산하고 🤗 Hub에 모델을 업로드하세요.
fit()
메서드를 사용하여 훈련을 실행하세요.
하이퍼파라미터, 옵티마이저, 학습률 스케쥴러를 정의하는 것으로 시작하세요:
그런 다음 레이블 매핑과 함께 TFAutoModelForSemanticSegmentation을 사용하여 SegFormer를 불러오고 옵티마이저로 컴파일합니다. 트랜스포머 모델은 모두 디폴트로 태스크 관련 손실 함수가 있으므로 원치 않으면 지정할 필요가 없습니다:
to_tf_dataset
와 DefaultDataCollator를 사용해 데이터 세트를 tf.data.Dataset
포맷으로 변환하세요:
예측으로 정확도를 계산하고 모델을 🤗 Hub로 푸시하려면 Keras callbacks를 사용하세요. compute_metrics
함수를 KerasMetricCallback에 전달하고, 모델 업로드를 위해 PushToHubCallback를 사용하세요:
이제 모델을 훈련할 준비가 되었습니다! 훈련 및 검증 데이터 세트, 에포크 수와 함께 fit()
을 호출하고, 콜백을 사용하여 모델을 미세 조정합니다:
축하합니다! 모델을 미세 조정하고 🤗 Hub에 공유했습니다. 이제 추론에 사용할 수 있습니다!
추론하기[[inference]]
이제 모델을 미세 조정했으니 추론에 사용할 수 있습니다!
추론할 이미지를 로드하세요:

이미지 프로세서를 로드하여 이미지를 전처리하고 입력을 TensorFlow 텐서로 반환합니다:
모델에 입력을 전달하고 logits
를 반환합니다:
그런 다음 로그를 원본 이미지 크기로 재조정하고 클래스 차원에 argmax를 적용합니다:
결과를 시각화하려면 dataset color palette를 각 클래스를 RGB 값에 매핑하는 ade_palette()
로 로드합니다. 그런 다음 이미지와 예측된 분할 지도(segmentation map)을 결합하여 구성할 수 있습니다:
