Intermedio 12 minVisione

LLM multimodale per la visione in locale: analizzare immagini con Ollama

Descrivere una foto, estrarre una tabella da uno screenshot, leggere il totale di una fattura scansionata: dal 2024 gli LLM open-weight con capacità visive reggono il confronto con GPT-4o in queste attività, e Ollama li rende accessibili con la stessa semplicità dei modelli di testo. Questa guida mostra come installare un LLM con capacità visive in locale con Ollama, chiamarlo da Python con un'immagine in base64 e sfruttare Qwen 3.5, Gemma 4 o Qwen 3.8 a seconda della tua VRAM.

Di Mohamed Meguedmi·Agg. 2026-08-27·Testato su Windows, macOS e Linux

#Perché usare un LLM con capacità visive in locale?

Inviare una fattura cliente, uno screenshot medico o un documento delle risorse umane a OpenAI pone un problema di riservatezza che gli uffici legali accettano sempre meno. Un LLM con capacità visive eseguito in locale risponde a questi casi concreti: OCR di documenti contabili, descrizione automatica di un catalogo prodotti, moderazione delle immagini, accessibilità (testo alternativo), estrazione di dati da PDF scansionati.

La differenza rispetto a un OCR classico (Tesseract, PaddleOCR): un LLM con capacità visive comprende la semantica. Sa dire "il numero di partita IVA è FR12345678901", mentre un OCR ti restituisce un miscuglio di caratteri che devi poi analizzare. Sui documenti strutturati, l'affidabilità supera il 95 % in modalità "estrazione JSON".

i
Cosa vuol dire qui 'vision'
Un LLM "multimodale con capacità visive" accetta immagini in ingresso oltre al testo. Non genera immagini (per questo, vedere Stable Diffusion). Gli dai un'immagine + una domanda e lui risponde in testo.

#I modelli di visione disponibili in Ollama

Il kit IA Locale

Il tuo ChatGPT privato e gratuito sulla tua macchina in 1 ora — LM Studio, Ollama, Open WebUI, i tuoi documenti, senza cloud.

  • Spazio online a vita
  • PDF + file
  • Aggiornamenti a vita

Ollama supporta nativamente diverse famiglie di modelli con capacità visive dalla versione 0.4 (ottobre 2024), e la generazione 2026 ha rimescolato le carte: la visione è ora integrata nel tag standard di Qwen 3.5 e Gemma 4, senza più bisogno di una variante -vl separata. Ecco le opzioni rilevanti nel 2026, ordinate per dimensione e qualità dell'OCR in francese.

qwen3.5:9b
Il migliore compromesso qualità/VRAM nel 2026. Ottimo riconoscimento OCR del testo in francese, comprende tabelle e moduli, contesto di 256k token, licenza Apache 2.0. ~6,6 GB per i pesi in Q4.
qwen3.5:4b
Versione leggera per 4-6 GB di VRAM o Mac M1/M2 16 GB. Stessa famiglia multimodale Qwen 3.5, riconoscimento OCR FR corretto, descrizioni un po' meno ricche. ~3,4 GB.
qwen3.8:27b
Per RTX 3090/4090/5090 (24 GB): qualità simile a GPT-4o nell'analisi di documenti complessi. Visione, contesto 262k, Apache 2.0. ~18 GB di pesi in Q4.
gemma4:12b
L'alternativa Google (Gemma 4, aprile 2026), multimodale e passata a Apache 2.0. Molto buona nella descrizione generale, un po' meno precisa nell'OCR puro. ~7,6 GB.
gemma4:26b
Gemma 4 26B-A4B, MoE multimodale. La fascia alta per un uso professionale intensivo: circa 19 GB di pesi, funziona con 24 GB di VRAM o su un Mac Studio con memoria unificata.
gemma4:e2b-it-qat
Gemma 4 E2B quantizzato QAT (~4,3 GB). Opzione compatta per sistemi con poca VRAM o per l'edge, con licenza Apache 2.0.
qwen3.5:2b
Qwen 3.5 2B multimodale (~1,9 GB, contesto 256k). Per Raspberry Pi 5 o per generare rapidamente descrizioni in grandi quantità. Non adatto a un OCR accurato su documenti complessi.
llava:7b / llava:13b
L'antenato storico del 2023. Da non distribuire più: nel 2026 la sua qualità è ampiamente superata da Qwen 3.5 e Gemma 4.
→
Raccomandazione predefinita
Se hai almeno 8 GB di VRAM, inizia con qwen3.5:9b. Offre il miglior rapporto qualità/peso per il francese nel 2026, la visione è inclusa nel tag standard e la comunità Ollama documenta bene i suoi casi d'uso.

