Erkennen Sie Text in Bildern mit ML Kit auf iOS

Sie können ML Kit verwenden, um Text in Bildern zu erkennen. ML Kit verfügt sowohl über eine Allzweck-API, die sich zum Erkennen von Text in Bildern eignet, z. B. den Text eines Straßenschilds, als auch über eine API, die für die Erkennung von Dokumententext optimiert ist. Die Allzweck-API verfügt sowohl über geräteinterne als auch Cloud-basierte Modelle. Die Dokumenttexterkennung ist nur als Cloud-basiertes Modell verfügbar. Siehe die Übersicht für einen Vergleich der Cloud und On-Device - Modelle.

Bevor Sie beginnen

  1. Wenn Sie nicht bereits Firebase zu Ihrer App, tun Sie dies , indem Sie die Schritte im Leitfaden zur Inbetriebnahme .
  2. Fügen Sie die ML - Kit - Bibliotheken in Ihrem Podfile:
    pod 'Firebase/MLVision', '6.25.0'
    # If using an on-device API:
    pod 'Firebase/MLVisionTextModel', '6.25.0'
    
    Nachdem Sie Ihr Projekt Pods installieren oder aktualisieren, sollten Sie Ihre Xcode - Projekt zu öffnen , seine Verwendung .xcworkspace .
  3. Importieren Sie Firebase in Ihre App:

    Schnell

    import Firebase

    Ziel c

    @import Firebase;
  4. Wenn Sie das Cloud-basierte Modell verwenden möchten und die Cloud-basierten APIs für Ihr Projekt noch nicht aktiviert haben, tun Sie dies jetzt:

    1. Öffnen Sie die ML - Kit APIs Seite der Konsole Firebase.
    2. Wenn Sie nicht bereits Ihr Projekt zu einem Blaze Preisgestaltungsplan aktualisiert haben, klicken Sie auf, dies zu tun Upgrades. (Sie werden nur dann zum Upgrade aufgefordert, wenn Ihr Projekt nicht im Blaze-Plan enthalten ist.)

      Nur Blaze-Level-Projekte können Cloud-basierte APIs verwenden.

    3. Wenn Cloud-basierte APIs nicht bereits aktiviert ist, klicken Sie auf Aktivieren Cloud-basierte APIs.

    Wenn Sie nur das On-Device-Modell verwenden möchten, können Sie diesen Schritt überspringen.

Jetzt können Sie mit der Texterkennung in Bildern beginnen.

Richtlinien für die Eingabe von Bildern

  • Damit ML Kit Text richtig erkennen kann, müssen Eingabebilder Text enthalten, der durch ausreichend Pixeldaten dargestellt wird. Idealerweise sollte für lateinischen Text jedes Zeichen mindestens 16 x 16 Pixel groß sein. Bei chinesischem, japanischem und koreanischem Text (wird nur von den Cloud-basierten APIs unterstützt) sollte jedes Zeichen 24 x 24 Pixel groß sein. Bei allen Sprachen gibt es im Allgemeinen keinen Genauigkeitsvorteil für Zeichen, die größer als 24 x 24 Pixel sind.

    So eignet sich beispielsweise ein 640 x 480-Bild gut zum Scannen einer Visitenkarte, die die gesamte Breite des Bilds einnimmt. Um ein auf Papier im Letter-Format gedrucktes Dokument zu scannen, ist möglicherweise ein Bild mit 720 x 1280 Pixeln erforderlich.

  • Ein schlechter Bildfokus kann die Genauigkeit der Texterkennung beeinträchtigen. Wenn Sie keine akzeptablen Ergebnisse erhalten, bitten Sie den Benutzer, das Bild erneut aufzunehmen.

  • Wenn Sie Text in einer Echtzeitanwendung erkennen, sollten Sie auch die Gesamtabmessungen der Eingabebilder berücksichtigen. Kleinere Bilder können schneller verarbeitet werden. Um die Latenz zu reduzieren, nehmen Sie Bilder mit niedrigeren Auflösungen auf (beachten Sie die oben genannten Genauigkeitsanforderungen) und stellen Sie sicher, dass der Text so viel wie möglich vom Bild einnimmt. Siehe auch Tipps Echtzeit - Performance zu verbessern .


Text in Bildern erkennen

