FoodDetection / app.py
HoagMin's picture
Add language and tags
336f4d8
import os
from flask import Flask, render_template, request, jsonify
from services.yolo_service import detect_food
from services.gemini_service import get_nutrition_info
from services.ocr_service import OCRService
app = Flask(__name__)
UPLOAD_FOLDER = 'static/uploads'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
try:
ocr_service = OCRService()
print("✅ OCR Service đã sẵn sàng!")
except Exception as e:
print(f"❌ Lỗi khởi tạo OCR: {e}")
ocr_service = None
@app.route('/health')
def health():
return "OK", 200
@app.route('/')
def index():
return render_template('index.html')
@app.route('/analyze', methods=['POST'])
def analyze():
if 'file' not in request.files:
return jsonify({'error': 'Không có file ảnh'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'error': 'Chưa chọn file'}), 400
if file:
try:
filename = file.filename
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
filepath_fixed = filepath.replace("\\", "/")
target_language = request.form.get('language', 'English')
print(f"🌐 Ngôn ngữ dịch: {target_language}")
# ==========================================
# YOLO DETECT
# ==========================================
print(f"🔍 Đang chạy YOLO cho ảnh: {filename}")
detected_name = detect_food(filepath_fixed)
if not detected_name:
return jsonify({
'success': False,
'message': 'Không nhận diện được món ăn nào.'
})
print(f"✅ YOLO phát hiện: {detected_name}")
# ==========================================
# OCR
# ==========================================
extracted_text = None
if ocr_service:
print("📖 Đang chạy OCR...")
try:
text_list = ocr_service.extract_text(filepath_fixed)
if text_list and len(text_list) > 0:
extracted_text = " | ".join(text_list)
print(f"✅ OCR đọc được: {extracted_text}")
else:
print("⚠️ OCR không tìm thấy chữ nào.")
except Exception as e:
print(f"❌ Lỗi khi chạy OCR: {e}")
# ==========================================
# GEMINI
# ==========================================
print("🤖 Đang gọi Gemini...")
try:
# Truyền cả tên món (YOLO) và chữ đọc được (OCR) vào
menu_data = get_nutrition_info(detected_name, ocr_text=extracted_text, target_language=target_language)
except Exception as e:
print(f"❌ Lỗi Gemini: {e}")
menu_data = {
"dish_name": detected_name,
"price": "Unavailable",
"description": "Connection error.",
"nutrition_summary": "Cannot fetch data.",
"tags": []
}
return jsonify({
'success': True,
'image_url': f"/{filepath_fixed}",
'data': menu_data,
'debug_ocr': extracted_text
})
except Exception as e:
print(f"❌ Lỗi Server: {e}")
return jsonify({'error': f'Lỗi server nội bộ: {str(e)}'}), 500
if __name__ == '__main__':
app.run(debug=True, port=5000)