🤖

Streamlitで画像生成アプリを作る

2024/12/31に公開

はじめに

Streamlitで参考画像から新しい画像を作成するアプリを作ってみたいと思います。

streamlitとは

https://zenn.dev/headwaters/articles/893d8604f35198
https://zenn.dev/headwaters/articles/34caea66e66470

画像生成アプリを作る上で、こちらを参考にStreamlitに書き直します。

https://zenn.dev/headwaters/articles/4b7554dc743196

app.py

import streamlit as st
import openai
import base64
import os
import requests
import json
from openai import AzureOpenAI

# Streamlitアプリのタイトル
st.title("画像説明生成と統合")

# Azure OpenAIのクライアント設定
client = AzureOpenAI(
    api_version="2023-05-15",  # 固定
    api_key="<OAI_KEY>",
    azure_endpoint="<OAI_ENDPOINT>"
)

# DALL-E 3を使用して新しい画像を生成
dalle_client = AzureOpenAI(
    api_version="2024-02-01",  # 固定
    api_key="<OAI_KEY>",
    azure_endpoint="<OAI_ENDPOINT>"
)

# 画像をアップロードするウィジェット
uploaded_files = st.file_uploader("画像をアップロードしてください", type=["png"], accept_multiple_files=True)

# 画像がアップロードされた場合の処理
if uploaded_files:
    base64_images = []
    for uploaded_file in uploaded_files:
        st.image(uploaded_file, caption=uploaded_file.name)
        # 画像をbase64エンコード
        base64_image = base64.b64encode(uploaded_file.read()).decode("utf-8")
        base64_images.append(base64_image)

    print('-----------------------')
    print('Upload Done')
    image_descriptions = []

    # 各画像の説明を生成
    for base64_image in base64_images:
        response = client.chat.completions.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": [
                    {"type": "text", "text": "Describe this image:"},
                    {"type": "image_url", "image_url": {
                        "url": f"data:image/png;base64,{base64_image}"}
                    }
                ]}
            ],
            temperature=0.0,
        )
        gpt_response = response.choices[0].message.content
        image_descriptions.append(gpt_response)

    st.write("Image descriptions:", image_descriptions)
    print('-----------------------')
    print('Image descriptions')

    # 説明を結合してプロンプトを作成
    combined_descriptions = "以下の画像の説明を元に画像を統合してください。"   " ".join(image_descriptions)

    result = dalle_client.images.generate(
        model="dall-e-3",
        prompt=f"あなたは、デザイナーです。{combined_descriptions}",
        n=1
    )

    json_response = json.loads(result.model_dump_json())
    image_url = json_response["data"][0]["url"]
    generated_image = requests.get(image_url).content

    # 生成された画像を表示
    st.image(generated_image, caption="Generated Image")

    # 画像を保存するディレクトリを設定
    image_dir = os.path.join(os.curdir, 'images')

    # ディレクトリが存在しない場合、作成する
    if not os.path.isdir(image_dir):
        os.mkdir(image_dir)

    # 生成された画像を保存
    image_path = os.path.join(image_dir, 'generated_image.png')
    with open(image_path, "wb") as image_file:
        image_file.write(generated_image)

    st.write(f"Image saved to {image_path}")

追加で画像のプレビューが出るようにしました。
必要なライブラリをインポートして、streamlit run app.pyして画像生成してみると...

なんか、似てるロボットが画像生成されました!

ヘッドウォータース

Discussion