haepada commited on
Commit
b7cb74f
·
verified ·
1 Parent(s): 96fda69

Update modules/image_analyzer.py

Browse files
Files changed (1) hide show
  1. modules/image_analyzer.py +34 -147
modules/image_analyzer.py CHANGED
@@ -2,6 +2,7 @@ import os
2
  import json
3
  import random
4
  from PIL import Image
 
5
 
6
  # 물리적 특성 매핑 데이터 경로
7
  SHAPE_TRAITS_PATH = "data/trait_mappings/shape_traits.json"
@@ -58,102 +59,7 @@ def load_trait_mappings():
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,17 +73,7 @@ def load_trait_mappings():
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,41 +88,52 @@ def load_trait_mappings():
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
 
206
- def analyze_image(image_path):
207
  """
208
  이미지를 분석하여 물리적 특성과 그에 따른 성격 특성을 반환합니다.
209
 
210
- 실제 구현에서는 비전 AI를 사용하여 물체의 형태, 색상, 재질 등을 분석하지만,
211
- 현재는 간단한 더미 분석 결과를 반환합니다.
 
 
 
212
  """
213
- if not image_path:
214
- print("이미지 경로가 없습니다.")
215
  return {}, 50, 50, 50, 50, 50, 50, "", ""
216
 
217
  try:
218
- print(f"이미지 분석 시작: {image_path}")
219
 
220
  # 이미지 로드 시도
221
  try:
222
- img = Image.open(image_path)
223
- print(f"이미지 로드 성공: {img.format}, {img.size}, {img.mode}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
224
  except Exception as img_error:
225
  print(f"이미지 로드 실패: {str(img_error)}")
226
  return {}, 50, 50, 50, 50, 50, 50, "", ""
227
 
228
- # 더미 분석 결과
229
- # 실제 구현에서는 이미지 분석 AI를 활용하여 물체의 특성을 추출합니다.
230
  physical_features = {
231
  "shape": random.choice(["곡선형", "직선형", "대칭형", "비대칭형", "단순형", "복잡형"]),
232
  "color": random.choice(["밝은", "어두운", "따뜻한", "차가운", "화려한", "단색"]),
@@ -242,7 +149,7 @@ def analyze_image(image_path):
242
  color_desc = physical_features["color"]
243
  material_desc = physical_features["material"]
244
 
245
- object_description = f"{color_desc} 색조의 {shape_desc} {material_desc} 물체입니다. "
246
 
247
  # 성격 특성 매핑 로드
248
  trait_mappings = load_trait_mappings()
@@ -258,27 +165,7 @@ def analyze_image(image_path):
258
  "유머감각": 50
259
  }
260
 
261
- # 형태 기반 성격 특성 적용
262
- shape = physical_features["shape"]
263
- if shape in trait_mappings["shape"]:
264
- for trait, value_range in trait_mappings["shape"][shape].items():
265
- traits[trait] = random.randint(value_range[0], value_range[1])
266
-
267
- # 색상 기반 성격 특성 적용
268
- color = physical_features["color"]
269
- if color in trait_mappings["color"]:
270
- for trait, value_range in trait_mappings["color"][color].items():
271
- # 이미 형태에서 설정한 값과 평균
272
- if trait in traits:
273
- traits[trait] = (traits[trait] + random.randint(value_range[0], value_range[1])) // 2
274
-
275
- # 재질 기반 성격 특성 적용
276
- material = physical_features["material"]
277
- if material in trait_mappings["material"]:
278
- for trait, value_range in trait_mappings["material"][material].items():
279
- # 이미 설정한 값과 평균
280
- if trait in traits:
281
- traits[trait] = (traits[trait] + random.randint(value_range[0], value_range[1])) // 2
282
 
283
  # 분석 결과 반환
284
  analysis_result = {
 
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
  "복잡형": {"창의성": (70, 90)}
60
  }
61
 
62
+ # 기타 매핑 데이터 로딩 코드는 생략...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
  # 매핑 데이터 로드
65
  shape_traits = {}
 
73
  else:
74
  shape_traits = default_shape_traits
75
 
76
+ # 여기에 색상 및 재질 매핑 로드 코드가 있음...
 
 
 
 
 
 
 
 
 
 
77
 
78
  return {
79
  "shape": shape_traits,
 
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
 
96
+ def analyze_image(image):
97
  """
98
  이미지를 분석하여 물리적 특성과 그에 따른 성격 특성을 반환합니다.
99
 
100
+ Args:
101
+ image: 파일 경로 문자열 또는 PIL 이미지 객체
102
+
103
+ Returns:
104
+ 이미지 분석 결과와 추천 특성값
105
  """
106
+ if image is None:
107
+ print("이미지가 없습니다.")
108
  return {}, 50, 50, 50, 50, 50, 50, "", ""
109
 
110
  try:
111
+ print(f"이미지 분석 시작: {type(image)}")
112
 
113
  # 이미지 로드 시도
114
  try:
115
+ # PIL 이미지 객체인 경우 바로 사용
116
+ if isinstance(image, Image.Image):
117
+ img = image
118
+ print(f"PIL 이미지 로드 성공: {img.format}, {img.size}, {img.mode}")
119
+ # 파일 경로인 경우 열기
120
+ elif isinstance(image, str):
121
+ img = Image.open(image)
122
+ print(f"파일 경로에서 이미지 로드 성공: {img.format}, {img.size}, {img.mode}")
123
+ # 기타 타입(바이트 등)인 경우 변환 시도
124
+ else:
125
+ print(f"다른 형식의 이미지 데이터: {type(image)}")
126
+ if hasattr(image, 'read'): # 파일 객체인 경우
127
+ img = Image.open(image)
128
+ elif isinstance(image, bytes): # 바이트인 경우
129
+ img = Image.open(io.BytesIO(image))
130
+ else:
131
+ raise ValueError(f"지원하지 않는 이미지 형식: {type(image)}")
132
  except Exception as img_error:
133
  print(f"이미지 로드 실패: {str(img_error)}")
134
  return {}, 50, 50, 50, 50, 50, 50, "", ""
135
 
136
+ # 분석 로직 (더미 데이터 생성)
 
137
  physical_features = {
138
  "shape": random.choice(["곡선형", "직선형", "대칭형", "비대칭형", "단순형", "복잡형"]),
139
  "color": random.choice(["밝은", "어두운", "따뜻한", "차가운", "화려한", "단색"]),
 
149
  color_desc = physical_features["color"]
150
  material_desc = physical_features["material"]
151
 
152
+ object_description = f"{color_desc} 색조의 {shape_desc} {material_desc} 물체입니다."
153
 
154
  # 성격 특성 매핑 로드
155
  trait_mappings = load_trait_mappings()
 
165
  "유머감각": 50
166
  }
167
 
168
+ # 특성 적용 로직...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
169
 
170
  # 분석 결과 반환
171
  analysis_result = {