생성형 AI - 키워드를 사용한 이미지 생성

1. 소개

최종 업데이트: 2023년 10월 12일

Imagegen 이미지 생성

Google Imagen은 텍스트 설명으로부터 실감 나고 창의적인 이미지를 생성할 수 있는 강력한 Google의 대규모 언어 모델입니다. Vertex AI의 Imagen을 사용하면 사용자의 상상력을 단 몇 초 만에 고품질 시각적 애셋으로 변환하는 차세대 AI 제품을 빌드할 수 있습니다. 텍스트를 통한 이미지 생성 외에도 텍스트 프롬프트, 이미지 캡션, 시각적 질의 응답, 제목 및 주제를 통한 이미지 편집도 지원합니다. 스타일 기반 이미지 모델 조정

프롬프트 생성

Imagen을 사용하여 이미지를 만들려면 프롬프트라고 하는 이미지에 대한 텍스트 설명을 제공해야 하며, 이를 사용하여 이미지가 생성됩니다. 그러나 실사에 가까운 고품질 이미지를 생성하려면 프롬프트 전문 지식이 필요합니다. 소매업, 제조업과 같은 특정 비즈니스 도메인과 관련된 이미지를 생성하려는 경우 도메인에 따라 다를 수도 있습니다. 프롬프트를 설계하는 더 쉬운 접근 방법은 Text Bison 모델에 키워드 집합을 제공하는 것입니다.

전반적인 접근 방식은 다음과 같습니다.

fbb3826592b2816d.png

GRadio UI

GRadio는 오픈소스 Python 라이브러리로, 단 몇 줄의 코드로 머신러닝 모델, 모든 API 또는 임의의 Python 함수를 위한 사용하기 쉽고 맞춤설정 가능한 UI 구성요소를 빠르게 만들 수 있습니다. GRadio GUI를 Jupyter 노트북에 직접 통합하거나 다른 사용자와 링크로 공유할 수 있습니다. GRadio는 텍스트, 이미지, 동영상, 오디오 등 다양한 미디어 유형을 지원합니다. 또한 입력란, 버튼, 슬라이더, 드롭다운 메뉴 등 사전 빌드된 여러 UI 구성요소도 제공합니다.

빌드할 항목

이 Codelab에서는 다음을 실행하는 GRadio 앱을 배포합니다.

  • 키워드나 구문을 사용하여 텍스트 프롬프트를 생성합니다. 생성된 프롬프트는 수동으로 수정할 수도 있습니다.
  • UI에 생성된 프롬프트에서 이미지를 생성합니다.

학습할 내용

  • 텍스트 들소 모델과 함께 제로샷 및 퓨샷 학습을 프로그래매틱 방식으로 사용하여 이미지 생성을 위한 이미지별 프롬프트를 생성하는 방법
  • API 및 프롬프트를 통해 Imagen 모델을 사용하여 이미지를 생성하는 방법
  • Vertex AI 워크벤치 노트북에서 GRadio 애플리케이션을 빌드, 배포, 테스트하는 방법

필요한 항목

  • GCP 프로젝트에 대한 액세스 권한(예: ‘Cloud-llm-preview4’)
  • Vertex AI Workbench를 만들 수 있는 액세스 권한입니다.
  • Vertex AI API가 사용 설정되었습니다.
  • GRadio의 네트워킹 요구사항: 노트북 인스턴스 액세스 공개 URL

2. 설정

노트북 만들기

  • 프로젝트에 로그인
  • 왼쪽 탐색 메뉴에서 Workbench로 이동합니다.
  • '사용자 관리형 노트북'에서 기본 옵션으로 새 노트북을 만듭니다.
  • 'JupyterLab 열기'를 클릭합니다. 인스턴스가 프로비저닝되면 인스턴스가 프로비저닝됩니다

참고: 노트북이 중지된 상태인 경우 노트북을 시작하는 데 몇 분 정도 걸릴 수 있습니다.

코드 가져오기

코드 파일을 여기에 배치했습니다. 이 노트북을 사용자 환경으로 가져와 그대로 실행할 수 있습니다 (프로젝트 세부정보 변경 제외).

