Bildsegmentierer einbinden

Bildsegmentierer sagen voraus, ob jedes Pixel eines Bilds einer bestimmten Klasse zugeordnet ist. Das steht im Gegensatz zur Objekterkennung, bei der Objekte in rechteckigen Bereichen erkannt werden, und zur Bildklassifizierung, bei der das gesamte Bild klassifiziert wird. Weitere Informationen zu Bildsegmentierern finden Sie im Beispiel für die Bildsegmentierung.

Mit der ImageSegmenter-API der Task Library können Sie benutzerdefinierte oder vortrainierte Bildsegmentierer in Ihren mobilen Apps bereitstellen.

Wichtige Funktionen der ImageSegmenter API

  • Verarbeitung von Eingabebildern, einschließlich Drehung, Größenänderung und Farbraumkonvertierung.

  • Gebietsschema für Labelkarte.

  • Zwei Ausgabetypen: Kategorienmaske und Konfidenzmasken.

  • Farbige Kennzeichnung für Anzeigezwecke.

Unterstützte Bildsegmentierungsmodelle

Die folgenden Modelle sind garantiert mit der ImageSegmenter API kompatibel.

Inferenz in Java ausführen

In der Referenz-App für die Bildsegmentierung finden Sie ein Beispiel für die Verwendung von ImageSegmenter in einer Android-App.

Schritt 1: Gradle-Abhängigkeit und andere Einstellungen importieren

Kopieren Sie die Modelldatei .tflite in das Assets-Verzeichnis des Android-Moduls, in dem das Modell ausgeführt wird. Geben Sie an, dass die Datei nicht komprimiert werden soll, und fügen Sie die TensorFlow Lite-Bibliothek der build.gradle-Datei des Moduls hinzu:

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
    implementation 'org.tensorflow:tensorflow-lite-task-vision'
    // Import the GPU delegate plugin Library for GPU inference
    implementation 'org.tensorflow:tensorflow-lite-gpu-delegate-plugin'
}

Schritt 2: Modell verwenden

// 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);

Weitere Optionen zum Konfigurieren von ImageSegmenter finden Sie im Quellcode und in der Javadoc.

Inferenz auf iOS-Geräten ausführen

Schritt 1: Abhängigkeiten installieren

Die Task Library unterstützt die Installation mit CocoaPods. Prüfen Sie, ob CocoaPods auf Ihrem System installiert ist. Eine Anleitung finden Sie im CocoaPods-Installationsleitfaden.

Weitere Informationen zum Hinzufügen von Pods zu einem Xcode-Projekt finden Sie im CocoaPods-Leitfaden.

Fügen Sie den TensorFlowLiteTaskVision-Pod in die Podfile ein.

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

Achten Sie darauf, dass das .tflite-Modell, das Sie für die Inferenz verwenden, in Ihrem App-Bundle enthalten ist.

Schritt 2: Modell verwenden

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/TensorFlowLiteTaskVision.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];

Weitere Optionen zum Konfigurieren von TFLImageSegmenter finden Sie im Quellcode.

Inferenz in Python ausführen

Schritt 1: pip-Paket installieren

pip install tflite-support

Schritt 2: Modell verwenden

# 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.output_type.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)

Weitere Optionen zum Konfigurieren von ImageSegmenter finden Sie im Quellcode.

Inferenz in C++ ausführen

// 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();

Weitere Optionen zum Konfigurieren von ImageSegmenter finden Sie im Quellcode.

Beispielergebnisse

Hier sehen Sie ein Beispiel für die Segmentierungsergebnisse von deeplab_v3, einem generischen Segmentierungsmodell, das in TensorFlow Hub verfügbar ist.

Flugzeug

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.

Die Maske für die Segmentierungskategorie sollte so aussehen:

segmentation-output

Testen Sie das einfache CLI-Demotool für ImageSegmenter mit Ihrem eigenen Modell und Ihren eigenen Testdaten.

Anforderungen an die Modellkompatibilität

Für die ImageSegmenter API ist ein TFLite-Modell mit obligatorischen TFLite-Modellmetadaten erforderlich. Beispiele für das Erstellen von Metadaten für Bildsegmentierer mit der TensorFlow Lite Metadata Writer API

  • Eingabe-Bildtensor (kTfLiteUInt8/kTfLiteFloat32)

    • Bild-Eingabe der Größe [batch x height x width x channels].
    • Die Batch-Inferenz wird nicht unterstützt (batch muss 1 sein).
    • Es werden nur RGB-Eingaben unterstützt (channels muss 3 sein).
    • Wenn der Typ kTfLiteFloat32 ist, müssen NormalizationOptions an die Metadaten für die Eingabenormalisierung angehängt werden.
  • Ausgabe-Masken-Tensor: (kTfLiteUInt8/kTfLiteFloat32)

    • Tensor der Größe [batch x mask_height x mask_width x num_classes], wobei batch 1 sein muss, mask_width und mask_height die Dimensionen der vom Modell erstellten Segmentierungsmasken sind und num_classes die Anzahl der vom Modell unterstützten Klassen ist.
    • Optionale (aber empfohlene) Labelzuordnungen können als AssociatedFile-s mit dem Typ TENSOR_AXIS_LABELS angehängt werden. Sie enthalten ein Label pro Zeile. Die erste solche AssociatedFile (falls vorhanden) wird verwendet, um das Feld label (in C++ als class_name bezeichnet) der Ergebnisse zu füllen. Das Feld display_name wird aus der AssociatedFile (falls vorhanden) gefüllt, deren Gebietsschema mit dem Feld display_names_locale des ImageSegmenterOptions übereinstimmt, das bei der Erstellung verwendet wurde („en“ als Standard, d.h. Englisch). Wenn keine dieser Informationen verfügbar sind, wird nur das Feld index der Ergebnisse ausgefüllt.