haepada commited on
Commit
35931a6
·
verified ·
1 Parent(s): 74e1e24

Update modules/image_analyzer.py

Browse files
Files changed (1) hide show
  1. modules/image_analyzer.py +166 -16
modules/image_analyzer.py CHANGED
@@ -2,7 +2,6 @@ import os
2
  import json
3
  import random
4
  from PIL import Image
5
- import io
6
 
7
  # 물리적 특성 매핑 데이터 경로
8
  SHAPE_TRAITS_PATH = "data/trait_mappings/shape_traits.json"
@@ -59,7 +58,102 @@ def load_trait_mappings():
59
  "복잡형": {"창의성": (70, 90)}
60
  }
61
 
62
- # 기타 매핑 데이터 로딩 코드는 생략...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
  # 매핑 데이터 로드
65
  shape_traits = {}
@@ -73,7 +167,17 @@ def load_trait_mappings():
73
  else:
74
  shape_traits = default_shape_traits
75
 
76
- # 여기에 색상 및 재질 매핑 로드 코드가 있음...
 
 
 
 
 
 
 
 
 
 
77
 
78
  return {
79
  "shape": shape_traits,
@@ -88,8 +192,14 @@ def load_trait_mappings():
88
  "곡선형": {"온기": (60, 80)},
89
  "직선형": {"능력": (60, 80)},
90
  },
91
- "color": {} if 'default_color_traits' not in locals() else default_color_traits,
92
- "material": {} if 'default_material_traits' not in locals() else default_material_traits,
 
 
 
 
 
 
93
  }
94
  return default_mappings
95
 
@@ -98,7 +208,7 @@ def analyze_image(image_path):
98
  이미지를 분석하여 물리적 특성과 그에 따른 성격 특성을 반환합니다.
99
 
100
  Args:
101
- image_path: 파일 경로 문자열
102
 
103
  Returns:
104
  이미지 분석 결과와 추천 특성값
@@ -112,18 +222,38 @@ def analyze_image(image_path):
112
 
113
  # 이미지 로드 시도
114
  try:
115
- # 파일 경로 처리
116
  if isinstance(image_path, str):
 
117
  img = Image.open(image_path)
118
- print(f"파일 경로에서 이미지 로드 성공: {img.format}, {img.size}, {img.mode}")
119
- # File 컴포넌트에서 반환하는 경로 형식 처리
120
- elif isinstance(image_path, dict) and 'path' in image_path:
121
- img = Image.open(image_path['path'])
122
- print(f"File 컴포넌트에서 이미지 로드 성공: {img.format}, {img.size}, {img.mode}")
123
- # 기타 타입 처리
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  else:
125
- print(f"다른 형식의 이미데이터: {type(image_path)}")
126
- raise ValueError(f"지원하지 않는 이미지 형식: {type(image_path)}")
 
 
 
 
 
 
127
  except Exception as img_error:
128
  print(f"이미지 로드 실패: {str(img_error)}")
129
  return {}, 50, 50, 50, 50, 50, 50, "", ""
@@ -160,7 +290,27 @@ def analyze_image(image_path):
160
  "유머감각": 50
161
  }
162
 
163
- # 특성 적용...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
 
165
  # 분석 결과 반환
166
  analysis_result = {
 
2
  import json
3
  import random
4
  from PIL import Image
 
5
 
6
  # 물리적 특성 매핑 데이터 경로
7
  SHAPE_TRAITS_PATH = "data/trait_mappings/shape_traits.json"
 
58
  "복잡형": {"창의성": (70, 90)}
59
  }
60
 