3. 코드 실행

필요한 종속 항목과 라이브러리 설치/가져오기

  • GRadio 앱 설치하기
  • Text-Bison 및 이미지 생성을 위한 Vertex AI API를 가져옵니다.
  • 다른 모든 필수 라이브러리를 가져옵니다.

Text-Bison을 사용한 프롬프트 생성

키워드 또는 구문이 포함된 사용자 입력을 사용합니다. 즉, 생성할 필수 이미지를 설명하는 문장을 구성하는 데 사용할 수 있는 쉼표로 구분된 키워드 또는 구문 목록입니다.

인물, 주제, 배경, 조명, 기타 설명 등을 예로 들 수 있습니다.

프롬프트를 생성하는 함수는 아래와 같이 제공됩니다.

대기 형 프롬프트_생성(페르소나,신호,테마, 조명, 품질, extra_desc):

model = TextGenerationModel.from_pretrained("text-bison")

response_few_shot = model.predict(

    few_shot_prompt,

    **parameters

)

response_single_shot = model.predict(

    prompt,

    **parameters

)

퓨샷 및 제로샷 프롬프트

제로샷 프롬프팅은 모델에 텍스트를 생성할 컨텍스트나 예시가 주어지지 않는 텍스트 생성 기법입니다. 일관되고 유익한 텍스트를 생성하려면 모델이 자체 지식에 의존해야 하기 때문에 이 작업은 어려울 수 있습니다.

하지만 제로샷 프롬프팅은 모델이 기존 예시에 의해 제한되지 않기 때문에 매우 창의적일 수도 있습니다.

퓨샷 프롬프팅은 텍스트를 생성할 때 사용할 예시를 몇 가지 모델에 제공하는 텍스트 생성 기법입니다. 모델에 생성할 항목에 대한 지침이 있으므로 이 방법은 제로샷 프롬프팅보다 쉬울 수 있습니다. 하지만 퓨샷 프롬프팅도 모델이 주어진 예와 유사한 텍스트만 생성할 수 있기 때문에 제한될 수 있습니다.

다음은 퓨샷 및 제로샷 프롬프트의 샘플 코드입니다.

‐###코드에 퓨샷(Few Shot) 프롬프트 사용**

몇_shot_prompt = f"""여러분은 이미지 생성 모델 프롬프트를 작성하는 데 전문가입니다. 제공된 구문과 키워드를 사용하여 연결하고 사실적인 세부정보를 더해 이미지 생성에 사용할 수 있는 논리적이고 의미 있는 프롬프트를 생성합니다.

input: people, gardening, house garden, colorful plants, Real, HD image, Photo.

output: A Photo of people gardening in a house garden landscape with few coloured flowering plants. Realistic FULL HD Images, Elegant and natural facial and eye features taken by professional photographer

input: plumber, faucet, kitchen, high quality, natural lighting, Photo

output: A Photo of a plumber fixing a faucet in the kitchen. High quality image with natural indoor lighting.

input: house and garden, halloween, warm lighting, high quality image, Sketch

output: A Sketch of Beautiful House and Garden with Halloween Decorations. Warm lighting, High Quality, 4K photograph taken by professional photographer from front.

input: nice living room, warm lighting,Professional Photographer from far, Photo

output: A photo of a Well designed Living Room. Warm lighting, High Quality, 4K photograph taken by Professional Photographer from far

input: {params_list_str}

output:
"""

# 코드에 사용된 제로샷 프롬프트

prompt = f"""여러분은 이미지 생성 모델 프롬프트를 작성하는 데 전문가입니다. 특히 "{params_list_str}" 단어를 포함하여 이미지 생성 모델과 관련된 의미 있는 프롬프트 목록을 작성하도록 도와줘. 이러한 단어를 프롬프트에 포함하고 의미 있는 프롬프트를 만드세요."""

Imagen을 사용한 이미지 생성

사용자 입력 프롬프트와 부정 프롬프트(선택사항)를 사용하고 모델에 동일하게 피드합니다 (imagegeneration@002).

