Ultralytics YOLO27:
Get Started

Inferenz#

Ultralytics Platform bietet browserbasierte Inferenz zum Testen trainierter Modelle sowie dedizierte Endpunkte für den programmgesteuerten Zugriff.

Vorhersage-Tab für Ultralytics Platform-Modelle mit eingeblendeten Erkennungen

Tab „Vorhersage“#

Jedes Modell mit Gewichten enthält einen Tab Predict für browserbasierte Inferenz:

  1. Rufe dein Modell auf
  2. Klicke auf den Tab Vorhersage
  3. Lade ein Bild hoch, verwende ein Beispiel oder öffne deine Webcam
  4. Prüfe die aufgabenspezifische Einblendung, die Vorhersagezusammenfassung, die Zeitangaben und die Rohantwort

Bei Modellen ohne Gewichte wird stattdessen ein leerer Zustand angezeigt – trainiere das Modell oder lade zuerst Gewichte hoch.

Bild-Uploadfeld im Vorhersage-Tab von Ultralytics Platform

Eingabemethoden#

Das Vorhersagefeld unterstützt mehrere Eingabemethoden:

MethodeBeschreibung
Bild hochladenZiehe ein Bild per Drag-and-drop hinein oder klicke, um es hochzuladen
BeispielbilderKlicke auf integrierte Beispiele (Datensatzbilder oder Standardbeispiele)
Webcam-AufnahmeLive-Kamerabild mit Aufnahme einzelner Bilder
IP-KameraRTSP- oder RTSPS-Stream auf deiner eigenen Bereitstellung
graph LR
    A[Upload Image]:::start --> D[Auto-Inference]:::proc
    B[Example Image]:::start --> D
    C[Webcam Capture]:::start --> D
    D --> E[Results + Overlays]:::out

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef out fill:#9C27B0,color:#fff

Bild hochladen#

Per Drag-and-drop hineinziehen oder zum Hochladen klicken:

  • Unterstützte Formate: JPEG, PNG, WebP, AVIF, HEIC, JP2, TIFF, BMP
  • Maximale Größe: 10 MB
  • Automatische Inferenz: Ergebnisse werden nach dem Hochladen automatisch angezeigt
Automatische Inferenz

Das Vorhersagefeld führt automatisch eine Inferenz aus, wenn du ein Bild hochlädst, ein Beispiel auswählst oder ein Webcam-Bild aufnimmst. Ein Klick auf eine Schaltfläche ist nicht erforderlich.

Größenänderung auf dem Client

Vor dem Hochladen passt das Feld die Bildgröße so an, dass die längste Seite der ausgewählten Image Size entspricht, und fordert normalisierte Koordinaten an. So bleiben Tests im Browser schnell; Anfragen, die du selbst sendest, werden nicht in der Größe angepasst.

Beispielbilder#

Das Vorhersagefeld zeigt bis zu zwei Beispielbilder aus dem mit deinem Modell verknüpften Datensatz an. Dabei wird zuerst der Split val, dann test und anschließend train bevorzugt. Wenn kein Datensatz verknüpft ist, werden Standardbeispiele verwendet:

BildInhalt
bus.jpgStraßenszene mit Fahrzeugen
zidane.jpgSportszene mit Personen

Bei OBB-Modellen werden stattdessen Luftbilder von Booten und einem Flughafen angezeigt.

Vorgeladene Bilder

Beispielbilder werden beim Laden der Seite vorgeladen. Wenn du auf ein Beispiel klickst, startet die Inferenz daher nahezu sofort und ohne Wartezeit für den Download.

Webcam#

Wähle oberhalb des Bildbereichs Webcam aus, um eine Live-Kameraübertragung zu starten:

  1. Erteile die Kameraberechtigung, wenn du dazu aufgefordert wirst
  2. Klicke auf die Videovorschau, um ein Bild aufzunehmen
  3. Die Inferenz wird automatisch auf dem aufgenommenen Bild ausgeführt
  4. Klicke auf Zurück zur Webcam, um zur Live-Übertragung zurückzukehren.

Auf dem Tab Predict deiner eigenen Bereitstellung läuft die Inferenz mit der Webcam stattdessen fortlaufend. Weitere Informationen findest du unter Live-Kamerainferenz.

