|
|
| """
|
| Image Generation Learning System
|
| Learns from user feedback to generate better images over time
|
| """
|
|
|
| import json
|
| import time
|
| from pathlib import Path
|
| from typing import Dict, List, Optional, Tuple
|
| import os
|
|
|
| class ImageLearningSystem:
|
| """
|
| Self-learning image generation system
|
| Remembers what users liked and improves accordingly
|
| """
|
|
|
| def __init__(self, data_dir: str = "noahski_data"):
|
| self.data_dir = Path(data_dir)
|
| self.data_dir.mkdir(parents=True, exist_ok=True)
|
| self.learning_file = self.data_dir / "image_learning_data.json"
|
| self.feedback_file = self.data_dir / "image_feedback.json"
|
| self.learning_data = self._load_learning_data()
|
| self.feedback_history = self._load_feedback()
|
|
|
| def _load_learning_data(self) -> Dict:
|
| """Load learning data"""
|
| if self.learning_file.exists():
|
| try:
|
| with open(self.learning_file, 'r') as f:
|
| return json.load(f)
|
| except:
|
| return self._default_learning_data()
|
| return self._default_learning_data()
|
|
|
| def _default_learning_data(self) -> Dict:
|
| """Default learning parameters"""
|
| return {
|
| 'successful_prompts': {},
|
| 'parameter_scores': {
|
| 'shading_intensity': 0.8,
|
| 'texture_density': 0.6,
|
| 'color_saturation': 0.85,
|
| 'detail_level': 0.7,
|
| 'lighting_strength': 0.75
|
| },
|
| 'learned_colors': {},
|
| 'total_feedback': 0,
|
| 'positive_count': 0,
|
| 'improvement_rate': 1.0
|
| }
|
|
|
| def _load_feedback(self) -> List:
|
| """Load feedback history"""
|
| if self.feedback_file.exists():
|
| try:
|
| with open(self.feedback_file, 'r') as f:
|
| return json.load(f)
|
| except:
|
| return []
|
| return []
|
|
|
| def record_feedback(self, prompt: str, feedback_type: str, params: Dict = None) -> None:
|
| """Record user feedback for learning"""
|
| feedback = {
|
| 'timestamp': time.time(),
|
| 'prompt': prompt,
|
| 'type': feedback_type,
|
| 'params': params or {}
|
| }
|
|
|
| self.feedback_history.append(feedback)
|
|
|
|
|
| self.learning_data['total_feedback'] += 1
|
| if feedback_type == 'positive':
|
| self.learning_data['positive_count'] += 1
|
|
|
|
|
| if prompt not in self.learning_data['successful_prompts']:
|
| self.learning_data['successful_prompts'][prompt] = {'positive': 0, 'total': 0}
|
|
|
| self.learning_data['successful_prompts'][prompt]['total'] += 1
|
| if feedback_type == 'positive':
|
| self.learning_data['successful_prompts'][prompt]['positive'] += 1
|
|
|
|
|
| if self.learning_data['total_feedback'] > 0:
|
| success_rate = self.learning_data['positive_count'] / self.learning_data['total_feedback']
|
| self.learning_data['improvement_rate'] = min(1.2, 0.8 + success_rate * 0.4)
|
|
|
| self._save_learning_data()
|
| self._save_feedback()
|
|
|
| def get_improved_parameters(self, base_params: Dict) -> Dict:
|
| """Get improved generation parameters based on learning"""
|
| improved = base_params.copy()
|
|
|
|
|
| for param, value in self.learning_data['parameter_scores'].items():
|
| if param in improved:
|
|
|
| blend = 0.6
|
| improved[param] = base_params[param] * (1 - blend) + value * blend
|
|
|
|
|
| rate = self.learning_data['improvement_rate']
|
| for param in ['shading_intensity', 'texture_density', 'color_saturation']:
|
| if param in improved:
|
| improved[param] = min(1.0, improved[param] * rate)
|
|
|
| return improved
|
|
|
| def get_success_rate(self, prompt: str = None) -> float:
|
| """Get success rate for a prompt or overall"""
|
| if prompt and prompt in self.learning_data['successful_prompts']:
|
| data = self.learning_data['successful_prompts'][prompt]
|
| if data['total'] > 0:
|
| return data['positive'] / data['total']
|
|
|
| if self.learning_data['total_feedback'] > 0:
|
| return self.learning_data['positive_count'] / self.learning_data['total_feedback']
|
|
|
| return 0.5
|
|
|
| def _save_learning_data(self) -> None:
|
| """Save learning data"""
|
| try:
|
| with open(self.learning_file, 'w') as f:
|
| json.dump(self.learning_data, f, indent=2)
|
| except:
|
| pass
|
|
|
| def _save_feedback(self) -> None:
|
| """Save feedback history"""
|
| try:
|
| with open(self.feedback_file, 'w') as f:
|
| json.dump(self.feedback_history, f, indent=2)
|
| except:
|
| pass
|
|
|
| def get_stats(self) -> Dict:
|
| """Get learning stats"""
|
| return {
|
| 'total_feedback': self.learning_data['total_feedback'],
|
| 'positive_count': self.learning_data['positive_count'],
|
| 'success_rate': self.get_success_rate(),
|
| 'improvement_rate': self.learning_data['improvement_rate']
|
| }
|
|
|
|
|
|
|
| _learning_system = None
|
|
|
|
|
| def get_learning_system() -> ImageLearningSystem:
|
| """Get global learning system instance"""
|
| global _learning_system
|
| if _learning_system is None:
|
| _learning_system = ImageLearningSystem()
|
| return _learning_system
|
|
|
|
|
| def get_improved_generation_params(base_params: Dict = None) -> Dict:
|
| """Get generation parameters improved by learning"""
|
| if base_params is None:
|
| base_params = {
|
| 'shading_intensity': 0.8,
|
| 'texture_density': 0.6,
|
| 'color_saturation': 0.85,
|
| 'detail_level': 0.7,
|
| 'lighting_strength': 0.75
|
| }
|
|
|
| system = get_learning_system()
|
| return system.get_improved_parameters(base_params)
|
|
|
|
|
| def record_image_feedback(prompt: str, feedback_type: str) -> None:
|
| """Record feedback for an image"""
|
| system = get_learning_system()
|
| system.record_feedback(prompt, feedback_type)
|
|
|