이미지 분할기 통합하기

이미지 분할기는 이미지의 각 픽셀이 특정 클래스와 연관되어 있는지 여부를 예측합니다. 이는 직사각형 영역에서 객체를 감지하는 객체 감지, 그리고 전체 이미지를 분류하는 이미지 분류와 대조적입니다. 이미지 분할기에 대한 자세한 내용은 이미지 분할 개요를 참조하세요.

Task Library ImageSegmenter API를 사용하여 사용자 정의 이미지 분할기 또는 사전 훈련된 분할기를 모델 앱에 배포합니다.

ImageSegmenter API의 주요 특징

  • 회전, 크기 조정 및 색 공간 변환을 포함한 입력 이미지 처리

  • 레이블 맵 로케일

  • 범주 마스크와 신뢰 마스크의 두 가지 출력 유형

  • 표시 목적의 컬러 레이블

지원되는 이미지 분할기 모델

다음 모델은 ImageSegmenter API와의 호환성이 보장됩니다.

Java에서 추론 실행하기

Android 앱에서 ImageSegmenter를 사용하는 방법의 예는 Image Segmentation 참조 앱을 참조하세요.

1단계: Gradle 종속성 및 기타 설정 가져오기

.tflite 모델 파일을 모델이 실행될 Android 모듈의 assets 디렉토리에 복사합니다. 파일을 압축하지 않도록 지정하고 TensorFlow Lite 라이브러리를 모듈의 build.gradle 파일에 추가합니다.

android {
    // Other settings

    // Specify tflite file should not be compressed for the app apk
    aaptOptions {
        noCompress "tflite"
    }
}

dependencies {
    // Other dependencies

    // Import the Task Vision Library dependency (NNAPI is included)
    implementation 'org.tensorflow:tensorflow-lite-task-vision'
    // Import the GPU delegate plugin Library for GPU inference
    implementation 'org.tensorflow:tensorflow-lite-gpu-delegate-plugin'
}

참고: Android Gradle 플러그인 버전 4.1부터는 .tflite가 기본적으로 noCompress 목록에 추가되며 위의 aaptOptions는 더 이상 필요하지 않습니다.

2단계: 모델 사용하기

// Initialization
ImageSegmenterOptions options =
    ImageSegmenterOptions.builder()
        .setBaseOptions(BaseOptions.builder().useGpu().build())
        .setOutputType(OutputType.CONFIDENCE_MASK)
        .build();
ImageSegmenter imageSegmenter =
    ImageSegmenter.createFromFileAndOptions(context, modelFile, options);

// Run inference
List<Segmentation> results = imageSegmenter.segment(image);

ImageSegmenter 구성에 대한 추가 옵션은 소스 코드 및 javadoc를 참조하세요.

iOS에서 추론 실행하기

1단계: 종속성 설치하기

작업 라이브러리는 CocoaPods를 사용한 설치를 지원합니다. 시스템에 CocoaPods가 설치되어 있는지 확인하세요. 지침은 CocoaPods 설치 가이드를 참조하세요.

Xcode 프로젝트에 포드를 추가하는 방법에 대한 자세한 내용은 CocoaPods 가이드를 참조하세요.

Podfile에 TensorFlowLiteTaskVision 포드를 추가합니다.

target 'MyAppWithTaskAPI' do
  use_frameworks!
  pod 'TensorFlowLiteTaskVision'
end

추론에 사용할 .tflite 모델이 앱 번들에 있어야 합니다.

2단계: 모델 사용하기

Swift

// Imports
import TensorFlowLiteTaskVision

// Initialization
guard let modelPath = Bundle.main.path(forResource: "deeplabv3",
                                            ofType: "tflite") else { return }

let options = ImageSegmenterOptions(modelPath: modelPath)

// Configure any additional options:
// options.outputType = OutputType.confidenceMasks

let segmenter = try ImageSegmenter.segmenter(options: options)

// Convert the input image to MLImage.
// There are other sources for MLImage. For more details, please see:
// https://developers.google.com/ml-kit/reference/ios/mlimage/api/reference/Classes/GMLImage
guard let image = UIImage (named: "plane.jpg"), let mlImage = MLImage(image: image) else { return }

// Run inference
let segmentationResult = try segmenter.segment(mlImage: mlImage)

Objective C

// Imports
#import <TensorFlowLiteTaskVision/TFLTaskVision.h>

// Initialization
NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"deeplabv3" ofType:@"tflite"];

TFLImageSegmenterOptions *options =
    [[TFLImageSegmenterOptions alloc] initWithModelPath:modelPath];

// Configure any additional options:
// options.outputType = TFLOutputTypeConfidenceMasks;

TFLImageSegmenter *segmenter = [TFLImageSegmenter imageSegmenterWithOptions:options
                                                                      error:nil];

// Convert the input image to MLImage.
UIImage *image = [UIImage imageNamed:@"plane.jpg"];