#Requisiti hardware

La VRAM necessaria per un LLM vision è leggermente superiore a quella del suo equivalente testuale, a causa dell'encoder di visione (spesso un ViT) che rimane caricato in memoria oltre al modello di linguaggio.

8 GB VRAM (RTX 3060 12GB, 4060, M1/M2 16GB)
qwen3.5:4b ci sta comodamente, oppure qwen3.5:9b (6,6 GB), che ci sta appena in Q4.
12 GB VRAM (RTX 3060 12GB, 4070, 5070)
qwen3.5:9b utilizzabile senza difficoltà, gemma4:12b in Q4_K_M.
16 GB VRAM (RTX 4070 Ti Super, 4080, 5070 Ti)
Tutto quanto detto prima + contesto di 32k token, oppure qwen3.5:9b-q8_0 per la qualità massima in questa fascia.
24 GB VRAM (RTX 3090, 4090, 5090)
qwen3.8:27b (~18 GB) o gemma4:26b, qualità simile a quella cloud.
Mac con chip della serie M e 24-48 GB di memoria unificata
qwen3.5:9b o qwen3.8:27b grazie alla memoria unificata. Preferisci M3/M4 per la larghezza di banda.

Ollama deve essere almeno nella versione 0.4 per i modelli di visione moderni. Controlla con ollama --version. Se sei al di sotto, aggiorna prima di procedere.

#1. Installa un modello di visione

L'installazione è identica a un modello di testo: ollama pull tscarica i pesi e l'encoder di visione in una sola comando.

Terminale — installare Qwen 3.5 9B
ollama pull qwen3.5:9b

Il download è di circa 6,6 GB (pesi del modello linguistico in Q4 + encoder ViT). Calcola 2–3 minuti con una connessione in fibra. Verifica poi che il modello sia elencato:

Terminale
ollama list

# NAME            ID            SIZE      MODIFIED
# qwen3.5:9b      abc123...     6.6 GB    2 minutes ago
!
La visione è nel tag standard
Buone notizie a partire da Qwen 3.5 e Gemma 4: la visione è integrata nel tag predefinito (qwen3.5:9b, gemma4:12b). Niente più trabocchetti della generazione precedente, in cui serviva un tag -vl distinto (qwen2.5vl vs qwen2.5). Verifica solo di aver scaricato un modello multimodale recente e non un vecchio modello solo testuale.

#2. Primo test in CLI

Ollama accetta le immagini direttamente nella CLI a partire dalla versione 0.4: inserisci il percorso del file dopo il tuo prompt.

Descrivere un'immagine in francese
ollama run qwen3.5:9b "Décris cette image en 3 phrases en français." ./photo.jpg

Il modello carica l'immagine, la codifica tramite ViT e risponde in streaming. Su una RTX 4070, considera 2-4 secondi per una descrizione breve, 8-12 secondi per un'analisi dettagliata.

Output tipico
L'image montre un chat tigré assis sur un rebord de fenêtre en bois clair.
Le pelage présente des rayures grises et noires caractéristiques d'un tabby.
À l'arrière-plan, on devine un jardin flou avec de la végétation verte.
→
Più immagini in una volta sola
Puoi passare più percorsi di file: ollama run qwen3.5:9b "Compare ces deux images" photo1.jpg photo2.jpg. Utile per confronti visivi o per la deduplicazione.

