{"id":68,"date":"2026-06-05T21:20:00","date_gmt":"2026-06-05T21:20:00","guid":{"rendered":"https:\/\/rpi.temporiti.net\/wordpress\/?p=68"},"modified":"2026-05-30T14:06:13","modified_gmt":"2026-05-30T12:06:13","slug":"gemini-flash-lite","status":"publish","type":"post","link":"https:\/\/rpi.temporiti.net\/wordpress\/?p=68","title":{"rendered":"Gemini 2.5 Flash-Lite per OCR e analisi screenshot"},"content":{"rendered":"<p>Gemini 2.5 Flash-Lite \u00e8 il modello a cui mi rivolgo quando devo tirar fuori del testo da uno screenshot o da una foto storta. \u00c8 la variante pi\u00f9 piccola della famiglia Gemini, proprietaria di Google DeepMind, e il free tier di AI Studio basta per il volume di immagini che gli passo in una settimana tipo: foto di etichette MAC address dietro gli access point, screenshot di terminal con output non selezionabile, asset tag stampati su rack e switch da archiviare in inventory, qualche pagina di documentazione cartacea che mi capita in mano da un fornitore.<\/p>\n<p>Lo uso con attenzione, per\u00f2, perch\u00e9 la policy di Google sul free tier \u00e8 tutto fuorch\u00e9 amichevole. Sul punto torno alla fine, ed \u00e8 la parte pi\u00f9 importante di questo articolo.<\/p>\n<h2>Setup con google-genai SDK<\/h2>\n<p>Servono due cose: una API key da AI Studio (https:\/\/aistudio.google.com\/apikey) e il pacchetto Python ufficiale <code>google-genai<\/code>. La key la tengo nel file di credenziali caricato dalla shell, in modo da non averla mai in chiaro.<\/p>\n<pre><code class=\"language-bash\">\npipx install google-genai\nexport GEMINI_API_KEY=\"...\"\n<\/code><\/pre>\n<p>A questo punto un OCR su un PNG \u00e8 una manciata di righe:<\/p>\n<pre><code class=\"language-bash\">\npython3 -c \"\nfrom google import genai\nclient = genai.Client()\nresp = client.models.generate_content(\n    model='gemini-2.5-flash-lite',\n    contents=[\n        {'inline_data': {\n            'mime_type': 'image\/png',\n            'data': open('etichetta.png', 'rb').read()\n        }},\n        'Estrai tutto il testo da questa immagine, mantenendo a capo e elenchi. Non aggiungere commenti.'\n    ]\n)\nprint(resp.text)\n\"\n<\/code><\/pre>\n<p>Per file pi\u00f9 grandi di qualche MB conviene caricarli prima con <code>client.files.upload(...)<\/code> e passare il file handle, ma per le foto normali da fotocamera l&#8217;inline base64 va benissimo.<\/p>\n<h2>Un esempio reale: MAC address da un&#8217;etichetta sgranata<\/h2>\n<p>Sabato dovevo recuperare il MAC address da una foto sgranata di un&#8217;etichetta dietro un access point in un sottotetto poco illuminato. Scatto al volo col cellulare appeso a una scala: JPEG da circa 3 MB con la sequenza esadecimale leggibile a fatica anche zoomando. Mi serviva il MAC per registrare una reservation DHCP, e rifare la foto sarebbe stato fastidiosissimo.<\/p>\n<p>Ho scaricato l&#8217;immagine, ho lanciato lo snippet di sopra, e in meno di un secondo mi \u00e8 uscito il MAC esatto, con anche modello e serial number letti dalla stessa etichetta. Su font OCR-B compresso e illuminato di sbieco, Flash-Lite ha tenuto duro dove tesseract sullo stesso file mi aveva restituito una stringa con tre caratteri sbagliati.<\/p>\n<h2>Cosa fa bene<\/h2>\n<p>Su testo stampato pulito, font da macchina, anche su sfondi rumorosi o con riflessi, la resa \u00e8 solida. Sui layout in colonne e tabelle conserva la struttura senza dover rimettere a mano i ritorni a capo. Sui codici alfanumerici (MAC, serial, asset tag) mi ha quasi sempre tolto le castagne dal fuoco rispetto a un OCR locale. Latenza nell&#8217;ordine del secondo, e i prompt vengono interpretati senza isterismi: &#8220;trascrivi solo l&#8217;IP&#8221; o &#8220;trascrivi il blocco di output, niente altro&#8221; funzionano.<\/p>\n<h2>Cosa fa meno bene<\/h2>\n<p>Sulla calligrafia umana \u00e8 ondeggiante: con grafia pulita se la cava, con grafia frettolosa inventa parole plausibili invece di ammettere di non riuscire a leggere. Su scansioni di documenti vecchi con macchie e sbavature gli risulta pi\u00f9 facile inventare il testo che dovrebbe esserci che dichiararsi incerto, ed \u00e8 il fallimento pi\u00f9 sgradevole. Sui layout multi-colonna molto fitti pu\u00f2 fondere righe di colonne diverse. Sulle immagini con poco testo e molti dettagli grafici tende a descrivere la scena invece di estrarre, e va imboccato con un prompt esplicito.<\/p>\n<h2>Privacy: il punto critico<\/h2>\n<p>Qui devo essere franco. Sul free tier di AI Studio, i dati che invio (prompt, immagini, output) vengono usati da Google per migliorare i propri modelli, e non esiste un opt-out nativo sul free: l&#8217;unica via per non farli usare \u00e8 passare al paid tier con un prepay minimo. Esiste inoltre un periodo di abuse monitoring di 55 giorni durante il quale i log restano conservati. Il free tier \u00e8 contrattualmente vietato a chi opera in EEA, UK e Svizzera per servire utenti di quelle aree, quindi se l&#8217;app \u00e8 destinata a un pubblico europeo il free non \u00e8 una scelta legale.<\/p>\n<p>Il modello in s\u00e9 \u00e8 proprietary closed, non self-hostabile: una chiamata a Flash-Lite vuol dire necessariamente un round-trip verso Google, con le regole di Google.<\/p>\n<h2>Cosa non gli mando<\/h2>\n<p>Per coerenza con quanto sopra, non gli passo mai screenshot con IP privati di reti che gestisco, hostname interni, password o token in chiaro, output di log non pubblici, asset di clienti, contenuti riservati. Se l&#8217;immagine ha porzioni sensibili, le copro a colpi di rettangolo nero prima di mandarla, oppure ripiego sul fallback locale.<\/p>\n<p>Il fallback \u00e8 doppio: per OCR puro su immagini semplici uso <code>tesseract<\/code> sul portatile, gratis e offline; per immagini pi\u00f9 ostiche dove serve un minimo di &#8220;comprensione&#8221; del layout, mi rivolgo a un modello vision-capable locale via Ollama sul server di casa. Latenza pi\u00f9 alta, qualit\u00e0 un po&#8217; sotto Flash-Lite sulle calligrafie, ma tutto resta in casa.<\/p>\n<h2>In pratica<\/h2>\n<p>Flash-Lite lo apro quando il testo da estrarre \u00e8 pubblico per natura (etichette di hardware in commercio, screenshot di output che finiranno comunque sul blog, foto di pagine di datasheet reperibili online) e voglio una resa che tesseract non mi d\u00e0. Per tutto ci\u00f2 che ha contesto sensibile, anche solo di striscio, tesseract o Ollama in casa, senza eccezioni. La comodit\u00e0 non vale lo scambio.<\/p>\n<hr>\n<blockquote>\n<p>Immagine generata con Cloudflare Workers AI \/ FLUX.<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Gemini 2.5 Flash-Lite \u00e8 il modello a cui mi rivolgo quando devo tirar fuori del testo da uno screenshot o da una foto storta. \u00c8 la variante pi\u00f9 piccola della famiglia Gemini, proprietaria di Google DeepMind, e il free tier di AI Studio basta per il volume di immagini che gli passo in una settimana [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":69,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-68","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-locale"],"_links":{"self":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/68","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=68"}],"version-history":[{"count":8,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/68\/revisions"}],"predecessor-version":[{"id":370,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/68\/revisions\/370"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/69"}],"wp:attachment":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=68"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=68"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=68"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}