openfree commited on
Commit
3081cf0
·
verified ·
1 Parent(s): 6de8f34

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +111 -67
app.py CHANGED
@@ -1,5 +1,3 @@
1
-
2
-
3
  import os
4
  import gradio as gr
5
  import random
@@ -12,17 +10,23 @@ import numpy as np
12
  from diffusers import DiffusionPipeline
13
  from transformers import pipeline as hf_pipeline
14
 
15
- # ---------------------- ZeroGPU 환경에서 CPU 사용 설정 ----------------------
 
 
 
16
  if os.getenv("ZERO_GPU"):
17
  device = "cpu"
18
  else:
19
  device = "cuda" if torch.cuda.is_available() else "cpu"
20
 
21
- dtype = torch.bfloat16 if (device == "cuda" and torch.cuda.is_available()) else torch.float32
 
22
 
23
- # ---------------------- 이미지 생성 관련 설정 ----------------------
 
 
24
  translator = hf_pipeline(
25
- "translation",
26
  model="Helsinki-NLP/opus-mt-ko-en",
27
  device=0 if device == "cuda" else -1
28
  )
@@ -35,12 +39,18 @@ pipe = DiffusionPipeline.from_pretrained(
35
  MAX_SEED = np.iinfo(np.int32).max
36
  MAX_IMAGE_SIZE = 2048
37
 
 
 
 
38
  def contains_korean(text):
39
  for char in text:
40
  if ord('가') <= ord(char) <= ord('힣'):
41
  return True
42
  return False
43
 
 
 
 
44
  def generate_design_image(prompt, seed=42, randomize_seed=True, width=1024, height=1024, num_inference_steps=4):
45
  """
46
  생성된 확장 아이디어 텍스트(prompt)를 입력받아,
@@ -72,7 +82,9 @@ def generate_design_image(prompt, seed=42, randomize_seed=True, width=1024, heig
72
 
73
  return image
74
 
75
- # ---------------------- Gemini API 및 아이디어 생성 관련 기존 코드 ----------------------
 
 
76
  logging.basicConfig(
77
  level=logging.INFO,
78
  format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
@@ -83,9 +95,15 @@ logging.basicConfig(
83
  )
84
  logger = logging.getLogger("idea_generator")
85
 
 
 
 
86
  GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
87
  genai.configure(api_key=GEMINI_API_KEY)
88
 
 
 
 
89
  def choose_alternative(transformation):
90
  if "/" not in transformation:
91
  return transformation
@@ -107,18 +125,17 @@ def choose_alternative(transformation):
107
  else:
108
  return random.choice([left, right])
109
 
110
- # 창의적인 모델/컨셉/형상 변화 아이디어를 위한 카테고리 (생략된 부분 동일)...
111
-
112
- # 창의적인 모델/컨셉/형상 변화 아이디어를 위한 카테고리 (총 15개)
113
  physical_transformation_categories = {
114
  "공간 이동": [
115
- "앞/뒤 이동", "좌/우 이동", "위/아래 이동", "세로축 회전(고개 끄덕임)",
116
- "가로축 회전(고개 젓기)", "길이축 회전(옆으로 기울임)", "원 운동", "나선형 이동",
117
  "관성에 의한 미끄러짐", "회전축 변화", "불규칙 회전", "흔들림 운동", "포물선 이동",
118
  "무중력 부유", "수면 위 부유", "점프/도약", "슬라이딩", "롤링", "자유 낙하",
119
  "왕복 운동", "탄성 튕김", "관통", "회피 움직임", "지그재그 이동", "스윙 운동"
120
  ],
121
-
122
  "크기와 형태 변화": [
123
  "부피 늘어남/줄어듦", "길이 늘어남/줄어듦", "너비 늘어남/줄어듦", "높이 늘어남/줄어듦",
124
  "밀도 변화", "무게 증가/감소", "모양 변형", "상태 변화", "불균등 변형",
@@ -127,63 +144,56 @@ physical_transformation_categories = {
127
  "접힘/펼쳐짐", "압착/팽창", "늘어남/수축", "구겨짐/평평해짐", "뭉개짐/단단해짐",
128
  "말림/펴짐", "꺾임/구부러짐"
129
  ],
130
-
131
  "표면 및 외관 변화": [
132
- "색상 변화", "질감 변화", "투명/불투명 변화", "반짝임/무광 변화",
133
- "빛 반사 정도 변화", "무늬 변화", "각도에 따른 색상 변화", "빛에 따른 색상 변화",
134
- "온도에 따른 색상 변화", "홀로그램 효과", "표면 각도별 빛 반사", "표면 모양 변형",
135
  "초미세 표면 구조 변화", "자가 세정 효과", "얼룩/패턴 생성", "흐림/선명함 변화",
136
- "광택/윤기 변화", "색조/채도 변화", "발광/형광", "빛 산란 효과",
137
  "빛 흡수 변화", "반투명 효과", "그림자 효과 변화", "자외선 반응 변화",
138
  "야광 효과"
139
  ],
140
-
141
  "물질의 상태 변화": [
142
- "고체/액체/기체 전환", "결정화/용해", "산화/부식", "딱딱해짐/부드러워짐",
143
- "특수 상태 전환", "무정형/결정형 전환", "성분 분리", "미세 입자 형성/분해",
144
- "젤 형성/풀어짐", "준안정 상태 변화", "분자 자가 정렬/분해", "상태변화 지연 현상",
145
  "녹음", "굳음", "증발/응축", "승화/증착", "침전/부유", "분산/응집",
146
  "건조/습윤", "팽윤/수축", "동결/해동", "풍화/침식", "충전/방전",
147
  "결합/분리", "발효/부패"
148
  ],
149
-
150
  "열 관련 변화": [
151
- "온도 상승/하강", "열에 의한 팽창/수축", "열 전달/차단", "압력 상승/하강",
152
- "열 변화에 따른 자화", "무질서도 변화", "열전기 현상", "자기장에 의한 열 변화",
153
- "상태변화 중 열 저장/방출", "열 스트레스 발생/해소", "급격한 온도 변화 영향",
154
  "복사열에 의한 냉각/가열", "발열/흡열", "열 분포 변화", "열 반사/흡수",
155
  "냉각 응축", "열 활성화", "열 변색", "열 팽창 계수 변화", "열 안정성 변화",
156
  "내열성/내한성", "자기발열", "열적 평형/불균형", "열적 변형", "열 분산/집중"
157
  ],
158
-
159
  "움직임 특성 변화": [
160
- "가속/감속", "일정 속도 유지", "진동/진동 감소", "부딪힘/튕김",
161
- "회전 속도 증가/감소", "회전 방향 변화", "불규칙 움직임", "멈췄다 미끄러지는 현상",
162
- "공진/반공진", "유체 속 저항/양력 변화", "움직임 저항 변화", "복합 진동 움직임",
163
  "특수 유체 속 움직임", "회전-이동 연계 움직임", "관성 정지", "충격 흡수",
164
  "충격 전달", "운동량 보존", "마찰력 변화", "관성 탈출", "불안정 균형",
165
  "동적 안정성", "흔들림 감쇠", "경로 예측성", "회피 움직임"
166
  ],
167
-
168
  "구조적 변화": [
169
  "부품 추가/제거", "조립/분해", "접기/펴기", "변형/원상복구", "최적 구조 변화",
170
  "자가 재배열", "자연 패턴 형성/소멸", "규칙적 패턴 변화", "모듈식 변형",
171
- "복잡성 증가 구조", "원래 모양 기억 효과", "시간에 따른 형태 변화", "부분 제거",
172
  "부분 교체", "결합", "분리", "분할/통합", "중첩/겹침", "내부 구조 변화",
173
  "외부 구조 변화", "중심축 이동", "균형점 변화", "계층 구조 변화", "지지 구조 변화",
174
  "응력 분산 구조", "충격 흡수 구조", "그리드/매트릭스 구조 변화", "상호 연결성 변화"
175
  ],
176
-
177
  "전기 및 자기 변화": [
178
- "자성 생성/소멸", "전하량 증가/감소", "전기장 생성/소멸", "자기장 생성/소멸",
179
- "초전도 상태 전환", "강유전체 특성 변화", "양자 상태 변화", "플라즈마 상태 형성/소멸",
180
  "스핀파 전달", "빛에 의한 전기 발생", "압력에 의한 전기 발생", "자기장 속 전류 변화",
181
  "전기 저항 변화", "전기 전도성 변화", "정전기 발생/방전", "전자기 유도",
182
  "전자기파 방출/흡수", "전기 용량 변화", "자기 이력 현상", "전기적 분극",
183
  "전자 흐름 방향 변화", "전기적 공명", "전기적 차폐/노출", "자기 차폐/노출",
184
  "자기장 방향 정렬"
185
  ],
186
-
187
  "화학적 변화": [
188
  "표면 코팅 변화", "물질 성분 변화", "화학 반응 변화", "촉매 작용 시작/중단",
189
  "빛에 의한 화학 반응", "전기에 의한 화학 반응", "단분자막 형성", "분자 수준 계산 변화",
@@ -192,16 +202,14 @@ physical_transformation_categories = {
192
  "이온화", "화학적 흡착/탈착", "촉매 효율 변화", "효소 활성 변화", "발색 반응",
193
  "pH 변화", "화학적 평형 이동", "결합 형성/분해", "용해도 변화"
194
  ],
195
-
196
  "시간 관련 변화": [
197
  "노화/풍화", "마모/부식", "색 바램/변색", "손상/회복", "수명 주기 변화",
198
- "사용자 상호작용에 따른 적응", "학습 기반 형태 최적화", "시간에 따른 물성 변화",
199
- "집단 기억 효과", "문화적 의미 변화", "지연 반응", "이전 상태 의존 변화",
200
  "점진적 시간 변화", "진화적 변화", "주기적 재생", "계절 변화 적응",
201
- "생체리듬 변화", "생애 주기 단계", "성장/퇴화", "자기 복구/재생",
202
  "자연 순환 적응", "지속성/일시성", "기억 효과", "지연된 작용", "누적 효과"
203
  ],
204
-
205
  "빛과 시각 효과": [
206
  "발광/소등", "빛 투과/차단", "빛 산란/집중", "색상 스펙트럼 변화", "빛 회절",
207
  "빛 간섭", "홀로그램 생성", "레이저 효과", "빛 편광", "형광/인광",
@@ -210,7 +218,6 @@ physical_transformation_categories = {
210
  "빔 효과", "광 필터 효과", "빛의 방향성 변화", "투영 효과", "빛 감지/반응",
211
  "광도 변화"
212
  ],
213
-
214
  "소리와 진동 효과": [
215
  "소리 발생/소멸", "소리 높낮이 변화", "소리 크기 변화", "음색 변화",
216
  "공명/반공명", "음향 진동", "초음파/저음파 발생", "음향 집중/분산",
@@ -219,7 +226,6 @@ physical_transformation_categories = {
219
  "소리 지향성", "음향 왜곡", "비트 생성", "하모닉스 생성", "주파수 변조",
220
  "음향 충격파", "음향 필터링"
221
  ],
222
-
223
  "생물학적 변화": [
224
  "생장/위축", "세포 분열/사멸", "생물 발광", "신진대사 변화", "면역 반응",
225
  "호르몬 분비", "신경 반응", "유전적 발현", "적응/진화", "생체리듬 변화",
@@ -228,7 +234,6 @@ physical_transformation_categories = {
228
  "생물학적 시계 변화", "세포외 기질 변화", "생체 역학적 반응", "세포 운동성",
229
  "세포 극성 변화", "영양 상태 변화"
230
  ],
231
-
232
  "환경 상호작용": [
233
  "온도 반응", "습도 반응", "기압 반응", "중력 반응", "자기장 반응",
234
  "빛 반응", "소리 반응", "화학 물질 감지", "기계적 자극 감지", "전기 자극 반응",
@@ -236,7 +241,6 @@ physical_transformation_categories = {
236
  "환경 오염 반응", "날씨 반응", "계절 변화 반응", "일주기 반응", "생태계 상호작용",
237
  "공생/경쟁 반응", "포식/피식 관계", "군집 형성", "영역 설정", "이주/정착 패턴"
238
  ],
239
-
240
  "센서 기능": [
241
  "시각 센서/감지", "청각 센서/감지", "촉각 센서/감지", "미각 센서/감지", "후각 센서/감지",
242
  "온도 센서/감지", "습도 센서/감지", "압력 센서/감지", "가속도 센서/감지", "회전 센서/감지",
@@ -245,15 +249,14 @@ physical_transformation_categories = {
245
  "생체신호 센서/감지", "진동 센서/감지", "소음 센서/감지", "빛 세기 센서/감지", "빛 파장 센서/감지",
246
  "기울기 센서/감지", "pH 센서/감지", "전류 센서/감지", "전압 센서/감지", "이미지 센서/감지",
247
  "거리 센서/감지", "깊이 센서/감지", "중력 센서/감지", "속도 센서/감지", "흐름 센서/감지",
248
- "수위 센서/감지", "탁도 센서/감지", "염도 센서/감지", "금속 감지", "압전 센서/감지",
249
  "광전 센서/감지", "열전대 센서/감지", "홀 효과 센서/감지", "초음파 센서/감지", "레이더 센서/감지",
250
  "라이다 센서/감지", "터치 센서/감지", "제스처 센서/감지", "심박 센서/감지", "혈압 센서/감지"
251
  ]
252
  }
253
 
254
-
255
  ##############################################################################
256
- # Gemini API 호출 함수 (모델: gemini-2.0-flash-thinking-exp-01-21)
257
  ##############################################################################
258
  def query_gemini_api(prompt):
259
  try:
@@ -283,7 +286,7 @@ def query_gemini_api(prompt):
283
  return f"An error occurred while calling the API: {str(e)}"
284
 
285
  ##############################################################################
286
- # 설명 확장 함수
287
  ##############################################################################
288
  def enhance_with_llm(base_description, obj_name, category):
289
  prompt = f"""
@@ -297,7 +300,7 @@ def enhance_with_llm(base_description, obj_name, category):
297
  return query_gemini_api(prompt)
298
 
299
  ##############################################################################
300
- # 선택된 카테고리만을 대상으로 창의적 변화 아이디어 생성 함수들
301
  ##############################################################################
302
  def generate_single_object_transformation_for_category(obj, selected_category):
303
  transformations = physical_transformation_categories.get(selected_category)
@@ -332,7 +335,7 @@ def generate_three_objects_interaction_for_category(obj1, obj2, obj3, selected_c
332
  return {selected_category: {"base": base_description, "enhanced": None}}
333
 
334
  ##############################################################################
335
- # 생성된 기본 설명을 LLM을 통해 확장 (선택된 카테고리만 해당)
336
  ##############################################################################
337
  def enhance_descriptions(results, objects):
338
  obj_name = " 및 ".join([obj for obj in objects if obj])
@@ -341,7 +344,7 @@ def enhance_descriptions(results, objects):
341
  return results
342
 
343
  ##############################################################################
344
- # 사용자 입력(최대 3개 키워드) 선택된 카테고리에 따라 창의적 변화 아이디어 생성
345
  ##############################################################################
346
  def generate_transformations(text1, text2, text3, selected_category):
347
  if text2 and text3:
@@ -365,7 +368,7 @@ def format_results(results):
365
  return formatted
366
 
367
  ##############################################################################
368
- # Gradio UI에서 호출할 함수 (아이디어 텍스트 생성)
369
  ##############################################################################
370
  def process_inputs(text1, text2, text3, selected_category, progress=gr.Progress()):
371
  text1 = text1.strip() if text1 else None
@@ -379,7 +382,7 @@ def process_inputs(text1, text2, text3, selected_category, progress=gr.Progress(
379
  time.sleep(0.3)
380
  progress(0.1, desc="창의적인 아이디어 생성 시작...")
381
 
382
- # 선택된 카테고리만 대상으로 아이디어 생성
383
  results = generate_transformations(text1, text2, text3, selected_category)
384
 
385
  progress(0.8, desc="결과 포맷팅 중...")
@@ -388,11 +391,18 @@ def process_inputs(text1, text2, text3, selected_category, progress=gr.Progress(
388
  return formatted
389
 
390
  ##############################################################################
391
- # 새로운 통합 함수: 아이디어 텍스트 생성 및 이미지 생성
392
  ##############################################################################
393
  def process_all(text1, text2, text3, selected_category, progress=gr.Progress()):
394
  idea_result = process_inputs(text1, text2, text3, selected_category, progress)
395
- image_result = generate_design_image(idea_result, seed=42, randomize_seed=True, width=1024, height=1024, num_inference_steps=4)
 
 
 
 
 
 
 
396
  return idea_result, image_result
397
 
398
  ##############################################################################
@@ -406,19 +416,46 @@ def get_warning_message():
406
  ##############################################################################
407
  # Gradio UI
408
  ##############################################################################
409
- with gr.Blocks(title="키워드 기반 창의적 변화 아이디어 및 디자인 생성기",
410
- theme=gr.themes.Soft(primary_hue="teal", secondary_hue="slate", neutral_hue="neutral")) as demo:
 
 
411
 
412
  gr.HTML("""
413
  <style>
414
- body { background: linear-gradient(135deg, #e0eafc, #cfdef3); font-family: 'Arial', sans-serif; }
415
- .gradio-container { padding: 20px; }
416
- h1, h2 { text-align: center; }
417
- h1 { color: #333; }
418
- h2 { color: #555; }
419
- .output { background-color: #ffffff; padding: 15px; border-radius: 8px; }
420
- .gr-button { background-color: #4CAF50; color: white; border: none; border-radius: 4px; padding: 8px 16px; }
421
- .progress-message { color: #2196F3; font-weight: bold; margin-top: 10px; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
422
  </style>
423
  """)
424
 
@@ -439,6 +476,7 @@ with gr.Blocks(title="키워드 기반 창의적 변화 아이디어 및 디자
439
  info="출력할 카테고리를 선택하세요."
440
  )
441
  status_msg = gr.Markdown("💡 '아이디어 생성하기' 버튼을 클릭하면 선택한 카테고리에 해당하는 아이디어와 디자인 이미지가 생성됩니다.")
 
442
  processing_indicator = gr.HTML("""
443
  <div style="display: flex; justify-content: center; align-items: center; margin: 10px 0;">
444
  <div style="border: 5px solid #f3f3f3; border-top: 5px solid #3498db; border-radius: 50%; width: 30px; height: 30px; animation: spin 2s linear infinite;"></div>
@@ -451,16 +489,18 @@ with gr.Blocks(title="키워드 기반 창의적 변화 아이디어 및 디자
451
  }
452
  </style>
453
  """, visible=False)
 
454
  submit_button = gr.Button("아이디어 생성하기", variant="primary")
455
 
456
  with gr.Column(scale=2):
457
  idea_output = gr.Markdown(label="아이디어 결과")
458
  generated_image = gr.Image(label="생성된 디자인 이미지", type="pil")
459
 
 
460
  gr.Examples(
461
  examples=[
462
  ["스마트폰", "", "", list(physical_transformation_categories.keys())[0]],
463
- ["자동차", "", "", list(physical_transformation_categories.keys())[0]],
464
  ["자동차", "인공지능", "", list(physical_transformation_categories.keys())[0]],
465
  ["드론", "인공지능", "", list(physical_transformation_categories.keys())[0]],
466
  ["운동화", "웨어러블", "건강", list(physical_transformation_categories.keys())[0]],
@@ -468,12 +508,15 @@ with gr.Blocks(title="키워드 기반 창의적 변화 아이디어 및 디자
468
  inputs=[text_input1, text_input2, text_input3, category_dropdown],
469
  )
470
 
 
471
  def show_processing_indicator():
472
  return gr.update(visible=True)
473
 
 
474
  def hide_processing_indicator():
475
  return gr.update(visible=False)
476
 
 
477
  submit_button.click(
478
  fn=show_processing_indicator,
479
  inputs=None,
@@ -488,5 +531,6 @@ with gr.Blocks(title="키워드 기반 창의적 변화 아이디어 및 디자
488
  outputs=processing_indicator
489
  )
490
 
 
491
  if __name__ == "__main__":
492
  demo.launch(debug=True)
 
 
 
1
  import os
2
  import gradio as gr
3
  import random
 
10
  from diffusers import DiffusionPipeline
11
  from transformers import pipeline as hf_pipeline
12
 
13
+ ##############################################################################
14
+ # 1) ZeroGPU 환경 처리 + device, dtype 설정
15
+ ##############################################################################
16
+ # ZeroGPU 환경이면 무조건 CPU 사용, 아니면 cuda 가용 여부에 따라 결정
17
  if os.getenv("ZERO_GPU"):
18
  device = "cpu"
19
  else:
20
  device = "cuda" if torch.cuda.is_available() else "cpu"
21
 
22
+ # GPU일 때만 bfloat16, 외에는 float32
23
+ dtype = torch.bfloat16 if device == "cuda" else torch.float32
24
 
25
+ ##############################################################################
26
+ # 2) 모델 로드: 번역 모델, DiffusionPipeline
27
+ ##############################################################################
28
  translator = hf_pipeline(
29
+ "translation",
30
  model="Helsinki-NLP/opus-mt-ko-en",
31
  device=0 if device == "cuda" else -1
32
  )
 
39
  MAX_SEED = np.iinfo(np.int32).max
40
  MAX_IMAGE_SIZE = 2048
41
 
42
+ ##############################################################################
43
+ # 한국어 감지 함수
44
+ ##############################################################################
45
  def contains_korean(text):
46
  for char in text:
47
  if ord('가') <= ord(char) <= ord('힣'):
48
  return True
49
  return False
50
 
51
+ ##############################################################################
52
+ # 이미지 생성 함수
53
+ ##############################################################################
54
  def generate_design_image(prompt, seed=42, randomize_seed=True, width=1024, height=1024, num_inference_steps=4):
55
  """
56
  생성된 확장 아이디어 텍스트(prompt)를 입력받아,
 
82
 
83
  return image
84
 
85
+ ##############################################################################
86
+ # 로깅 설정
87
+ ##############################################################################
88
  logging.basicConfig(
89
  level=logging.INFO,
90
  format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
 
95
  )
96
  logger = logging.getLogger("idea_generator")
97
 
98
+ ##############################################################################
99
+ # Gemini API 키
100
+ ##############################################################################
101
  GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
102
  genai.configure(api_key=GEMINI_API_KEY)
103
 
104
+ ##############################################################################
105
+ # 선택적 변형 선택 함수
106
+ ##############################################################################
107
  def choose_alternative(transformation):
108
  if "/" not in transformation:
109
  return transformation
 
125
  else:
126
  return random.choice([left, right])
127
 
128
+ ##############################################################################
129
+ # 물리적 변화 카테고리 사전 (총 15개)
130
+ ##############################################################################
131
  physical_transformation_categories = {
132
  "공간 이동": [
133
+ "앞/뒤 이동", "좌/우 이동", "위/아래 이동", "세로축 회전(고개 끄덕임)",
134
+ "가로축 회전(고개 젓기)", "길이축 회전(옆으로 기울임)", "원 운동", "나선형 이동",
135
  "관성에 의한 미끄러짐", "회전축 변화", "불규칙 회전", "흔들림 운동", "포물선 이동",
136
  "무중력 부유", "수면 위 부유", "점프/도약", "슬라이딩", "롤링", "자유 낙하",
137
  "왕복 운동", "탄성 튕김", "관통", "회피 움직임", "지그재그 이동", "스윙 운동"
138
  ],
 
139
  "크기와 형태 변화": [
140
  "부피 늘어남/줄어듦", "길이 늘어남/줄어듦", "너비 늘어남/줄어듦", "높이 늘어남/줄어듦",
141
  "밀도 변화", "무게 증가/감소", "모양 변형", "상태 변화", "불균등 변형",
 
144
  "접힘/펼쳐짐", "압착/팽창", "늘어남/수축", "구겨짐/평평해짐", "뭉개짐/단단해짐",
145
  "말림/펴짐", "꺾임/구부러짐"
146
  ],
 
147
  "표면 및 외관 변화": [
148
+ "색상 변화", "질감 변화", "투명/불투명 변화", "반짝임/무광 변화",
149
+ "빛 반사 정도 변화", "무늬 변화", "각도에 따른 색상 변화", "빛에 따른 색상 변화",
150
+ "온도에 따른 색상 변화", "홀로그램 효과", "표면 각도별 빛 반사", "표면 모양 변형",
151
  "초미세 표면 구조 변화", "자가 세정 효과", "얼룩/패턴 생성", "흐림/선명함 변화",
152
+ "광택/윤기 변화", "색조/채도 변화", "발광/형광", "빛 산란 효과",
153
  "빛 흡수 변화", "반투명 효과", "그림자 효과 변화", "자외선 반응 변화",
154
  "야광 효과"
155
  ],
 
156
  "물질의 상태 변화": [
157
+ "고체/액체/기체 전환", "결정화/용해", "산화/부식", "딱딱해짐/부드러워짐",
158
+ "특수 상태 전환", "무정형/결정형 전환", "성분 분리", "미세 입자 형성/분해",
159
+ "젤 형성/풀어짐", "준안정 상태 변화", "분자 자가 정렬/분해", "상태변화 지연 현상",
160
  "녹음", "굳음", "증발/응축", "승화/증착", "침전/부유", "분산/응집",
161
  "건조/습윤", "팽윤/수축", "동결/해동", "풍화/침식", "충전/방전",
162
  "결합/분리", "발효/부패"
163
  ],
 
164
  "열 관련 변화": [
165
+ "온도 상승/하강", "열에 의한 팽창/수축", "열 전달/차단", "압력 상승/하강",
166
+ "열 변화에 따른 자화", "무질서도 변화", "열전기 현상", "자기장에 의한 열 변화",
167
+ "상태변화 중 열 저장/방출", "열 스트레스 발생/해소", "급격한 온도 변화 영향",
168
  "복사열에 의한 냉각/가열", "발열/흡열", "열 분포 변화", "열 반사/흡수",
169
  "냉각 응축", "열 활성화", "열 변색", "열 팽창 계수 변화", "열 안정성 변화",
170
  "내열성/내한성", "자기발열", "열적 평형/불균형", "열적 변형", "열 분산/집중"
171
  ],
 
172
  "움직임 특성 변화": [
173
+ "가속/감속", "일정 속도 유지", "진동/진동 감소", "부딪힘/튕김",
174
+ "회전 속도 증가/감소", "회전 방향 변화", "불규칙 움직임", "멈췄다 미끄러지는 현상",
175
+ "공진/반공진", "유체 속 저항/양력 변화", "움직임 저항 변화", "복합 진동 움직임",
176
  "특수 유체 속 움직임", "회전-이동 연계 움직임", "관성 정지", "충격 흡수",
177
  "충격 전달", "운동량 보존", "마찰력 변화", "관성 탈출", "불안정 균형",
178
  "동적 안정성", "흔들림 감쇠", "경로 예측성", "회피 움직임"
179
  ],
 
180
  "구조적 변화": [
181
  "부품 추가/제거", "조립/분해", "접기/펴기", "변형/원상복구", "최적 구조 변화",
182
  "자가 재배열", "자연 패턴 형성/소멸", "규칙적 패턴 변화", "모듈식 변형",
183
+ "복잡성 증가 구조", "원래 모양 기억 효과", "시간에 따른 형태 변화", "부분 제거",
184
  "부분 교체", "결합", "분리", "분할/통합", "중첩/겹침", "내부 구조 변화",
185
  "외부 구조 변화", "중심축 이동", "균형점 변화", "계층 구조 변화", "지지 구조 변화",
186
  "응력 분산 구조", "충격 흡수 구조", "그리드/매트릭스 구조 변화", "상호 연결성 변화"
187
  ],
 
188
  "전기 및 자기 변화": [
189
+ "자성 생성/소멸", "전하량 증가/감소", "전기장 생성/소멸", "자기장 생성/소멸",
190
+ "초전도 상태 전환", "강유전체 특성 변화", "양자 상태 변화", "플라즈마 상태 형성/소멸",
191
  "스핀파 전달", "빛에 의한 전기 발생", "압력에 의한 전기 발생", "자기장 속 전류 변화",
192
  "전기 저항 변화", "전기 전도성 변화", "정전기 발생/방전", "전자기 유도",
193
  "전자기파 방출/흡수", "전기 용량 변화", "자기 이력 현상", "전기적 분극",
194
  "전자 흐름 방향 변화", "전기적 공명", "전기적 차폐/노출", "자기 차폐/노출",
195
  "자기장 방향 정렬"
196
  ],
 
197
  "화학적 변화": [
198
  "표면 코팅 변화", "물질 성분 변화", "화학 반응 변화", "촉매 작용 시작/중단",
199
  "빛에 의한 화학 반응", "전기에 의한 화학 반응", "단분자막 형성", "분자 수준 계산 변화",
 
202
  "이온화", "화학적 흡착/탈착", "촉매 효율 변화", "효소 활성 변화", "발색 반응",
203
  "pH 변화", "화학적 평형 이동", "결합 형성/분해", "용해도 변화"
204
  ],
 
205
  "시간 관련 변화": [
206
  "노화/풍화", "마모/부식", "색 바램/변색", "손상/회복", "수명 주기 변화",
207
+ "사용자 상호작용에 따른 적응", "학습 기반 형태 최적화", "시간에 따른 물성 변화",
208
+ "집단 기억 효과", "문화적 의미 변화", "지연 반응", "이전 상태 의존 변화",
209
  "점진적 시간 변화", "진화적 변화", "주기적 재생", "계절 변화 적응",
210
+ "생체리듬 변화", "생애 주기 단계", "성장/퇴화", "자기 복구/재생",
211
  "자연 순환 적응", "지속성/일시성", "기억 효과", "지연된 작용", "누적 효과"
212
  ],
 
213
  "빛과 시각 효과": [
214
  "발광/소등", "빛 투과/차단", "빛 산란/집중", "색상 스펙트럼 변화", "빛 회절",
215
  "빛 간섭", "홀로그램 생성", "레이저 효과", "빛 편광", "형광/인광",
 
218
  "빔 효과", "광 필터 효과", "빛의 방향성 변화", "투영 효과", "빛 감지/반응",
219
  "광도 변화"
220
  ],
 
221
  "소리와 진동 효과": [
222
  "소리 발생/소멸", "소리 높낮이 변화", "소리 크기 변화", "음색 변화",
223
  "공명/반공명", "음향 진동", "초음파/저음파 발생", "음향 집중/분산",
 
226
  "소리 지향성", "음향 왜곡", "비트 생성", "하모닉스 생성", "주파수 변조",
227
  "음향 충격파", "음향 필터링"
228
  ],
 
229
  "생물학적 변화": [
230
  "생장/위축", "세포 분열/사멸", "생물 발광", "신진대사 변화", "면역 반응",
231
  "호르몬 분비", "신경 반응", "유전적 발현", "적응/진화", "생체리듬 변화",
 
234
  "생물학적 시계 변화", "세포외 기질 변화", "생체 역학적 반응", "세포 운동성",
235
  "세포 극성 변화", "영양 상태 변화"
236
  ],
 
237
  "환경 상호작용": [
238
  "온도 반응", "습도 반응", "기압 반응", "중력 반응", "자기장 반응",
239
  "빛 반응", "소리 반응", "화학 물질 감지", "기계적 자극 감지", "전기 자극 반응",
 
241
  "환경 오염 반응", "날씨 반응", "계절 변화 반응", "일주기 반응", "생태계 상호작용",
242
  "공생/경쟁 반응", "포식/피식 관계", "군집 형성", "영역 설정", "이주/정착 패턴"
243
  ],
 
244
  "센서 기능": [
245
  "시각 센서/감지", "청각 센서/감지", "촉각 센서/감지", "미각 센서/감지", "후각 센서/감지",
246
  "온도 센서/감지", "습도 센서/감지", "압력 센서/감지", "가속도 센서/감지", "회전 센서/감지",
 
249
  "생체신호 센서/감지", "진동 센서/감지", "소음 센서/감지", "빛 세기 센서/감지", "빛 파장 센서/감지",
250
  "기울기 센서/감지", "pH 센서/감지", "전류 센서/감지", "전압 센서/감지", "이미지 센서/감지",
251
  "거리 센서/감지", "깊이 센서/감지", "중력 센서/감지", "속도 센서/감지", "흐름 센서/감지",
252
+ "수위 센서/감지", "탁도 센서/감지", "염도 센서/감지", "금속 감지", "압전 센서/감지",
253
  "광전 센서/감지", "열전대 센서/감지", "홀 효과 센서/감지", "초음파 센서/감지", "레이더 센서/감지",
254
  "라이다 센서/감지", "터치 센서/감지", "제스처 센서/감지", "심박 센서/감지", "혈압 센서/감지"
255
  ]
256
  }
257
 
 
258
  ##############################################################################
259
+ # Gemini API 호출 함수
260
  ##############################################################################
261
  def query_gemini_api(prompt):
262
  try:
 
286
  return f"An error occurred while calling the API: {str(e)}"
287
 
288
  ##############################################################################
289
+ # 설명 확장 함수 (LLM 이용)
290
  ##############################################################################
291
  def enhance_with_llm(base_description, obj_name, category):
292
  prompt = f"""
 
300
  return query_gemini_api(prompt)
301
 
302
  ##############################################################################
303
+ # 객체수(1, 2, 3)에 따른 변형 아이디어 생성
304
  ##############################################################################
305
  def generate_single_object_transformation_for_category(obj, selected_category):
306
  transformations = physical_transformation_categories.get(selected_category)
 
335
  return {selected_category: {"base": base_description, "enhanced": None}}
336
 
337
  ##############################################################################
338
+ # 생성된 기본 설명을 LLM을 통해 확장 ( 카테고리별)
339
  ##############################################################################
340
  def enhance_descriptions(results, objects):
341
  obj_name = " 및 ".join([obj for obj in objects if obj])
 
344
  return results
345
 
346
  ##############################################################################
347
+ # 사용자 입력(최대 3개 키워드) + 선택 카테고리 변화 아이디어 생성
348
  ##############################################################################
349
  def generate_transformations(text1, text2, text3, selected_category):
350
  if text2 and text3:
 
368
  return formatted
369
 
370
  ##############################################################################
371
+ # Gradio UI에서 호출될 함수 (텍스트 아이디어만 생성)
372
  ##############################################################################
373
  def process_inputs(text1, text2, text3, selected_category, progress=gr.Progress()):
374
  text1 = text1.strip() if text1 else None
 
382
  time.sleep(0.3)
383
  progress(0.1, desc="창의적인 아이디어 생성 시작...")
384
 
385
+ # 카테고리에 해당하는 아이디어 생성
386
  results = generate_transformations(text1, text2, text3, selected_category)
387
 
388
  progress(0.8, desc="결과 포맷팅 중...")
 
391
  return formatted
392
 
393
  ##############################################################################
394
+ # 아이디어와 이미지를 함께 생성하는 최종 함수
395
  ##############################################################################
396
  def process_all(text1, text2, text3, selected_category, progress=gr.Progress()):
397
  idea_result = process_inputs(text1, text2, text3, selected_category, progress)
398
+ image_result = generate_design_image(
399
+ idea_result,
400
+ seed=42,
401
+ randomize_seed=True,
402
+ width=1024,
403
+ height=1024,
404
+ num_inference_steps=4
405
+ )
406
  return idea_result, image_result
407
 
408
  ##############################################################################
 
416
  ##############################################################################
417
  # Gradio UI
418
  ##############################################################################
419
+ with gr.Blocks(
420
+ title="키워드 기반 창의적 변화 아이디어 및 디자인 생성기",
421
+ theme=gr.themes.Soft(primary_hue="teal", secondary_hue="slate", neutral_hue="neutral")
422
+ ) as demo:
423
 
424
  gr.HTML("""
425
  <style>
426
+ body {
427
+ background: linear-gradient(135deg, #e0eafc, #cfdef3);
428
+ font-family: 'Arial', sans-serif;
429
+ }
430
+ .gradio-container {
431
+ padding: 20px;
432
+ }
433
+ h1, h2 {
434
+ text-align: center;
435
+ }
436
+ h1 {
437
+ color: #333;
438
+ }
439
+ h2 {
440
+ color: #555;
441
+ }
442
+ .output {
443
+ background-color: #ffffff;
444
+ padding: 15px;
445
+ border-radius: 8px;
446
+ }
447
+ .gr-button {
448
+ background-color: #4CAF50;
449
+ color: white;
450
+ border: none;
451
+ border-radius: 4px;
452
+ padding: 8px 16px;
453
+ }
454
+ .progress-message {
455
+ color: #2196F3;
456
+ font-weight: bold;
457
+ margin-top: 10px;
458
+ }
459
  </style>
460
  """)
461
 
 
476
  info="출력할 카테고리를 선택하세요."
477
  )
478
  status_msg = gr.Markdown("💡 '아이디어 생성하기' 버튼을 클릭하면 선택한 카테고리에 해당하는 아이디어와 디자인 이미지가 생성됩니다.")
479
+
480
  processing_indicator = gr.HTML("""
481
  <div style="display: flex; justify-content: center; align-items: center; margin: 10px 0;">
482
  <div style="border: 5px solid #f3f3f3; border-top: 5px solid #3498db; border-radius: 50%; width: 30px; height: 30px; animation: spin 2s linear infinite;"></div>
 
489
  }
490
  </style>
491
  """, visible=False)
492
+
493
  submit_button = gr.Button("아이디어 생성하기", variant="primary")
494
 
495
  with gr.Column(scale=2):
496
  idea_output = gr.Markdown(label="아이디어 결과")
497
  generated_image = gr.Image(label="생성된 디자인 이미지", type="pil")
498
 
499
+ # 예제
500
  gr.Examples(
501
  examples=[
502
  ["스마트폰", "", "", list(physical_transformation_categories.keys())[0]],
503
+ ["자동차", "", "", list(physical_transformation_categories.keys())[0]],
504
  ["자동차", "인공지능", "", list(physical_transformation_categories.keys())[0]],
505
  ["드론", "인공지능", "", list(physical_transformation_categories.keys())[0]],
506
  ["운동화", "웨어러블", "건강", list(physical_transformation_categories.keys())[0]],
 
508
  inputs=[text_input1, text_input2, text_input3, category_dropdown],
509
  )
510
 
511
+ # 처리중 아이콘 보이기
512
  def show_processing_indicator():
513
  return gr.update(visible=True)
514
 
515
+ # 처리중 아이콘 숨기기
516
  def hide_processing_indicator():
517
  return gr.update(visible=False)
518
 
519
+ # 버튼 클릭 시 처리 로직
520
  submit_button.click(
521
  fn=show_processing_indicator,
522
  inputs=None,
 
531
  outputs=processing_indicator
532
  )
533
 
534
+ # 메인 실행
535
  if __name__ == "__main__":
536
  demo.launch(debug=True)