// There are other sources for GMLImage. For more details, please see:
// https://developers.google.com/ml-kit/reference/ios/mlimage/api/reference/Classes/GMLImage
GMLImage *gmlImage = [[GMLImage alloc] initWithImage:image];

// Run inference
TFLSegmentationResult *segmentationResult =
    [segmenter segmentWithGMLImage:gmlImage error:nil];

TFLImageSegmenter 구성을 위한 추가 옵션은 소스 코드를 참조하세요.

Python에서 추론 실행하기

1단계: pip 패키지 설치하기

pip install tflite-support

2단계: 모델 사용하기

# Imports
from tflite_support.task import vision
from tflite_support.task import core
from tflite_support.task import processor

# Initialization
base_options = core.BaseOptions(file_name=model_path)
segmentation_options = processor.SegmentationOptions(
    output_type=processor.SegmentationOptions.OutputType.CATEGORY_MASK)
options = vision.ImageSegmenterOptions(base_options=base_options, segmentation_options=segmentation_options)
segmenter = vision.ImageSegmenter.create_from_options(options)

# Alternatively, you can create an image segmenter in the following manner:
# segmenter = vision.ImageSegmenter.create_from_file(model_path)

# Run inference
image_file = vision.TensorImage.create_from_file(image_path)
segmentation_result = segmenter.segment(image_file)

ImageSegmenter 구성에 대한 추가 옵션은 소스 코드를 참조하세요.

C++에서 추론 실행하기

// Initialization
ImageSegmenterOptions options;
options.mutable_base_options()->mutable_model_file()->set_file_name(model_path);
std::unique_ptr<ImageSegmenter> image_segmenter = ImageSegmenter::CreateFromOptions(options).value();

// Create input frame_buffer from your inputs, `image_data` and `image_dimension`.
// See more information here: tensorflow_lite_support/cc/task/vision/utils/frame_buffer_common_utils.h
std::unique_ptr<FrameBuffer> frame_buffer = CreateFromRgbRawBuffer(
      image_data, image_dimension);

// Run inference
const SegmentationResult result = image_segmenter->Segment(*frame_buffer).value();

ImageSegmenter 구성에 대한 추가 옵션은 소스 코드를 참조하세요.

예제 결과

다음은 TensorFlow Hub에서 사용할 수 있는 일반적인 분할 모델인 deeplab_v3의 분할 결과를 보여주는 예입니다.

비행기

Color Legend:
 (r: 000, g: 000, b: 000):
  index       : 0
  class name  : background
 (r: 128, g: 000, b: 000):
  index       : 1
  class name  : aeroplane

# (omitting multiple lines for conciseness) ...

 (r: 128, g: 192, b: 000):
  index       : 19
  class name  : train
 (r: 000, g: 064, b: 128):
  index       : 20
  class name  : tv
Tip: use a color picker on the output PNG file to inspect the output mask with
this legend.

분할 범주 마스크는 다음과 같아야 합니다.

분할 출력

자체 모델 및 테스트 데이터로 간단한 ImageSegmenter용 CLI 데모 도구를 시도해 보세요.

모델 호환성 요구 사항

ImageSegmenter API는 필수 TFLite 모델 메타데이터가 있는 TFLite 모델을 예상합니다. TensorFlow Lite Metadata Writer API를 사용하여 이미지 분류자에 대한 메타데이터를 생성하는 예를 참조하세요.

  • 입력 이미지 텐서(kTfLiteUInt8/kTfLiteFloat32)

    • 이미지 입력 크기는 [batch x height x width x channels]입니다.
    • 배치 추론은 지원되지 않습니다(batch는 1이어야 함).
    • RGB 입력만 지원됩니다(channels은 3이어야 함).
    • 유형이 kTfLiteFloat32인 경우, 입력 정규화를 위해 NormalizationOptions를 메타데이터에 첨부해야 합니다.
  • 출력 마스크 텐서: (kTfLiteUInt8/kTfLiteFloat32)

    • [batch x mask_height x mask_width x num_classes] 크기의 텐서(여기서 batch는 1이어야 하고, mask_widthmask_height는 모델에 의해 생성된 분할 마스크의 차원이며, num_classes는 모델에서 지원하는 클래스의 수입니다.)
    • 선택적 (권장함) 레이블 맵은 한 줄에 하나의 레이블을 포함하여 TENSOR_VALUE_LABELS 유형의 AssociatedFile-s로 첨부할 수 있습니다. 첫 번째 AssociatedFile(있는 경우)은 결과의 label 필드(C++에서 class_name으로 명명됨)를 채우는 데 사용됩니다. display_name 필드는 생성 시 사용된 ImageSegmenterOptionsdisplay_names_locale 필드와 로케일이 일치하는 AssociatedFile(있는 경우)로부터 채워집니다(기본적으로 "en", 즉 영어). 이들 중 어느 것도 사용할 수 없는 경우, 결과의 index 필드만 채워집니다.