Ergebnisse anzeigen#

Die Inferenzergebnisse zeigen die für die Modellaufgabe passenden Ausgaben: Boxen, Masken, Keypoints, orientierte Boxen, Klassifikationswerte, semantische Abdeckung oder eine Tiefenkarte. Für Objektergebnisse werden, sofern verfügbar, die Klassenfarben des Datensatzes verwendet. Das Feld zeigt außerdem die Zeitangaben für Vorverarbeitung, Inferenz, Nachverarbeitung und Netzwerk an.

Ergebnisse im Vorhersage-Tab von Ultralytics Platform mit Erkennungen und Laufzeitangaben

Das Ergebnisfeld zeigt Folgendes:

FeldBeschreibung
ErgebnisübersichtListe der einzelnen Erkennungen oder die fünf besten Klassen bei Klassifikations- und semantischen Modellen
LaufzeitangabenVorverarbeitung, Inferenz, Nachverarbeitung und Netzwerk (ms)
VersionenUltralytics- und PyTorch-Versionen sowie gegebenenfalls Tiefenbereich oder Maskengröße
JSON-AntwortUnverarbeitete API-Antwort in einem Codeblock, wobei Base64-Kartendaten ausgelassen werden

Sobald Ergebnisse vorliegen, werden zwei Steuerelemente über der Vorschau angezeigt: Klicke auf das Bild, um es mit weiterhin eingeblendeten Überlagerungen zu vergrößern, und verwende die Schaltfläche zum Herunterladen, um ein mit Anmerkungen versehenes JPEG des aktuellen Ergebnisses zu speichern.

Inferenzparameter#

Passe das Inferenzverhalten mit den drei Schiebereglern unter dem Bild an (Tiefenmodelle zeigen nur Bildgröße):

Schieberegler für Parameter im Vorhersage-Tab der Ultralytics Platform

ParameterBereichStandardBeschreibung
Konfidenz0.01 – 1.0, Schritte von 0.010.25Mindest-Konfidenzschwelle
IoU0.0 – 0.95, Schritte von 0.010.7NMS-IoU-Schwellenwert
Bildgröße32 – 1280, Schritte von 32640Größe der Eingabe
Automatischer erneuter Durchlauf

Wenn du einen Parameter änderst, wird die Inferenz für das aktuelle Bild nach einer Verzögerung von 500 ms automatisch erneut ausgeführt. Du musst das Bild nicht erneut hochladen.

Konfidenzschwelle#

Filtere Vorhersagen nach Konfidenz:

  • Höher (0.5+): Weniger, aber sicherere Vorhersagen
  • Niedriger (0.1-0.25): Mehr Vorhersagen, aber auch einige Fehlalarme
  • Standard (0.25): Ausgewogen für die meisten Anwendungsfälle

IoU-Schwellenwert#

Steuere die Non-Maximum Suppression:

  • Höher (0.7+): Mehr überlappende Boxen zulassen
  • Niedriger (0.3-0.5): Überlappende Erkennungen stärker unterdrücken
  • Standard (0.7): Ausgewogenes NMS-Verhalten für die meisten Anwendungsfälle

Vorhersage für Bereitstellungen#

Jeder aktive dedizierte Endpunkt enthält auf seiner Bereitstellungsseite einen Tab Predict. Dabei wird der Inferenzdienst der Bereitstellung selbst statt des gemeinsam genutzten Vorhersagedienstes verwendet. So kannst du deinen bereitgestellten Endpunkt im Browser testen.

Auf einem bereiten Endpunkt fließen verarbeitete Bilder auch in den Monitoring-Tab ein. Die Beispiele und zusammengefassten Diagramme sind temporäre Daten, die nur wenig Speicher benötigen und im Arbeitsspeicher gehalten werden. Beim Anhalten, Neustarten, erneuten Bereitstellen, Ändern der Größe oder Ersetzen des Modells können sie gelöscht werden. Speichere Beispiele in einem Datensatz, wenn du sie behalten möchtest.

Live-Kamerainferenz#

Wähle auf dem Tab Predict einer Bereitstellung, die dir gehört, Webcam oder IP-Kamera aus, um den Endpunkt mit Live-Video auszuführen:

