from fastapi import FastAPI, UploadFile, File, HTTPException from fastapi.responses import JSONResponse from transformers import ViTFeatureExtractor, ViTForImageClassification from PIL import Image import requests import io import warnings import gradio as gr import threading import uvicorn warnings.filterwarnings('ignore') # Load the pre-trained Vision Transformer model and feature extractor model_name = "google/vit-base-patch16-224" feature_extractor = ViTFeatureExtractor.from_pretrained(model_name) model = ViTForImageClassification.from_pretrained(model_name) # API key for the nutrition information api_key = 'TTnVMFxStvcP3sUXow/sGw==CnAQfUtuozhAAO5M' app = FastAPI() def identify_image(image: Image.Image): """Identify the food item in the image.""" inputs = feature_extractor(images=image, return_tensors="pt") outputs = model(**inputs) logits = outputs.logits predicted_class_idx = logits.argmax(-1).item() predicted_label = model.config.id2label[predicted_class_idx] food_name = predicted_label.split(',')[0] return food_name def get_calories(food_name: str): """Get the calorie information of the identified food item.""" api_url = f'https://api.api-ninjas.com/v1/nutrition?query={food_name}' response = requests.get(api_url, headers={'X-Api-Key': api_key}) if response.status_code == requests.codes.ok: return response.json() else: raise HTTPException(status_code=response.status_code, detail=response.text) @app.post("/identify_and_get_nutrition") async def identify_and_get_nutrition(file: UploadFile = File(...)): image_data = await file.read() image = Image.open(io.BytesIO(image_data)) food_name = identify_image(image) nutrition_info = get_calories(food_name) if len(nutrition_info) == 0: return JSONResponse(content={"message": "No nutritional information found."}, status_code=404) return nutrition_info # Gradio Interface def gradio_interface(image_file): image = Image.open(image_file) food_name = identify_image(image) nutrition_info = get_calories(food_name) if len(nutrition_info) == 0: return "No nutritional information found." nutrition_data = nutrition_info[0] table = f"""
Nutrition Facts
Food Name: {nutrition_data['name']}
Calories{nutrition_data['calories']} Serving Size (g){nutrition_data['serving_size_g']}
Total Fat (g){nutrition_data['fat_total_g']} Saturated Fat (g){nutrition_data['fat_saturated_g']}
Protein (g){nutrition_data['protein_g']} Sodium (mg){nutrition_data['sodium_mg']}
Potassium (mg){nutrition_data['potassium_mg']} Cholesterol (mg){nutrition_data['cholesterol_mg']}
Total Carbohydrates (g){nutrition_data['carbohydrates_total_g']} Fiber (g){nutrition_data['fiber_g']}
Sugar (g){nutrition_data['sugar_g']}
""" return table iface = gr.Interface( fn=gradio_interface, inputs=gr.Image(type="filepath"), outputs="html", title="Food Identification and Nutrition Info", description="Upload an image of food to get nutritional information.", allow_flagging="never" # Disable flagging ) def run_gradio(): iface.launch(share=True) def run_fastapi(): uvicorn.run(app, host="0.0.0.0", port=8000) if __name__ == "__main__": # Run Gradio and FastAPI in separate threads gradio_thread = threading.Thread(target=run_gradio) fastapi_thread = threading.Thread(target=run_fastapi) gradio_thread.start() fastapi_thread.start() gradio_thread.join() fastapi_thread.join()