Analyser une image en local en 2026 n'est plus de la science-fiction : avec Gemma 4 (Google, avril 2026) ou Llama 3.2 Vision (Meta), votre GPU consumer ou votre Mac M4 décrit, classifie et extrait des informations d'images sans envoyer un seul pixel sur le cloud. Pour des cas sensibles (santé, défense, vie privée), c'est un changement de paradigme — et c'est ce qu'on va construire ensemble.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Choisir entre Gemma 4 et Llama 3.2 Vision selon votre matériel
- Décrire une image localement en français
- Extraire un JSON structuré d'une image (combiner Vision + Structured Outputs)
- Faire de l'OCR local : extraire le texte d'une capture d'écran
- Les vraies limites des modèles vision Ollama en 2026
Quels modèles vision en 2026 ?
Section intitulée « Quels modèles vision en 2026 ? »| Modèle | Tag Ollama | Taille | VRAM | Spécificités |
|---|---|---|---|---|
| Gemma 4 | gemma4 | 9.6 Go | ~10 Go | Vision + tool calling natifs (avril 2026), Apache 2.0, 256 K context |
| Llama 3.2 Vision 11B | llama3.2-vision | 7.8 Go | ~8 Go | Multimodal Meta, anglais principalement |
| Llama 3.2 Vision 90B | llama3.2-vision:90b | ~55 Go | ~64 Go | Réservé aux GPU pro (H100, A100) |
| Qwen 2.5-VL | qwen2.5-vl | ~5 Go | ~6 Go | Multimodal Alibaba, multilingue |
| LLaVA | llava:7b | ~4.7 Go | ~5 Go | Classique, alternative légère |
Mon choix par défaut :
gemma4— c'est le premier modèle qui combine vision et tool calling natifs, et qui parle un français impeccable. Sur un GPU 12 Go, il rentre confortablement.
Prérequis et installation
Section intitulée « Prérequis et installation »-
Vérifier la version d'Ollama (le full support Gemma 4 demande 0.22.1 minimum) :
Fenêtre de terminal ollama --version# Si < 0.22, mettre à jour :curl -fsSL https://ollama.com/install.sh | sh -
Pull le modèle :
Fenêtre de terminal ollama pull gemma4 # 9.6 Go, recommandé# ouollama pull llama3.2-vision # 7.8 Go, alternative -
Installer les dépendances Python :
pyproject.toml [project]dependencies = ["ollama==0.6.2","pydantic[email]==2.13.4","pillow==11.3.0",]Fenêtre de terminal uv sync
Premier appel : décrire une image
Section intitulée « Premier appel : décrire une image »Le code minimal pour qu'un LLM Ollama décrive une image que vous lui passez :
from pathlib import Pathfrom ollama import Client
MODEL = "gemma4"HOST = "http://localhost:11434"IMAGE = Path("sample.png") # Une image PNG ou JPEG, n'importe laquelle
client = Client(host=HOST)response = client.chat( model=MODEL, messages=[ { "role": "user", "content": "Décris cette image en 3-4 phrases.", "images": [str(IMAGE)], # 👈 ICI : chemin vers l'image } ], options={"temperature": 0.2},)print(response["message"]["content"])Sortie réelle testée sur H100 avec gemma4 (image : un carré rouge et un cercle bleu sur fond blanc) :
Cette image présente une composition très simple et géométrique, composée de deuxformes distinctes placées côte à côte sur un fond blanc. À gauche, on trouve uncarré de couleur rouge vif, qui occupe une grande partie de l'espace. À droite,il y a un cercle de couleur bleu profond, contrastant fortement avec le carrérouge. L'ensemble est donc une juxtaposition classique de deux formes géométriquesfondamentales – le carré et le cercle – utilisant des couleurs primaires vives.Vision + Structured Outputs : la combinaison qui change tout
Section intitulée « Vision + Structured Outputs : la combinaison qui change tout »L'intérêt majeur en 2026 : combiner vision et sortie structurée. Au lieu de récupérer du texte libre que vous devez parser, vous récupérez directement un objet Pydantic typé depuis l'analyse d'une image.
Cas d'usage : automatiser l'analyse de photos produits pour un catalogue e-commerce, ou modérer des contenus uploadés par des utilisateurs.
from pathlib import Pathfrom typing import Literalfrom ollama import Clientfrom pydantic import BaseModel, Field
MODEL = "gemma4"HOST = "http://localhost:11434"IMAGE = Path("sample.png")
class AnalyseImage(BaseModel): """Analyse structurée d'une image.""" type_image: Literal["photo", "schema", "capture_ecran", "illustration", "autre"] objets_principaux: list[str] = Field(description="3-5 objets visibles, en français.") couleurs_dominantes: list[str] = Field(description="2-4 couleurs majoritaires.") contient_texte: bool texte_extrait: str | None = Field(default=None, description="Texte visible si présent.") description_courte: str = Field(description="1 phrase de résumé.")
client = Client(host=HOST)response = client.chat( model=MODEL, messages=[ { "role": "user", "content": "Analyse cette image et remplis le JSON demandé.", "images": [str(IMAGE)], } ], format=AnalyseImage.model_json_schema(), # 👈 Structured Output options={"temperature": 0},)analyse = AnalyseImage.model_validate_json(response["message"]["content"])print(analyse.model_dump_json(indent=2))Sortie réelle obtenue :
{ "type_image": "illustration", "objets_principaux": ["carré rouge", "cercle bleu"], "couleurs_dominantes": ["rouge", "bleu", "blanc"], "contient_texte": false, "texte_extrait": null, "description_courte": "L'image présente deux formes géométriques simples..."}OCR local : extraire du texte d'une capture
Section intitulée « OCR local : extraire du texte d'une capture »L'OCR (Optical Character Recognition, reconnaissance optique de caractères) consiste à extraire le texte présent dans une image. Les modèles vision Ollama font ça plutôt bien sur des captures d'écran lisibles, mais moins bien que des outils dédiés (Tesseract, docTR) sur du texte dense ou manuscrit.
from pathlib import Pathfrom ollama import Client
client = Client(host="http://localhost:11434")response = client.chat( model="gemma4", messages=[ { "role": "user", "content": ( "Extrait UNIQUEMENT le texte visible dans cette image. " "Ne décris rien d'autre. Conserve la mise en forme (sauts de ligne, listes)." ), "images": [str(Path("sample.png"))], } ], options={"temperature": 0},)print(response["message"]["content"])Sortie réelle obtenue sur H100 avec gemma4 (image contenant le texte « Lab Ollama Vision 2026 - dev H100 ») :
Lab Ollama Vision 2026 - dev H100Texte exact, sans hallucination, sans description ajoutée. Le prompt « UNIQUEMENT le texte » est essentiel.
Pièges et limites en 2026
Section intitulée « Pièges et limites en 2026 »Cas d'usage : analyse de photos produits
Section intitulée « Cas d'usage : analyse de photos produits »Combinaison Vision + Structured Outputs pour automatiser le catalogage e-commerce :
class FicheProduit(BaseModel): categorie: Literal["vetement", "electronique", "alimentation", "mobilier", "autre"] couleurs: list[str] materiaux_apparents: list[str] style: Literal["moderne", "vintage", "industriel", "minimaliste", "classique"] qualite_photo: Literal["pro", "amateur", "floue"] description_seo: str = Field(description="Description optimisée SEO en 150 caractères.")
# Boucle sur 1000 photos produitsfor photo in dossier_photos.glob("*.jpg"): response = client.chat(model="gemma4", messages=[...], format=FicheProduit.model_json_schema(), ...) fiche = FicheProduit.model_validate_json(response["message"]["content"]) db.insert(fiche.model_dump())Sur H100, c'est ~2-3 secondes par photo, 100 % en local, 0 € d'API.
Q : Mon GPU a 8 Go de VRAM, est-ce assez pour Gemma 4 ? R : Limite. Gemma 4 demande ~10 Go quantifié Q4. Soit vous prenez Llama 3.2 Vision 11B (~8 Go) qui rentre, soit vous passez à un GPU 12 Go+ pour Gemma 4. Sur Apple Silicon M3/M4 avec 16 Go unified, Gemma 4 marche très bien.
Q : Peut-on passer plusieurs images dans le même appel ?
R : Oui, images est une liste. Vous pouvez en passer 2-3 pour que le modèle compare ou raisonne dessus. Au-delà de 4-5, la qualité se dégrade.
Q : Gemma 4 parle-t-il bien français sur l'analyse d'images ? R : Oui, excellent. Mes tests sur des photos et des schémas en français donnent des descriptions riches et idiomatiques. Llama 3.2 Vision est moins bon en français — préférez Gemma 4 pour un usage francophone.
Q : Comment passer une image qui vient d'une requête HTTP (FastAPI) ? R : Pas besoin de la sauvegarder sur disque. Convertissez en base64 :
import base64img_b64 = base64.b64encode(file_bytes).decode()client.chat(model="gemma4", messages=[{"role": "user", "content": "...", "images": [img_b64]}])Q : Le modèle décrit l'image en anglais alors que je demande en français.
R : Forcer explicitement dans le prompt : « Réponds en français ». Avec un temperature: 0, le modèle suit cette instruction de manière fiable.
À retenir
Section intitulée « À retenir »- Gemma 4 est le modèle vision Ollama de référence en 2026 : Apache 2.0, français impeccable, vision + tool calling natifs.
- Llama 3.2 Vision reste une bonne alternative plus légère (8 Go VRAM).
- Vision + Structured Outputs = catalogage automatique d'images en JSON typé, sans cloud.
- L'OCR Ollama est correct sur captures lisibles, mais préférez Tesseract/docTR pour de l'OCR critique.
- Redimensionner les images avant l'appel pour gagner en vitesse — pas besoin de 4K pour analyser une photo produit.