feat: 集成DeepSeek照片建议生成器
- 新增DeepSeek照片建议生成器模块 - 在照片质量评分和美学评分中集成DeepSeek智能建议 - 支持个性化改进建议、美学指导和综合评估 - 添加DeepSeek配置状态显示和错误处理机制
This commit is contained in:
parent
7b3cbb2324
commit
38bac0e110
120
app.py
120
app.py
@ -184,6 +184,20 @@ elif page == "📸 AI照片评分":
|
||||
else:
|
||||
st.warning(f"⚠️ AI文案生成: {copywriter_message}")
|
||||
|
||||
# DeepSeek照片建议状态检查
|
||||
try:
|
||||
from utils.deepseek_photo_advisor import check_deepseek_config
|
||||
deepseek_available, deepseek_message = check_deepseek_config()
|
||||
except:
|
||||
deepseek_available = False
|
||||
deepseek_message = "DeepSeek照片建议生成器未配置"
|
||||
|
||||
# 显示DeepSeek状态
|
||||
if deepseek_available:
|
||||
st.success("✅ DeepSeek照片建议生成器可用")
|
||||
else:
|
||||
st.warning(f"⚠️ DeepSeek照片建议: {deepseek_message}")
|
||||
|
||||
col1, col2, col3, col4 = st.columns(4)
|
||||
|
||||
with col1:
|
||||
@ -243,6 +257,58 @@ elif page == "📸 AI照片评分":
|
||||
for i, suggestion in enumerate(suggestions[:3], 1):
|
||||
st.write(f"{i}. {suggestion}")
|
||||
|
||||
# DeepSeek智能建议(如果可用)
|
||||
if deepseek_available:
|
||||
st.subheader("🤖 DeepSeek智能建议")
|
||||
with st.spinner("正在生成个性化改进建议..."):
|
||||
try:
|
||||
from utils.deepseek_photo_advisor import get_deepseek_quality_advice
|
||||
|
||||
# 获取照片内容描述用于个性化建议
|
||||
from utils.baidu_image_analysis import analyze_image_content
|
||||
content_result = analyze_image_content(file_path)
|
||||
photo_description = content_result.get('summary', '一张照片')
|
||||
|
||||
deepseek_advice = get_deepseek_quality_advice(quality_scores, photo_description)
|
||||
|
||||
if deepseek_advice:
|
||||
# 显示DeepSeek总体评价
|
||||
if deepseek_advice.get('overall_evaluation'):
|
||||
st.info(f"**总体评价**: {deepseek_advice['overall_evaluation']}")
|
||||
|
||||
# 显示优势分析
|
||||
if deepseek_advice.get('strengths'):
|
||||
st.subheader("🌟 优势分析")
|
||||
for strength in deepseek_advice['strengths']:
|
||||
st.success(f"✅ {strength}")
|
||||
|
||||
# 显示优先级改进
|
||||
if deepseek_advice.get('priority_improvements'):
|
||||
st.subheader("🎯 重点改进领域")
|
||||
for improvement in deepseek_advice['priority_improvements']:
|
||||
st.warning(f"⚠️ {improvement}")
|
||||
|
||||
# 显示具体建议
|
||||
if deepseek_advice.get('specific_advice'):
|
||||
st.subheader("🔧 个性化改进建议")
|
||||
for dimension, suggestions in deepseek_advice['specific_advice'].items():
|
||||
with st.expander(f"{dimension}详细建议"):
|
||||
for i, suggestion in enumerate(suggestions, 1):
|
||||
st.write(f"{i}. {suggestion}")
|
||||
|
||||
# 显示学习资源
|
||||
if deepseek_advice.get('learning_resources'):
|
||||
st.subheader("📚 推荐学习资源")
|
||||
for resource in deepseek_advice['learning_resources']:
|
||||
st.info(f"📖 {resource}")
|
||||
|
||||
st.success("DeepSeek智能建议生成完成!")
|
||||
else:
|
||||
st.info("DeepSeek建议生成失败,已显示基础建议")
|
||||
|
||||
except Exception as e:
|
||||
st.warning(f"DeepSeek建议生成失败: {str(e)}")
|
||||
|
||||
st.success("照片质量分析完成!已生成详细改进建议")
|
||||
except Exception as e:
|
||||
st.error(f"质量评分失败: {str(e)}")
|
||||
@ -352,6 +418,60 @@ elif page == "📸 AI照片评分":
|
||||
for i, suggestion in enumerate(suggestions, 1):
|
||||
st.write(f"{i}. {suggestion}")
|
||||
|
||||
# DeepSeek智能美学建议(如果可用)
|
||||
if deepseek_available:
|
||||
st.subheader("🤖 DeepSeek美学指导")
|
||||
with st.spinner("正在生成专业美学建议..."):
|
||||
try:
|
||||
from utils.deepseek_photo_advisor import get_deepseek_aesthetic_advice
|
||||
|
||||
# 准备美学评分数据
|
||||
aesthetic_scores = {
|
||||
'overall_score': aesthetic_score,
|
||||
'composition': aesthetic_result['composition'],
|
||||
'color_harmony': aesthetic_result['color_harmony'],
|
||||
'lighting': aesthetic_result['lighting'],
|
||||
'focus': aesthetic_result['focus']
|
||||
}
|
||||
|
||||
deepseek_aesthetic_advice = get_deepseek_aesthetic_advice(aesthetic_scores, photo_content)
|
||||
|
||||
if deepseek_aesthetic_advice:
|
||||
# 显示美学评价
|
||||
if deepseek_aesthetic_advice.get('aesthetic_evaluation'):
|
||||
st.info(f"**美学评价**: {deepseek_aesthetic_advice['aesthetic_evaluation']}")
|
||||
|
||||
# 显示构图建议
|
||||
if deepseek_aesthetic_advice.get('composition_advice'):
|
||||
st.subheader("🎨 构图艺术指导")
|
||||
for advice in deepseek_aesthetic_advice['composition_advice']:
|
||||
st.success(f"📐 {advice}")
|
||||
|
||||
# 显示色彩建议
|
||||
if deepseek_aesthetic_advice.get('color_advice'):
|
||||
st.subheader("🌈 色彩运用建议")
|
||||
for advice in deepseek_aesthetic_advice['color_advice']:
|
||||
st.info(f"🎨 {advice}")
|
||||
|
||||
# 显示光线建议
|
||||
if deepseek_aesthetic_advice.get('lighting_advice'):
|
||||
st.subheader("💡 光影艺术指导")
|
||||
for advice in deepseek_aesthetic_advice['lighting_advice']:
|
||||
st.warning(f"✨ {advice}")
|
||||
|
||||
# 显示创意建议
|
||||
if deepseek_aesthetic_advice.get('creative_suggestions'):
|
||||
st.subheader("🌟 创意提升建议")
|
||||
for suggestion in deepseek_aesthetic_advice['creative_suggestions']:
|
||||
st.success(f"💫 {suggestion}")
|
||||
|
||||
st.success("DeepSeek美学指导生成完成!")
|
||||
else:
|
||||
st.info("DeepSeek美学建议生成失败,已显示基础建议")
|
||||
|
||||
except Exception as e:
|
||||
st.warning(f"DeepSeek美学建议生成失败: {str(e)}")
|
||||
|
||||
st.success("照片美学评估完成!已生成详细改进建议")
|
||||
except Exception as e:
|
||||
st.error(f"美学评分失败: {str(e)}")
|
||||
|
||||
313
utils/deepseek_photo_advisor.py
Normal file
313
utils/deepseek_photo_advisor.py
Normal file
@ -0,0 +1,313 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
DeepSeek照片建议生成器
|
||||
使用DeepSeek大模型为照片评分结果生成具体、个性化的改进建议
|
||||
"""
|
||||
|
||||
import os
|
||||
import json
|
||||
import requests
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# 加载环境变量
|
||||
load_dotenv()
|
||||
|
||||
class DeepSeekPhotoAdvisor:
|
||||
"""DeepSeek照片建议生成器类"""
|
||||
|
||||
def __init__(self):
|
||||
"""初始化DeepSeek客户端"""
|
||||
self.api_key = os.getenv('DEEPSEEK_API_KEY')
|
||||
if not self.api_key:
|
||||
raise Exception("DeepSeek API密钥未配置,请在.env文件中设置DEEPSEEK_API_KEY")
|
||||
|
||||
self.base_url = "https://api.deepseek.com/v1/chat/completions"
|
||||
|
||||
def generate_quality_advice(self, quality_scores, photo_description=""):
|
||||
"""
|
||||
生成照片质量改进建议
|
||||
|
||||
Args:
|
||||
quality_scores: 质量评分字典,包含各维度分数
|
||||
photo_description: 照片内容描述
|
||||
|
||||
Returns:
|
||||
dict: 包含详细建议的字典
|
||||
"""
|
||||
try:
|
||||
# 构建提示词
|
||||
prompt = self._build_quality_advice_prompt(quality_scores, photo_description)
|
||||
|
||||
# 调用DeepSeek API
|
||||
response = self._call_deepseek_api(prompt)
|
||||
|
||||
# 解析响应
|
||||
advice_data = self._parse_advice_response(response)
|
||||
|
||||
return advice_data
|
||||
|
||||
except Exception as e:
|
||||
# 如果API调用失败,返回备用建议
|
||||
return self._generate_fallback_quality_advice(quality_scores)
|
||||
|
||||
def generate_aesthetic_advice(self, aesthetic_scores, photo_description=""):
|
||||
"""
|
||||
生成照片美学改进建议
|
||||
|
||||
Args:
|
||||
aesthetic_scores: 美学评分字典
|
||||
photo_description: 照片内容描述
|
||||
|
||||
Returns:
|
||||
dict: 包含详细美学建议的字典
|
||||
"""
|
||||
try:
|
||||
prompt = self._build_aesthetic_advice_prompt(aesthetic_scores, photo_description)
|
||||
response = self._call_deepseek_api(prompt)
|
||||
advice_data = self._parse_advice_response(response)
|
||||
return advice_data
|
||||
|
||||
except Exception as e:
|
||||
return self._generate_fallback_aesthetic_advice(aesthetic_scores)
|
||||
|
||||
def generate_comprehensive_advice(self, quality_scores, aesthetic_scores, photo_description):
|
||||
"""
|
||||
生成综合改进建议
|
||||
|
||||
Args:
|
||||
quality_scores: 质量评分
|
||||
aesthetic_scores: 美学评分
|
||||
photo_description: 照片描述
|
||||
|
||||
Returns:
|
||||
dict: 综合建议
|
||||
"""
|
||||
try:
|
||||
prompt = self._build_comprehensive_prompt(quality_scores, aesthetic_scores, photo_description)
|
||||
response = self._call_deepseek_api(prompt)
|
||||
advice_data = self._parse_advice_response(response)
|
||||
return advice_data
|
||||
|
||||
except Exception as e:
|
||||
return self._generate_fallback_comprehensive_advice(quality_scores, aesthetic_scores)
|
||||
|
||||
def _build_quality_advice_prompt(self, quality_scores, photo_description):
|
||||
"""构建质量建议提示词"""
|
||||
prompt = f"""
|
||||
你是一名专业的摄影指导专家,请根据以下照片质量评分结果,为摄影师提供具体、可操作的改进建议。
|
||||
|
||||
照片描述:{photo_description if photo_description else "未提供具体描述"}
|
||||
|
||||
质量评分结果:
|
||||
{json.dumps(quality_scores, indent=2, ensure_ascii=False)}
|
||||
|
||||
请按照以下结构提供建议:
|
||||
1. 总体评价:简要总结照片质量状况
|
||||
2. 优势分析:指出表现较好的方面
|
||||
3. 改进重点:按优先级列出需要改进的维度
|
||||
4. 具体建议:为每个需要改进的维度提供3-5条具体、可操作的建议
|
||||
5. 学习资源:推荐相关学习内容
|
||||
|
||||
请用JSON格式返回,结构如下:
|
||||
{{
|
||||
"overall_evaluation": "总体评价",
|
||||
"strengths": ["优势1", "优势2"],
|
||||
"priority_improvements": ["优先级1", "优先级2"],
|
||||
"specific_advice": {{
|
||||
"维度名称": ["建议1", "建议2", "建议3"]
|
||||
}},
|
||||
"learning_resources": ["资源1", "资源2"]
|
||||
}}
|
||||
|
||||
请确保建议具体、实用,适合摄影爱好者理解。
|
||||
"""
|
||||
return prompt.strip()
|
||||
|
||||
def _build_aesthetic_advice_prompt(self, aesthetic_scores, photo_description):
|
||||
"""构建美学建议提示词"""
|
||||
prompt = f"""
|
||||
你是一名专业的摄影美学指导专家,请根据以下照片美学评分结果,为摄影师提供具体的美学改进建议。
|
||||
|
||||
照片描述:{photo_description if photo_description else "未提供具体描述"}
|
||||
|
||||
美学评分结果:
|
||||
{json.dumps(aesthetic_scores, indent=2, ensure_ascii=False)}
|
||||
|
||||
请按照以下结构提供建议:
|
||||
1. 美学评价:从艺术角度评价照片
|
||||
2. 构图建议:针对构图提供具体改进方案
|
||||
3. 色彩建议:针对色彩和谐度提供建议
|
||||
4. 光线建议:针对光线运用提供指导
|
||||
5. 创意提升:提供创意性建议
|
||||
|
||||
请用JSON格式返回,结构如下:
|
||||
{{
|
||||
"aesthetic_evaluation": "美学评价",
|
||||
"composition_advice": ["构图建议1", "构图建议2"],
|
||||
"color_advice": ["色彩建议1", "色彩建议2"],
|
||||
"lighting_advice": ["光线建议1", "光线建议2"],
|
||||
"creative_suggestions": ["创意建议1", "创意建议2"]
|
||||
}}
|
||||
|
||||
请确保建议具有艺术性和实用性。
|
||||
"""
|
||||
return prompt.strip()
|
||||
|
||||
def _build_comprehensive_prompt(self, quality_scores, aesthetic_scores, photo_description):
|
||||
"""构建综合建议提示词"""
|
||||
prompt = f"""
|
||||
你是一名资深的摄影导师,请根据以下照片的全面评估结果,为摄影师提供综合性的改进建议和学习计划。
|
||||
|
||||
照片描述:{photo_description}
|
||||
|
||||
质量评分:
|
||||
{json.dumps(quality_scores, indent=2, ensure_ascii=False)}
|
||||
|
||||
美学评分:
|
||||
{json.dumps(aesthetic_scores, indent=2, ensure_ascii=False)}
|
||||
|
||||
请提供:
|
||||
1. 综合评估:结合技术和艺术角度全面评价
|
||||
2. 个性化学习计划:根据评分结果制定针对性学习路径
|
||||
3. 短期目标:可立即实施的改进措施
|
||||
4. 长期规划:提升摄影水平的长期建议
|
||||
5. 练习建议:具体的拍摄练习方案
|
||||
|
||||
请用JSON格式返回,结构如下:
|
||||
{{
|
||||
"comprehensive_evaluation": "综合评估",
|
||||
"learning_plan": {{
|
||||
"short_term": ["短期目标1", "短期目标2"],
|
||||
"long_term": ["长期规划1", "长期规划2"]
|
||||
}},
|
||||
"practice_suggestions": ["练习建议1", "练习建议2"],
|
||||
"immediate_actions": ["立即行动1", "立即行动2"]
|
||||
}}
|
||||
|
||||
请确保建议系统、实用,适合不同水平的摄影爱好者。
|
||||
"""
|
||||
return prompt.strip()
|
||||
|
||||
def _call_deepseek_api(self, prompt):
|
||||
"""调用DeepSeek API"""
|
||||
headers = {
|
||||
'Authorization': f'Bearer {self.api_key}',
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
|
||||
data = {
|
||||
'model': 'deepseek-chat',
|
||||
'messages': [
|
||||
{
|
||||
'role': 'system',
|
||||
'content': '你是一名专业的摄影指导专家,具有丰富的摄影教学经验和艺术审美能力。你擅长为不同水平的摄影爱好者提供具体、实用的改进建议。'
|
||||
},
|
||||
{
|
||||
'role': 'user',
|
||||
'content': prompt
|
||||
}
|
||||
],
|
||||
'max_tokens': 1500,
|
||||
'temperature': 0.7,
|
||||
'top_p': 0.9
|
||||
}
|
||||
|
||||
response = requests.post(self.base_url, headers=headers, json=data, timeout=30)
|
||||
response.raise_for_status()
|
||||
|
||||
return response.json()
|
||||
|
||||
def _parse_advice_response(self, api_response):
|
||||
"""解析API响应"""
|
||||
try:
|
||||
if 'choices' in api_response and len(api_response['choices']) > 0:
|
||||
content = api_response['choices'][0]['message']['content'].strip()
|
||||
|
||||
# 尝试解析JSON格式的响应
|
||||
try:
|
||||
# 提取JSON部分(可能包含在代码块中)
|
||||
if '```json' in content:
|
||||
json_str = content.split('```json')[1].split('```')[0].strip()
|
||||
elif '```' in content:
|
||||
json_str = content.split('```')[1].strip()
|
||||
else:
|
||||
json_str = content
|
||||
|
||||
advice_data = json.loads(json_str)
|
||||
return advice_data
|
||||
|
||||
except json.JSONDecodeError:
|
||||
# 如果不是JSON格式,返回原始文本
|
||||
return {'raw_advice': content}
|
||||
else:
|
||||
raise Exception("API响应格式错误")
|
||||
|
||||
except Exception as e:
|
||||
raise Exception(f"解析API响应失败: {str(e)}")
|
||||
|
||||
def _generate_fallback_quality_advice(self, quality_scores):
|
||||
"""生成备用质量建议"""
|
||||
return {
|
||||
"overall_evaluation": "基于评分结果生成的改进建议",
|
||||
"strengths": ["照片基础质量良好"],
|
||||
"priority_improvements": ["根据评分结果确定重点改进维度"],
|
||||
"specific_advice": {
|
||||
"通用建议": [
|
||||
"建议使用三脚架提高稳定性",
|
||||
"注意光线条件,避免过暗或过亮",
|
||||
"后期适当调整对比度和色彩平衡"
|
||||
]
|
||||
},
|
||||
"learning_resources": ["推荐学习基础摄影知识和后期处理技巧"]
|
||||
}
|
||||
|
||||
def _generate_fallback_aesthetic_advice(self, aesthetic_scores):
|
||||
"""生成备用美学建议"""
|
||||
return {
|
||||
"aesthetic_evaluation": "照片具有基本的审美价值",
|
||||
"composition_advice": ["学习三分法则构图", "注意主体位置安排"],
|
||||
"color_advice": ["保持色彩和谐", "避免过度饱和"],
|
||||
"lighting_advice": ["选择合适的光线条件", "注意光影效果"],
|
||||
"creative_suggestions": ["尝试不同的拍摄角度", "探索创意构图方式"]
|
||||
}
|
||||
|
||||
def _generate_fallback_comprehensive_advice(self, quality_scores, aesthetic_scores):
|
||||
"""生成备用综合建议"""
|
||||
return {
|
||||
"comprehensive_evaluation": "照片整体表现良好,有提升空间",
|
||||
"learning_plan": {
|
||||
"short_term": ["重点改进技术基础", "练习基本构图技巧"],
|
||||
"long_term": ["系统学习摄影理论", "培养艺术审美能力"]
|
||||
},
|
||||
"practice_suggestions": ["多拍多练", "分析优秀作品"],
|
||||
"immediate_actions": ["检查相机设置", "注意拍摄环境"]
|
||||
}
|
||||
|
||||
# 便捷函数
|
||||
def get_deepseek_quality_advice(quality_scores, photo_description=""):
|
||||
"""获取DeepSeek质量建议(便捷函数)"""
|
||||
try:
|
||||
advisor = DeepSeekPhotoAdvisor()
|
||||
return advisor.generate_quality_advice(quality_scores, photo_description)
|
||||
except Exception as e:
|
||||
# 如果DeepSeek不可用,返回空建议
|
||||
return {}
|
||||
|
||||
def get_deepseek_aesthetic_advice(aesthetic_scores, photo_description=""):
|
||||
"""获取DeepSeek美学建议(便捷函数)"""
|
||||
try:
|
||||
advisor = DeepSeekPhotoAdvisor()
|
||||
return advisor.generate_aesthetic_advice(aesthetic_scores, photo_description)
|
||||
except Exception as e:
|
||||
return {}
|
||||
|
||||
def check_deepseek_config():
|
||||
"""检查DeepSeek配置状态"""
|
||||
try:
|
||||
api_key = os.getenv('DEEPSEEK_API_KEY')
|
||||
if api_key:
|
||||
return True, "DeepSeek照片建议生成器已配置"
|
||||
else:
|
||||
return False, "DeepSeek API密钥未配置,请在.env文件中设置DEEPSEEK_API_KEY"
|
||||
except Exception as e:
|
||||
return False, f"DeepSeek配置检查失败: {str(e)}"
|
||||
Loading…
Reference in New Issue
Block a user