QuelleFunktionsweise
WebcamDer Browser sendet die Einzelbilder nacheinander an den Endpunkt und blendet jedes Ergebnis über der Live-Übertragung ein.
IP-KameraGib eine URL vom Typ rtsp:// oder rtsps:// einschließlich aller Anmeldedaten ein und klicke auf Verbinden. Der Endpunkt liest das Kamerabild aus und streamt jedes Ergebnis zurück.

Für die Live-Inferenz wird der an den Endpunkt gebundene API-Schlüssel verwendet, den nur der Arbeitsbereichsinhaber laden kann. Bei anderen Teammitgliedern nimmt die Webcam einzelne Bilder auf und IP-Kamera ist nicht verfügbar – genau wie auf dem Tab Predict eines Modells. Die IP-Kamera muss über das Internet erreichbar sein: Der Endpunkt weist lokale Netzwerkadressen wie 192.168.x.x zurück. Jedes Ergebnis bezieht sich auf das neueste Bild. Wenn die Inferenz nicht Schritt hält, werden Bilder übersprungen. Änderungen an den Schiebereglern werden auf das nächste Webcam-Bild angewendet und starten einen IP-Kamera-Stream neu. Die Live-Inferenz wird angehalten, solange der Browser-Tab ausgeblendet ist. Klicke auf die Vorschau, um ein Bild aufzunehmen, oder auf Trennen, um die IP-Kamera nicht mehr anzuzeigen.

Hintergrundkamera#

Ein Endpunkt mit einer benutzerdefinierten CPU- und Arbeitsspeichergröße kann eine IP-Kamera weiter überwachen, nachdem du die Verbindung getrennt oder die Seite geschlossen hast. Sobald die verbundene Kamera Ergebnisse anzeigt, aktiviere Im Hintergrund weiter ausführen. In der Kopfzeile der Bereitstellung wird Kamera aktiv angezeigt. Die Ergebnisse erscheinen als temporäre Beispiele und Vorhersagestatistiken auf dem Tab Überwachung.

  • Einstellungen: Die Hintergrundkamera verwendet immer die standardmäßige Konfidenz (0.25), IoU (0.7) und Bildgröße des trainierten Modells. Die Schieberegler haben darauf keinen Einfluss.
  • Kosten: Die Hintergrundkamera läuft auf der aktiven Instanz des Endpunkts und verursacht keine zusätzlichen Kosten. Der stündliche Laufzeittarif gilt unabhängig davon, ob die Kamera ein- oder ausgeschaltet ist.
  • Änderungen: Wenn du die Kamera ein- oder ausschaltest oder zu einer anderen Kamera wechselst, wird die Instanz des Endpunkts neu gestartet. Dadurch bleibt der Endpunkt bereit, aber seine temporären Überwachungsdaten werden gelöscht.
  • Beenden: Schalte den Schalter aus. Durch Trennen der Verbindung oder Schließen der Seite wird die Kamera nicht angehalten. Wird die Größe des Endpunkts auf die Standardgröße zurückgesetzt, wird die Kamera entfernt. Wenn die Kamera offline geht, versucht der Endpunkt weiterhin, die Verbindung wiederherzustellen.
  • Lebenszyklus des Endpunkts: Wenn du den Endpunkt anhältst, werden die Kamera und die Abrechnung gestoppt. Beim erneuten Start wird die gespeicherte Kamera wieder aktiviert.

Endpunkte in Standardgröße bieten Live-Inferenz mit Webcam und IP-Kamera, aber keine Hintergrundoption. Um eine Hintergrundkamera über die API zu speichern, verwende die Aktion camera der Bereitstellung.

Ergebnisse über die API streamen#

Sende eine RTSP- oder RTSPS-URL als source mit dem Header Accept: text/event-stream an eine dedizierte Endpunkt-URL, um Ergebnisse als vom Server gesendete Ereignisse zu empfangen:

curl -N -X POST \
  "https://YOUR_DEPLOYMENT_URL.run.app/predict" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: text/event-stream" \
  -F "source=rtsp://user:password@camera.example.com:554/stream" \
  -F "conf=0.25"

