יצירת תמונות באמצעות Imagen 3

Imagen 3 הוא מודל ליצירת תמונות. אפשר להשתמש בה כדי ליצור דמויות 'אני' בהתאמה אישית לפרופיל המשתמש, או כדי לשלב נכסים חזותיים מותאמים אישית במסלולי מסך קיימים כדי להגביר את ההתעניינות של המשתמשים.

אתם יכולים לגשת למודלים של Imagen מאפליקציית Android שלכם באמצעות Firebase AI Logic SDK. אפשר להשתמש במודלים של Imagen באמצעות שני ספקי ה-API של Firebase AI Logic: Gemini Developer API (מומלץ לרוב המפתחים) ו-Vertex AI.

תרשים שממחיש ארכיטקטורה של שילוב של Firebase AI Logic כדי לגשת ל-Gemini Developer API. אפליקציה ל-Android משתמשת ב-Firebase Android SDK כדי להתחבר ל-Firebase. לאחר מכן, Firebase יוצר אינטראקציה עם Gemini Developer API, שמאפשר גישה ל-Gemini Pro ול-Gemini Flash בענן.
איור 1. גישה למודלים של Imagen 3 באמצעות Firebase AI Logic.

התנסות בהנחיות

לרוב, צריך לנסות כמה פעמים כדי ליצור את ההנחיות האידיאליות. אתם יכולים להתנסות בהנחיות תמונה ב-Vertex AI Studio, סביבת פיתוח משולבת (IDE) ליצירת אב טיפוס ולעיצוב של הנחיות. טיפים לשיפור ההנחיות מופיעים במדריך בנושא הנחיות ומאפייני תמונות.

צילום מסך של הממשק של Google Cloud Vertex AI Studio, שבו מוצגות ארבע תמונות שנוצרו של דינוזאור טי-רקס עם תיק גב כחול ביער פרהיסטורי. בסרגל הצד מוצגות אפשרויות ניווט כמו מרכז הבקרה, גן המודלים ו-Vision, ובחלונית השמאלית מוצגים פרמטרים להגדרות של יצירת תמונות.
איור 2. Vertex AI Studio יכול לעזור לכם לשפר את ההנחיות ליצירת תמונות.

הגדרת פרויקט Firebase וקישור האפליקציה

פועלים לפי השלבים שמפורטים במסמכי העזרה של Firebase כדי להוסיף את Firebase לפרויקט Android.

מוסיפים את יחסי התלות של Gradle

מוסיפים את יחסי התלות הבאים לקובץ build.gradle:

dependencies {
  // Import the BoM for the Firebase platform
  implementation(platform("com.google.firebase:firebase-bom:33.14.0"))

  // Add the dependency for the Firebase AI Logic library. When using the BoM,
  // you don't specify versions in Firebase library dependencies
  implementation("com.google.firebase:firebase-ai")
}

יצירת תמונה

כדי ליצור תמונה באפליקציה ל-Android, מתחילים ביצירת מופע של ImagenModel עם הגדרה אופציונלית.

אפשר להשתמש בפרמטר generationConfig כדי להגדיר הנחיה שלילית, את מספר התמונות, את יחס הגובה-רוחב של התמונה בפלט, את פורמט התמונה ולהוסיף סימן מים. אפשר להשתמש בפרמטר safetySettings כדי להגדיר את המסננים של הבטיחות והאנשים.

Kotlin

val config = ImagenGenerationConfig {
    numberOfImages = 2,
    aspectRatio = ImagenAspectRatio.LANDSCAPE_16x9,
    imageFormat = ImagenImageFormat.jpeg(compressionQuality = 100),
    addWatermark = false
}

// Initialize the Gemini Developer API backend service
// For Vertex AI use Firebase.ai(backend = GenerativeBackend.vertexAI())
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).imagenModel(
    modelName = "imagen-3.0-generate-002",
    generationConfig = config,
    safetySettings = ImagenSafetySettings(
       safetyFilterLevel = ImagenSafetyFilterLevel.BLOCK_LOW_AND_ABOVE,
       personFilterLevel = ImagenPersonFilterLevel.BLOCK_ALL
    )
)

Java

ImagenGenerationConfig config = new ImagenGenerationConfig.Builder()
    .setNumberOfImages(2)
    .setAspectRatio(ImagenAspectRatio.LANDSCAPE_16x9)
    .setImageFormat(ImagenImageFormat.jpeg(100))
    .setAddWatermark(false)
    .build();

// For Vertex AI use Firebase.ai(backend = GenerativeBackend.vertexAI())
ImagenModelFutures model = ImagenModelFutures.from(
    FirebaseAI.ai(backend = GenerativeBackend.googleAI()).imagenModel(
       "imagen-3.0-generate-002",
       config,
       ImagenSafetySettings.builder()
          .setSafetyFilterLevel(ImagenSafetyFilterLevel.BLOCK_LOW_AND_ABOVE)
          .setPersonFilterLevel(ImagenPersonFilterLevel.BLOCK_ALL)
          .build())
);

אחרי שיוצרים את ImagenModel, אפשר ליצור תמונות על ידי קריאה ל-generateImages:

Kotlin

val imageResponse = model.generateImages(
  prompt = "An astronaut riding a horse",
)
val image = imageResponse.images.first
val bitmapImage = image.asBitmap()

Java

CompletableFuture<GenerateContentResponse> futureResponse =
    model.generateContent(
        Content.newBuilder()
            .addParts(
                Part.newBuilder()
                    .setText("An astronaut riding a horse")
                    .build())
            .build());

try {
  GenerateContentResponse imageResponse = futureResponse.get();
  List<GeneratedImage> images =
      imageResponse
          .getCandidates(0)
          .getContent()
          .getParts(0)
          .getInlineData()
          .getImagesList();

  if (!images.isEmpty()) {
    GeneratedImage image = images.get(0);
    Bitmap bitmapImage = image.asBitmap();
    // Use bitmapImage
  }
} catch (ExecutionException | InterruptedException e) {
  e.printStackTrace();
}