Malaji71 commited on
Commit
e53d7f7
·
verified ·
1 Parent(s): 86630ab

Update utils.py

Browse files
Files changed (1) hide show
  1. utils.py +76 -25
utils.py CHANGED
@@ -123,17 +123,17 @@ def apply_flux_rules(prompt: str, analysis_metadata: Optional[Dict[str, Any]] =
123
  # Check if BAGEL provided intelligent camera setup
124
  camera_config = ""
125
  if analysis_metadata and analysis_metadata.get("has_camera_suggestion") and analysis_metadata.get("camera_setup"):
126
- # Use BAGEL's intelligent camera suggestion
127
  bagel_camera = analysis_metadata["camera_setup"]
128
- camera_config = f", {bagel_camera}" if not bagel_camera.startswith(",") else bagel_camera
129
- logger.info(f"Using BAGEL camera suggestion: {bagel_camera}")
130
  else:
131
- # Fallback to static rules if BAGEL didn't suggest camera
132
  camera_config = _get_fallback_camera_config(description_part.lower())
133
  logger.info("Using fallback camera configuration")
134
 
135
- # Add lighting enhancements if not present
136
- lighting_enhancement = _get_lighting_enhancement(description_part.lower())
137
 
138
  # Build final prompt: Description + Camera + Lighting
139
  final_prompt = description_part + camera_config + lighting_enhancement
@@ -162,31 +162,78 @@ def _extract_description_only(prompt: str) -> str:
162
  elif description.startswith("1. DESCRIPTION:"):
163
  description = description.replace("1. DESCRIPTION:", "").strip()
164
 
 
 
 
 
165
  return description.strip()
166
 
167
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
168
  def _get_fallback_camera_config(prompt_lower: str) -> str:
169
  """Get fallback camera configuration when BAGEL doesn't suggest one"""
170
- if any(word in prompt_lower for word in ['portrait', 'person', 'man', 'woman', 'face']):
 
 
 
171
  return FLUX_RULES["camera_configs"]["portrait"]
172
  elif any(word in prompt_lower for word in ['landscape', 'mountain', 'nature', 'outdoor']):
173
  return FLUX_RULES["camera_configs"]["landscape"]
174
- elif any(word in prompt_lower for word in ['street', 'urban', 'city']):
175
- return FLUX_RULES["camera_configs"]["street"]
176
  else:
177
  return FLUX_RULES["camera_configs"]["default"]
178
 
179
 
180
- def _get_lighting_enhancement(prompt_lower: str) -> str:
181
  """Determine appropriate lighting enhancement"""
182
- if 'lighting' not in prompt_lower:
183
- if 'dramatic' in prompt_lower:
184
- return FLUX_RULES["lighting_enhancements"]["dramatic"]
185
- elif 'portrait' in prompt_lower:
186
- return FLUX_RULES["lighting_enhancements"]["portrait"]
187
- else:
188
- return FLUX_RULES["lighting_enhancements"]["default"]
189
- return "" # No enhancement needed if lighting already mentioned
 
 
190
 
191
 
192
  def _clean_prompt_formatting(prompt: str) -> str:
@@ -205,6 +252,9 @@ def _clean_prompt_formatting(prompt: str) -> str:
205
  prompt = re.sub(r'^\s*,\s*', '', prompt) # Remove leading commas
206
  prompt = re.sub(r'\s*,\s*$', '', prompt) # Remove trailing commas
207
 
 
 
 
208
  return prompt.strip()
209
 
210
 
@@ -238,7 +288,7 @@ def calculate_prompt_score(prompt: str, analysis_data: Optional[Dict[str, Any]]
238
 
239
  # Bonus points for BAGEL camera suggestions
240
  if analysis_data and analysis_data.get("has_camera_suggestion"):
241
- tech_score += 5 # Bonus for intelligent camera selection
242
 
243
  breakdown["technical_details"] = min(25, tech_score)
244
 
@@ -250,14 +300,15 @@ def calculate_prompt_score(prompt: str, analysis_data: Optional[Dict[str, Any]]
250
  # Flux optimization score (0-20 points)
251
  flux_score = 0
252
 
253
- # Check for camera configuration (either BAGEL or fallback)
254
- if any(camera in prompt for camera in FLUX_RULES["camera_configs"].values()) or \
255
- (analysis_data and analysis_data.get("has_camera_suggestion")):
256
- flux_score += 10
 
257
 
258
  # Check for lighting configuration
259
  if any(lighting in prompt for lighting in FLUX_RULES["lighting_enhancements"].values()):
260
- flux_score += 10
261
 
262
  breakdown["flux_optimization"] = flux_score
263
 
@@ -313,7 +364,7 @@ def format_analysis_report(analysis_data: Dict[str, Any], processing_time: float
313
  ✅ Technical photography details
314
  ✅ Artistic enhancement keywords
315
 
316
- **⚡ Powered by Pariente AI Research**"""
317
 
318
  return report
319
 
 
123
  # Check if BAGEL provided intelligent camera setup
124
  camera_config = ""
125
  if analysis_metadata and analysis_metadata.get("has_camera_suggestion") and analysis_metadata.get("camera_setup"):
126
+ # Use BAGEL's intelligent camera suggestion - clean and format it properly
127
  bagel_camera = analysis_metadata["camera_setup"]
128
+ camera_config = _format_bagel_camera_suggestion(bagel_camera)
129
+ logger.info(f"Using BAGEL camera suggestion: {camera_config}")
130
  else:
131
+ # Only use fallback if BAGEL didn't suggest anything
132
  camera_config = _get_fallback_camera_config(description_part.lower())
133
  logger.info("Using fallback camera configuration")
134
 
135
+ # Add lighting enhancements if not present and not already covered by BAGEL
136
+ lighting_enhancement = _get_lighting_enhancement(description_part.lower(), camera_config)
137
 
138
  # Build final prompt: Description + Camera + Lighting
139
  final_prompt = description_part + camera_config + lighting_enhancement
 
162
  elif description.startswith("1. DESCRIPTION:"):
163
  description = description.replace("1. DESCRIPTION:", "").strip()
164
 
165
+ # Clean up any remaining camera recommendations from the description
166
+ description = re.sub(r'For this type of scene.*?shooting style would be.*?\.', '', description, flags=re.DOTALL)
167
+ description = re.sub(r'I would recommend.*?aperture.*?\.', '', description, flags=re.DOTALL)
168
+
169
  return description.strip()
170
 
171
 
172
+ def _format_bagel_camera_suggestion(bagel_camera: str) -> str:
173
+ """Format BAGEL's camera suggestion into clean FLUX format"""
174
+ try:
175
+ # Clean up the BAGEL suggestion
176
+ camera_text = bagel_camera.strip()
177
+
178
+ # Remove "CAMERA_SETUP:" if it's still there
179
+ camera_text = re.sub(r'^CAMERA_SETUP:\s*', '', camera_text)
180
+
181
+ # Extract key camera info using regex patterns
182
+ camera_patterns = {
183
+ 'camera': r'(Canon EOS [^,]+|Sony A[^,]+|Leica [^,]+|Hasselblad [^,]+|Phase One [^,]+|Fujifilm [^,]+)',
184
+ 'lens': r'(\d+mm[^,]*|[^,]*lens[^,]*)',
185
+ 'aperture': r'(f/[\d.]+[^,]*)'
186
+ }
187
+
188
+ extracted_parts = []
189
+
190
+ for key, pattern in camera_patterns.items():
191
+ match = re.search(pattern, camera_text, re.IGNORECASE)
192
+ if match:
193
+ extracted_parts.append(match.group(1).strip())
194
+
195
+ if extracted_parts:
196
+ # Build clean camera config
197
+ camera_info = ', '.join(extracted_parts)
198
+ return f", Shot on {camera_info}, professional photography"
199
+ else:
200
+ # Fallback: use the first part of BAGEL's suggestion
201
+ first_sentence = camera_text.split('.')[0].strip()
202
+ if len(first_sentence) > 10:
203
+ return f", {first_sentence}, professional photography"
204
+ else:
205
+ return ", professional camera setup"
206
+
207
+ except Exception as e:
208
+ logger.warning(f"Failed to format BAGEL camera suggestion: {e}")
209
+ return ", professional camera setup"
210
+
211
+
212
  def _get_fallback_camera_config(prompt_lower: str) -> str:
213
  """Get fallback camera configuration when BAGEL doesn't suggest one"""
214
+ # Improved detection logic
215
+ if any(word in prompt_lower for word in ['street', 'urban', 'city', 'documentary', 'crowd', 'protest']):
216
+ return FLUX_RULES["camera_configs"]["street"]
217
+ elif any(word in prompt_lower for word in ['portrait', 'person', 'man', 'woman', 'face']) and not any(word in prompt_lower for word in ['street', 'crowd', 'scene']):
218
  return FLUX_RULES["camera_configs"]["portrait"]
219
  elif any(word in prompt_lower for word in ['landscape', 'mountain', 'nature', 'outdoor']):
220
  return FLUX_RULES["camera_configs"]["landscape"]
 
 
221
  else:
222
  return FLUX_RULES["camera_configs"]["default"]
223
 
224
 
225
+ def _get_lighting_enhancement(prompt_lower: str, camera_config: str) -> str:
226
  """Determine appropriate lighting enhancement"""
227
+ # Don't add lighting if already mentioned in prompt or camera config
228
+ if 'lighting' in prompt_lower or 'lighting' in camera_config.lower():
229
+ return ""
230
+
231
+ if 'dramatic' in prompt_lower or 'chaos' in prompt_lower or 'fire' in prompt_lower:
232
+ return FLUX_RULES["lighting_enhancements"]["dramatic"]
233
+ elif 'portrait' in camera_config.lower():
234
+ return FLUX_RULES["lighting_enhancements"]["portrait"]
235
+ else:
236
+ return FLUX_RULES["lighting_enhancements"]["default"]
237
 
238
 
239
  def _clean_prompt_formatting(prompt: str) -> str:
 
252
  prompt = re.sub(r'^\s*,\s*', '', prompt) # Remove leading commas
253
  prompt = re.sub(r'\s*,\s*$', '', prompt) # Remove trailing commas
254
 
255
+ # Remove redundant periods
256
+ prompt = re.sub(r'\.+', '.', prompt)
257
+
258
  return prompt.strip()
259
 
260
 
 
288
 
289
  # Bonus points for BAGEL camera suggestions
290
  if analysis_data and analysis_data.get("has_camera_suggestion"):
291
+ tech_score += 10 # Higher bonus for intelligent camera selection
292
 
293
  breakdown["technical_details"] = min(25, tech_score)
294
 
 
300
  # Flux optimization score (0-20 points)
301
  flux_score = 0
302
 
303
+ # Check for camera configuration (prefer BAGEL over fallback)
304
+ if analysis_data and analysis_data.get("has_camera_suggestion"):
305
+ flux_score += 15 # Higher score for BAGEL suggestions
306
+ elif any(camera in prompt for camera in FLUX_RULES["camera_configs"].values()):
307
+ flux_score += 10 # Lower score for fallback
308
 
309
  # Check for lighting configuration
310
  if any(lighting in prompt for lighting in FLUX_RULES["lighting_enhancements"].values()):
311
+ flux_score += 5
312
 
313
  breakdown["flux_optimization"] = flux_score
314
 
 
364
  ✅ Technical photography details
365
  ✅ Artistic enhancement keywords
366
 
367
+ **⚡ Powered by Frame 0 Laboratory for MIA**"""
368
 
369
  return report
370