Führen Sie die Texterkennung wie unten beschrieben aus, um Text in einem Bild mit einem geräteinternen oder cloudbasierten Modell zu erkennen.

1. Führen Sie die Texterkennung aus

Übergeben Sie das Bild als `UIImage` oder `CMSampleBufferRef` an die `process(_:completion:)`-Methode von `VisionTextRecognizer`:
  1. Erhalten Sie eine Instanz von VisionTextRecognizer entweder durch Aufruf onDeviceTextRecognizer oder cloudTextRecognizer :

    Schnell

    So verwenden Sie das On-Device-Modell:

    let vision = Vision.vision()
    let textRecognizer = vision.onDeviceTextRecognizer()
    

    So verwenden Sie das Cloud-Modell:

    let vision = Vision.vision()
    let textRecognizer = vision.cloudTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudTextRecognizer(options: options)
    

    Ziel c

    So verwenden Sie das On-Device-Modell:

    FIRVision *vision = [FIRVision vision];
    FIRVisionTextRecognizer *textRecognizer = [vision onDeviceTextRecognizer];
    

    So verwenden Sie das Cloud-Modell:

    FIRVision *vision = [FIRVision vision];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudTextRecognizerOptions *options =
            [[FIRVisionCloudTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizerWithOptions:options];
    
  2. Erstellen Sie ein VisionImage Objekt unter Verwendung eines UIImage oder eine CMSampleBufferRef .

    So verwenden Sie eine UIImage :

    1. Falls erforderlich, drehen Sie das Bild so , dass seine imageOrientation Eigenschaft ist .up .
    2. Erstellen Sie ein VisionImage Objekt die korrekt gedreht mit UIImage . Geben Sie nicht jede Drehung Metadaten den Standardwert, .topLeft , verwendet werden.

      Schnell

      let image = VisionImage(image: uiImage)

      Ziel c

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    So verwenden Sie eine CMSampleBufferRef :

    1. Erstellen eines VisionImageMetadata Objekt , das angibt , ist die Orientierung der Bilddaten in der enthaltenen CMSampleBufferRef Puffer.

      So erhalten Sie die Bildausrichtung:

      Schnell

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      Ziel c

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      Erstellen Sie dann das Metadatenobjekt:

      Schnell

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      Ziel c

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. Erstellen Sie ein VisionImage Objekt mit dem CMSampleBufferRef Objekt und die Rotation von Metadaten:

      Schnell

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      Ziel c

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. Dann passiert das Bild an den process(_:completion:) Methode:

    Schnell

    textRecognizer.process(visionImage) { result, error in
      guard error == nil, let result = result else {
        // ...
        return
      }
    
      // Recognized text
    }
    

    Ziel c

    [textRecognizer processImage:image
                      completion:^(FIRVisionText *_Nullable result,
                                   NSError *_Nullable error) {
      if (error != nil || result == nil) {
        // ...
        return;
      }
    
      // Recognized text
    }];
    

2. Text aus Blöcken erkannten Texts extrahieren

Wenn der Texterkennungsvorgang erfolgreich ist, wird ein [`VisionText`][VisionText]-Objekt zurückgegeben. Ein `VisionText`-Objekt enthält den im Bild erkannten Volltext und null oder mehr [`VisionTextBlock`][VisionTextBlock]-Objekte. Jeder `VisionTextBlock` stellt einen rechteckigen Textblock dar, der null oder mehr [`VisionTextLine`][VisionTextLine]-Objekte enthält. Jedes `VisionTextLine`-Objekt enthält null oder mehr [`VisionTextElement`][VisionTextElement]-Objekte, die Wörter und wortähnliche Entitäten (Daten, Zahlen usw.) darstellen. Für jedes `VisionTextBlock`-, `VisionTextLine`- und `VisionTextElement`-Objekt können Sie den in der Region erkannten Text und die Begrenzungskoordinaten der Region abrufen. Zum Beispiel:

Schnell

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockConfidence = block.confidence
    let blockLanguages = block.recognizedLanguages
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for line in block.lines {
        let lineText = line.text
        let lineConfidence = line.confidence
        let lineLanguages = line.recognizedLanguages
        let lineCornerPoints = line.cornerPoints
        let lineFrame = line.frame
        for element in line.elements {
            let elementText = element.text
            let elementConfidence = element.confidence
            let elementLanguages = element.recognizedLanguages
            let elementCornerPoints = element.cornerPoints
            let elementFrame = element.frame
        }
    }
}