‐·def image_generation_completion(입력, 부정_프롬프트):

input_prompt = input

model = ImageGenerationModel.from_pretrained("imagegeneration@002")

response = model.generate_images(

    prompt=input_prompt,

    number_of_images=4, #kept to static value of 4

    negative_prompt=negative_prompt

)

다음 코드는 사용자 입력 프롬프트와 부정 프롬프트로부터 이미지를 생성하기 위해 포함되어 있습니다. 최종 코드는 text-bison 모델에서 생성한 프롬프트를 사용합니다.

× vertexai.preview.vision_models에서 ImageGenerationModel 가져오기

def image_generation(input, negative_prompt):

input_prompt = input

model = ImageGenerationModel.from_pretrained("imagegeneration@002")

response = model.generate_images(

    prompt=input_prompt,

    number_of_images=4, #kept to static value of 4.. can be a max value of 8

    negative_prompt=negative_prompt

)

images = response.images

return images

user_prompt = "프롬프트: 한 젊은 여성이 나무 한 그루에서 장식되지 않은 신선한 크리스마스트리를 보여주고 판매합니다. 차가운 조명, 고품질의 섬세한 이미지를 전문 사진가가 멀리서 촬영합니다."

네거티브_프롬프트 = "왜곡되고 매력적이지 않은 얼굴"

generate_images_list = image_generation(user_prompt,negative_prompt)

#생성된 이미지 중 하나 표시

generated_images_list[0].show()

출력 -

db04a6bfdd78693b.jpeg

4. GRadio 앱 배포

GRadio는 사용자가 키워드를 입력하고 구조화된 프롬프트를 생성할 수 있는 프런트엔드에 사용됩니다. 이러한 프롬프트는 직접 사용하거나 사용자가 추가로 편집한 다음, 입력에 따라 이미지를 생성하기 위해 Imagen에 입력할 수 있습니다. GRadio는 머신러닝 모델의 사용자 인터페이스를 만드는 데 사용할 수 있는 Python 라이브러리입니다. 이 애플리케이션에서는 블록을 사용하여 애플리케이션에 유연성과 복잡한 데이터 흐름을 추가합니다. 블록은 행과 열을 사용하여 애플리케이션 레이아웃 관리를 제공합니다.

× gr.Blocks()를 데모로 사용하는 경우:

#Prompt Generation Part

with gr.Row():

    with gr.Column(scale=1):

        Persona = gr.Textbox(label="Persona", info = "Customer segment such as Plumber, Electrician etc.")

    with gr.Column(scale=1):

        Signals = gr.Textbox(label="Signals", info = "Main content of banner such as Faucet, Lamp etc.")

    with gr.Column(scale=1):

        Theme = gr.Textbox(label="Theme", info = "Context of the banner such as Halloween, Kitchen etc.")

with gr.Row():

    with gr.Column(scale=1):

        photo_modifiers = gr.Textbox(label="Photography Modifiers", info = "Photography specific modifiers and parameters such as Lighting(Dramatic/Natural/Warm/Cold), Camera Proximity etc.")

    with gr.Column(scale=1):

        quality_modifiers =  gr.Textbox(label="Image Quality Modifier", info = "Quality Modifiers like high-quality, beautiful, stylized. 4K, HDR, By a professional etc")

    with gr.Column(scale=1):

        other_desc =  gr.Textbox(label="Any Other Description", info = "Other Descriptions for Image such as Style (Painting/Photo/Sketch), Bakground/Foreground Context")

gr.Row()를 사용합니다.

    btn = gr.Button("Submit")

gr.Row()를 사용합니다.

    returned_prompts = gr.Textbox(label="Result Prompts", interactive = True)    

btn.click(fn=prompt_generation, input=[Persona, Signals,Theme, photo_modifiers, quality_modifiers, other_desc], output = returned_prompts)