Jedes Bildereignis enthält images im Antwort-Format mit normalisierten Koordinaten (0–1), eine JPEG-Daten-URL preview des Bildes und metadata mit den Aufgabennamen und Klassennamen. Es gelten nur conf, iou und imgsz. Beim Streamen der URL der Hintergrundkamera des Endpunkts werden dessen Standardeinstellungen verwendet. Ereignisse, die nur status enthalten, enthalten kein Bild. Ein Ereignis mit einer error-Meldung (die Kamera konnte nicht ausgelesen werden oder der Endpunkt kann das Modell nicht ausführen) beendet den Stream. Der Stream wird auch geschlossen, wenn der Endpunkt neu gestartet wird oder die Anfrage ihr Zeitlimit erreicht. Wird der Stream ohne Fehler beendet, stelle die Verbindung mit einer ansteigenden Wartezeit erneut her. Die Bereitstellungsvorhersageroute und das SDK der Platform API unterstützen kein Streaming. Sende Kameraanfragen mit dem an den Endpunkt gebundenen API-Schlüssel an die Endpunkt-URL. Eine Kameraanfrage source ohne den Header gibt 400 zurück.

API für dedizierte Endpunkte#

Die Karte API-Dokumentation im Tab Predict des Modells enthält Beispielanfragen für Python, JavaScript und cURL. Die Anfragen sind mit den Konfidenz-, IoU- und Bildgrößenwerten vorausgefüllt, die aktuell über die Schieberegler eingestellt sind. URL und Schlüssel sind Platzhalter, bis du das Modell bereitstellst – über die Schaltfläche Bereitstellen neben den Code-Tabs gelangst du zum Tab Deploy des Modells. Nach der Bereitstellung trägt der Ergebnis-Tab Dokumentation im Tab Predict der Bereitstellungsseite die URL des Endpunkts und, für Workspace-Inhaber, den zugehörigen API-Schlüssel ein. Beides ist dann direkt kopier- und ausführbar.

Authentifizierung#

Füge deinen API-Schlüssel zu den Anfragen hinzu:

Authorization: Bearer YOUR_API_KEY
API-Schlüssel erforderlich

Um Inferenz über eigene Skripte, Notebooks oder Apps auszuführen, musst du einen API-Schlüssel hinzufügen. Erstelle einen Schlüssel unter Settings > API Keys. Ein dedizierter Endpunkt akzeptiert nur den einzelnen Schlüssel, mit dem er erstellt wurde. Die gemeinsam genutzte Modell-API akzeptiert jeden aktiven Schlüssel im Workspace; öffentliche Modelle akzeptieren außerdem anonyme Anfragen.

Endpunkt#

Dedizierte Endpunkte nehmen Anfragen unter ihrer eigenen URL entgegen:

POST https://YOUR_DEPLOYMENT_URL.run.app/predict

Für gemeinsam genutzte Inferenz wird die Platform API mit dem vollständigen Pfad des Modells verwendet:

POST https://platform.ultralytics.com/api/models/{owner}/{project}/{model}/predict

Beide akzeptieren denselben Anfragetext multipart/form-data und liefern dasselbe Antwortformat zurück. Verwende mit dem Python SDK client.models.predict(owner, project, model, body=...) für gemeinsam genutzte Inferenz oder client.deployments.predict(owner, deployment, body=...) für eine dedizierte Bereitstellung. Beide SDK-Methoden rufen die Platform API auf; daher gelten deren Ratenbegrenzungen und die Größenbeschränkung für Anfragen. Um diese zu umgehen, sende die Anfrage direkt an eine URL eines dedizierten Endpunkts, wie unter Anfrage gezeigt. Beispiel für gemeinsam genutzte Inferenz:

from ultralytics_platform import Platform

client = Platform()  # reads ULTRALYTICS_API_KEY
with open("image.jpg", "rb") as f:
    results = client.models.predict("acme-vision", "inspection", "v3", body={"file": f, "conf": 0.25})

Anfrage#

import requests

url = "https://YOUR_DEPLOYMENT_URL.run.app/predict"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
data = {"conf": 0.25, "iou": 0.7, "imgsz": 640}

with open("image.jpg", "rb") as image_file:
    response = requests.post(url, headers=headers, files={"file": image_file}, data=data)
print(response.json())

Python-Tab mit Codebeispielen im Vorhersage-Tab der Ultralytics Platform

Anfrageparameter#

