Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import base64
|
2 |
+
import streamlit as st
|
3 |
+
from langchain.chat_models import ChatOpenAI
|
4 |
+
from langchain_community.utilities.dalle_image_generator import DallEAPIWrapper
|
5 |
+
|
6 |
+
|
7 |
+
GPT4V_PROMPT = """
|
8 |
+
まず、以下のユーザーのリクエストとアップロードされた画像を注意深く読んでください。
|
9 |
+
|
10 |
+
次に、アップロードされた画像に基づいて画像を生成するというユーザーのリクエストに沿ったDALL-Eプロンプトを作成してください。
|
11 |
+
DALL-Eプロンプトは必ず英語で作成してください。
|
12 |
+
|
13 |
+
ユーザー入力: {user_input}
|
14 |
+
|
15 |
+
プロンプトでは、ユーザーがアップロードした写真に何が描かれているか、どのように構成されているかを詳細に説明してください。
|
16 |
+
写真に何が写っているのかはっきりと見える場合は、示されている場所や人物の名前を正確に書き留めてください。
|
17 |
+
写真の構図とズームの程度を可能な限り詳しく説明してください。
|
18 |
+
写真の内容を可能な限り正確に再現することが重要です。
|
19 |
+
|
20 |
+
DALL-E 3向けのプロンプトを英語で回答してください:
|
21 |
+
"""
|
22 |
+
|
23 |
+
|
24 |
+
def init_page():
|
25 |
+
st.set_page_config(
|
26 |
+
page_title="Image Converter",
|
27 |
+
page_icon="🤗"
|
28 |
+
)
|
29 |
+
st.header("Image Converter 🤗")
|
30 |
+
|
31 |
+
|
32 |
+
def main():
|
33 |
+
init_page()
|
34 |
+
# Style adjustments (optional, remove if not needed)
|
35 |
+
st.markdown("""<style>.st-emotion-cache-15ecox0 { display: none !important; }
|
36 |
+
@media (max-width: 50.5rem) {.st-emotion-cache-13ln4jf {max-width: calc(0rem + 100vw);}}
|
37 |
+
</style>""",unsafe_allow_html=True,)
|
38 |
+
llm = ChatOpenAI(
|
39 |
+
temperature=0,
|
40 |
+
model="gpt-4o",
|
41 |
+
# なぜかmax_tokensないとたまに挙動が不安定になる (2024年5月現在)
|
42 |
+
max_tokens=512
|
43 |
+
)
|
44 |
+
|
45 |
+
dalle3_image_url = None
|
46 |
+
uploaded_file = st.file_uploader(
|
47 |
+
label='Upload your Image here😇',
|
48 |
+
# GPT-4Vが処理可能な画像ファイルのみ許可
|
49 |
+
type=['png', 'jpg', 'webp', 'gif']
|
50 |
+
)
|
51 |
+
if uploaded_file:
|
52 |
+
if user_input := st.chat_input("画像をどのように加工したいか教えてね"):
|
53 |
+
# 読み取ったファイルをBase64でエンコード
|
54 |
+
image_base64 = base64.b64encode(uploaded_file.read()).decode()
|
55 |
+
image = f"data:image/jpeg;base64,{image_base64}"
|
56 |
+
|
57 |
+
query = [
|
58 |
+
(
|
59 |
+
"user",
|
60 |
+
[
|
61 |
+
{
|
62 |
+
"type": "text",
|
63 |
+
"text": GPT4V_PROMPT.format(user_input=user_input)
|
64 |
+
},
|
65 |
+
{
|
66 |
+
"type": "image_url",
|
67 |
+
"image_url": {
|
68 |
+
"url": image,
|
69 |
+
"detail": "auto"
|
70 |
+
},
|
71 |
+
}
|
72 |
+
]
|
73 |
+
)
|
74 |
+
]
|
75 |
+
|
76 |
+
# GPT-4Vに DALL-E 3 用の画像生成プロンプトを書いてもらう
|
77 |
+
st.markdown("### Image Prompt")
|
78 |
+
image_prompt = st.write_stream(llm.stream(query))
|
79 |
+
|
80 |
+
# DALL-E 3 による画像生成
|
81 |
+
with st.spinner("DALL-E 3 is drawing ..."):
|
82 |
+
dalle3 = DallEAPIWrapper(
|
83 |
+
model="dall-e-3",
|
84 |
+
size="1792x1024", # "1024x1024", "1024x1792" も選択可能
|
85 |
+
quality="standard", # 'hd' で高品質な画像も生成可能
|
86 |
+
n=1, # 1度に1枚しか生成できない (並行してリクエストは可能)
|
87 |
+
)
|
88 |
+
dalle3_image_url = dalle3.run(image_prompt)
|
89 |
+
else:
|
90 |
+
st.write('まずは画像をアップロードしてね😇')
|
91 |
+
|
92 |
+
# DALL-E 3 の画像表示
|
93 |
+
if dalle3_image_url:
|
94 |
+
st.markdown("### Question")
|
95 |
+
st.write(user_input)
|
96 |
+
st.image(
|
97 |
+
uploaded_file,
|
98 |
+
use_column_width="auto"
|
99 |
+
)
|
100 |
+
|
101 |
+
st.markdown("### DALL-E 3 Generated Image")
|
102 |
+
st.image(
|
103 |
+
dalle3_image_url,
|
104 |
+
caption=image_prompt,
|
105 |
+
use_column_width="auto"
|
106 |
+
)
|
107 |
+
|
108 |
+
|
109 |
+
if __name__ == '__main__':
|
110 |
+
main()
|