heysho's picture
Create app.py
251723f verified
import base64
import streamlit as st
from langchain.chat_models import ChatOpenAI
from langchain_community.utilities.dalle_image_generator import DallEAPIWrapper
GPT4V_PROMPT = """
まず、以下のユーザーのリクエストとアップロードされた画像を注意深く読んでください。
次に、アップロードされた画像に基づいて画像を生成するというユーザーのリクエストに沿ったDALL-Eプロンプトを作成してください。
DALL-Eプロンプトは必ず英語で作成してください。
ユーザー入力: {user_input}
プロンプトでは、ユーザーがアップロードした写真に何が描かれているか、どのように構成されているかを詳細に説明してください。
写真に何が写っているのかはっきりと見える場合は、示されている場所や人物の名前を正確に書き留めてください。
写真の構図とズームの程度を可能な限り詳しく説明してください。
写真の内容を可能な限り正確に再現することが重要です。
DALL-E 3向けのプロンプトを英語で回答してください:
"""
def init_page():
st.set_page_config(
page_title="Image Converter",
page_icon="🤗"
)
st.header("Image Converter 🤗")
def main():
init_page()
# Style adjustments (optional, remove if not needed)
st.markdown("""<style>.st-emotion-cache-15ecox0 { display: none !important; }
@media (max-width: 50.5rem) {.st-emotion-cache-13ln4jf {max-width: calc(0rem + 100vw);}}
</style>""",unsafe_allow_html=True,)
llm = ChatOpenAI(
temperature=0,
model="gpt-4o",
# なぜかmax_tokensないとたまに挙動が不安定になる (2024年5月現在)
max_tokens=512
)
dalle3_image_url = None
uploaded_file = st.file_uploader(
label='Upload your Image here😇',
# GPT-4Vが処理可能な画像ファイルのみ許可
type=['png', 'jpg', 'webp', 'gif']
)
if uploaded_file:
if user_input := st.chat_input("画像をどのように加工したいか教えてね"):
# 読み取ったファイルをBase64でエンコード
image_base64 = base64.b64encode(uploaded_file.read()).decode()
image = f"data:image/jpeg;base64,{image_base64}"
query = [
(
"user",
[
{
"type": "text",
"text": GPT4V_PROMPT.format(user_input=user_input)
},
{
"type": "image_url",
"image_url": {
"url": image,
"detail": "auto"
},
}
]
)
]
# GPT-4Vに DALL-E 3 用の画像生成プロンプトを書いてもらう
st.markdown("### Image Prompt")
image_prompt = st.write_stream(llm.stream(query))
# DALL-E 3 による画像生成
with st.spinner("DALL-E 3 is drawing ..."):
dalle3 = DallEAPIWrapper(
model="dall-e-3",
size="1792x1024", # "1024x1024", "1024x1792" も選択可能
quality="standard", # 'hd' で高品質な画像も生成可能
n=1, # 1度に1枚しか生成できない (並行してリクエストは可能)
)
dalle3_image_url = dalle3.run(image_prompt)
else:
st.write('まずは画像をアップロードしてね😇')
# DALL-E 3 の画像表示
if dalle3_image_url:
st.markdown("### Question")
st.write(user_input)
st.image(
uploaded_file,
use_column_width="auto"
)
st.markdown("### DALL-E 3 Generated Image")
st.image(
dalle3_image_url,
caption=image_prompt,
use_column_width="auto"
)
if __name__ == '__main__':
main()