Ziel c

NSString *resultText = result.text;
for (FIRVisionTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages;
  NSArray<NSValue *> *blockCornerPoints = block.cornerPoints;
  CGRect blockFrame = block.frame;
  for (FIRVisionTextLine *line in block.lines) {
    NSString *lineText = line.text;
    NSNumber *lineConfidence = line.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages;
    NSArray<NSValue *> *lineCornerPoints = line.cornerPoints;
    CGRect lineFrame = line.frame;
    for (FIRVisionTextElement *element in line.elements) {
      NSString *elementText = element.text;
      NSNumber *elementConfidence = element.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *elementLanguages = element.recognizedLanguages;
      NSArray<NSValue *> *elementCornerPoints = element.cornerPoints;
      CGRect elementFrame = element.frame;
    }
  }
}

Tipps zur Verbesserung der Echtzeitleistung

Wenn Sie das On-Device-Modell verwenden möchten, um Text in einer Echtzeitanwendung zu erkennen, befolgen Sie diese Richtlinien, um die besten Frameraten zu erzielen:

  • Drosseln Sie Anrufe an die Texterkennung. Wenn ein neuer Videoframe verfügbar wird, während die Texterkennung ausgeführt wird, lassen Sie den Frame fallen.
  • Wenn Sie die Ausgabe des Texterkenners verwenden, um Grafiken auf dem Eingabebild zu überlagern, rufen Sie zuerst das Ergebnis von ML Kit ab und rendern Sie dann das Bild und die Überlagerung in einem einzigen Schritt. Auf diese Weise rendern Sie für jeden Eingabeframe nur einmal auf der Anzeigeoberfläche. Siehe die previewOverlayView und FIRDetectionOverlayView Klassen in der Vitrine Beispielanwendung für ein Beispiel.
  • Ziehen Sie in Erwägung, Bilder mit einer niedrigeren Auflösung aufzunehmen. Beachten Sie jedoch auch die Anforderungen an die Bildabmessungen dieser API.

Nächste Schritte


Text in Bildern von Dokumenten erkennen

Um den Text eines Dokuments zu erkennen, konfigurieren und führen Sie die cloudbasierte Dokumenttexterkennung wie unten beschrieben aus.

Die unten beschriebene Dokumenttexterkennungs-API stellt eine Schnittstelle bereit, die für die Arbeit mit Dokumentenbildern bequemer sein soll. Wenn Sie jedoch die Schnittstelle von dem spärlichen Text - API zur Verfügung gestellt bevorzugen, können Sie es verwenden , anstatt auf Dokumente scannen durch die Wolke Texterkennungs Konfiguration auf das dichte Textmodell zu verwenden .

So verwenden Sie die Dokumenttexterkennungs-API:

1. Führen Sie die Texterkennung aus