ParameterTypStandardBereichBeschreibung
fileDatei--Bild- oder Videodatei (erforderlich, sofern source nicht gesetzt ist)
conffloat0.250.01 – 1.0Mindest-Konfidenzschwelle
ioufloat0.70.0 – 0.95NMS-IoU-Schwellenwert
imgszint-32 – 1280Größe des Eingabebilds in Pixeln; standardmäßig die Trainingsgröße des Modells (640, falls nicht verfügbar)
normalizeboolfalse-Gibt BBox-Koordinaten als Werte von 0 bis 1 zurück
decimalsint50 – 10Dezimalstellen für Koordinatenwerte
vid_strideint1≥ 1Jeden N-ten Videoframe vorhersagen; bei Bildern wird dieser Parameter ignoriert
bitsint88, 12, 16Quantisierung der Tiefenkarte, nur für Tiefenmodelle
sourceZeichenkette--Bild-URL oder Base64-Zeichenkette (Alternative zu file); über die Platform API auf 4.096 Zeichen begrenzt

Antwort#

{
    "images": [
        {
            "shape": [1080, 1920],
            "results": [
                {
                    "class": 0,
                    "name": "person",
                    "confidence": 0.92,
                    "box": { "x1": 100, "y1": 50, "x2": 300, "y2": 400 }
                },
                {
                    "class": 2,
                    "name": "car",
                    "confidence": 0.87,
                    "box": { "x1": 400, "y1": 200, "x2": 600, "y2": 350 }
                }
            ],
            "speed": {
                "preprocess": 1.2,
                "inference": 12.5,
                "postprocess": 2.3
            }
        }
    ],
    "metadata": {
        "imageCount": 1,
        "classNames": ["person", "bicycle", "car", "..."],
        "functionTimeAlive": 1284.51,
        "functionTimeCall": 0.018,
        "task": "detect",
        "version": {
            "ultralytics": "8.x.x",
            "torch": "2.6.0",
            "torchvision": "0.21.0",
            "python": "3.13.0"
        }
    }
}

JSON-Ansicht der Antwort im Vorhersage-Tab der Ultralytics Platform

Antwortfelder#

FeldTypBeschreibung
imagesArrayListe der verarbeiteten Bilder mit einem Eintrag pro verarbeitetem Videoframe
images[].shapeArrayBildabmessungen [Höhe, Breite]
images[].resultsArrayListe der Erkennungen
images[].results[].classintKlassenindex (Ganzzahl-ID)
images[].results[].nameZeichenketteKlassenname
images[].results[].confidencefloatKonfidenz der Erkennung (0-1)
images[].results[].boxObjektKoordinaten der BBox
images[].semantic_maskObjektKlassenkarte für jedes Pixel (nur semantische Modelle)
images[].depthObjektTiefenkarte für jedes Pixel (nur Tiefenmodelle)
images[].speedObjektVerarbeitungszeiten in Millisekunden
metadataObjektAnzahl der Bilder, Modellklassennamen, Dienstlaufzeiten, Aufgabe und Versionen

Aufgabenspezifische Antworten#

Das Antwortformat variiert je nach Aufgabe:

{
  "class": 0,
  "name": "person",
  "confidence": 0.92,
  "box": {"x1": 100, "y1": 50, "x2": 300, "y2": 400}
}

Ratenbegrenzungen#

Für die gemeinsam genutzte Modell-API gilt eine Begrenzung von 20 Anfragen pro Minute für jeden API-Schlüssel, angemeldeten Aufrufer oder jede anonyme IP-Adresse. Für die Vorhersageroute der Platform-Bereitstellung (POST /api/deployments/{owner}/{deployment}/predict) gilt dieselbe Begrenzung. Bei einer Drosselung gibt die API 429 mit einem Retry-After-Header zurück. Eine vollständige Übersicht aller Endpunktkategorien findest du in der Referenz zu Ratenbegrenzungen.

Brauchst du mehr Durchsatz?

Anfragen, die direkt an einen dedizierten Endpunkt gesendet werden, durchlaufen nicht die Ratenbegrenzung der Platform API. Wenn die Kapazität des Endpunkts vorübergehend ausgeschöpft ist, weist er weiterhin Anfragen mit 429 und einem Retry-After-Header ab. Informationen zur lokalen Inferenz mit hohem Anfragevolumen findest du in der Anleitung zum Vorhersagemodus.