사용자 입력과 출력을 처리하기 위해 GRadio는 이미지, 동영상, 슬라이더, 드롭다운, 텍스트 상자, 라디오, 기타 옵션과 같은 여러 구성요소를 제공합니다. 이러한 구성요소를 통해 개발자는 사용자의 입력을 받아 Test-bison, Imagen 또는 기타 ML 모델에 데이터를 제공하는 방법을 유연하게 제어할 수 있습니다.

이 프로젝트의 경우 애플리케이션이 Blocks를 사용하여 제작되어 유연성과 복잡성이 더해졌습니다.

데이터 흐름을 관리할 수 있습니다 차단 외에도 여러 GRadio 구성요소가

사용되는 예:

다음은 입력 및 부정 프롬프트에서 이미지를 생성하는 데 사용되는 코드 스니펫입니다.

× #이미지 생성 부분

with gr.Row():

    with gr.Column(scale=1):

        image_prompt = gr.Textbox(label="Image Generation Prompt")

with gr.Accordion("Advanced options", open=False): #Let's hide the advanced options!

    with gr.Row():

        negative_prompt = gr.Textbox(label="Negative prompt", info = "Specify What not to Include in Image ex. Bad Quality Image")

with gr.Row():

    with gr.Column(scale=1):    

        img_btn = gr.Button("Generate Images")

with gr.Row():

    with gr.Column():

        output_image_1 = gr.Image(label = "Result Image 1", visible = False)

    with gr.Column():

        output_image_2 = gr.Image(label = "Result Image 2", visible = False)

with gr.Row():

    with gr.Column():

        output_image_3 = gr.Image(label = "Result Image 3", visible = False)

    with gr.Column():

        output_image_4 = gr.Image(label = "Result Image 4", visible = False)

returned_prompts.select(populate_image_prompt, inputs = [returned_prompts], outputs = image_prompt)

img_btn.click(fn=image_generation_completion, inputs=[image_prompt,negative_prompt], outputs = [output_image_1,output_image_2,output_image_3,output_image_4])       

GRadio 애플리케이션을 실행하고 테스트하려면 텍스트 프롬프트를 입력한 다음 '생성' 버튼을 클릭하면 됩니다. Imagen이 프롬프트를 기반으로 이미지를 생성합니다. 다양한 프롬프트를 시도하여 Imagen에서 생성할 수 있는 이미지의 종류를 확인할 수 있습니다.

다음은 GRadio 앱의 프롬프트 생성 스크린샷입니다.

70331c9645b1e91b.png

다음은 GRadio 앱의 이미지 생성 스크린샷입니다.

a7261e8fafab7073.png

예시 -

예 1 -

[왼쪽 이미지] 프롬프트 (간단한 키워드를 프롬프트로 사용) : 보트를 타는 몇 명의 친구.

[오른쪽 이미지] 프롬프트 (Text-Bison에서 생성한 프롬프트 사용) : 숲속의 어두운 나무로 둘러싸인 젊은 남성 두 명이 보트에서 낚시를 하고 있는 사진입니다. 남성들이 셔츠를 입고 배 위에 서 있습니다. 자연광, 고품질, 4K(전문 사진사가 촬영)

c2f5fabd10baf42.jpeg abc9b8204a9fdf7f.jpeg

예 2 -

[왼쪽 이미지] 프롬프트 ((간단한 키워드를 프롬프트로 사용)) : 크리스마스 트리

[오른쪽 이미지] 프롬프트 (Text-Bison에서 생성한 프롬프트 사용) : 램프와 가구가 있는 방의 크리스마스 트리입니다. 이 나무는 조명과 장식품으로 장식되어 있습니다. 창 근처에 배치되며 배경에 벽이 보입니다. 따뜻한 조명, 고화질, HDR 전문 사진사가 멀리서 촬영합니다.

f10cf9f52ffd92c7.jpeg cce36df7a439b309.jpeg

5. 삭제

리소스를 정리하려면

  • gRadio 앱을 중지합니다.
  • Workbench 노트북을 중지/삭제합니다.

6. 축하합니다

수고하셨습니다. Google Text-Bison API와 Imagen API를 사용하여 프롬프트와 이미지를 만드는 GRadio 애플리케이션을 배포했습니다.