61
+ # 색상 매핑
62
+ if not os.path.exists(COLOR_TRAITS_PATH):
63
+ try:
64
+ os.makedirs(os.path.dirname(COLOR_TRAITS_PATH), exist_ok=True)
65
+
66
+ default_color_traits = {
67
+ "밝은": {
68
+ "온기": (60, 80),
69
+ "친화성": (60, 80)
70
+ },
71
+ "어두운": {
72
+ "신뢰성": (60, 80),
73
+ "창의성": (60, 80)
74
+ },
75
+ "따뜻한": {
76
+ "온기": (70, 90),
77
+ "친화성": (60, 80)
78
+ },
79
+ "차가운": {
80
+ "신뢰성": (60, 80),
81
+ "능력": (60, 80)
82
+ },
83
+ "화려한": {
84
+ "창의성": (70, 90),
85
+ "유머감각": (60, 80)
86
+ },
87
+ "단색": {
88
+ "신뢰성": (60, 80),
89
+ "능력": (50, 70)
90
+ }
91
+ }
92
+
93
+ with open(COLOR_TRAITS_PATH, 'w', encoding='utf-8') as f:
94
+ json.dump(default_color_traits, f, ensure_ascii=False, indent=2)
95
+ except Exception as e:
96
+ print(f"색상-특성 매핑 파일 생성 오류: {str(e)}")
97
+ print("기본값을 사용합니다.")
98
+ default_color_traits = {
99
+ "밝은": {"온기": (60, 80)},
100
+ "어두운": {"신뢰성": (60, 80)},
101
+ "따뜻한": {"온기": (70, 90)},
102
+ "차가운": {"능력": (60, 80)},
103
+ "화려한": {"창의성": (70, 90)},
104
+ "단색": {"신뢰성": (60, 80)}
105
+ }
106
+
107
+ # 재질 매핑
108
+ if not os.path.exists(MATERIAL_TRAITS_PATH):
109
+ try:
110
+ os.makedirs(os.path.dirname(MATERIAL_TRAITS_PATH), exist_ok=True)
111
+
112
+ default_material_traits = {
113
+ "나무": {
114
+ "온기": (60, 80),
115
+ "신뢰성": (60, 80)
116
+ },
117
+ "금속": {
118
+ "능력": (70, 90),
119
+ "신뢰성": (60, 80)
120
+ },
121
+ "유리": {
122
+ "신뢰성": (60, 80),
123
+ "친화성": (40, 60)
124
+ },
125
+ "가죽": {
126
+ "온기": (60, 80),
127
+ "신뢰성": (70, 90)
128
+ },
129
+ "플라스틱": {
130
+ "능력": (50, 70),
131
+ "창의성": (50, 70)
132
+ },
133
+ "천": {
134
+ "온기": (70, 90),
135
+ "친화성": (60, 80)
136
+ },
137
+ "종이": {
138
+ "창의성": (60, 80),
139
+ "온기": (50, 70)
140
+ }
141
+ }
142
+
143
+ with open(MATERIAL_TRAITS_PATH, 'w', encoding='utf-8') as f:
144
+ json.dump(default_material_traits, f, ensure_ascii=False, indent=2)
145
+ except Exception as e:
146
+ print(f"재질-특성 매핑 파일 생성 오류: {str(e)}")
147
+ print("기본값을 사용합니다.")
148
+ default_material_traits = {
149
+ "나무": {"온기": (60, 80)},
150
+ "금속": {"능력": (70, 90)},
151
+ "유리": {"친화성": (40, 60)},
152
+ "가죽": {"신뢰성": (70, 90)},
153
+ "플라스틱": {"창의성": (50, 70)},
154
+ "천": {"친화성": (60, 80)},
155
+ "종이": {"창의성": (60, 80)}
156
+ }
157
 
158
  # 매핑 데이터 로드
159
  shape_traits = {}
 
167
  else:
168
  shape_traits = default_shape_traits
169
 
170
+ if os.path.exists(COLOR_TRAITS_PATH):
171
+ with open(COLOR_TRAITS_PATH, 'r', encoding='utf-8') as f:
172
+ color_traits = json.load(f)
173
+ else:
174
+ color_traits = default_color_traits
175
+
176
+ if os.path.exists(MATERIAL_TRAITS_PATH):
177
+ with open(MATERIAL_TRAITS_PATH, 'r', encoding='utf-8') as f:
178
+ material_traits = json.load(f)
179
+ else:
180
+ material_traits = default_material_traits
181
 
182
  return {
183
  "shape": shape_traits,
 
192
  "곡선형": {"온기": (60, 80)},
193
  "직선형": {"능력": (60, 80)},
194
  },
