Spaces:
Running
on
L40S
Running
on
L40S
Update app-backup.py
Browse files- app-backup.py +92 -73
app-backup.py
CHANGED
@@ -9,32 +9,26 @@ import torch
|
|
9 |
import numpy as np
|
10 |
from diffusers import DiffusionPipeline
|
11 |
from transformers import pipeline as hf_pipeline
|
|
|
12 |
|
13 |
##############################################################################
|
14 |
# 1) ZeroGPU 환경 처리 + device, dtype 설정
|
15 |
##############################################################################
|
16 |
-
##############################################################################
|
17 |
-
# 1) ZeroGPU 환경 처리 + device, dtype 설정
|
18 |
-
##############################################################################
|
19 |
-
# ZeroGPU 초기화 시도
|
20 |
try:
|
21 |
import zerogpu
|
22 |
zerogpu.init()
|
23 |
print("ZeroGPU initialized successfully")
|
24 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
25 |
except ImportError:
|
26 |
-
# ZeroGPU가 설치되지 않은 경우
|
27 |
print("ZeroGPU package not installed, continuing without it")
|
28 |
if os.getenv("ZERO_GPU"):
|
29 |
print("ZeroGPU environment variable is set but zerogpu package is not installed.")
|
30 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
31 |
except Exception as e:
|
32 |
-
# ZeroGPU 초기화 중 다른 오류가 발생한 경우
|
33 |
print(f"Error initializing ZeroGPU: {e}")
|
34 |
print("Continuing without ZeroGPU")
|
35 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
36 |
|
37 |
-
# GPU일 때만 bfloat16, 그 외에는 float32
|
38 |
dtype = torch.bfloat16 if device == "cuda" else torch.float32
|
39 |
|
40 |
print(f"Using device: {device}, dtype: {dtype}")
|
@@ -57,7 +51,6 @@ try:
|
|
57 |
print("Models loaded successfully")
|
58 |
except Exception as e:
|
59 |
print(f"Error loading models: {e}")
|
60 |
-
# 모델 로드 에러 처리를 위한 더미 함수들
|
61 |
def dummy_translator(text):
|
62 |
return [{'translation_text': text}]
|
63 |
|
@@ -87,23 +80,48 @@ def contains_korean(text):
|
|
87 |
return False
|
88 |
|
89 |
##############################################################################
|
90 |
-
#
|
91 |
##############################################################################
|
92 |
-
def
|
93 |
"""
|
94 |
-
|
95 |
-
|
96 |
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
original_prompt = prompt
|
98 |
translated = False
|
99 |
|
100 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
101 |
if contains_korean(prompt):
|
102 |
-
|
|
|
103 |
prompt = translation[0]['translation_text']
|
104 |
translated = True
|
105 |
|
106 |
-
# 랜덤 시드 설정
|
107 |
if randomize_seed:
|
108 |
seed = random.randint(0, MAX_SEED)
|
109 |
|
@@ -120,6 +138,7 @@ def generate_design_image(prompt, seed=42, randomize_seed=True, width=1024, heig
|
|
120 |
|
121 |
return image
|
122 |
|
|
|
123 |
##############################################################################
|
124 |
# 로깅 설정
|
125 |
##############################################################################
|
@@ -167,12 +186,17 @@ def choose_alternative(transformation):
|
|
167 |
# 물리적 변화 카테고리 사전 (총 15개)
|
168 |
##############################################################################
|
169 |
physical_transformation_categories = {
|
170 |
-
"
|
171 |
-
"
|
172 |
-
"
|
173 |
-
"
|
174 |
-
"
|
175 |
-
"
|
|
|
|
|
|
|
|
|
|
|
176 |
],
|
177 |
"크기와 형태 변화": [
|
178 |
"부피 늘어남/줄어듦", "길이 늘어남/줄어듦", "너비 늘어남/줄어듦", "높이 늘어남/줄어듦",
|
@@ -190,7 +214,10 @@ physical_transformation_categories = {
|
|
190 |
"광택/윤기 변화", "색조/채도 변화", "발광/형광", "빛 산란 효과",
|
191 |
"빛 흡수 변화", "반투명 효과", "그림자 효과 변화", "자외선 반응 변화",
|
192 |
"야광 효과"
|
193 |
-
],
|
|
|
|
|
|
|
194 |
"물질의 상태 변화": [
|
195 |
"고체/액체/기체 전환", "결정화/용해", "산화/부식", "딱딱해짐/부드러워짐",
|
196 |
"특수 상태 전환", "무정형/결정형 전환", "성분 분리", "미세 입자 형성/분해",
|
@@ -199,14 +226,7 @@ physical_transformation_categories = {
|
|
199 |
"건조/습윤", "팽윤/수축", "동결/해동", "풍화/침식", "충전/방전",
|
200 |
"결합/분리", "발효/부패"
|
201 |
],
|
202 |
-
|
203 |
-
"온도 상승/하강", "열에 의한 팽창/수축", "열 전달/차단", "압력 상승/하강",
|
204 |
-
"열 변화에 따른 자화", "무질서도 변화", "열전기 현상", "자기장에 의한 열 변화",
|
205 |
-
"상태변화 중 열 저장/방출", "열 스트레스 발생/해소", "급격한 온도 변화 영향",
|
206 |
-
"복사열에 의한 냉각/가열", "발열/흡열", "열 분포 변화", "열 반사/흡수",
|
207 |
-
"냉각 응축", "열 활성화", "열 변색", "열 팽창 계수 변화", "열 안정성 변화",
|
208 |
-
"내열성/내한성", "자기발열", "열적 평형/불균형", "열적 변형", "열 분산/집중"
|
209 |
-
],
|
210 |
"움직임 특성 변화": [
|
211 |
"가속/감속", "일정 속도 유지", "진동/진동 감소", "부딪힘/튕김",
|
212 |
"회전 속도 증가/감소", "회전 방향 변화", "불규칙 움직임", "멈췄다 미끄러지는 현상",
|
@@ -223,22 +243,12 @@ physical_transformation_categories = {
|
|
223 |
"외부 구조 변화", "중심축 이동", "균형점 변화", "계층 구조 변화", "지지 구조 변화",
|
224 |
"응력 분산 구조", "충격 흡수 구조", "그리드/매트릭스 구조 변화", "상호 연결성 변화"
|
225 |
],
|
226 |
-
"
|
227 |
-
"
|
228 |
-
"
|
229 |
-
"
|
230 |
-
"
|
231 |
-
"
|
232 |
-
"전자 흐름 방향 변화", "전기적 공명", "전기적 차폐/노출", "자기 차폐/노출",
|
233 |
-
"자기장 방향 정렬"
|
234 |
-
],
|
235 |
-
"화학적 변화": [
|
236 |
-
"표면 코팅 변화", "물질 성분 변화", "화학 반응 변화", "촉매 작용 시작/중단",
|
237 |
-
"빛에 의한 화학 반응", "전기에 의한 화학 반응", "단분자막 형성", "분자 수준 계산 변화",
|
238 |
-
"자연 모방 표면 변화", "환경 반응형 물질 변화", "주기적 화학 반응", "산화", "환원",
|
239 |
-
"고분자화", "물 분해", "화합", "방사선 영향", "산-염기 반응", "중화 반응",
|
240 |
-
"이온화", "화학적 흡착/탈착", "촉매 효율 변화", "효소 활성 변화", "발색 반응",
|
241 |
-
"pH 변화", "화학적 평형 이동", "결합 형성/분해", "용해도 변화"
|
242 |
],
|
243 |
"시간 관련 변화": [
|
244 |
"노화/풍화", "마모/부식", "색 바램/변색", "손상/회복", "수명 주기 변화",
|
@@ -264,6 +274,32 @@ physical_transformation_categories = {
|
|
264 |
"소리 지향성", "음향 왜곡", "비트 생성", "하모닉스 생성", "주파수 변조",
|
265 |
"음향 충격파", "음향 필터링"
|
266 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
267 |
"생물학적 변화": [
|
268 |
"생장/위축", "세포 분열/사멸", "생물 발광", "신진대사 변화", "면역 반응",
|
269 |
"호르몬 분비", "신경 반응", "유전적 발현", "적응/진화", "생체리듬 변화",
|
@@ -278,19 +314,8 @@ physical_transformation_categories = {
|
|
278 |
"방사선 반응", "진동 감지", "pH 반응", "용매 반응", "기체 교환",
|
279 |
"환경 오염 반응", "날씨 반응", "계절 변화 반응", "일주기 반응", "생태계 상호작용",
|
280 |
"공생/경쟁 반응", "포식/피식 관계", "군집 형성", "영역 설정", "이주/정착 패턴"
|
281 |
-
],
|
282 |
-
"센서 기능": [
|
283 |
-
"시각 센서/감지", "청각 센서/감지", "촉각 센서/감지", "미각 센서/감지", "후각 센서/감지",
|
284 |
-
"온도 센서/감지", "습도 센서/감지", "압력 센서/감지", "가속도 센서/감지", "회전 센서/감지",
|
285 |
-
"근접 센서/감지", "위치 센서/감지", "운동 센서/감지", "가스 센서/감지", "적외선 센서/감지",
|
286 |
-
"자외선 센서/감지", "방사선 센서/감지", "자기장 센서/감지", "전기장 센서/감지", "화학물질 센서/감지",
|
287 |
-
"생체신호 센서/감지", "진동 센서/감지", "소음 센서/감지", "빛 세기 센서/감지", "빛 파장 센서/감지",
|
288 |
-
"기울기 센서/감지", "pH 센서/감지", "전류 센서/감지", "전압 센서/감지", "이미지 센서/감지",
|
289 |
-
"거리 센서/감지", "깊��� 센서/감지", "중력 센서/감지", "속도 센서/감지", "흐름 센서/감지",
|
290 |
-
"수위 센서/감지", "탁도 센서/감지", "염도 센서/감지", "금속 감지", "압전 센서/감지",
|
291 |
-
"광전 센서/감지", "열전대 센서/감지", "홀 효과 센서/감지", "초음파 센서/감지", "레이더 센서/감지",
|
292 |
-
"라이다 센서/감지", "터치 센서/감지", "제스처 센서/감지", "심박 센서/감지", "혈압 센서/감지"
|
293 |
]
|
|
|
294 |
}
|
295 |
|
296 |
##############################################################################
|
@@ -420,7 +445,6 @@ def process_inputs(text1, text2, text3, selected_category, progress=gr.Progress(
|
|
420 |
time.sleep(0.3)
|
421 |
progress(0.1, desc="창의적인 아이디어 생성 시작...")
|
422 |
|
423 |
-
# 카테고리에 해당하는 아이디어 생성
|
424 |
results = generate_transformations(text1, text2, text3, selected_category)
|
425 |
|
426 |
progress(0.8, desc="결과 포맷팅 중...")
|
@@ -497,7 +521,7 @@ with gr.Blocks(
|
|
497 |
</style>
|
498 |
""")
|
499 |
|
500 |
-
gr.Markdown("# 🚀
|
501 |
gr.Markdown("입력한 **키워드**(최대 3개)와 **카테고리**를 바탕으로, 창의적인 모델/컨셉/형상 변화 아이디어를 생성하고, 해당 확장 아이디어를 프롬프트로 하여 디자인 이미지를 생성합니다.")
|
502 |
|
503 |
warning = gr.Markdown(get_warning_message())
|
@@ -507,7 +531,7 @@ with gr.Blocks(
|
|
507 |
text_input1 = gr.Textbox(label="키워드 1 (필수)", placeholder="예: 스마트폰")
|
508 |
text_input2 = gr.Textbox(label="키워드 2 (선택)", placeholder="예: 인공지능")
|
509 |
text_input3 = gr.Textbox(label="키워드 3 (선택)", placeholder="예: 헬스케어")
|
510 |
-
|
511 |
label="카테고리 선택",
|
512 |
choices=list(physical_transformation_categories.keys()),
|
513 |
value=list(physical_transformation_categories.keys())[0],
|
@@ -534,34 +558,30 @@ with gr.Blocks(
|
|
534 |
idea_output = gr.Markdown(label="아이디어 결과")
|
535 |
generated_image = gr.Image(label="생성된 디자인 이미지", type="pil")
|
536 |
|
537 |
-
# 예제
|
538 |
gr.Examples(
|
539 |
examples=[
|
540 |
-
["스마트폰", "", "",
|
541 |
-
["자동차", "", "",
|
542 |
-
["자동차", "인공지능", "",
|
543 |
-
["드론", "인공지능", "",
|
544 |
-
["운동화", "웨어러블", "건강",
|
545 |
],
|
546 |
-
inputs=[text_input1, text_input2, text_input3,
|
547 |
)
|
548 |
|
549 |
-
# 처리중 아이콘 보이기
|
550 |
def show_processing_indicator():
|
551 |
return gr.update(visible=True)
|
552 |
|
553 |
-
# 처리중 아이콘 숨기기
|
554 |
def hide_processing_indicator():
|
555 |
return gr.update(visible=False)
|
556 |
|
557 |
-
# 버튼 클릭 시 처리 로직
|
558 |
submit_button.click(
|
559 |
fn=show_processing_indicator,
|
560 |
inputs=None,
|
561 |
outputs=processing_indicator
|
562 |
).then(
|
563 |
fn=process_all,
|
564 |
-
inputs=[text_input1, text_input2, text_input3,
|
565 |
outputs=[idea_output, generated_image]
|
566 |
).then(
|
567 |
fn=hide_processing_indicator,
|
@@ -569,6 +589,5 @@ with gr.Blocks(
|
|
569 |
outputs=processing_indicator
|
570 |
)
|
571 |
|
572 |
-
# 메인 실행
|
573 |
if __name__ == "__main__":
|
574 |
demo.launch(debug=True)
|
|
|
9 |
import numpy as np
|
10 |
from diffusers import DiffusionPipeline
|
11 |
from transformers import pipeline as hf_pipeline
|
12 |
+
import re
|
13 |
|
14 |
##############################################################################
|
15 |
# 1) ZeroGPU 환경 처리 + device, dtype 설정
|
16 |
##############################################################################
|
|
|
|
|
|
|
|
|
17 |
try:
|
18 |
import zerogpu
|
19 |
zerogpu.init()
|
20 |
print("ZeroGPU initialized successfully")
|
21 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
22 |
except ImportError:
|
|
|
23 |
print("ZeroGPU package not installed, continuing without it")
|
24 |
if os.getenv("ZERO_GPU"):
|
25 |
print("ZeroGPU environment variable is set but zerogpu package is not installed.")
|
26 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
27 |
except Exception as e:
|
|
|
28 |
print(f"Error initializing ZeroGPU: {e}")
|
29 |
print("Continuing without ZeroGPU")
|
30 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
31 |
|
|
|
32 |
dtype = torch.bfloat16 if device == "cuda" else torch.float32
|
33 |
|
34 |
print(f"Using device: {device}, dtype: {dtype}")
|
|
|
51 |
print("Models loaded successfully")
|
52 |
except Exception as e:
|
53 |
print(f"Error loading models: {e}")
|
|
|
54 |
def dummy_translator(text):
|
55 |
return [{'translation_text': text}]
|
56 |
|
|
|
80 |
return False
|
81 |
|
82 |
##############################################################################
|
83 |
+
# 입력 텍스트 클린징 함수: 한글, 영문, 숫자, 공백 및 일반적인 문장 부호만 허용
|
84 |
##############################################################################
|
85 |
+
def clean_input_text(text):
|
86 |
"""
|
87 |
+
한글, 영문, 숫자, 공백 및 . , ! ? - : ; ' " 등의 문장 부호만 남기고 제거합니다.
|
88 |
+
필요에 따라 허용할 문자를 조정할 수 있습니다.
|
89 |
"""
|
90 |
+
allowed = re.compile(r'[^ㄱ-ㅎ가-힣a-zA-Z0-9\s\.\,\!\?\-\:\;\'\"]')
|
91 |
+
cleaned_text = allowed.sub('', text)
|
92 |
+
return cleaned_text
|
93 |
+
|
94 |
+
##############################################################################
|
95 |
+
# 입력 텍스트의 예상치 못한 문자 로그 함수 (디버깅용)
|
96 |
+
##############################################################################
|
97 |
+
def log_unexpected_characters(text):
|
98 |
+
allowed = re.compile(r'[ㄱ-ㅎ가-힣a-zA-Z0-9\s\.\,\!\?\-\:\;\'\"]')
|
99 |
+
unexpected_chars = [char for char in text if not allowed.match(char)]
|
100 |
+
if unexpected_chars:
|
101 |
+
print("예상치 못한 문자 발견:", set(unexpected_chars))
|
102 |
+
else:
|
103 |
+
print("입력 텍스트에 예상치 못한 문자는 없습니다.")
|
104 |
+
|
105 |
+
##############################################################################
|
106 |
+
# 이미지 생성 함수
|
107 |
+
##############################################################################
|
108 |
+
def generate_design_image(prompt, seed=42, randomize_seed=True, width=1024, height=1024, num_inference_steps=4):
|
109 |
original_prompt = prompt
|
110 |
translated = False
|
111 |
|
112 |
+
# 입력 텍스트 클린징 적용
|
113 |
+
prompt = clean_input_text(prompt)
|
114 |
+
|
115 |
+
# 사전 처리: 입력 텍스트가 너무 길면 미리 자르기 (예: 1000자 이상이면 1000자로 잘라냄)
|
116 |
+
if len(prompt) > 1000:
|
117 |
+
prompt = prompt[:1000]
|
118 |
+
|
119 |
if contains_korean(prompt):
|
120 |
+
# 번역 호출 시 max_length와 truncation 옵션을 추가하여 길이 초과 문제를 방지
|
121 |
+
translation = translator(prompt, max_length=400, truncation=True)
|
122 |
prompt = translation[0]['translation_text']
|
123 |
translated = True
|
124 |
|
|
|
125 |
if randomize_seed:
|
126 |
seed = random.randint(0, MAX_SEED)
|
127 |
|
|
|
138 |
|
139 |
return image
|
140 |
|
141 |
+
|
142 |
##############################################################################
|
143 |
# 로깅 설정
|
144 |
##############################################################################
|
|
|
186 |
# 물리적 변화 카테고리 사전 (총 15개)
|
187 |
##############################################################################
|
188 |
physical_transformation_categories = {
|
189 |
+
"센서 기능": [
|
190 |
+
"시각 센서/감지", "청각 센서/감지", "촉각 센서/감지", "미각 센서/감지", "후각 센서/감지",
|
191 |
+
"온도 센서/감지", "습도 센서/감지", "압력 센서/감지", "가속도 센서/감지", "회전 센서/감지",
|
192 |
+
"근접 센서/감지", "위치 센서/감지", "운동 센서/감지", "가스 센서/감지", "적외선 센서/감지",
|
193 |
+
"자외선 센서/감지", "방사선 센서/감지", "자기장 센서/감지", "전기장 센서/감지", "화학물질 센서/감지",
|
194 |
+
"생체신호 센서/감지", "진동 센서/감지", "소음 센서/감지", "빛 세기 센서/감지", "빛 파장 센서/감지",
|
195 |
+
"기울기 센서/감지", "pH 센서/감지", "전류 센서/감지", "전압 센서/감지", "이미지 센서/감지",
|
196 |
+
"거리 센서/감지", "깊이 센서/감지", "중력 센서/감지", "속도 센서/감지", "흐름 센서/감지",
|
197 |
+
"수위 센서/감지", "탁도 센서/감지", "염도 센서/감지", "금속 감지", "압전 센서/감지",
|
198 |
+
"광전 센서/감지", "열전대 센서/감지", "홀 효과 센서/감지", "초음파 센서/감지", "레이더 센서/감지",
|
199 |
+
"라이다 센서/감지", "터치 센서/감지", "제스처 센서/감지", "심박 센서/감지", "혈압 센서/감지"
|
200 |
],
|
201 |
"크기와 형태 변화": [
|
202 |
"부피 늘어남/줄어듦", "길이 늘어남/줄어듦", "너비 늘어남/줄어듦", "높이 늘어남/줄어듦",
|
|
|
214 |
"광택/윤기 변화", "색조/채도 변화", "발광/형광", "빛 산란 효과",
|
215 |
"빛 흡수 변화", "반투명 효과", "그림자 효과 변화", "자외선 반응 변화",
|
216 |
"야광 효과"
|
217 |
+
],
|
218 |
+
|
219 |
+
|
220 |
+
|
221 |
"물질의 상태 변화": [
|
222 |
"고체/액체/기체 전환", "결정화/용해", "산화/부식", "딱딱해짐/부드러워짐",
|
223 |
"특수 상태 전환", "무정형/결정형 전환", "성분 분리", "미세 입자 형성/분해",
|
|
|
226 |
"건조/습윤", "팽윤/수축", "동결/해동", "풍화/침식", "충전/방전",
|
227 |
"결합/분리", "발효/부패"
|
228 |
],
|
229 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
230 |
"움직임 특성 변화": [
|
231 |
"가속/감속", "일정 속도 유지", "진동/진동 감소", "부딪힘/튕김",
|
232 |
"회전 속도 증가/감소", "회전 방향 변화", "불규칙 움직임", "멈췄다 미끄러지는 현상",
|
|
|
243 |
"외부 구조 변화", "중심축 이동", "균형점 변화", "계층 구조 변화", "지지 구조 변화",
|
244 |
"응력 분산 구조", "충격 흡수 구조", "그리드/매트릭스 구조 변화", "상호 연결성 변화"
|
245 |
],
|
246 |
+
"공간 이동": [
|
247 |
+
"앞/뒤 이동", "좌/우 이동", "위/아래 이동", "세로축 회전(고개 끄덕임)",
|
248 |
+
"가로축 회전(고개 젓기)", "길이축 회전(옆으로 기울임)", "원 운동", "나선형 이동",
|
249 |
+
"관성에 의한 미끄러짐", "회전축 변화", "불규칙 회전", "흔들림 운동", "포물선 이동",
|
250 |
+
"무중력 부유", "수면 위 부유", "점프/도약", "슬라이딩", "롤링", "자유 낙하",
|
251 |
+
"왕복 운동", "탄성 튕김", "관통", "회피 움직임", "지그재그 이동", "스윙 운동"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
252 |
],
|
253 |
"시간 관련 변화": [
|
254 |
"노화/풍화", "마모/부식", "색 바램/변색", "손상/회복", "수명 주기 변화",
|
|
|
274 |
"소리 지향성", "음향 왜곡", "비트 생성", "하모닉스 생성", "주파수 변조",
|
275 |
"음향 충격파", "음향 필터링"
|
276 |
],
|
277 |
+
"열 관련 변화": [
|
278 |
+
"온도 상승/하강", "열에 의한 팽창/수축", "열 전달/차단", "압력 상승/하강",
|
279 |
+
"열 변화에 따른 자화", "무질서도 변화", "열전기 현상", "자기장에 의한 열 변화",
|
280 |
+
"상태변화 중 열 저장/방출", "열 스트레스 발생/해소", "급격한 온도 변화 영향",
|
281 |
+
"복사열에 의한 냉각/가열", "발열/흡열", "열 분포 변화", "열 반사/흡수",
|
282 |
+
"냉각 응축", "열 활성화", "열 변색", "열 팽창 계수 변화", "열 안정성 변화",
|
283 |
+
"내열성/내한성", "자기발열", "열적 평형/불균형", "열적 변형", "열 분산/집중"
|
284 |
+
],
|
285 |
+
"전기 및 자기 변화": [
|
286 |
+
"자성 생성/소멸", "전하량 증가/감소", "전기장 생성/소멸", "자기장 생성/소멸",
|
287 |
+
"초전도 상태 전환", "강유전체 특성 변화", "양자 상태 변화", "플라즈마 상태 형성/소멸",
|
288 |
+
"스핀파 전달", "빛에 의한 전기 발생", "압력에 의한 전기 발생", "자기장 속 전류 변화",
|
289 |
+
"전기 저항 변화", "전기 전도성 변화", "정전기 발생/방전", "전자기 유도",
|
290 |
+
"전자기파 방출/흡수", "전기 용량 변화", "자기 이력 현상", "전기적 분극",
|
291 |
+
"전자 흐름 방향 변화", "전기적 공명", "전기적 차폐/노출", "자기 차폐/노출",
|
292 |
+
"자기장 방향 정렬"
|
293 |
+
],
|
294 |
+
"화학적 변화": [
|
295 |
+
"표면 코팅 변화", "물질 성분 변화", "화학 반응 변화", "촉매 작용 시작/중단",
|
296 |
+
"빛에 의한 화학 반응", "전기에 의한 화학 반응", "단분자막 형성", "분자 수준 계산 변화",
|
297 |
+
"자연 모방 표면 변화", "환경 반응형 물질 변화", "주기적 화학 반응", "산화", "환원",
|
298 |
+
"고분자화", "물 분해", "화합", "방사선 영향", "산-염기 반응", "중화 반응",
|
299 |
+
"이온화", "화학적 흡착/탈착", "촉매 효율 변화", "효소 활성 변화", "발색 반응",
|
300 |
+
"pH 변화", "화학적 평형 이동", "결합 형성/분해", "용해도 변화"
|
301 |
+
],
|
302 |
+
|
303 |
"생물학적 변화": [
|
304 |
"생장/위축", "세포 분열/사멸", "생물 발광", "신진대사 변화", "면역 반응",
|
305 |
"호르몬 분비", "신경 반응", "유전적 발현", "적응/진화", "생체리듬 변화",
|
|
|
314 |
"방사선 반응", "진동 감지", "pH 반응", "용매 반응", "기체 교환",
|
315 |
"환경 오염 반응", "날씨 반응", "계절 변화 반응", "일주기 반응", "생태계 상호작용",
|
316 |
"공생/경쟁 반응", "포식/피식 관계", "군집 형성", "영역 설정", "이주/정착 패턴"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
317 |
]
|
318 |
+
|
319 |
}
|
320 |
|
321 |
##############################################################################
|
|
|
445 |
time.sleep(0.3)
|
446 |
progress(0.1, desc="창의적인 아이디어 생성 시작...")
|
447 |
|
|
|
448 |
results = generate_transformations(text1, text2, text3, selected_category)
|
449 |
|
450 |
progress(0.8, desc="결과 포맷팅 중...")
|
|
|
521 |
</style>
|
522 |
""")
|
523 |
|
524 |
+
gr.Markdown("# 🚀 아이디어 트랜스포머")
|
525 |
gr.Markdown("입력한 **키워드**(최대 3개)와 **카테고리**를 바탕으로, 창의적인 모델/컨셉/형상 변화 아이디어를 생성하고, 해당 확장 아이디어를 프롬프트로 하여 디자인 이미지를 생성합니다.")
|
526 |
|
527 |
warning = gr.Markdown(get_warning_message())
|
|
|
531 |
text_input1 = gr.Textbox(label="키워드 1 (필수)", placeholder="예: 스마트폰")
|
532 |
text_input2 = gr.Textbox(label="키워드 2 (선택)", placeholder="예: 인공지능")
|
533 |
text_input3 = gr.Textbox(label="키워드 3 (선택)", placeholder="예: 헬스케어")
|
534 |
+
category_radio = gr.Radio(
|
535 |
label="카테고리 선택",
|
536 |
choices=list(physical_transformation_categories.keys()),
|
537 |
value=list(physical_transformation_categories.keys())[0],
|
|
|
558 |
idea_output = gr.Markdown(label="아이디어 결과")
|
559 |
generated_image = gr.Image(label="생성된 디자인 이미지", type="pil")
|
560 |
|
|
|
561 |
gr.Examples(
|
562 |
examples=[
|
563 |
+
["스마트폰", "", "", "센서 기능"],
|
564 |
+
["자동차", "", "", "크기와 형태 변화"],
|
565 |
+
["자동차", "인공지능", "", "표면 및 외관 변화"],
|
566 |
+
["드론", "인공지능", "", "물질의 상태 변화"],
|
567 |
+
["운동화", "웨어러블", "건강", "구조적 변화"],
|
568 |
],
|
569 |
+
inputs=[text_input1, text_input2, text_input3, category_radio],
|
570 |
)
|
571 |
|
|
|
572 |
def show_processing_indicator():
|
573 |
return gr.update(visible=True)
|
574 |
|
|
|
575 |
def hide_processing_indicator():
|
576 |
return gr.update(visible=False)
|
577 |
|
|
|
578 |
submit_button.click(
|
579 |
fn=show_processing_indicator,
|
580 |
inputs=None,
|
581 |
outputs=processing_indicator
|
582 |
).then(
|
583 |
fn=process_all,
|
584 |
+
inputs=[text_input1, text_input2, text_input3, category_radio],
|
585 |
outputs=[idea_output, generated_image]
|
586 |
).then(
|
587 |
fn=hide_processing_indicator,
|
|
|
589 |
outputs=processing_indicator
|
590 |
)
|
591 |
|
|
|
592 |
if __name__ == "__main__":
|
593 |
demo.launch(debug=True)
|