이 페이지에서는 Imagen의 맞춤설정 기능을 사용하여 Firebase AI Logic SDK로 지정된 주제에 따라 이미지를 수정하거나 생성하는 방법을 설명합니다.
작동 방식: 텍스트 프롬프트와 특정 주제 (예: 제품, 사람, 반려동물)를 보여주는 하나 이상의 참조 이미지를 제공합니다. 모델은 이러한 입력을 사용하여 참조 이미지에 지정된 주체를 기반으로 새 이미지를 생성합니다.
예를 들어 모델에 아이 사진에 만화 스타일을 적용하거나 사진 속 자전거의 색상을 변경해 달라고 요청할 수 있습니다.
시작하기 전에
Vertex AI Gemini API을 API 제공자로 사용하는 경우에만 사용할 수 있습니다. |
아직 완료하지 않았다면 Firebase 프로젝트를 설정하고, 앱을 Firebase에 연결하고, SDK를 추가하고, 선택한 API 제공업체의 백엔드 서비스를 초기화하고, ImagenModel
인스턴스를 만드는 방법을 설명하는 시작 가이드를 완료합니다.
이 기능을 지원하는 모델
Imagen는 capability
모델을 통해 이미지 편집을 제공합니다.
imagen-3.0-capability-001
Imagen 모델의 경우 global
위치는 지원되지 않습니다.
주제 맞춤설정 요청 전송
다음 샘플은 제공된 참조 이미지 (이 예에서는 고양이)를 기반으로 새 이미지를 생성하도록 모델에 요청하는 주제 맞춤설정 요청을 보여줍니다. 고양이는 동물이므로 주체 유형 ImagenSubjectReferenceType.ANIMAL
를 사용합니다.
주제가 사람 또는 제품인 경우 다음 변경사항을 적용하여 이 예시를 사용할 수도 있습니다.
주제가 사람인 경우 주제 유형
ImagenSubjectReferenceType.PERSON
를 사용합니다. 얼굴 메시 대조 이미지 유무와 관계없이 이러한 유형의 요청을 전송하여 이미지 생성을 추가로 안내할 수 있습니다.주제가 제품인 경우 주제 유형
ImagenSubjectReferenceType.PRODUCT
를 사용하세요.
이 페이지의 뒷부분에 있는 프롬프트 템플릿을 검토하여 프롬프트를 작성하는 방법과 프롬프트 내에서 참조 이미지를 사용하는 방법을 알아보세요.
Swift
Swift에서는 Imagen 모델을 사용한 이미지 수정이 지원되지 않습니다. 올해 다시 확인해 주세요.
Kotlin
// Using this SDK to access Imagen models is a Preview release and requires opt-in
@OptIn(PublicPreviewAPI::class)
suspend fun customizeImage() {
// Initialize the Vertex AI Gemini API backend service
// Optionally specify the location to access the model (for example, `us-central1`)
val ai = Firebase.ai(backend = GenerativeBackend.vertexAI(location = "us-central1"))
// Create an `ImagenModel` instance with an Imagen "capability" model
val model = ai.imagenModel("imagen-3.0-capability-001")
// This example assumes 'referenceImage' is a pre-loaded Bitmap.
// In a real app, this might come from the user's device or a URL.
val referenceImage: Bitmap = TODO("Load your reference image Bitmap here")
// Define the subject reference using the reference image.
val subjectReference = ImagenSubjectReference(
image = referenceImage,
referenceID = 1,
description = "cat",
subjectType = ImagenSubjectReferenceType.ANIMAL
)
// Provide a prompt that describes the final image.
// The "[1]" links the prompt to the subject reference with ID 1.
val prompt = "A cat[1] flying through outer space"
// Use the editImage API to perform the subject customization.
// Pass the list of references, the prompt, and an editing configuration.
val editedImage = model.editImage(
references = listOf(subjectReference),
prompt = prompt,
config = ImagenEditingConfig(
editSteps = 50 // Number of editing steps, a higher value can improve quality
)
)
// Process the result
}
Java
// Initialize the Vertex AI Gemini API backend service
// Optionally specify the location to access the model (for example, `us-central1`)
// Create an `ImagenModel` instance with an Imagen "capability" model
ImagenModel imagenModel = FirebaseAI.getInstance(GenerativeBackend.vertexAI("us-central1"))
.imagenModel(
/* modelName */ "imagen-3.0-capability-001");
ImagenModelFutures model = ImagenModelFutures.from(imagenModel);
// This example assumes 'referenceImage' is a pre-loaded Bitmap.
// In a real app, this might come from the user's device or a URL.
Bitmap referenceImage = null; // TODO("Load your image Bitmap here");
// Define the subject reference using the reference image.
ImagenSubjectReference subjectReference = new ImagenSubjectReference.Builder()
.setImage(referenceImage)
.setReferenceID(1)
.setDescription("cat")
.setSubjectType(ImagenSubjectReferenceType.ANIMAL)
.build();
// Provide a prompt that describes the final image.
// The "[1]" links the prompt to the subject reference with ID 1.
String prompt = "A cat[1] flying through outer space";
// Define the editing configuration.
ImagenEditingConfig imagenEditingConfig = new ImagenEditingConfig.Builder()
.setEditSteps(50) // Number of editing steps, a higher value can improve quality
.build();
// Use the editImage API to perform the subject customization.
// Pass the list of references, the prompt, and an editing configuration.
Futures.addCallback(model.editImage(Collections.singletonList(subjectReference), prompt, imagenEditingConfig), new FutureCallback<ImagenGenerationResponse>() {
@Override
public void onSuccess(ImagenGenerationResponse result) {
if (result.getImages().isEmpty()) {
Log.d("TAG", "No images generated");
}
Bitmap bitmap = result.getImages().get(0).asBitmap();
// Use the bitmap to display the image in your UI
}
@Override
public void onFailure(Throwable t) {
// ...
}
}, Executors.newSingleThreadExecutor());
Web
Imagen 모델을 사용한 이미지 편집은 웹 앱에서 지원되지 않습니다. 올해 다시 확인해 주세요.
Dart
import 'dart:typed_data';
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
// Initialize FirebaseApp
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
// Initialize the Vertex AI Gemini API backend service
// Optionally specify a location to access the model (for example, `us-central1`)
final ai = FirebaseAI.vertexAI(location: 'us-central1');
// Create an `ImagenModel` instance with an Imagen "capability" model
final model = ai.imagenModel(model: 'imagen-3.0-capability-001');
// This example assumes 'referenceImage' is a pre-loaded Uint8List.
// In a real app, this might come from the user's device or a URL.
final Uint8List referenceImage = Uint8List(0); // TODO: Load your reference image data here
// Define the subject reference using the reference image.
final subjectReference = ImagenSubjectReference(
image: referenceImage,
referenceId: 1,
description: 'cat',
subjectType: ImagenSubjectReferenceType.animal,
);
// Provide a prompt that describes the final image.
// The "[1]" links the prompt to the subject reference with ID 1.
final prompt = "A cat[1] flying through outer space.";
try {
// Use the editImage API to perform the subject customization.
// Pass the list of references, the prompt, and an editing configuration.
final response = await model.editImage(
[subjectReference],
prompt,
config: ImagenEditingConfig(
editSteps: 50, // Number of editing steps, a higher value can improve quality
),
);
// Process the result.
if (response.images.isNotEmpty) {
final editedImage = response.images.first.bytes;
// Use the editedImage (a Uint8List) to display the image, save it, etc.
print('Image successfully generated!');
} else {
// Handle the case where no images were generated.
print('Error: No images were generated.');
}
} catch (e) {
// Handle any potential errors during the API call.
print('An error occurred: $e');
}
Unity
Unity에서는 Imagen 모델을 사용한 이미지 수정이 지원되지 않습니다. 올해 다시 확인해 주세요.
프롬프트 템플릿
요청에서 이미지의 참조 ID (선택적으로 주제 설명도)를 지정하는 ImagenSubjectReference
를 정의하여 참조 이미지(최대 4개 이미지)를 제공합니다. 여러 이미지가 동일한 참조 ID를 가질 수 있습니다 (예: 동일한 고양이의 여러 사진).
그런 다음 프롬프트를 작성할 때 이러한 ID를 참조합니다. 예를 들어 프롬프트에서 [1]
를 사용하여 참조 ID가 1
인 이미지를 참조합니다. 주제 설명을 제공하는 경우 프롬프트에 포함하여 사람이 프롬프트를 더 쉽게 읽을 수 있도록 할 수도 있습니다.
다음 표에서는 피사체 (예: 제품, 사람, 반려동물)를 기반으로 맞춤설정을 위한 프롬프트를 작성할 때 시작점으로 사용할 수 있는 프롬프트 템플릿을 설명합니다.
사용 사례 | 참조 이미지 | 프롬프트 템플릿 | 예 |
---|---|---|---|
제품 이미지 스타일 지정 - 광고 | 피사체 이미지 (최대 4개) | 다음 설명과 일치하는 SUBJECT_DESCRIPTION [1] 이미지를 만들어 줘: ${PROMPT} |
다음 설명과 일치하는 Luxe Elixir hair oil, golden liquid in glass bottle [1] 이미지를 만들어 줘: 순백색 배경에 Luxe Elixir hair oil, golden liquid in glass bottle [1]을 들고 있는 여성의 손을 클로즈업한 밝은 이미지. 여성의 손이 밝게 조명되고 병에 초점이 선명하게 맞춰져 있으며, 피사계 심도가 얕아 배경이 흐리게 처리되어 제품이 강조되어야 해. 조명이 부드럽게 확산되어 병과 손 주위에 은은한 빛을 발하도록 만들어 줘. 제품의 고급스러운 매력이 강조되도록 전반적인 구성은 단순하고 우아해야 해. |
제품 이미지 스타일 지정 - 속성 변경 | 피사체 이미지 (최대 4개) | SUBJECT_DESCRIPTION의 이미지를 생성해 줘. ${PROMPT} |
Seiko watch [1]의 이미지를 생성해 줘. 파란색으로. |
얼굴 메시 입력 없이 사람 이미지 스타일 지정 | 피사체 이미지 (최대 4개) | 다음 설명과 일치하는 SUBJECT_DESCRIPTION [1] 이미지를 만들어 줘: SUBJECT_DESCRIPTION [1]의 초상화 ${PROMPT} | 다음 설명과 일치하는 a woman with short hair[1] 이미지를 만들어 줘: a woman with short hair[1]의 초상화, 배경이 흐리게 처리된 3D 만화 스타일. 카메라를 바라보며 미소 짓는 얼굴을 한 귀엽고 사랑스러운 캐릭터, 파스텔 색조 ... |
얼굴 메시 입력 없이 사람 이미지 스타일 지정 | 피사체 이미지 (최대 4개) | 다음 설명과 일치하는 SUBJECT_DESCRIPTION [1]에 관한 STYLE_DESCRIPTION [2] 이미지를 만들어 줘: SUBJECT_DESCRIPTION [1]의 초상화 STYLE_PROMPT | 다음 설명과 일치하는 a woman with short hair [1]에 관한 3d-cartoon style [2] 이미지를 만들어 줘: a woman with short hair [1]의 초상화로 배경이 흐리게 처리된 3D 만화 스타일. 카메라를 바라보며 미소 짓는 얼굴을 한 귀엽고 사랑스러운 캐릭터, 파스텔 색조 ... |
얼굴 메시 입력을 사용하는 사람 이미지 스타일 지정 |
피사체 이미지 (최대 3개) 얼굴 메시 대조 이미지 (1개) |
Face mesh from the control image [2]로 SUBJECT_DESCRIPTION [1]의 이미지를 생성해 줘. ${PROMPT} | face mesh from the control image [2]로 the person [1]의 이미지를 생성해 줘. 무표정한 얼굴로 정면을 똑바로 바라보고 있어야 해. 배경은 ... |
얼굴 메시 입력을 사용하는 사람 이미지 스타일 지정 |
피사체 이미지 (최대 3개) 얼굴 메시 대조 이미지 (1개) |
설명과 일치하는 CONTROL_IMAGE [2]의 포즈로 SUBJECT_DESCRIPTION [1]에 관한 이미지를 만들어 줘: SUBJECT_DESCRIPTION [1]의 초상화 ${PROMPT} | 다음 설명과 일치하는 a woman with short hair [1] 이미지를 만들어 줘: control image [2]의 포즈를 취한 a woman with short hair [1]의 초상화로 배경이 흐리게 처리된 3D 만화 스타일. 카메라를 바라보고 있으며, 미소 짓는 얼굴을 가진 귀엽고 사랑스러운 캐릭터, 파스텔 색조 ... |
얼굴 메시 입력을 사용하는 사람 이미지 스타일 지정 |
피사체 이미지 (최대 3개) 얼굴 메시 대조 이미지 (1개) |
설명과 일치하도록 CONTROL_IMAGE [2]의 포즈로 SUBJECT_DESCRIPTION [1]에 관한 STYLE_DESCRIPTION [3] 이미지 생성: SUBJECT_DESCRIPTION [1]의 초상화 ${PROMPT} | 다음 설명과 일치하도록 control image [2]의 포즈를 취한 a woman with short hair [1]에 관한 3d-cartoon style [3] 이미지 생성: a woman with short hair [1]의 초상화로 배경이 흐리게 처리된 3D 만화 스타일 카메라를 바라보며 미소 짓는 얼굴을 한 귀엽고 사랑스러운 캐릭터, 파스텔 색조 ... |
권장사항 및 제한사항
사람을 피사체로 사용하는 경우 참조 이미지의 얼굴에 다음 속성이 있는 것이 좋습니다.
- 중앙에 배치되어 전체 이미지의 절반 이상을 차지합니다.
- 모든 방향 (롤, 피치, 요)에서 전면 뷰로 회전됩니다.
- 선글라스나 마스크와 같은 물체로 가려지지 않음
사용 사례
맞춤설정 기능은 자유 형식의 프롬프트를 제공하므로 모델이 학습된 것보다 더 많은 작업을 할 수 있다는 인상을 줄 수 있습니다. 다음 섹션에서는 맞춤설정의 의도된 사용 사례와 의도하지 않은 사용 사례를 예시를 들어 설명합니다.
의도한 사용 사례에 이 기능을 사용하는 것이 좋습니다. 이러한 사용 사례에 대해 모델을 학습시켰으므로 좋은 결과를 기대할 수 있기 때문입니다. 반대로 의도한 사용 사례를 벗어나는 작업을 모델에 푸시하면 결과가 좋지 않을 수 있습니다.
의도된 사용 사례
다음은 의도된 주제 기반 맞춤설정의 사용 사례입니다.
사람의 사진에 스타일을 지정합니다.
사람의 사진에 스타일을 지정하고 사람의 얼굴 표정을 유지합니다.
(성공률 낮음) 소파나 쿠키와 같은 제품을 다양한 제품 각도에 따라 다양한 장면에 배치합니다.
정확한 세부정보를 보존하지 않는 제품의 변형을 생성합니다.
얼굴 표정을 유지하면서 사람의 사진에 스타일을 지정합니다.
의도하지 않은 사용 사례의 예시
다음은 주제를 기반으로 한 맞춤설정의 의도하지 않은 사용 사례의 일부 목록입니다. 이러한 사용 사례에 대해 모델이 학습되지 않았으므로 좋지 않은 결과가 나올 수 있습니다.
두 명 이상의 사람을 서로 다른 장면에 배치하면서 신원을 보존합니다.
두 명 이상의 사람을 서로 다른 장면에 배치하고, 신원을 보존하면서 스타일의 입력으로 예시 이미지를 사용하여 출력 이미지의 스타일을 지정합니다.
두 명 이상의 사람의 신원을 유지하면서 사진에 스타일을 지정합니다.
반려동물의 신원을 유지하면서 다양한 장면에 배치합니다.
반려동물 사진을 스타일화하여 그림으로 변환해 줘.
반려동물의 사진에 스타일을 지정하여 그림으로 바꾸면서 이미지의 스타일 (예: 수채화)을 유지하거나 지정합니다.
반려동물과 사람을 서로 다른 장면에 배치하고 두 사람의 신원을 보존합니다.
반려동물과 한 명 이상의 인물이 있는 사진을 스타일을 지정하여 그림으로 변환합니다.
두 제품을 다양한 제품 각도에 따라 다양한 장면에 배치합니다.
쿠키나 소파와 같은 제품을 다양한 제품 각도와 특정 이미지 스타일(예: 특정 색상, 조명 스타일 또는 애니메이션이 있는 사실적인 이미지)에 따라 다양한 장면에 배치합니다.
제어 이미지로 지정된 장면의 특정 구성을 유지하면서 제품을 다른 장면에 배치합니다.
특정 이미지를 입력으로 사용하여 (예: 특정 색상, 조명 스타일 또는 애니메이션이 있는 사실적인 이미지) 두 제품을 다양한 제품 각도에 따라 다양한 장면에 배치합니다.
두 제품을 서로 다른 장면에 배치하면서 제어 이미지에 지정된 장면의 특정 구성을 유지합니다.