heysho commited on
Commit
251723f
1 Parent(s): 380ffdc

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +110 -0
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()