Übergeben des Bildes als UIImage oder CMSampleBufferRef auf die VisionDocumentTextRecognizer ‚s - process(_:completion:) Methode:

  1. Erhalten Sie eine Instanz von VisionDocumentTextRecognizer durch den Aufruf cloudDocumentTextRecognizer :

    Schnell

    let vision = Vision.vision()
    let textRecognizer = vision.cloudDocumentTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudDocumentTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudDocumentTextRecognizer(options: options)
    

    Ziel c

    FIRVision *vision = [FIRVision vision];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudDocumentTextRecognizerOptions *options =
            [[FIRVisionCloudDocumentTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizerWithOptions:options];
    
  2. Erstellen Sie ein VisionImage Objekt unter Verwendung eines UIImage oder eine CMSampleBufferRef .

    So verwenden Sie eine UIImage :

    1. Falls erforderlich, drehen Sie das Bild so , dass seine imageOrientation Eigenschaft ist .up .
    2. Erstellen Sie ein VisionImage Objekt die korrekt gedreht mit UIImage . Geben Sie nicht jede Drehung Metadaten den Standardwert, .topLeft , verwendet werden.

      Schnell

      let image = VisionImage(image: uiImage)

      Ziel c

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    So verwenden Sie eine CMSampleBufferRef :

    1. Erstellen eines VisionImageMetadata Objekt , das angibt , ist die Orientierung der Bilddaten in der enthaltenen CMSampleBufferRef Puffer.

      So erhalten Sie die Bildausrichtung:

      Schnell

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      Ziel c

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      Erstellen Sie dann das Metadatenobjekt:

      Schnell

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      Ziel c

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. Erstellen Sie ein VisionImage Objekt mit dem CMSampleBufferRef Objekt und die Rotation von Metadaten:

      Schnell

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      Ziel c

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. Dann passiert das Bild an den process(_:completion:) Methode:

    Schnell

    textRecognizer.process(visionImage) { result, error in
      guard error == nil, let result = result else {
        // ...
        return
      }
    
      // Recognized text
    }
    

    Ziel c

    [textRecognizer processImage:image
                      completion:^(FIRVisionDocumentText *_Nullable result,
                                   NSError *_Nullable error) {
      if (error != nil || result == nil) {
        // ...
        return;
      }
    
        // Recognized text
    }];
    

2. Text aus Blöcken erkannten Texts extrahieren

Wenn die Texterkennung Operation erfolgreich ist , wird es eine Rückkehr VisionDocumentText Objekt. Ein VisionDocumentText Objekt enthält den vollständigen Text in dem Bild erkannt und eine Hierarchie von Objekten, die die Struktur des erkannten Dokuments beziehen:

Für jede VisionDocumentTextBlock , VisionDocumentTextParagraph , VisionDocumentTextWord und VisionDocumentTextSymbol Objekt, können Sie den Text in der Region und die begrenzenden Koordinaten der Region anerkannt bekommen.

Zum Beispiel:

Schnell

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockConfidence = block.confidence
    let blockRecognizedLanguages = block.recognizedLanguages
    let blockBreak = block.recognizedBreak
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for paragraph in block.paragraphs {
        let paragraphText = paragraph.text
        let paragraphConfidence = paragraph.confidence
        let paragraphRecognizedLanguages = paragraph.recognizedLanguages
        let paragraphBreak = paragraph.recognizedBreak
        let paragraphCornerPoints = paragraph.cornerPoints
        let paragraphFrame = paragraph.frame
        for word in paragraph.words {
            let wordText = word.text
            let wordConfidence = word.confidence
            let wordRecognizedLanguages = word.recognizedLanguages
            let wordBreak = word.recognizedBreak
            let wordCornerPoints = word.cornerPoints
            let wordFrame = word.frame
            for symbol in word.symbols {
                let symbolText = symbol.text
                let symbolConfidence = symbol.confidence
                let symbolRecognizedLanguages = symbol.recognizedLanguages
                let symbolBreak = symbol.recognizedBreak
                let symbolCornerPoints = symbol.cornerPoints
                let symbolFrame = symbol.frame
            }
        }
    }
}

Ziel c

NSString *resultText = result.text;
for (FIRVisionDocumentTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockRecognizedLanguages = block.recognizedLanguages;
  FIRVisionTextRecognizedBreak *blockBreak = block.recognizedBreak;
  CGRect blockFrame = block.frame;
  for (FIRVisionDocumentTextParagraph *paragraph in block.paragraphs) {
    NSString *paragraphText = paragraph.text;
    NSNumber *paragraphConfidence = paragraph.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *paragraphRecognizedLanguages = paragraph.recognizedLanguages;
    FIRVisionTextRecognizedBreak *paragraphBreak = paragraph.recognizedBreak;
    CGRect paragraphFrame = paragraph.frame;
    for (FIRVisionDocumentTextWord *word in paragraph.words) {
      NSString *wordText = word.text;
      NSNumber *wordConfidence = word.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *wordRecognizedLanguages = word.recognizedLanguages;
      FIRVisionTextRecognizedBreak *wordBreak = word.recognizedBreak;
      CGRect wordFrame = word.frame;
      for (FIRVisionDocumentTextSymbol *symbol in word.symbols) {
        NSString *symbolText = symbol.text;
        NSNumber *symbolConfidence = symbol.confidence;
        NSArray<FIRVisionTextRecognizedLanguage *> *symbolRecognizedLanguages = symbol.recognizedLanguages;
        FIRVisionTextRecognizedBreak *symbolBreak = symbol.recognizedBreak;
        CGRect symbolFrame = symbol.frame;
      }
    }
  }
}

Nächste Schritte