#3. API Python con immagine base64

Per integrare un LLM con capacità visive in un'app, Ollama espone il suo endpoint REST su http://localhost:11434. L'immagine viene passata indicando il percorso (binding Python) oppure in base64 (HTTP diretto).

Metodo consigliato: la libreria ufficiale ollama-python. Gestisce l'encoding base64 per te e accetta un percorso direttamente.

Installazione
pip install ollama pillow
vision_local.py — chiamata semplice
import ollama

response = ollama.chat(
    model='qwen3.5:9b',
    messages=[{
        'role': 'user',
        'content': 'Quel est le texte visible sur cette image ? Réponds en français.',
        'images': ['./screenshot.png'],
    }],
)

print(response['message']['content'])

Se preferisci gestire il base64 da solo (immagine in memoria, blob S3, upload tramite FastAPI), ecco la versione esplicita:

Con base64 esplicito
import base64
import requests

with open('facture.png', 'rb') as f:
    img_b64 = base64.b64encode(f.read()).decode('utf-8')

response = requests.post(
    'http://localhost:11434/api/chat',
    json={
        'model': 'qwen3.5:9b',
        'messages': [{
            'role': 'user',
            'content': 'Décris cette image.',
            'images': [img_b64],
        }],
        'stream': False,
    },
    timeout=120,
)

print(response.json()['message']['content'])
i
Formato base64 atteso
Ollama accetta il base64 grezzo, senza il prefisso data:image/png;base64,. Se recuperi l'immagine da un browser, ricorda di rimuovere questo prefisso prima della chiamata.

#4. Caso pratico: OCR di una fattura in francese

L'estrazione strutturata da un documento scansionato è il caso d'uso aziendale più richiesto. Il pattern che funziona meglio: chiedere un output JSON con uno schema esplicito nel prompt.

ocr_facture.py
import ollama
import json

SYSTEM = '''Tu es un assistant d'extraction de données comptables.
Tu réponds UNIQUEMENT en JSON valide, sans markdown, sans commentaire.'''

PROMPT = '''Extrais les informations de cette facture française au format JSON :
{
  "fournisseur": str,
  "siret": str ou null,
  "numero_facture": str,
  "date": "YYYY-MM-DD",
  "montant_ht": float,
  "tva": float,
  "montant_ttc": float,
  "lignes": [{"description": str, "quantite": float, "prix_unitaire": float}]
}'''

response = ollama.chat(
    model='qwen3.5:9b',
    messages=[
        {'role': 'system', 'content': SYSTEM},
        {'role': 'user', 'content': PROMPT, 'images': ['./facture.png']},
    ],
    format='json',
    options={'temperature': 0.1},
)

data = json.loads(response['message']['content'])
print(f"Fournisseur : {data['fournisseur']}")
print(f"Montant TTC : {data['montant_ttc']} €")

Due accorgimenti che migliorano radicalmente l'affidabilità: impostare format='json' (Ollama forza così un JSON valido in output) e abbassare la temperatura a 0.1 per limitare le allucinazioni sugli importi. Su 100 fatture francesi di vario tipo, Qwen 3.5 9B ottiene tipicamente un tasso di estrazione corretta del 92-96% per importo IVA inclusa + data + fornitore.

!
Verificare sempre gli importi
Anche al 96%, avrai 4 errori su 100 fatture. In produzione, verifica sistematicamente che montant_ht + tva ≈ montant_ttc e segnala gli scostamenti per una revisione umana. Un LLM non è un contabile abilitato.

#Qwen 3.5 vs Gemma 4: cosa scegliere?

Le due famiglie dominano il panorama dei modelli di visione a pesi aperti nel 2026. Il nostro confronto sul campo tra qwen3.5:9b e gemma4:12b su casi in lingua francese:

OCR francese (fatture, contratti)
Qwen 3.5 vince nettamente. Gemma 4 tende a "inventare" numeri nei documenti sfocati. Vantaggio di Qwen: +15 % di precisione.
Descrizione generale dell'immagine
Pareggio. Gemma 4 dà descrizioni più narrative, Qwen 3.5 più fattuali. Questione di gusto.
Comprensione di tabelle
Qwen 3.5 eccelle. È uno dei pochi modelli delle sue dimensioni che sa leggere una tabella pivot di Excel senza confonderne i dati.
Captioning multilingue (FR/EN/ES)
Qwen 3.5 è stato addestrato su più lingue. Gemma 4 è leggermente migliore quando si usa soltanto l'inglese.
Latenza su RTX 4070
Simili: 2-4 secondi per una risposta breve. Gemma 4 12B è il 10-15% più veloce nella prima inferenza (encoder visivo più leggero).
Licenza
Entrambi sono sotto licenza Apache 2.0 (uso commerciale libero): Gemma 4 è passato ad Apache 2.0 nell'aprile 2026, allineando Google a Qwen. Non ci sono più restrizioni MAU da monitorare.
→
Verdetto pratico
Per il 90% dei casi d'uso in lingua francese (OCR, estrazione, descrizione), Qwen 3.5 9B è la scelta predefinita. Gemma 4 12B rimane una scelta valida se sei già nell'ecosistema Google/Gemma (fine-tuning, deployment) o per generare descrizioni di immagini in inglese destinate al grande pubblico. Hai bisogno della migliore qualità nell'elaborazione dei documenti con 24 GB? Passa a qwen3.8:27b.

#Risoluzione dei problemi

"Error: model does not support images"
Stai chiamando un modello di testo. Verifica di aver scaricato un modello multimodale recente (qwen3.5, gemma4 o il vecchio llava). ollama list deve mostrare il modello corretto.
Il modello descrive qualcosa di diverso dall'immagine
Il base64 è probabilmente corrotto o contiene il prefisso data:image. Rimuovi data:image/png;base64, prima della chiamata. Prova prima dalla CLI per isolare il problema.
VRAM saturata durante il caricamento
L'encoder di visione viene aggiunto ai pesi LM. Passa a una quantizzazione più aggressiva (q3_K_M) o riduci OLLAMA_NUM_CTX a 4096 nell'ambiente.
L'OCR non riconosce correttamente gli accenti francesi
Specifica esplicitamente "Rispondi in francese preservando gli accenti" nel system prompt. Altrimenti il modello a volte latinizza il testo (e invece di é).
Tempo di risposta > 30 s
Un'immagine da 4000x3000 fa aumentare enormemente il numero di token visivi. Ridimensionala a un massimo di 1024x1024 prima di inviarla: il 90% della qualità OCR con il 10% delle risorse di calcolo.
Ridimensionare prima dell'inferenza
from PIL import Image

img = Image.open('facture_4k.png')
img.thumbnail((1024, 1024), Image.LANCZOS)
img.save('facture_resized.png', optimize=True)

#Per approfondire

Hai un LLM locale con capacità di visione funzionante. Tre percorsi naturali per andare oltre:

Integrare in un'app Python completa
La guida Integrare Ollama in un'applicazione Python tramite l'API REST tratta in dettaglio FastAPI, streaming e function calling: quanto descritto si applica senza modifiche ai modelli di visione.
Costruire una pipeline di estrazione documentale
La guida Compta: estrazione delle fatture mostra l'industrializzazione completa (coda dei job, validazione, esportazione verso l'ERP) a partire da un LLM vision locale.
Scegliere la GPU adatta al tuo carico di lavoro
La guida Scegliere la GPU per l'IA locale tratta le fasce di VRAM da 12/16/24 GB e il loro impatto sui modelli di visione 4B/9B/27B.
Questa guida ti è stata utile?

Un feedback, un errore, una precisazione? Facci sapere, così la guida migliora per tutti.