Qwen-Image-Layered: guida pratica alla decomposizione delle immagini
Impara ad automatizzare l'editing di immagini con Python. Usa Qwen-Image-Layered per scomporre le immagini in layer RGBA modificabili e ricomporle in un'app Streamlit.
Gli utenti di Photoshop passano ore a creare maschere manualmente e a dipingere gli sfondi. Qwen-Image-Layered, un nuovo modello del team Qwen di Alibaba, lo fa in automatico: gli dai una singola immagine e lui restituisce più livelli RGBA con sfondi trasparenti.
Questo tutorial spiega cos'è Qwen-Image-Layered, in cosa differisce da strumenti di segmentazione come SAM e come eseguirlo in Python. Scomporrai un'immagine in livelli, poi modificherai e ricombinerai quei livelli in un nuovo composito. Alla fine avrai un flusso di lavoro funzionante per l'editing di immagini via codice che evita del tutto la mascheratura manuale.
Se sei alle prime armi con la gestione dei dati immagine e della trasparenza nel codice, dai un'occhiata al nostro corso Image Processing in Python per costruire solide basi prima di iniziare. Ti consiglio anche di leggere la nostra guida sull'ultimo modello di generazione di immagini di Google, Nano Banana 2.
Che cos'è Qwen-Image-Layered?
Qwen-Image-Layered è costruito su Qwen2.5-VL, un modello visione-linguaggio di Alibaba. Il backbone VL significa che il modello comprende semanticamente cosa c'è in un'immagine: può distinguere un prodotto dalla sua ombra e dalla superficie su cui poggia, non solo rilevare i bordi. Come iVision Transformers, elabora le immagini tramite meccanismi di attenzione anziché con approcci convoluzionali tradizionali.
Quando esegui l'inferenza, specifichi quante layer vuoi. Chiedi 4 e il modello distribuisce il contenuto dell'immagine su 4 output RGBA. Ne chiedi 8 e ottieni una separazione più fine. Il modello decide cosa va dove in base alla struttura della scena.
Il modello prende un'immagine composita e la separa in livelli RGBA singolarmente modificabili con trasparenza.
L'immagine promozionale delle caramelle si scompone in quattro layer distinti: lo sfondo a raggiera, la persona in arancione, il testo e il branding "Sour Candy" e i singoli pezzi di caramella. Ogni livello esce con uno sfondo trasparente (indicato dal pattern a scacchiera), pronto per essere modificato o riordinato.
Il modello distribuisce gli elementi visivi tra i layer in base alla profondità e alla comprensione semantica. Le grafiche di sfondo vanno al livello 0, il soggetto principale (la persona) al livello 1, le sovrapposizioni di testo al livello 2 e i piccoli oggetti in primo piano (i pezzi di caramella) al livello 3. Ogni elemento è separato in modo pulito con trasparenza corretta.
Qwen-Image-Layered vs Segment Anything Model
Se hai già lavorato con la segmentazione di immagini, potresti chiederti come Qwen-Image-Layered si confronta con gli strumenti esistenti, in particolare il Segment Anything Model (SAM).
SAM e modelli di segmentazione simili producono maschere: mappe binarie di quali pixel appartengono a quale oggetto. Utili, ma una maschera ti dice solo dove si trova qualcosa. Estrarre l'oggetto lascia comunque un buco nell'immagine originale.
Qwen-Image-Layered, invece, produce layer completi. L'oggetto in primo piano esce con trasparenza e il livello di sfondo dietro è già riempito. Quando in seguito elimini o sposti un livello, non c'è nulla da rattoppare.
Funzionalità
Qwen-Image-Layered
Segment Anything Model 2 (SAM 2)
Obiettivo principale
Decomposizione in layer (crea asset modificabili)
Segmentazione (identifica e isola i pixel)
Output principale
Stack di immagini RGBA (layer trasparenti)
Maschere binarie (contorni in bianco e nero)
Gestione dello sfondo
Inpainting delle occlusioni: genera pixel per riempire il "buco" dietro un oggetto.
Nessuna: lascia lo sfondo vuoto/nero dove l'oggetto è stato rimosso.
Modalità di input
Immagine + prompt testuale (opzionale)
Immagine/video + punti, box o maschere
Tipo di architettura
Generativa (basata su diffusione, Qwen2.5-VL)
Discriminativa (basata su transformer)
Supporto video
Limitato (applicazione frame-by-frame)
Nativo (tracciamento oggetti all'avanguardia nei video)
Controllo dell'utente
Layer variabili (es. "dividi in 4 layer vs 8 layer")
Prompt interattivo (clicca punti o disegna box per selezionare oggetti specifici)
Caso d'uso ideale
Graphic design, creazione di asset, editing "senza Photoshop".
Video editing, tracciamento oggetti, analisi scientifica, robotica.
SAM usa un approccio discriminativo, analizzando i pixel esistenti per definire con precisione i confini degli oggetti. Qwen-Image-Layered, al contrario, impiega un'architettura generativa basata sulla diffusione che ricostruisce le regioni occluse o nascoste tramite generazione di immagini appresa.
Mentre SAM produce maschere che definiscono cosa rimuovere, Qwen-Image-Layered genera contenuti di sfondo plausibili per completare la decomposizione in layer. Vale la pena notare che SAM può ottenere un riempimento di sfondo simile se combinato con modelli di inpainting dedicati, ma Qwen-Image-Layered integra questa capacità end-to-end all'interno del processo di decomposizione.
Anche il meccanismo di controllo dell'input è diverso: SAM si affida a prompt interattivi precisi, richiedendo di cliccare punti o disegnare riquadri per selezionare un target specifico. Qwen-Image-Layered opera in modo più olistico, permettendoti semplicemente di specificare un numero di layer desiderato (ad esempio, "dividi in 4 layer") per organizzare automaticamente l'intera struttura dell'immagine.
Dobbiamo notare che SAM 2 è esplicitamente progettato per i video, in grado di tracciare oggetti nelle sequenze usando un'architettura di streaming con memoria aumentata (mantiene ~6 frame recenti) con elevata coerenza temporale. Qwen-Image-Layered è specializzato per la decomposizione di immagini statiche e al momento non offre tracciamento oggetti nativo per l'editing video.
Scomporre un'immagine con Qwen-Image-Layered
Passiamo alla pratica. Prima di scrivere codice, c'è una considerazione pratica: dove eseguire il modello.
Perché usare un'API?
Qwen-Image-Layered richiede oltre 57 GB di pesi del modello e una GPU di fascia alta con molta VRAM.
Ho provato a eseguirlo in locale su Google Colab con una GPU T4 e la sessione ha esaurito la RAM prima ancora che il modello finisse di scaricarsi. L'uso del disco è salito a 90 GB dei 112 GB disponibili nel runtime GPU. Il modello è semplicemente troppo grande per gli ambienti cloud gratuiti.
I grandi modelli generativi comeStable Diffusion affrontano sfide di hosting simili, motivo per cui le API hosted sono diventate comuni.
Per questo tutorial useremo l'API hosted di Replicate. Ogni decomposizione costa circa $0,03, che ti garantisce un'esecuzione stabile e riproducibile senza preoccuparti di limiti di memoria o conflitti di dipendenze. Se vuoi solo provare il modello senza scrivere codice, laHugging Face Space offre un'interfaccia web gratuita in cui puoi caricare immagini e scaricare i layer manualmente.
L'Hugging Face Space ti permette di testare il modello senza codice, ma l'API ti dà controllo programmatico.
Configurare l'ambiente
Crea una nuova directory di progetto e installa i pacchetti richiesti:
Gli annunci ufficiali dei modelli di solito mostrano esempi selezionati in cui il modello rende al meglio. Testiamo invece con un'immagine reale per vedere prestazioni realistiche.
La foto mostra tre prodotti per la cura della pelle su una superficie menta contro uno sfondo lavanda: una scatola regalo bianca con nastro nero, una boccetta di siero rosa e un piccolo vasetto di crema. Composizione pulita, oggetti distinti, ombre delicate. Un buon caso di test per la separazione in layer.
Eseguire l'inferenza
import replicate
from dotenv import load_dotenv
load_dotenv()withopen("data/healthcare_products.jpg","rb")as f:
output = replicate.run("qwen/qwen-image-layered",input={"image": f,"num_layers":4,"go_fast":True,"output_format":"png","seed":42,})Offerto da
Il parametro num_layers controlla quanto finemente il modello suddivide l'immagine. I valori possono variare da 2 a 8. Con 4 layer ottieni un buon equilibrio tra granularità e gestibilità. Impostare seed a un valore fisso rende l'output riproducibile.
L'API accetta anche direttamente URL, quindi puoi saltare la gestione dei file se la tua immagine è ospitata altrove:
output = replicate.run("qwen/qwen-image-layered",input={"image":"https://example.com/photo.jpg","num_layers":4,"go_fast":True,"output_format":"png",})Offerto da
Salvare i layer
L'API restituisce una lista di oggetti FileOutput. Ognuno ha un metodo .read() che ti fornisce i byte dell'immagine:
for i, layer inenumerate(output):withopen(f"layer_{i}.png","wb")as f:
f.write(layer.read())Offerto da
I layer sono ordinati dal basso verso l'alto: l'indice 0 è lo sfondo e gli indici superiori si sovrappongono. Ogni PNG è un'immagine RGBA con trasparenza, dove gli altri layer traspariranno.
Ecco il risultato:
Il modello ha posizionato lo sfondo (parete lavanda e superficie menta) sul livello 0, il vasetto di crema sul livello 1, la scatola regalo sul livello 2 e la boccetta di siero sul livello 3. Ogni prodotto è uscito con bordi puliti e trasparenza accurata.
Osserva però il livello di sfondo e noterai deboli residui di ombra dove prima c'erano i prodotti. Questo è emerso costantemente nei miei test: il modello gestisce bene l'isolamento degli oggetti, ma fatica nella ricostruzione dello sfondo quando ci sono ombre.
Più sono evidenti le ombre nell'immagine di partenza, più visibili diventano questi artefatti. È il primo modello del suo genere, quindi aspettati che il team Qwen affini questo aspetto nei prossimi aggiornamenti.
Ricomporre i layer con Qwen-Image-Layered
La decomposizione è solo metà del flusso di lavoro. I layer diventano utili quando li modifichi e li riassembli in qualcosa di nuovo.
Sostituire lo sfondo
I fotografi di prodotto spesso necessitano dello stesso scatto con sfondi diversi per A/B test, campagne stagionali o esigenze di piattaforma. Con i layer separati, bastano poche righe di codice.
from PIL import Image
# Load the decomposed layers
layers =[Image.open(f"layer_{i}.png")for i inrange(4)]# Create a new background (solid coral)
new_bg = Image.new("RGBA", layers[0].size,(255,180,162,255))# Replace the original background layer
layers[0]= new_bg
# Composite from bottom to top
result = layers[0]for layer in layers[1:]:
result = Image.alpha_composite(result, layer)
result.save("coral_background.png")Offerto da
La funzione alpha_composite() gestisce automaticamente il blending RGBA. Rispetta la trasparenza di ogni layer, così gli oggetti in primo piano si posano in modo naturale su qualsiasi sfondo tu fornisca.
PIL rende la manipolazione delle immagini semplice e, se ti servono trasformazioni più complesse,le funzionalità di elaborazione immagini di PyTorch si integrano bene con i flussi di lavoro basati su PIL.
Ecco il risultato:
Stessi prodotti, ambiente diverso, niente mascheratura manuale. Puoi inserire un gradiente, una texture o un'altra foto interamente. Il processo non cambia: sostituisci il layer 0 e componi gli altri sopra.
Rimuovere o riposizionare oggetti
Lo stesso schema vale per altre modifiche. Rimuovi un oggetto saltando il suo layer:
# Composite without the cream jar (layer 1)
layers_without_jar =[layers[0], layers[2], layers[3]]
result = layers_without_jar[0]for layer in layers_without_jar[1:]:
result = Image.alpha_composite(result, layer)Offerto da
Per riposizionare un oggetto incollandolo a coordinate diverse, usa il metodo paste() con l'offset x/y scelto:
# Move the serum bottle 50 pixels left
canvas = Image.new("RGBA", layers[0].size,(0,0,0,0))
canvas.paste(layers[3],(-50,0), layers[3])
layers[3]= canvas
# Then composite as usualOfferto da
Il flusso di lavoro è sempre lo stesso:
Modifica i layer che ti interessano: ridimensiona, ricolora, elimina, riordina.
Poi ricomponi tutto.
Ogni operazione avviene su un layer isolato, quindi le modifiche restano circoscritte.
Creare un editor Qwen-Image-Layered con Streamlit
Eseguire queste operazioni in un notebook va bene per modifiche una tantum, ma il ciclo di feedback è lento. Scrivi il codice, esegui una cella, controlli l'output, regoli, ripeti. Per il lavoro iterativo in cui vuoi attivare/disattivare layer, confrontare composizioni e scaricare i risultati senza rieseguire le celle, ha più senso una GUI leggera.
Costruiremo un'app Streamlit in circa 160 righe che ti permette di caricare un'immagine, scomporla, attivare/disattivare i layer e vedere un'anteprima live. Crea un file chiamato streamlit_app.py nella directory del progetto.
Configurare Streamlit
Inizia con gli import e la configurazione di base:
import os
import io
import time
from typing import List
import streamlit as st
from PIL import Image, ImageDraw
from dotenv import load_dotenv
import replicate
load_dotenv()# Constants
MAX_LAYERS, MIN_LAYERS, DEFAULT_LAYERS =8,2,4
THUMBNAIL_SIZE =(150,150)# Initialize session stateif"layers"notin st.session_state:
st.session_state.layers =[]
st.session_state.layer_visibility =[]
st.session_state.original_image =None
st.set_page_config(page_title="Qwen-Image-Layered", page_icon="🎨", layout="wide")
st.title("🎨 Qwen-Image-Layered")
st.markdown("Decompose images into editable RGBA layers")Offerto da
Lo stato di sessione persiste tra le riesecuzioni di Streamlit. Senza di esso, i tuoi layer scomparirebbero ogni volta che qualcuno clicca un pulsante.
Controllo del token API
Prima di chiamare Replicate, assicurati che il token esista:
token = os.environ.get("REPLICATE_API_TOKEN")ifnot token:
st.error("REPLICATE_API_TOKEN not found. Set it in your .env file.")
st.code("export REPLICATE_API_TOKEN=your_token_here", language="bash")
st.stop()Offerto da
st.stop() interrompe l'esecuzione se manca il token. Non ha senso renderizzare il resto della UI.
Funzione di decomposizione con cache
L'API di decomposizione costa $0,03 a chiamata e impiega 30–60 secondi. La cache evita chiamate ridondanti:
@st.cache_data(show_spinner=False)defdecompose_image(_image_bytes:bytes, num_layers:int, seed:int)-> List[bytes]:"""Call Replicate API with retry logic for 502 errors."""for attempt inrange(3):try:
output = replicate.run("qwen/qwen-image-layered",input={"image": io.BytesIO(_image_bytes),"num_layers": num_layers,"go_fast":True,"output_format":"png","seed": seed,},)return[layer.read()for layer in output]except Exception as e:if attempt <2and("502"instr(e)or"Replicate"instr(type(e).__name__)):
time.sleep(5)continueraiseOfferto da
Il prefisso underscore in _image_bytes indica a Streamlit di non fare l'hash di quel parametro (l'hash dei byte è costoso). Il ciclo di retry gestisce gli occasionali errori 502 di Replicate attendendo 5 secondi e provando fino a 3 volte.
Visualizzazione e composizione immagini
Definiamo poi piccole utility per la visualizzazione e la composizione:
defcreate_checkerboard(size:tuple)-> Image.Image:"""Create a checkerboard pattern to show transparency."""
img = Image.new("RGBA", size,(220,220,220,255))
draw = ImageDraw.Draw(img)
square =10for y inrange(0, size[1], square):for x inrange(0, size[0], square):if(x // square + y // square)%2:
draw.rectangle([x, y, x + square, y + square],
fill=(255,255,255,255),)return img
defcomposite_layers(
layers: List[Image.Image],
visibility: List[bool],)-> Image.Image:"""Composite visible layers from bottom to top."""ifnot layers ornotany(visibility):return Image.new("RGBA",
layers[0].size if layers else(400,400),(0,0,0,0),)
result =Nonefor layer, visible inzip(layers, visibility):if visible:
result = layer.copy()if result isNoneelse Image.alpha_composite(result, layer)return result or Image.new("RGBA", layers[0].size,(0,0,0,0))Offerto da
La scacchiera rende visibile la trasparenza (convenzione standard dei software di editing). La funzione di composizione replica ciò che abbiamo fatto nel notebook, ora guidata dallo stato delle checkbox.
Upload immagine e impostazioni di decomposizione
La sidebar gestisce l'upload dell'immagine e le impostazioni di decomposizione:
with st.sidebar:
st.header("🖼️ Image Upload")
uploaded_file = st.file_uploader("Choose an image",type=["png","jpg","jpeg"],help="Upload an image to decompose",)if uploaded_file isnotNone:
st.session_state.original_image = uploaded_file
st.image(uploaded_file, caption="Uploaded", use_container_width=True)
st.divider()
st.header("⚙️ Settings")
num_layers = st.slider("Number of layers",
MIN_LAYERS,
MAX_LAYERS,
DEFAULT_LAYERS,)
seed = st.number_input("Random seed",0,999999,42,help="For reproducibility",)# Decompose buttonif st.button("🔄 Decompose Image",
disabled=uploaded_file isNone,
use_container_width=True,type="primary",):if st.session_state.original_image isnotNone:
image_bytes = st.session_state.original_image.getvalue()with st.spinner(f"Decomposing into {num_layers} layers... (30-60s)"):try:
layer_bytes = decompose_image(image_bytes, num_layers, seed)
st.session_state.layers =[
Image.open(io.BytesIO(lb)).convert("RGBA")for lb in layer_bytes
]
st.session_state.layer_visibility =[True]*len(
st.session_state.layers
)
st.success(f"Decomposed into {len(st.session_state.layers)} layers!")except Exception as e:if"502"instr(e):
st.error("Replicate API error (502). Try again or use fewer layers.")else:
st.error(f"Error: {e}")# Reset buttonif st.session_state.layers and st.button("🗑️ Reset", use_container_width=True):
st.session_state.layers =[]
st.session_state.layer_visibility =[]
st.session_state.original_image =None
st.rerun()Offerto da
Il pulsante di decomposizione è disabilitato finché non viene caricata un'immagine. In caso di successo, i layer vengono salvati nello stato di sessione e tutte le opzioni di visibilità sono impostate su True per default.
Aggiungere i controlli dei layer immagine
Due colonne mostrano i controlli dei layer e l'anteprima live:
col1, col2 = st.columns([1,1])# two equal-width columns [web:61]with col1:
st.subheader("📑 Layers")ifnot st.session_state.layers:
st.info("Upload an image and decompose to see layers here.")else:
st.caption("Toggle layers on/off. Layer 0 is the background.")
cols = st.columns(min(len(st.session_state.layers),4))for i, layer inenumerate(st.session_state.layers):with cols[i %4]:
thumb = layer.copy()
thumb.thumbnail(THUMBNAIL_SIZE)
checkerboard = create_checkerboard(thumb.size)
display = Image.alpha_composite(checkerboard, thumb)
st.image(display, caption=f"Layer {i}", use_container_width=True)
st.session_state.layer_visibility[i]= st.checkbox(f"Show Layer {i}",
value=st.session_state.layer_visibility[i],
key=f"layer_{i}",)with col2:
st.subheader("👁️ Preview")ifnot st.session_state.layers:
st.info("Composite preview will appear here.")else:
composite = composite_layers(
st.session_state.layers,
st.session_state.layer_visibility,)
visible =sum(st.session_state.layer_visibility)
st.caption(f"Showing {visible} of {len(st.session_state.layers)} layers")
st.image(composite, caption="Composite result", use_container_width=True)if visible >0:
buf = io.BytesIO()
composite.save(buf,format="PNG")
st.download_button("⬇️ Download Result",
data=buf.getvalue(),
file_name="composite.png",
mime="image/png",
use_container_width=True,)Offerto da
Quando deselezioni un layer, Streamlit riesegue lo script. La checkbox aggiorna layer_visibility, la funzione di composizione ricalcola l'anteprima e la UI si aggiorna automaticamente.
L'app ha un'immagine scomposta. Disattiva i layer per rimuovere oggetti dall'anteprima.
Carica un'immagine, clicca su decompose, poi attiva/disattiva i layer. L'anteprima si aggiorna all'istante. Scarica il risultato quando trovi una composizione che ti piace. L'intero flusso avviene nel browser senza rieseguire le celle del notebook.
Conclusione
Qwen-Image-Layered adotta un approccio diverso all'editing di immagini: invece di mascherare i pixel, separa i contenuti in layer RGBA completi con sfondi ricostruiti. Ottieni l'isolamento degli oggetti senza il lavoro di pulizia. Il modello ha difficoltà con artefatti di ombra in scene complesse, ma l'estrazione degli oggetti in sé funziona bene.
Il flusso di lavoro Python è lineare. Chiami l'API di Replicate, ottieni una lista di layer e li componi con PIL. La sostituzione degli sfondi e la rimozione degli oggetti diventano poche righe di codice. L'app Streamlit incapsula quella logica in una GUI per iterare più velocemente.
Questo è il primo modello del suo genere. Il team Qwen rilascia aggiornamenti rapidamente, quindi aspettati miglioramenti nella ricostruzione dello sfondo e una gestione migliore delle immagini con ombre marcate. Ilpaper di ricerca illustra l'architettura se vuoi capire come funziona la decomposizione a numero variabile di layer sotto il cofano.
Pronto a esplorare altri modelli open source di AI? Padroneggia l'ecosistema dietro Qwen seguendo lo skill trackHugging Face Fundamentals su DataCamp.
Qwen-Image-Layered FAQ
Che cos'è Qwen-Image-Layered e come funziona?⌄
Qwen-Image-Layered è un modello visione-linguaggio di Alibaba che scompone le immagini in più livelli RGBA con trasparenza. A differenza degli strumenti di segmentazione che forniscono solo maschere, produce layer completi con sfondi ricostruiti, permettendoti di modificare o rimuovere oggetti senza pulizia manuale.
In cosa Qwen-Image-Layered è diverso da SAM (Segment Anything Model)?⌄
SAM produce maschere binarie che mostrano dove sono gli oggetti, ma estrarli lascia buchi nell'immagine originale. Qwen-Image-Layered produce layer RGBA completi in cui lo sfondo dietro gli oggetti in primo piano è già riempito. Puoi eliminare o spostare i layer senza dover rattoppare nulla.
Posso eseguire Qwen-Image-Layered in locale sul mio computer?⌄
Il modello richiede oltre 57 GB di pesi e notevole VRAM GPU, rendendo difficile il deployment locale. Anche la T4 di Google Colab esaurisce la RAM durante la configurazione. L'articolo consiglia di usare l'API hosted di Replicate (circa $0,03 per decomposizione) o l'Hugging Face Space gratuito per i test.
Che tipo di editing posso fare con i layer scomposti?⌄
Una volta ottenuti i layer, puoi sostituire gli sfondi per A/B test, rimuovere oggetti saltando i loro layer, riposizionare elementi incollandoli a coordinate diverse o creare composizioni personalizzate. Il tutorial mostra esempi con PIL per l'editing via codice e costruisce un'app Streamlit per attivare/disattivare i layer in modo interattivo.
Quali sono i limiti di Qwen-Image-Layered?⌄
Il modello fatica con la ricostruzione dello sfondo quando le ombre sono prominenti. Potresti vedere deboli residui di ombra nel layer di sfondo dove prima c'erano gli oggetti. Più complesse sono le ombre nell'immagine sorgente, più visibili diventano questi artefatti. È un modello di prima generazione, quindi aspettati miglioramenti dal team Qwen.
Sono un creator di contenuti sulla data science con oltre 2 anni di esperienza e uno dei più seguiti su Medium. Mi piace scrivere articoli dettagliati su AI e ML con un pizzico di sarcasmo, perché bisogna pur fare qualcosa per renderli un po’ meno noiosi. Ho pubblicato oltre 130 articoli e un corso su DataCamp, con un altro in arrivo. I miei contenuti sono stati visti da oltre 5 milioni di persone, 20.000 delle quali sono diventate follower sia su Medium che su LinkedIn.
Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Scopri i modelli di IA open source, i dataset e le app più recenti, crea agenti di IA e metti a punto gli LLM con Hugging Face. Entra oggi nella più grande community di IA!
Applica le tue competenze in Python per affrontare i dati delle immagini! Dalla pre-elaborazione al deep learning, scoprirai i molti modi in cui puoi sfruttare i dati delle immagini.
Gli utenti di Photoshop passano ore a creare maschere manualmente e a dipingere gli sfondi. Qwen-Image-Layered, un nuovo modello del team Qwen di Alibaba, lo fa in automatico: gli dai una singola immagine e lui restituisce più livelli RGBA con sfondi trasparenti.
Questo tutorial spiega cos'è Qwen-Image-Layered, in cosa differisce da strumenti di segmentazione come SAM e come eseguirlo in Python. Scomporrai un'immagine in livelli, poi modificherai e ricombinerai quei livelli in un nuovo composito. Alla fine avrai un flusso di lavoro funzionante per l'editing di immagini via codice che evita del tutto la mascheratura manuale.
Se sei alle prime armi con la gestione dei dati immagine e della trasparenza nel codice, dai un'occhiata al nostro corso Image Processing in Python per costruire solide basi prima di iniziare. Ti consiglio anche di leggere la nostra guida sull'ultimo modello di generazione di immagini di Google, Nano Banana 2.
Che cos'è Qwen-Image-Layered?
Qwen-Image-Layered è costruito su Qwen2.5-VL, un modello visione-linguaggio di Alibaba. Il backbone VL significa che il modello comprende semanticamente cosa c'è in un'immagine: può distinguere un prodotto dalla sua ombra e dalla superficie su cui poggia, non solo rilevare i bordi. Come i Vision Transformers, elabora le immagini tramite meccanismi di attenzione anziché con approcci convoluzionali tradizionali.
Quando esegui l'inferenza, specifichi quante layer vuoi. Chiedi 4 e il modello distribuisce il contenuto dell'immagine su 4 output RGBA. Ne chiedi 8 e ottieni una separazione più fine. Il modello decide cosa va dove in base alla struttura della scena.
Esempio visivo
Ecco come appare la decomposizione nell' annuncio di Qwen:
Il modello prende un'immagine composita e la separa in livelli RGBA singolarmente modificabili con trasparenza.
L'immagine promozionale delle caramelle si scompone in quattro layer distinti: lo sfondo a raggiera, la persona in arancione, il testo e il branding "Sour Candy" e i singoli pezzi di caramella. Ogni livello esce con uno sfondo trasparente (indicato dal pattern a scacchiera), pronto per essere modificato o riordinato.
Il modello distribuisce gli elementi visivi tra i layer in base alla profondità e alla comprensione semantica. Le grafiche di sfondo vanno al livello 0, il soggetto principale (la persona) al livello 1, le sovrapposizioni di testo al livello 2 e i piccoli oggetti in primo piano (i pezzi di caramella) al livello 3. Ogni elemento è separato in modo pulito con trasparenza corretta.
Qwen-Image-Layered vs Segment Anything Model
Se hai già lavorato con la segmentazione di immagini, potresti chiederti come Qwen-Image-Layered si confronta con gli strumenti esistenti, in particolare il Segment Anything Model (SAM).
SAM e modelli di segmentazione simili producono maschere: mappe binarie di quali pixel appartengono a quale oggetto. Utili, ma una maschera ti dice solo dove si trova qualcosa. Estrarre l'oggetto lascia comunque un buco nell'immagine originale.
Qwen-Image-Layered, invece, produce layer completi. L'oggetto in primo piano esce con trasparenza e il livello di sfondo dietro è già riempito. Quando in seguito elimini o sposti un livello, non c'è nulla da rattoppare.
Funzionalità
Qwen-Image-Layered
Segment Anything Model 2 (SAM 2)
Obiettivo principale
Decomposizione in layer (crea asset modificabili)
Segmentazione (identifica e isola i pixel)
Output principale
Stack di immagini RGBA (layer trasparenti)
Maschere binarie (contorni in bianco e nero)
Gestione dello sfondo
Inpainting delle occlusioni: genera pixel per riempire il "buco" dietro un oggetto.
Nessuna: lascia lo sfondo vuoto/nero dove l'oggetto è stato rimosso.
Modalità di input
Immagine + prompt testuale (opzionale)
Immagine/video + punti, box o maschere
Tipo di architettura
Generativa (basata su diffusione, Qwen2.5-VL)
Discriminativa (basata su transformer)
Supporto video
Limitato (applicazione frame-by-frame)
Nativo (tracciamento oggetti all'avanguardia nei video)
Controllo dell'utente
Layer variabili (es. "dividi in 4 layer vs 8 layer")
Prompt interattivo (clicca punti o disegna box per selezionare oggetti specifici)
Caso d'uso ideale
Graphic design, creazione di asset, editing "senza Photoshop".
Video editing, tracciamento oggetti, analisi scientifica, robotica.
SAM usa un approccio discriminativo, analizzando i pixel esistenti per definire con precisione i confini degli oggetti. Qwen-Image-Layered, al contrario, impiega un'architettura generativa basata sulla diffusione che ricostruisce le regioni occluse o nascoste tramite generazione di immagini appresa.
Mentre SAM produce maschere che definiscono cosa rimuovere, Qwen-Image-Layered genera contenuti di sfondo plausibili per completare la decomposizione in layer. Vale la pena notare che SAM può ottenere un riempimento di sfondo simile se combinato con modelli di inpainting dedicati, ma Qwen-Image-Layered integra questa capacità end-to-end all'interno del processo di decomposizione.
Anche il meccanismo di controllo dell'input è diverso: SAM si affida a prompt interattivi precisi, richiedendo di cliccare punti o disegnare riquadri per selezionare un target specifico. Qwen-Image-Layered opera in modo più olistico, permettendoti semplicemente di specificare un numero di layer desiderato (ad esempio, "dividi in 4 layer") per organizzare automaticamente l'intera struttura dell'immagine.
Dobbiamo notare che SAM 2 è esplicitamente progettato per i video, in grado di tracciare oggetti nelle sequenze usando un'architettura di streaming con memoria aumentata (mantiene ~6 frame recenti) con elevata coerenza temporale. Qwen-Image-Layered è specializzato per la decomposizione di immagini statiche e al momento non offre tracciamento oggetti nativo per l'editing video.
Scomporre un'immagine con Qwen-Image-Layered
Passiamo alla pratica. Prima di scrivere codice, c'è una considerazione pratica: dove eseguire il modello.
Perché usare un'API?
Qwen-Image-Layered richiede oltre 57 GB di pesi del modello e una GPU di fascia alta con molta VRAM.
Ho provato a eseguirlo in locale su Google Colab con una GPU T4 e la sessione ha esaurito la RAM prima ancora che il modello finisse di scaricarsi. L'uso del disco è salito a 90 GB dei 112 GB disponibili nel runtime GPU. Il modello è semplicemente troppo grande per gli ambienti cloud gratuiti.
I grandi modelli generativi come Stable Diffusion affrontano sfide di hosting simili, motivo per cui le API hosted sono diventate comuni.
Per questo tutorial useremo l'API hosted di Replicate. Ogni decomposizione costa circa $0,03, che ti garantisce un'esecuzione stabile e riproducibile senza preoccuparti di limiti di memoria o conflitti di dipendenze. Se vuoi solo provare il modello senza scrivere codice, la Hugging Face Space offre un'interfaccia web gratuita in cui puoi caricare immagini e scaricare i layer manualmente.
L'Hugging Face Space ti permette di testare il modello senza codice, ma l'API ti dà controllo programmatico.
Configurare l'ambiente
Crea una nuova directory di progetto e installa i pacchetti richiesti:
Ottieni il tuo token API dalle impostazioni account di Replicate e salvalo in un file
.env:L'immagine sorgente
Gli annunci ufficiali dei modelli di solito mostrano esempi selezionati in cui il modello rende al meglio. Testiamo invece con un'immagine reale per vedere prestazioni realistiche.
Questa è l'immagine che scomporremo in layer:
Foto di Karola G su Pexels
La foto mostra tre prodotti per la cura della pelle su una superficie menta contro uno sfondo lavanda: una scatola regalo bianca con nastro nero, una boccetta di siero rosa e un piccolo vasetto di crema. Composizione pulita, oggetti distinti, ombre delicate. Un buon caso di test per la separazione in layer.
Eseguire l'inferenza
Il parametro
num_layerscontrolla quanto finemente il modello suddivide l'immagine. I valori possono variare da 2 a 8. Con 4 layer ottieni un buon equilibrio tra granularità e gestibilità. Impostareseeda un valore fisso rende l'output riproducibile.L'API accetta anche direttamente URL, quindi puoi saltare la gestione dei file se la tua immagine è ospitata altrove:
Salvare i layer
L'API restituisce una lista di oggetti
FileOutput. Ognuno ha un metodo.read()che ti fornisce i byte dell'immagine:I layer sono ordinati dal basso verso l'alto: l'indice 0 è lo sfondo e gli indici superiori si sovrappongono. Ogni PNG è un'immagine RGBA con trasparenza, dove gli altri layer traspariranno.
Ecco il risultato:
Il modello ha posizionato lo sfondo (parete lavanda e superficie menta) sul livello 0, il vasetto di crema sul livello 1, la scatola regalo sul livello 2 e la boccetta di siero sul livello 3. Ogni prodotto è uscito con bordi puliti e trasparenza accurata.
Osserva però il livello di sfondo e noterai deboli residui di ombra dove prima c'erano i prodotti. Questo è emerso costantemente nei miei test: il modello gestisce bene l'isolamento degli oggetti, ma fatica nella ricostruzione dello sfondo quando ci sono ombre.
Più sono evidenti le ombre nell'immagine di partenza, più visibili diventano questi artefatti. È il primo modello del suo genere, quindi aspettati che il team Qwen affini questo aspetto nei prossimi aggiornamenti.
Ricomporre i layer con Qwen-Image-Layered
La decomposizione è solo metà del flusso di lavoro. I layer diventano utili quando li modifichi e li riassembli in qualcosa di nuovo.
Sostituire lo sfondo
I fotografi di prodotto spesso necessitano dello stesso scatto con sfondi diversi per A/B test, campagne stagionali o esigenze di piattaforma. Con i layer separati, bastano poche righe di codice.
La funzione
alpha_composite()gestisce automaticamente il blending RGBA. Rispetta la trasparenza di ogni layer, così gli oggetti in primo piano si posano in modo naturale su qualsiasi sfondo tu fornisca.PIL rende la manipolazione delle immagini semplice e, se ti servono trasformazioni più complesse, le funzionalità di elaborazione immagini di PyTorch si integrano bene con i flussi di lavoro basati su PIL.
Ecco il risultato:
Stessi prodotti, ambiente diverso, niente mascheratura manuale. Puoi inserire un gradiente, una texture o un'altra foto interamente. Il processo non cambia: sostituisci il layer 0 e componi gli altri sopra.
Rimuovere o riposizionare oggetti
Lo stesso schema vale per altre modifiche. Rimuovi un oggetto saltando il suo layer:
Per riposizionare un oggetto incollandolo a coordinate diverse, usa il metodo
paste()con l'offset x/y scelto:Il flusso di lavoro è sempre lo stesso:
Ogni operazione avviene su un layer isolato, quindi le modifiche restano circoscritte.
Creare un editor Qwen-Image-Layered con Streamlit
Eseguire queste operazioni in un notebook va bene per modifiche una tantum, ma il ciclo di feedback è lento. Scrivi il codice, esegui una cella, controlli l'output, regoli, ripeti. Per il lavoro iterativo in cui vuoi attivare/disattivare layer, confrontare composizioni e scaricare i risultati senza rieseguire le celle, ha più senso una GUI leggera.
Costruiremo un'app Streamlit in circa 160 righe che ti permette di caricare un'immagine, scomporla, attivare/disattivare i layer e vedere un'anteprima live. Crea un file chiamato
streamlit_app.pynella directory del progetto.Configurare Streamlit
Inizia con gli import e la configurazione di base:
Lo stato di sessione persiste tra le riesecuzioni di Streamlit. Senza di esso, i tuoi layer scomparirebbero ogni volta che qualcuno clicca un pulsante.
Controllo del token API
Prima di chiamare Replicate, assicurati che il token esista:
st.stop()interrompe l'esecuzione se manca il token. Non ha senso renderizzare il resto della UI.Funzione di decomposizione con cache
L'API di decomposizione costa $0,03 a chiamata e impiega 30–60 secondi. La cache evita chiamate ridondanti:
Il prefisso underscore in
_image_bytesindica a Streamlit di non fare l'hash di quel parametro (l'hash dei byte è costoso). Il ciclo di retry gestisce gli occasionali errori 502 di Replicate attendendo 5 secondi e provando fino a 3 volte.Visualizzazione e composizione immagini
Definiamo poi piccole utility per la visualizzazione e la composizione:
La scacchiera rende visibile la trasparenza (convenzione standard dei software di editing). La funzione di composizione replica ciò che abbiamo fatto nel notebook, ora guidata dallo stato delle checkbox.
Upload immagine e impostazioni di decomposizione
La sidebar gestisce l'upload dell'immagine e le impostazioni di decomposizione:
Il pulsante di decomposizione è disabilitato finché non viene caricata un'immagine. In caso di successo, i layer vengono salvati nello stato di sessione e tutte le opzioni di visibilità sono impostate su True per default.
Aggiungere i controlli dei layer immagine
Due colonne mostrano i controlli dei layer e l'anteprima live:
Quando deselezioni un layer, Streamlit riesegue lo script. La checkbox aggiorna
layer_visibility, la funzione di composizione ricalcola l'anteprima e la UI si aggiorna automaticamente.Eseguire l'app
Salva il file ed esegui:
L'app ha un'immagine scomposta. Disattiva i layer per rimuovere oggetti dall'anteprima.
Carica un'immagine, clicca su decompose, poi attiva/disattiva i layer. L'anteprima si aggiorna all'istante. Scarica il risultato quando trovi una composizione che ti piace. L'intero flusso avviene nel browser senza rieseguire le celle del notebook.
Conclusione
Qwen-Image-Layered adotta un approccio diverso all'editing di immagini: invece di mascherare i pixel, separa i contenuti in layer RGBA completi con sfondi ricostruiti. Ottieni l'isolamento degli oggetti senza il lavoro di pulizia. Il modello ha difficoltà con artefatti di ombra in scene complesse, ma l'estrazione degli oggetti in sé funziona bene.
Il flusso di lavoro Python è lineare. Chiami l'API di Replicate, ottieni una lista di layer e li componi con PIL. La sostituzione degli sfondi e la rimozione degli oggetti diventano poche righe di codice. L'app Streamlit incapsula quella logica in una GUI per iterare più velocemente.
Questo è il primo modello del suo genere. Il team Qwen rilascia aggiornamenti rapidamente, quindi aspettati miglioramenti nella ricostruzione dello sfondo e una gestione migliore delle immagini con ombre marcate. Il paper di ricerca illustra l'architettura se vuoi capire come funziona la decomposizione a numero variabile di layer sotto il cofano.
Pronto a esplorare altri modelli open source di AI? Padroneggia l'ecosistema dietro Qwen seguendo lo skill track Hugging Face Fundamentals su DataCamp.