Spaces:
Build error
Build error
| from fastapi import FastAPI, File, UploadFile | |
| from fastapi.responses import JSONResponse | |
| import tensorflow as tf | |
| import numpy as np | |
| import shutil | |
| import os | |
| from huggingface_hub import InferenceClient | |
| import json | |
| # Initialize FastAPI app | |
| app = FastAPI() | |
| # Class labels | |
| class_labels = { | |
| 0: 'Baked Potato', 1: 'Burger', 2: 'Crispy Chicken', 3: 'Donut', 4: 'Fries', | |
| 5: 'Hot Dog', 6: 'Jalapeno', 7: 'Kiwi', 8: 'Lemon', 9: 'Lettuce', | |
| 10: 'Mango', 11: 'Onion', 12: 'Orange', 13: 'Pizza', 14: 'Taquito', | |
| 15: 'Apple', 16: 'Banana', 17: 'Beetroot', 18: 'Bell Pepper', 19: 'Bread', | |
| 20: 'Cabbage', 21: 'Carrot', 22: 'Cauliflower', 23: 'Cheese', | |
| 24: 'Chilli Pepper', 25: 'Corn', 26: 'Crab', 27: 'Cucumber', | |
| 28: 'Eggplant', 29: 'Eggs', 30: 'Garlic', 31: 'Ginger', 32: 'Grapes', | |
| 33: 'Milk', 34: 'Salmon', 35: 'Yogurt' | |
| } | |
| # Load the trained model | |
| model = tf.keras.models.load_model("model_unfreezeNewCorrectpredict.keras") | |
| # Image preprocessing function | |
| def load_and_prep_image(file_path, img_shape=224): | |
| img = tf.io.read_file(file_path) | |
| img = tf.image.decode_image(img, channels=3) | |
| img = tf.image.resize(img, size=[img_shape, img_shape]) | |
| img = tf.expand_dims(img, axis=0) | |
| return img | |
| # Predict label function | |
| def predict_label(model, image_path, class_names): | |
| img = load_and_prep_image(image_path, img_shape=224) | |
| pred = model.predict(img) | |
| pred_class_index = np.argmax(pred, axis=1)[0] | |
| pred_class_name = class_names[pred_class_index] | |
| return pred_class_name | |
| def read_root(): | |
| return {"message": "This is My Nutrionguid App"} | |
| # API endpoint for prediction | |
| async def predict_image(file: UploadFile = File(...)): | |
| try: | |
| # Save the uploaded file | |
| file_location = f"./temp_{file.filename}" | |
| with open(file_location, "wb") as f: | |
| shutil.copyfileobj(file.file, f) | |
| # Predict the label | |
| prediction = predict_label(model, file_location, class_labels) | |
| # Remove the temporary file | |
| os.remove(file_location) | |
| return {"predicted_label": prediction} | |
| except Exception as e: | |
| return JSONResponse( | |
| status_code=500, | |
| content={"error": f"An error occurred: {str(e)}"} | |
| ) | |
| async def predict_image_and_nutrition(file: UploadFile = File(...)): | |
| try: | |
| # Save the uploaded file | |
| file_location = f"./temp_{file.filename}" | |
| with open(file_location, "wb") as f: | |
| shutil.copyfileobj(file.file, f) | |
| # Predict the label using the same prediction logic | |
| prediction = predict_label(model, file_location, class_labels) | |
| # Remove the temporary file | |
| os.remove(file_location) | |
| # Define the repository ID and your token | |
| #repo_id = "google/gemma-2-9b-it" | |
| repo_id = "Qwen/Qwen2.5-72B-Instruct" | |
| # repo_id = "microsoft/Phi-3-mini-4k-instruct" | |
| #repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1" | |
| api_token = "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12" | |
| # Initialize the InferenceClient with your token | |
| llm_client = InferenceClient( | |
| model=repo_id, | |
| token=api_token[:-2], | |
| timeout=120, | |
| ) | |
| # Function to call the LLM | |
| def call_llm(inference_client: InferenceClient, prompt: str): | |
| response = inference_client.text_generation( | |
| prompt=prompt, | |
| max_new_tokens=500, | |
| temperature=0.7, # optional | |
| ) | |
| return response | |
| # Use the prediction to generate nutrition information | |
| # prompt = f"Nutrition information (Calories, Protein, Carbohydrates, Dietary Fiber, Sugars, Fat, Sodium, Potassium, Vitamin C, Vitamin B6, Folate, Niacin, Pantothenic acid) for {prediction} in formatted list" | |
| # # prompt = f"Provide all the nutrition information for {prediction}, including Calories, Protein, Carbohydrates, Dietary Fiber, Sugars, Fat, Sodium, Potassium, Vitamin C, Vitamin B6, Folate, Niacin, and Pantothenic acid. Please present the information in a clear, formatted list only, without additional explanations." | |
| # response = call_llm(llm_client, prompt) | |
| # return {"predicted_label": prediction, "nutrition_info": response} | |
| # nutrition_prompt = f"Provide the nutrition information (Calories, Protein, Carbohydrates, Dietary Fiber, Sugars, Fat, Sodium, Potassium, Vitamin C, Vitamin B6, Folate, Niacin, Pantothenic acid) for {prediction} per 100 grams in a formatted list only." | |
| nutrition_prompt = f"Provide the nutrition information (Calories, Protein, Carbohydrates, Dietary Fiber, Sugars, Fat, Sodium, Potassium, Vitamin C, Vitamin B6) for {prediction} per 100 grams, Output the information as a concise, formatted list without repetition." | |
| nutrition_info = call_llm(llm_client, nutrition_prompt) | |
| # # Second prompt: Health benefits and tips | |
| health_benefits_prompt = f"Provide the health benefits and considerations for {prediction}. Additionally, include practical tips for making {prediction} healthier. Keep the response focused on these two aspects only." | |
| # health_benefits_prompt = f"Provide detailed information about {prediction}, including its origin, common uses, cultural significance, and any interesting facts. Keep the response informative and well-structured." | |
| Information = call_llm(llm_client, health_benefits_prompt) | |
| recipes_prompt=f"Tell me about the two most famous recipes for {prediction}. Include the ingredients only." | |
| recipes_info=call_llm(llm_client, recipes_prompt) | |
| return { | |
| "Predicted_label": prediction, | |
| "Nutrition_info": nutrition_info, | |
| "Information": Information, | |
| "Recipes":recipes_info | |
| } | |
| except Exception as e: | |
| return JSONResponse( | |
| status_code=500, | |
| content={"error": f"An error occurred: {str(e)}"} | |
| ) | |
| #nutrition_prompt = f"Provide the nutrition information (Calories, Protein, Carbohydrates, Dietary Fiber, Sugars, Fat, Sodium, Potassium, Vitamin C, Vitamin B6) for {prediction} in a formatted list only." | |
| # nutrition_info = call_llm(llm_client, nutrition_prompt) | |
| # # Second prompt: Health benefits and tips | |
| # health_benefits_prompt = f"Provide the health benefits and considerations for {prediction} and give tips for making it healthier." | |
| # health_benefits_and_tips = call_llm(llm_client, health_benefits_prompt) | |
| # return { | |
| # "predicted_label": prediction, | |
| # "nutrition_info": nutrition_info, | |
| # "health_benefits_and_tips": health_benefits_and_tips | |
| # } |