Spaces:
Running
Running
Commit
·
c2a1c6d
1
Parent(s):
8b0abe0
Add real Hugging Face model support with Food101 classification
Browse files- app.py +60 -6
- requirements.txt +8 -0
app.py
CHANGED
@@ -10,6 +10,7 @@ import logging
|
|
10 |
import time
|
11 |
from datetime import datetime
|
12 |
import os # Added for environment detection
|
|
|
13 |
|
14 |
# 設置詳細日誌 - 在 Hugging Face Spaces 中只使用 StreamHandler
|
15 |
logging.basicConfig(
|
@@ -165,14 +166,67 @@ def simulate_ai_analysis(image_url: str):
|
|
165 |
}
|
166 |
|
167 |
def real_ai_analysis(image_url: str):
|
168 |
-
"""真實 AI 分析 -
|
169 |
try:
|
170 |
-
log_analysis_step("模型載入", "
|
171 |
|
172 |
-
#
|
173 |
-
|
174 |
-
|
175 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
176 |
|
177 |
except Exception as e:
|
178 |
log_analysis_step("模型載入", f"模型載入失敗: {str(e)}")
|
|
|
10 |
import time
|
11 |
from datetime import datetime
|
12 |
import os # Added for environment detection
|
13 |
+
import torch # Added for Hugging Face model inference
|
14 |
|
15 |
# 設置詳細日誌 - 在 Hugging Face Spaces 中只使用 StreamHandler
|
16 |
logging.basicConfig(
|
|
|
166 |
}
|
167 |
|
168 |
def real_ai_analysis(image_url: str):
|
169 |
+
"""真實 AI 分析 - 使用 Hugging Face 模型"""
|
170 |
try:
|
171 |
+
log_analysis_step("模型載入", "嘗試載入 Hugging Face 模型...")
|
172 |
|
173 |
+
# 嘗試載入 Hugging Face 模型
|
174 |
+
try:
|
175 |
+
from transformers import AutoImageProcessor, AutoModelForImageClassification
|
176 |
+
from PIL import Image
|
177 |
+
import requests
|
178 |
+
from io import BytesIO
|
179 |
+
|
180 |
+
log_analysis_step("模型載入", "載入 Food101 模型...")
|
181 |
+
|
182 |
+
# 載入預訓練的 Food101 模型
|
183 |
+
processor = AutoImageProcessor.from_pretrained("nateraw/food101")
|
184 |
+
model = AutoModelForImageClassification.from_pretrained("nateraw/food101")
|
185 |
+
|
186 |
+
log_analysis_step("圖片處理", "下載並處理圖片...")
|
187 |
+
|
188 |
+
# 下載圖片
|
189 |
+
response = requests.get(image_url)
|
190 |
+
image = Image.open(BytesIO(response.content))
|
191 |
+
|
192 |
+
# 處理圖片
|
193 |
+
inputs = processor(image, return_tensors="pt")
|
194 |
+
|
195 |
+
log_analysis_step("模型推理", "進行食物識別...")
|
196 |
+
|
197 |
+
# 進行預測
|
198 |
+
with torch.no_grad():
|
199 |
+
outputs = model(**inputs)
|
200 |
+
logits = outputs.logits
|
201 |
+
predicted_class_id = logits.argmax(-1).item()
|
202 |
+
confidence = torch.softmax(logits, dim=-1).max().item()
|
203 |
+
|
204 |
+
# 獲取食物名稱
|
205 |
+
food_name = model.config.id2label[predicted_class_id]
|
206 |
+
|
207 |
+
log_analysis_step("識別完成", f"識別結果: {food_name} (信心度: {confidence:.1%})")
|
208 |
+
|
209 |
+
# 查詢營養資訊
|
210 |
+
nutrition_data = lookup_nutrition_data(food_name)
|
211 |
+
|
212 |
+
return {
|
213 |
+
"food_name": food_name,
|
214 |
+
"confidence": confidence * 100,
|
215 |
+
"weight": 150, # 模擬重量估算
|
216 |
+
"nutrition": nutrition_data.get("nutrition", {}),
|
217 |
+
"analysis_steps": [
|
218 |
+
"Hugging Face Food101 模型載入完成",
|
219 |
+
"圖片下載和預處理完成",
|
220 |
+
f"食物識別: {food_name}",
|
221 |
+
"營養資訊查詢完成"
|
222 |
+
],
|
223 |
+
"mode": "real_hf_model"
|
224 |
+
}
|
225 |
+
|
226 |
+
except Exception as model_error:
|
227 |
+
log_analysis_step("模型載入", f"Hugging Face 模型載入失敗: {str(model_error)}")
|
228 |
+
log_analysis_step("模式切換", "切換到模擬模式")
|
229 |
+
return simulate_ai_analysis(image_url)
|
230 |
|
231 |
except Exception as e:
|
232 |
log_analysis_step("模型載入", f"模型載入失敗: {str(e)}")
|
requirements.txt
CHANGED
@@ -4,8 +4,15 @@ uvicorn[standard]>=0.27.0
|
|
4 |
gradio>=4.44.0
|
5 |
pydantic>=2.5.0
|
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
# Image processing
|
8 |
Pillow>=10.3.0
|
|
|
9 |
|
10 |
# HTTP requests
|
11 |
requests>=2.31.0
|
@@ -13,6 +20,7 @@ httpx>=0.25.0
|
|
13 |
|
14 |
# Data processing
|
15 |
numpy>=1.24.0
|
|
|
16 |
|
17 |
# CORS support
|
18 |
python-multipart>=0.0.6
|
|
|
4 |
gradio>=4.44.0
|
5 |
pydantic>=2.5.0
|
6 |
|
7 |
+
# Hugging Face models
|
8 |
+
transformers>=4.35.0
|
9 |
+
torch>=2.0.0
|
10 |
+
torchvision>=0.15.0
|
11 |
+
diffusers>=0.24.0
|
12 |
+
|
13 |
# Image processing
|
14 |
Pillow>=10.3.0
|
15 |
+
opencv-python>=4.8.0
|
16 |
|
17 |
# HTTP requests
|
18 |
requests>=2.31.0
|
|
|
20 |
|
21 |
# Data processing
|
22 |
numpy>=1.24.0
|
23 |
+
pandas>=2.0.0
|
24 |
|
25 |
# CORS support
|
26 |
python-multipart>=0.0.6
|