Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -16,16 +16,14 @@ GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini
|
|
| 16 |
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
|
| 17 |
|
| 18 |
def allowed_file(filename):
|
| 19 |
-
return '.' in filename and
|
| 20 |
-
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
|
| 21 |
|
| 22 |
-
# 优化图像函数,现在接受字节数据作为输入
|
| 23 |
def optimize_image(image_bytes, max_size=(1024, 1024), quality=85):
|
| 24 |
"""优化图像大小和质量"""
|
| 25 |
try:
|
| 26 |
# 使用 io.BytesIO 将字节数据转换为文件对象,供 Pillow 使用
|
| 27 |
img = Image.open(io.BytesIO(image_bytes))
|
| 28 |
-
|
| 29 |
if img.mode in ('RGBA', 'LA'):
|
| 30 |
background = Image.new('RGB', img.size, (255, 255, 255))
|
| 31 |
if img.mode == 'RGBA':
|
|
@@ -43,63 +41,71 @@ def optimize_image(image_bytes, max_size=(1024, 1024), quality=85):
|
|
| 43 |
return img_byte_arr.getvalue()
|
| 44 |
except Exception as e:
|
| 45 |
print(f"Image optimization error: {e}")
|
| 46 |
-
# 优化失败,返回原始字节数据
|
| 47 |
-
return image_bytes
|
| 48 |
|
| 49 |
-
# call_gemini_api 函数
|
| 50 |
def call_gemini_api(text_content=None, image_data=None):
|
| 51 |
"""调用Gemini API进行分析"""
|
| 52 |
-
|
| 53 |
if not GEMINI_API_KEY:
|
| 54 |
return {"error": "未配置Gemini API密钥,请设置环境变量GEMINI_API_KEY"}
|
| 55 |
-
|
| 56 |
system_prompt = """你是一位经验丰富的皮肤科专家医生,具有多年的临床诊疗经验。请基于提供的信息进行专业的皮肤病分析。
|
| 57 |
|
| 58 |
-
分析要求:
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
|
| 66 |
-
|
| 67 |
|
| 68 |
-
|
| 69 |
-
[详细描述观察到的皮肤病变特征]
|
| 70 |
|
| 71 |
-
|
| 72 |
-
[结合文字描述的症状分析]
|
| 73 |
|
| 74 |
-
|
| 75 |
-
1. **最可能诊断**: [诊断名称] - 可能性: X%
|
| 76 |
-
- 依据: [具体理由]
|
| 77 |
-
|
| 78 |
-
2. **次要考虑**: [其他可能诊断]
|
| 79 |
|
| 80 |
-
|
| 81 |
-
### 药物治疗
|
| 82 |
-
- [具体用药建议]
|
| 83 |
|
| 84 |
-
|
| 85 |
-
- [日常护理要点]
|
| 86 |
|
| 87 |
-
|
| 88 |
-
|
| 89 |
|
| 90 |
-
|
| 91 |
-
[重要提醒和注意事项]
|
| 92 |
|
| 93 |
-
|
| 94 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
|
| 96 |
parts = []
|
| 97 |
-
|
| 98 |
if text_content:
|
| 99 |
parts.append({"text": f"{system_prompt}\n\n患者症状描述:{text_content}"})
|
| 100 |
else:
|
| 101 |
parts.append({"text": system_prompt + "\n\n请基于图像进行分析。"})
|
| 102 |
-
|
| 103 |
if image_data:
|
| 104 |
image_base64 = base64.b64encode(image_data).decode('utf-8')
|
| 105 |
parts.append({
|
|
@@ -108,7 +114,7 @@ def call_gemini_api(text_content=None, image_data=None):
|
|
| 108 |
"data": image_base64
|
| 109 |
}
|
| 110 |
})
|
| 111 |
-
|
| 112 |
request_body = {
|
| 113 |
"contents": [
|
| 114 |
{
|
|
@@ -140,12 +146,12 @@ def call_gemini_api(text_content=None, image_data=None):
|
|
| 140 |
}
|
| 141 |
]
|
| 142 |
}
|
| 143 |
-
|
| 144 |
headers = {
|
| 145 |
'Content-Type': 'application/json',
|
| 146 |
'x-goog-api-key': GEMINI_API_KEY
|
| 147 |
}
|
| 148 |
-
|
| 149 |
try:
|
| 150 |
response = requests.post(
|
| 151 |
GEMINI_API_URL,
|
|
@@ -180,7 +186,6 @@ def index():
|
|
| 180 |
@app.route('/analyze', methods=['POST'])
|
| 181 |
def analyze():
|
| 182 |
"""分析皮肤图像和症状的API端点"""
|
| 183 |
-
|
| 184 |
try:
|
| 185 |
text_content = request.form.get('text', '').strip()
|
| 186 |
image_data = None
|
|
@@ -237,4 +242,4 @@ if __name__ == '__main__':
|
|
| 237 |
print("⚠️ 警告: 未设置GEMINI_API_KEY环境变量")
|
| 238 |
print(" 请设置环境变量: export GEMINI_API_KEY=your_api_key")
|
| 239 |
port = int(os.environ.get('PORT', 7860))
|
| 240 |
-
app.run(host='0.0.0.0', port=port, debug=False)
|
|
|
|
| 16 |
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
|
| 17 |
|
| 18 |
def allowed_file(filename):
|
| 19 |
+
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
|
|
|
|
| 20 |
|
|
|
|
| 21 |
def optimize_image(image_bytes, max_size=(1024, 1024), quality=85):
|
| 22 |
"""优化图像大小和质量"""
|
| 23 |
try:
|
| 24 |
# 使用 io.BytesIO 将字节数据转换为文件对象,供 Pillow 使用
|
| 25 |
img = Image.open(io.BytesIO(image_bytes))
|
| 26 |
+
|
| 27 |
if img.mode in ('RGBA', 'LA'):
|
| 28 |
background = Image.new('RGB', img.size, (255, 255, 255))
|
| 29 |
if img.mode == 'RGBA':
|
|
|
|
| 41 |
return img_byte_arr.getvalue()
|
| 42 |
except Exception as e:
|
| 43 |
print(f"Image optimization error: {e}")
|
| 44 |
+
return image_bytes # 优化失败,返回原始字节数据
|
|
|
|
| 45 |
|
|
|
|
| 46 |
def call_gemini_api(text_content=None, image_data=None):
|
| 47 |
"""调用Gemini API进行分析"""
|
|
|
|
| 48 |
if not GEMINI_API_KEY:
|
| 49 |
return {"error": "未配置Gemini API密钥,请设置环境变量GEMINI_API_KEY"}
|
| 50 |
+
|
| 51 |
system_prompt = """你是一位经验丰富的皮肤科专家医生,具有多年的临床诊疗经验。请基于提供的信息进行专业的皮肤病分析。
|
| 52 |
|
| 53 |
+
分析要求:
|
| 54 |
+
|
| 55 |
+
仔细观察皮肤病变的形态、颜色、分布、边界等特征
|
| 56 |
+
|
| 57 |
+
结合患者描述的症状和病史
|
| 58 |
+
|
| 59 |
+
提供可能的诊断方向(按可能性大小排序)
|
| 60 |
+
|
| 61 |
+
给出详细的诊疗建议
|
| 62 |
+
|
| 63 |
+
必要时建议进一步检查
|
| 64 |
+
|
| 65 |
+
提醒患者注意事项
|
| 66 |
+
请按以下格式回复:
|
| 67 |
+
|
| 68 |
+
🔍 图像观察分析
|
| 69 |
+
|
| 70 |
+
[详细描述观察到的皮肤病变特征]
|
| 71 |
|
| 72 |
+
📋 症状综合评估
|
| 73 |
|
| 74 |
+
[结合文字描述的症状分析]
|
|
|
|
| 75 |
|
| 76 |
+
🎯 可能诊断
|
|
|
|
| 77 |
|
| 78 |
+
最可能诊断: [诊断名称] - 可能性: X%
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
|
| 80 |
+
依据: [具体理由]
|
|
|
|
|
|
|
| 81 |
|
| 82 |
+
次要考虑: [其他可能诊断]
|
|
|
|
| 83 |
|
| 84 |
+
💊 治疗建议
|
| 85 |
+
药物治疗
|
| 86 |
|
| 87 |
+
[具体用药建议]
|
|
|
|
| 88 |
|
| 89 |
+
生活护理
|
| 90 |
+
|
| 91 |
+
[日常护理要点]
|
| 92 |
+
|
| 93 |
+
🏥 进一步检查建议
|
| 94 |
+
|
| 95 |
+
[如需要其他检查,请列出]
|
| 96 |
+
|
| 97 |
+
⚠️ 注意事项
|
| 98 |
+
[重要提醒和注意事项]
|
| 99 |
+
|
| 100 |
+
免责声明: 此分析仅供临床参考,最终诊断需结合完整病史、体格检查等综合判断。建议患者及时就医,接受专业医师诊疗。"""
|
| 101 |
|
| 102 |
parts = []
|
| 103 |
+
|
| 104 |
if text_content:
|
| 105 |
parts.append({"text": f"{system_prompt}\n\n患者症状描述:{text_content}"})
|
| 106 |
else:
|
| 107 |
parts.append({"text": system_prompt + "\n\n请基于图像进行分析。"})
|
| 108 |
+
|
| 109 |
if image_data:
|
| 110 |
image_base64 = base64.b64encode(image_data).decode('utf-8')
|
| 111 |
parts.append({
|
|
|
|
| 114 |
"data": image_base64
|
| 115 |
}
|
| 116 |
})
|
| 117 |
+
|
| 118 |
request_body = {
|
| 119 |
"contents": [
|
| 120 |
{
|
|
|
|
| 146 |
}
|
| 147 |
]
|
| 148 |
}
|
| 149 |
+
|
| 150 |
headers = {
|
| 151 |
'Content-Type': 'application/json',
|
| 152 |
'x-goog-api-key': GEMINI_API_KEY
|
| 153 |
}
|
| 154 |
+
|
| 155 |
try:
|
| 156 |
response = requests.post(
|
| 157 |
GEMINI_API_URL,
|
|
|
|
| 186 |
@app.route('/analyze', methods=['POST'])
|
| 187 |
def analyze():
|
| 188 |
"""分析皮肤图像和症状的API端点"""
|
|
|
|
| 189 |
try:
|
| 190 |
text_content = request.form.get('text', '').strip()
|
| 191 |
image_data = None
|
|
|
|
| 242 |
print("⚠️ 警告: 未设置GEMINI_API_KEY环境变量")
|
| 243 |
print(" 请设置环境变量: export GEMINI_API_KEY=your_api_key")
|
| 244 |
port = int(os.environ.get('PORT', 7860))
|
| 245 |
+
app.run(host='0.0.0.0', port=port, debug=False)
|