Naar inhoud
lightbulb Welkom op de nieuwe kennisbank | We hebben de docs volledig vernieuwd met meer dan 160 features. Bekijk wat nieuw isarrow_forward

Imagen API in Python gebruiken

Genereer afbeeldingen programmatisch met Imagen 4 op Vertex AI via de Google Gen AI SDK in Python: installatie, authenticatie, parameters en een Flask-voorbeeld.

Overzicht van de Imagen API

Imagen is het tekst-naar-beeldmodel van Google. Je benadert het programmatisch op twee manieren:

  1. Vertex AI (aanbevolen voor productie): authenticatie via Google Cloud-credentials, hogere quota, edit- en upscale-functies. In dit artikel de hoofdroute.
  2. Gemini API (voor lagere volumes en snelle proefjes): authenticatie met een API-key.

Sinds 2025 verloopt beide routes via dezelfde bibliotheek: de Google Gen AI SDK (google-genai, importnaam google.genai). Je kiest met een vlag of je tegen Vertex AI of de Gemini API praat. Eén codebasis, twee backends.

warning

De oude SDK is uitgefaseerd

De oudere modules vertexai.vision_models en vertexai.preview.vision_models (met ImageGenerationModel.from_pretrained(...) en modelnamen als imagegeneration@006) zijn vervangen door de Google Gen AI SDK en stoppen rond 24 juni 2026. Nieuwe code schrijf je met from google import genai. Bestaande code migreer je. Controleer de actuele situatie in de migratiegids van Vertex AI.

Welk model kies je

In juni 2026 is Imagen 4 de nieuwste generatie op Vertex AI. Veelgebruikte modelnamen:

Modelnaam Wanneer
imagen-4.0-generate-001 Nieuwste, hoogste kwaliteit
imagen-3.0-generate-002 Stabiele vorige generatie
imagen-3.0-capability-001 Voor edit- en inpainting-taken

Modelnamen en beschikbaarheid per regio veranderen regelmatig. Bevestig de naam die in jouw regio actief is in de Vertex AI-modeldocumentatie voor je hardcodeert.

Vereisten

Installatie

pip install google-genai pillow

Gebruik een vaste versie (pin) in je requirements.txt, bijvoorbeeld google-genai==1.* met een exacte patchversie, zodat builds reproduceerbaar blijven.

Authenticatie

Voor lokaal ontwikkelen met je eigen Google-account:

gcloud auth application-default login
export GOOGLE_CLOUD_PROJECT="jouw-project-id"

In productie gebruik je een service account. Op Cloud Run, Cloud Functions of een VM met de juiste IAM-rol (roles/aiplatform.user) hoef je geen sleutelbestand mee te geven; de omgeving levert de credentials automatisch. Een sleutelbestand op schijf is een veiligheidsrisico en alleen nodig buiten Google Cloud:

import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/pad/naar/credentials.json"
lightbulb

Houd sleutels uit je repository

Commit nooit een service-account-sleutel of API-key. Zet ze in een secret manager of in omgevingsvariabelen, en voeg *.json-sleutels toe aan je .gitignore.

Basisgebruik

from google import genai
from google.genai import types

client = genai.Client(
    vertexai=True,
    project="jouw-project-id",
    location="us-central1",
)

response = client.models.generate_images(
    model="imagen-4.0-generate-001",
    prompt="Een professionele workspacefoto van mensen die samenwerken op laptops, daglicht, fotorealistisch",
    config=types.GenerateImagesConfig(
        number_of_images=1,
        aspect_ratio="16:9",
        person_generation="allow_adult",
    ),
)

response.generated_images[0].image.save("output.png")
print("Afbeelding opgeslagen als output.png")

De image-objecten in response.generated_images hebben een save(pad)-methode en een attribuut image_bytes met de ruwe bytes, handig als je niet naar schijf wilt schrijven.

Veelgebruikte parameters

Je geeft parameters mee via types.GenerateImagesConfig(...):

Parameter Type Beschrijving
number_of_images int Aantal varianten, 1 tot 4
aspect_ratio str "1:1", "3:4", "4:3", "9:16" of "16:9"
image_size str "1K" of "2K" (resolutie, modelafhankelijk)
person_generation str "dont_allow", "allow_adult" of "allow_all"
negative_prompt str Wat er niet in de afbeelding mag
seed int Vaste zaadwaarde voor reproduceerbare resultaten
output_mime_type str "image/png" of "image/jpeg"

Het genereren van afbeeldingen van kinderen is niet toegestaan, ook niet met allow_all. Welke parameters een model precies ondersteunt verschilt per modelversie; controleer de parameterdocumentatie bij twijfel.

Negatieve prompts

Met een negatieve prompt stuur je bij wat je juist wilt vermijden:

response = client.models.generate_images(
    model="imagen-4.0-generate-001",
    prompt="Professionele kantooromgeving met moderne meubels",
    config=types.GenerateImagesConfig(
        number_of_images=2,
        aspect_ratio="16:9",
        negative_prompt="rommel, slechte belichting, mensen, tekst, logo's",
    ),
)

Afbeelding verwerken met Pillow

Wil je de afbeelding nabewerken (formaat aanpassen, comprimeren naar WebP) zonder eerst naar schijf te schrijven, gebruik dan de ruwe bytes:

from PIL import Image
from io import BytesIO

for i, generated in enumerate(response.generated_images):
    pil_image = Image.open(BytesIO(generated.image.image_bytes)).convert("RGB")
    pil_image.thumbnail((1280, 720))
    pil_image.save(f"output_{i}.webp", "WEBP", quality=85)

Een afbeelding bewerken (inpainting)