195
+ "color": default_color_traits if 'default_color_traits' in locals() else {
196
+ "밝은": {"온기": (60, 80)},
197
+ "어두운": {"신뢰성": (60, 80)},
198
+ },
199
+ "material": default_material_traits if 'default_material_traits' in locals() else {
200
+ "나무": {"온기": (60, 80)},
201
+ "금속": {"능력": (70, 90)},
202
+ }
203
  }
204
  return default_mappings
205
 
 
208
  이미지를 분석하여 물리적 특성과 그에 따른 성격 특성을 반환합니다.
209
 
210
  Args:
211
+ image_path: 파일 경로 문자열 또는 File 컴포넌트 출력 객체
212
 
213
  Returns:
214
  이미지 분석 결과와 추천 특성값
 
222
 
223
  # 이미지 로드 시도
224
  try:
225
+ # 파일 경로 처리 - 다양한 형식 지원
226
  if isinstance(image_path, str):
227
+ # 문자열 경로
228
  img = Image.open(image_path)
229
+ print(f"문자열 경로에서 이미지 로드 성공: {img.format}, {img.size}, {img.mode}")
230
+ elif isinstance(image_path, dict):
231
+ # File 컴포넌트에서 반환된 딕셔너리 처리
232
+ if 'path' in image_path:
233
+ # 일반적인 File 컴포넌트 출력 형식
234
+ img = Image.open(image_path['path'])
235
+ print(f"File 컴포넌트(path 키)에서 이미지 로드 성공: {img.format}, {img.size}, {img.mode}")
236
+ elif 'name' in image_path:
237
+ # 일부 환경에서는 name 키를 사용할 수 있음
238
+ img = Image.open(image_path['name'])
239
+ print(f"File 컴포넌트(name 키)에서 이미지 로드 성공: {img.format}, {img.size}, {img.mode}")
240
+ else:
241
+ # 알 수 없는 딕셔너리 형식
242
+ print(f"지원되지 않는 딕셔너리 형식: {image_path.keys()}")
243
+ raise ValueError(f"지원하지 않는 이미지 딕셔너리 형식: {list(image_path.keys())}")
244
+ elif hasattr(image_path, 'name'):
245
+ # 파일 객체 형식
246
+ img = Image.open(image_path.name)
247
+ print(f"파일 객체에서 이미지 로드 성공: {img.format}, {img.size}, {img.mode}")
248
  else:
249
+ # PIL Image 객체인확인
250
+ if hasattr(image_path, 'format') and hasattr(image_path, 'mode'):
251
+ img = image_path
252
+ print(f"PIL Image 객체 직접 사용: {img.format}, {img.size}, {img.mode}")
253
+ else:
254
+ # 기타 타입 처리
255
+ print(f"지원되지 않는 이미지 데이터 타입: {type(image_path)}")
256
+ raise ValueError(f"지원하지 않는 이미지 형식: {type(image_path)}")
257
  except Exception as img_error:
258
  print(f"이미지 로드 실패: {str(img_error)}")
259
  return {}, 50, 50, 50, 50, 50, 50, "", ""
 
290
  "유머감각": 50
291
  }
292
 
293
+ # 형태 기반 성격 특성 적용
294
+ shape = physical_features["shape"]
295
+ if shape in trait_mappings["shape"]:
296
+ for trait, value_range in trait_mappings["shape"][shape].items():
297
+ traits[trait] = random.randint(value_range[0], value_range[1])
298
+
299
+ # 색상 기반 성격 특성 적용
300
+ color = physical_features["color"]
301
+ if color in trait_mappings["color"]:
302
+ for trait, value_range in trait_mappings["color"][color].items():
303
+ # 이미 형태에서 설정한 값과 평균
304
+ if trait in traits:
305
+ traits[trait] = (traits[trait] + random.randint(value_range[0], value_range[1])) // 2
306
+
307
+ # 재질 기반 성격 특성 적용
308
+ material = physical_features["material"]
309
+ if material in trait_mappings["material"]:
310
+ for trait, value_range in trait_mappings["material"][material].items():
311
+ # 이미 설정한 값과 평균
312
+ if trait in traits:
313
+ traits[trait] = (traits[trait] + random.randint(value_range[0], value_range[1])) // 2
314
 
315
  # 분석 결과 반환
316
  analysis_result = {