Bilder mit der Vision-API vergleichen
Auf dieser Seite
Visuelle Vergleichsanalyse
Der Bildvergleich ist ein leistungsfähiger Anwendungsfall, der die Mehrbilder-Funktion aus Lektion 6 nutzt. Die Fragestellung verschiebt sich von „Was zeigt dieses Bild?” zu „Was hat sich geändert?”. Dies ist eine Operation, die ein semantisches Modell grundlegend anders handhabt als ein Pixel-Vergleich. Während ein Pixelunterschied lediglich eine Divergenz signalisiert, ohne sie zu qualifizieren, kann das Modell feststellen, dass ein Label zwei Millimeter verschoben wurde und ein Logo verschwunden ist, und dann beurteilen, welcher der beiden Punkte wichtiger ist.
Qualitätskontrolle, Verfolgung von Entwicklungen, visuelle Regressionserkennung: In dieser Lektion wird gezeigt, wie Vergleichsprompts strukturiert werden und die Ergebnisse genutzt werden.
Vergleich von Vorher/Nachher
Der häufigste Szenario umfasst die Überprüfung dessen, was zwischen zwei Zuständen geändert wurde. Die Systemnachricht definiert die Vergleichsmethode, während die Benutzernachricht die Bilder identifiziert:
from mistralai.client import Mistral
import os
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
response = client.chat.complete(
model="mistral-large-latest",
messages=[
{
"role": "system",
"content": """Sie sind ein Experte für vergleichende Bildanalyse. Wenn zwei Bilder präsentiert werden:
1. Beschreiben Sie jedes Bild kurz
2. Listen Sie die identifizierten Unterschiede (mit Ort) auf
3. Bewerten Sie die Bedeutung jedes Unterschieds (gering/wichtig)
4. Geben Sie einen Gesamtsimilitäts-Score an (0-100%)"""
},
{
"role": "user",
"content": [
{"type": "text", "text": "BEFORE Image (Referenz):"},
{"type": "image_url", "image_url": "https://exemple.com/avant.jpg"},
{"type": "text", "text": "AFTER Image (aktueller Zustand):"},
{"type": "image_url", "image_url": "https://exemple.com/apres.jpg"},
{"type": "text", "text": "Identifizieren Sie alle Unterschiede zwischen diesen beiden Bildern."}
]
}
]
)
print(response.choices[0].message.content)
Das Einweben von Text („BEFORE Image”, „AFTER Image”) hilft dem Modell, die Rolle jedes Bildes zu identifizieren. Der dritte Schritt im Systemprompt macht den Bericht handlungsrelevant: Ohne Priorisierung erhalten Sie eine Liste, bei der eine Schattenänderung genauso viel wiegt wie ein fehlender Teil.
Produktqualitätskontrolle
Am Ende der Pipeline muss dieser Bericht von einem Programm, nicht von einem Menschen, gelesen werden. Wir kombinieren daher den Vergleich mit dem JSON-Modus aus Lektion 9: Das Modell gibt ein Urteil, einen Score und eine Liste qualifizierter Mängel zurück, die der Code sofort ausnutzen kann.
import base64
import json
def encode_image(path):
with open(path, "rb") as f:
b64 = base64.standard_b64encode(f.read()).decode("utf-8")
return f"data:image/jpeg;base64,{b64}"
def quality_control(reference_image, sample_image):
"""Vergleicht eine Probe mit ihrer Referenz und erkennt Mängel."""
response = client.chat.complete(
model="mistral-large-latest",
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": "Sie sind ein Qualitätsinspektor. Vergleichen Sie die Probe mit der Referenz und geben Sie einen JSON-Bericht zurück."
},
{
"role": "user",
"content": [
{"type": "text", "text": "Referenz (konformes Produkt):"},
{"type": "image_url", "image_url": encode_image(reference_image)},
{"type": "text", "text": "Probe zur Inspektion:"},
{"type": "image_url", "image_url": encode_image(sample_image)},
{
"type": "text",
"text": """Vergleichen und zurückgeben:
{
"compliant": true/false,
"compliance_score": 0-100,
"defects": [
{"description": "...", "severity": "minor/major/critical", "location": "..."}
],
"recommendation": "accept/review/reject"
}"""
}
]
}
]
)
return json.loads(response.choices[0].message.content)
# Nutzung
result = quality_control("reference/product-ok.jpg", "batch-42/sample-7.jpg")
if result["compliant"]:
print(f"KONFORM - Score: {result['compliance_score']}%")
else:
print(f"NICHTKONFORM - {len(result['defects'])} Mangel(n) erkannt")
for defect in result["defects"]:
print(f" - [{defect['severity']}] {defect['description']}")
Das Feld recommendation ist interessanter, als es auf den ersten Blick erscheint: Durch die Unterscheidung zwischen „review” und „reject” reserbiert es menschliches Eingreifen für mehrdeutige Fälle, anstatt es überall oder nirgendwo aufzuerlegen.
Verfolgung von Entwicklungen über die Zeit
Eine Zeitreihe – Baustelle, Pflanzenwachstum, Strukturdegradation – wird als ausgedehnter Vergleich behandelt, sofern Sie jedes Bild mit seinem Datum kennzeichnen. Das Modell hat dann die zeitliche Achse und kann ein Tempo qualifizieren, nicht nur eine Lücke.
def analyze_evolution(chronological_images, context=""):
"""Analysiert sichtbare Entwicklung über eine Reihe geordneter Bilder."""
content = [
{
"type": "text",
"text": f"Hier sind {len(chronological_images)} Bilder, die zu verschiedenen Zeiten aufgenommen wurden, in chronologischer Reihenfolge. {context}"
}
]
for i, (date, path) in enumerate(chronological_images):
content.append({"type": "text", "text": f"Bild {i+1} ({date}):"})
content.append({"type": "image_url", "image_url": encode_image(path)})
content.append({
"type": "text",
"text": "Beschreiben Sie die beobachtete Entwicklung zwischen jedem Schritt. Identifizieren Sie wesentliche Änderungen und den allgemeinen Trend."
})
response = client.chat.complete(
model="mistral-large-latest",
messages=[{"role": "user", "content": content}]
)
return response.choices[0].message.content
# Verfolgung einer Baustelle
images = [
("2025-01", "site/jan-2025.jpg"),
("2025-06", "site/jun-2025.jpg"),
("2026-01", "site/jan-2026.jpg"),
]
evolution = analyze_evolution(images, context="Verfolgung einer Baustelle.")
print(evolution)
Die abschließende Frage wird erst nach allen Bildern hinzugefügt, sobald die vollständige Datei angelegt ist.
Vergleich von Benutzeroberflächen
Die Webentwicklung bietet einen unmittelbaren Anwendungsfall: Konfrontation des genehmigten Mockups mit dem tatsächlich erzeugten Render. Wo ein Pixel-Regressionstest bei einer ein-Pixel-Verschiebung ohne Bedeutung versagt, qualifiziert das Modell die Auswirkung jeder Diskrepanz.
def compare_interfaces(expected_screenshot, actual_screenshot):
"""Vergleicht zwei Schnittstellen-Screenshots, um visuelle Regressionen zu erkennen."""
response = client.chat.complete(
model="mistral-large-latest",
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": "Sie sind ein QA-Tester, der sich auf visuelles Testen von Web-Schnittstellen spezialisiert hat."
},
{
"role": "user",
"content": [
{"type": "text", "text": "Erwartetes Design (Mockup):"},
{"type": "image_url", "image_url": encode_image(expected_screenshot)},
{"type": "text", "text": "Aktuelles Render (Screenshot):"},
{"type": "image_url", "image_url": encode_image(actual_screenshot)},
{
"type": "text",
"text": """Vergleichen und zurückgeben:
{
"pixel_perfect": true/false,
"differences": [
{"element": "...", "expected": "...", "actual": "...", "impact": "minor/moderate/major"}
],
"fidelity_score": 0-100,
"verdict": "compliant/minor_adjustments/regression"
}"""
}
]
}
]
)
return json.loads(response.choices[0].message.content)
Eingefügt in Ihre Continuous-Integration-Pipeline, blockiert diese Prüfung die Auslieferung nur bei einem regression-Urteil.
Best Practices für Vergleiche
Diese Beispiele teilen einige Prinzipien, die explizit gemacht werden sollten. Benennen Sie Ihre Bilder immer mit einem eingewebten Label – „Referenz”, „Probe”, „Vorher”, „Nachher” –, denn ohne dieses weist das Modell Rollen basierend auf zufälliger Reihenfolge zu. Stellen Sie die Vergleichbarkeit der Aufnahmen sicher: Bei unterschiedlichen Winkeln und Beleuchtungsbedingungen wird das Modell Diskrepanzen signalisieren, die nur auf Foto-Bedingungen zurückzuführen sind. Nutzen Sie Mistral Large 3, da Vergleichsaufgaben feingranulares Denken mobilisieren, das kleinere Modelle nicht immer beherrschen. Beschränken Sie sich auf zwei oder drei Bilder pro Aufruf; darüber hinaus verdünnt sich die vergleichende Präzision. Und fordern Sie systematisch ein strukturiertes Format an, mit einem Score, aufgelisteten Unterschieden und einem Urteil, falls das Ergebnis automatisch verarbeitet werden muss.
Kernaussagen
- Bildvergleich nutzt die Mehrbilder-Funktion der API
- Einweben von erklärendem Text zwischen Bildern, um deren Rollen zu klären
- JSON-Modus (
response_format) ist ideal für automatisierte Vergleichsberichte - Hauptanwendungsfälle: Qualitätskontrolle, Standortverfolgung, visuelles QA, Vorher/Nachher
- Nutzen Sie immer Mistral Large 3 für anspruchsvolle Vergleichsaufgaben