Voor inpainting of het vervangen van een gebied gebruik je edit_image met referentiebeelden. Dit draait op het capability-model en is alleen op Vertex AI beschikbaar:

from google.genai import types

raw_ref = types.RawReferenceImage(
    reference_image=types.Image.from_file(location="referentie.jpg"),
    reference_id=0,
)

response = client.models.edit_image(
    model="imagen-3.0-capability-001",
    prompt="Vervang de achtergrond door een moderne kantooromgeving",
    reference_images=[raw_ref],
    config=types.EditImageConfig(
        edit_mode="EDIT_MODE_INPAINT_INSERTION",
        number_of_images=1,
    ),
)

response.generated_images[0].image.save("bewerkt.png")
info

Edit-modi verschillen per model

Welke edit_mode-waarden (zoals EDIT_MODE_INPAINT_INSERTION of EDIT_MODE_OUTPAINT) en welke referentietypes beschikbaar zijn, hangt af van het model en de versie. Raadpleeg de actuele documentatie voor de geldige combinaties.

Foutafhandeling

Vang quota- en validatiefouten apart af, zodat je gericht kunt reageren:

import time
from google.genai import errors

try:
    response = client.models.generate_images(
        model="imagen-4.0-generate-001",
        prompt=prompt,
        config=types.GenerateImagesConfig(number_of_images=1),
    )
except errors.ClientError as e:
    if e.code == 429:
        print(f"Quota overschreden, wacht en probeer opnieuw: {e}")
        time.sleep(60)
    else:
        print(f"Ongeldige aanvraag of geblokkeerde prompt: {e}")
except errors.ServerError as e:
    print(f"Serverfout aan Google-kant: {e}")
    raise

De SDK groepeert fouten in ClientError (4xx, zoals een geweigerde prompt of overschreden quota) en ServerError (5xx). Het HTTP-statusnummer staat in e.code.

Flask-endpoint als voorbeeld

Een eenvoudige REST-endpoint die Imagen aanroept en een WebP teruggeeft:

from flask import Flask, request, jsonify, send_file
from io import BytesIO
from google import genai
from google.genai import types

app = Flask(__name__)
client = genai.Client(vertexai=True, project="jouw-project-id", location="us-central1")

@app.route("/genereer", methods=["POST"])
def genereer():
    data = request.get_json(silent=True) or {}
    prompt = data.get("prompt", "").strip()
    if not prompt or len(prompt) > 2000:
        return jsonify({"fout": "Ongeldige prompt"}), 400

    response = client.models.generate_images(
        model="imagen-4.0-generate-001",
        prompt=prompt,
        config=types.GenerateImagesConfig(number_of_images=1, aspect_ratio="16:9"),
    )

    buffer = BytesIO(response.generated_images[0].image.image_bytes)
    buffer.seek(0)
    return send_file(buffer, mimetype="image/png")

if __name__ == "__main__":
    app.run(debug=False)
warning

Bescherm een publieke generatie-endpoint

Beeldgeneratie kost geld per afbeelding. Zet zo'n endpoint nooit onbeveiligd online: voeg authenticatie, een rate limit en een maximumlengte op de prompt toe, en valideer de invoer. Anders kan iemand jouw quota en factuur opstoken.

Verder kijken: Gemini-beeldmodellen

Naast Imagen biedt Google ook beeldgeneratie via de Gemini-modellen (informeel "Nano Banana" genoemd). Die zijn sterk in conversationeel bewerken en het combineren van tekst en beeld in één gesprek. Voor strakke, hoogwaardige tekst-naar-beeld blijft Imagen 4 doorgaans de eerste keuze. Weeg per use case af wat past, en houd de releasenotes in de gaten, want dit veld beweegt snel.

Welke Imagen-modelversie moet ik gebruiken?

In juni 2026 is imagen-4.0-generate-001 de nieuwste generatie en doorgaans de beste keuze. Wil je stabiliteit boven nieuwste features, dan is imagen-3.0-generate-002 een degelijk alternatief. Controleer welke modellen in jouw regio beschikbaar zijn voor je een naam hardcodeert.

Moet ik de oude vertexai-vision_models-code herschrijven?

Ja. Die modules zijn uitgefaseerd en stoppen rond 24 juni 2026. Vervang ImageGenerationModel.from_pretrained(...) door een genai.Client(vertexai=True, ...) en client.models.generate_images(...). De parameters zijn grotendeels vergelijkbaar, maar zitten nu in een GenerateImagesConfig-object.

Hoe hoog zijn de kosten per afbeelding?

Vertex AI rekent per gegenereerde afbeelding, met een tarief dat afhangt van model en resolutie. Bekijk de actuele bedragen in de Google Cloud-prijslijst voor Vertex AI, want prijzen wijzigen los van deze handleiding.

Kan ik dit draaien vanuit Cloud Run of Cloud Functions?

Ja. De Google Gen AI SDK werkt prima serverless. Geef het draaiende account de rol roles/aiplatform.user, dan hoef je geen apart sleutelbestand mee te leveren; de omgeving levert de credentials.

Wat doe ik bij een rate limit of quota-fout?

Een quota-overschrijding komt terug als een ClientError met code 429. Bouw een retry met wachttijd (backoff) in, en vraag indien nodig een hoger quotum aan via de Google Cloud Console.

Werkt dezelfde code ook tegen de Gemini API in plaats van Vertex AI?

Grotendeels wel. Maak de client dan zonder vertexai=True en geef een API-key mee in plaats van project en locatie. De Gemini-route heeft minder configuratieopties en lagere quota, en is bedoeld voor kleinere volumes of prototypes.