Fehlerbehandlung#

Häufige Fehlerantworten:

CodeMeldungLösung
400Ungültiges BildPrüfe das Dateiformat oder ob das Modell trainierte Gewichte hat
401Nicht autorisiertÜberprüfe den API-Schlüssel
404Modell nicht gefundenÜberprüfe die Namen des Inhabers, Projekts und Modells
413Eingabe zu großVerringere die Dateigröße unter den Grenzwert des Endpunkts
429Ratenbegrenzung erreichtWarte und versuche es erneut oder sende Anfragen direkt an einen dedizierten Endpunkt
500ServerfehlerAnfrage erneut versuchen
503Dienst nicht verfügbarDer Vorhersagedienst wird gestartet oder ist nicht erreichbar; warte kurz und versuche es erneut

Häufig gestellte Fragen#

  • Beide Inferenzmethoden akzeptieren Videodateien:

    • Dedizierte Endpunkte akzeptieren Videodateien direkt. Unterstützte Formate (bis zu 32 MB pro Anfrage): ASF, AVI, GIF, M4V, MKV, MOV, MP4, MPEG, MPG, TS, WEBM, WMV. Die Ergebnisse werden für jeden verarbeiteten Frame zurückgegeben; eine Anfrage kann bis zu einer Stunde laufen. Weitere Informationen findest du unter dedizierte Endpunkte.
    • Gemeinsam genutzte Inferenz (POST /api/models/{owner}/{project}/{model}/predict) verwendet denselben Vorhersagedienst und akzeptiert dieselben Videoformate. Anfragen sind jedoch auf etwa 4,5 MB begrenzt und laufen nach etwa 30 Sekunden ab. Daher eignet sich diese Option nur für kurze Clips. Der Tab Vorhersage im Browser lädt nur Bilder hoch. Verwende für Videodateien daher einen dedizierten Endpunkt oder für eine Webcam oder IP-Kamera die Live-Kamerainferenz.

    Tiefenmodelle akzeptieren keine Videodateien.

  • Im Tab Vorhersage speichert die Download-Schaltfläche über der Vorschau das aktuelle Ergebnis als annotiertes JPEG. Die API selbst gibt JSON-Vorhersagen zurück. So kannst du sie visualisieren:

    1. Verwende die Vorhersagen, um lokal Boxen einzuzeichnen
    2. Führe das Modell lokal mit Ultralytics aus und speichere das annotierte Ergebnis mit save() (oder rufe mit plot() ein Array ab):
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    results = model("image.jpg")
    results[0].save("annotated.jpg")

    Weitere Informationen zur vollständigen Results-API und zu Visualisierungsoptionen findest du in der Dokumentation zum Predict-Modus.

    • Limit im Predict-Tab: 10 MB
    • Limit der gemeinsamen Inferenz-API: etwa 4,5 MB pro Anfrage, auch über das Python SDK
    • Limit für dedizierte Endpunkte: 32 MB pro Anfrage, die direkt an die Endpunkt-URL gesendet wird
    • Automatische Größenanpassung im Predict-Tab: Bilder werden vor dem Upload auf die ausgewählte Image Size skaliert

    Große Bilder werden im Browser automatisch unter Beibehaltung des Seitenverhältnisses skaliert. Anfragen, die du selbst sendest, werden nicht skaliert. Anfragen, die das Limit überschreiten, werden daher mit 413 abgelehnt.

  • Die aktuelle API verarbeitet ein Bild pro Anfrage. Für Stapelverarbeitung:

    1. Sende für jedes Bild eine separate Anfrage
    2. Verteile Anfragen bei Bedarf auf dedizierte Endpunkte
    3. Verwende für große Stapel die lokale Inferenz
    Stapelverarbeitung mit Python
    import concurrent.futures
    
    import requests
    
    url = "https://YOUR_DEPLOYMENT_URL.run.app/predict"
    headers = {"Authorization": "Bearer YOUR_API_KEY"}
    images = ["img1.jpg", "img2.jpg", "img3.jpg"]
    
    def predict(image_path):
        with open(image_path, "rb") as f:
            return requests.post(url, headers=headers, files={"file": f}).json()
    
    with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
        results = list(executor.map(predict, images))

Kommentare