# from ultralytics import YOLO # import pandas as pd # from PIL import Image, ImageDraw # import gradio as gr # # تحميل الموديل # model = YOLO("best.pt") # # تحميل بيانات التغذية # food_df = pd.read_csv("food_cleaned.csv") # # جلب القيم الغذائية # def get_nutrition(label): # row = food_df[food_df["Food_Name"].str.lower() == label.lower()] # if row.empty: # return "No data" # cals = row["Calories_per_100g"].values[0] # fat = row["Fat_g"].values[0] # protein = row["Protein_g"].values[0] # carbs = row["Carbs_g"].values[0] # return f"{label}: {cals} kcal, {fat}g fat, {protein}g protein, {carbs}g carbs" # # دالة الكشف والرسم # def detect(image): # results = model.predict(image) # result = results[0] # boxes = result.boxes # names = model.names # img = Image.fromarray(result.plot()) # الصورة عليها البوكسات # draw = ImageDraw.Draw(img) # for box in boxes: # cls_id = int(box.cls[0]) # label = names[cls_id] # nutrition = get_nutrition(label) # xy = box.xyxy[0].tolist() # draw.text((xy[0], xy[1] - 10), nutrition, fill=(255, 0, 0)) # return img # # Gradio app # demo = gr.Interface( # fn=detect, # inputs=gr.Image(type="pil"), # outputs=gr.Image(type="pil"), # title="YOLOv8 Food Detector + Nutrition Info", # description="Upload an image of food and see calories and nutrients!" # ) # demo.launch() from ultralytics import YOLO import pandas as pd from PIL import Image import gradio as gr from collections import Counter # Load YOLO model model = YOLO("best.pt") # Load food nutrition data food_df = pd.read_csv("food_cleaned.csv") # Retrieve nutrition info for a given label def get_nutrition(label): row = food_df[food_df["Food_Name"].str.lower() == label.lower()] if row.empty: return {"label": label, "info": "No data found"} return { "label": label, "calories": float(row["Calories_per_100g"].values[0]), "fat": float(row["Fat_g"].values[0]), "protein": float(row["Protein_g"].values[0]), "carbs": float(row["Carbs_g"].values[0]) } # Detection and nutrition calculation def detect(image): results = model.predict(image) result = results[0] boxes = result.boxes names = model.names detected_labels = [] for box in boxes: cls_id = int(box.cls[0]) label = names[cls_id] detected_labels.append(label) label_counts = Counter(detected_labels) total_calories = 0 total_fat = 0 total_protein = 0 total_carbs = 0 detailed_items = [] for label, count in label_counts.items(): nutrition = get_nutrition(label) if "info" in nutrition: continue nutrition["count"] = count nutrition["total_calories"] = round(nutrition["calories"] * count, 2) nutrition["total_fat"] = round(nutrition["fat"] * count, 2) nutrition["total_protein"] = round(nutrition["protein"] * count, 2) nutrition["total_carbs"] = round(nutrition["carbs"] * count, 2) total_calories += nutrition["total_calories"] total_fat += nutrition["total_fat"] total_protein += nutrition["total_protein"] total_carbs += nutrition["total_carbs"] detailed_items.append(nutrition) overall_summary = { "Total Calories": round(total_calories, 2), "Total Fat": round(total_fat, 2), "Total Protein": round(total_protein, 2), "Total Carbs": round(total_carbs, 2) } return Image.fromarray(result.plot()), {"summary": overall_summary, "details": detailed_items} # Gradio web app demo = gr.Interface( fn=detect, inputs=gr.Image(type="pil"), outputs=[ gr.Image(type="pil", label="Detected Image"), gr.JSON(label="Nutrition Info") ], title="Smart Food Detector - Nutrition Calculator", description="Upload a food image to get total calories, fat, protein, and carbs." ) demo.launch()