tdurzynski commited on
Commit
f27898a
·
verified ·
1 Parent(s): cdc48c2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -10
app.py CHANGED
@@ -7,9 +7,12 @@ from PIL import Image
7
  from autogen import AssistantAgent, GroupChat, GroupChatManager
8
  import os
9
  import openai
 
 
 
10
 
11
  # Multi-label recognition model (placeholder - swap for fine-tuned multi-label later)
12
- recognizer = pipeline("image-classification", model="google/vit-base-patch16-224")
13
 
14
  # Agent Definitions
15
  food_recognizer = AssistantAgent(
@@ -46,17 +49,31 @@ manager = GroupChatManager(groupchat=group_chat)
46
 
47
  # Agent Functions
48
  def recognize_foods(image):
49
- pil_image = Image.fromarray(image)
50
- predictions = recognizer(pil_image)
51
- foods = [(pred["label"], pred["score"]) for pred in predictions if pred["score"] > 0.5]
52
- return foods
 
 
 
 
 
 
 
 
 
53
 
54
  def estimate_sizes(image, foods):
55
- img_cv = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
56
- height, width = img_cv.shape[:2]
57
- total_pixels = height * width
58
- portion_per_food = total_pixels / len(foods)
59
- sizes = {food: min(500, int(portion_per_food / 1000 * 100)) for food, _ in foods}
 
 
 
 
 
60
  return sizes
61
 
62
  def fetch_nutrition(foods_with_sizes, nutritionix_key):
 
7
  from autogen import AssistantAgent, GroupChat, GroupChatManager
8
  import os
9
  import openai
10
+ from ultralytics import YOLO
11
+
12
+ model = YOLO("yolov8n.pt") # Nano model for speed, fine-tune on food data later
13
 
14
  # Multi-label recognition model (placeholder - swap for fine-tuned multi-label later)
15
+ recognizer = pipeline("image-classification", model=model)
16
 
17
  # Agent Definitions
18
  food_recognizer = AssistantAgent(
 
49
 
50
  # Agent Functions
51
  def recognize_foods(image):
52
+ start = time.time()
53
+ # Resize to 640x640 (YOLO default)
54
+ pil_image = Image.fromarray(image).resize((640, 640))
55
+ results = model(pil_image)
56
+ foods = []
57
+ for result in results:
58
+ for cls in result.boxes.cls:
59
+ label = model.names[int(cls)]
60
+ if "food" in label.lower() or label in ["pasta", "rice", "tomato", "potato", "bread"]: # Expand this list
61
+ conf = result.boxes.conf[result.boxes.cls == cls].item()
62
+ foods.append((label, conf))
63
+ print(f"Recognition took {time.time() - start:.2f}s")
64
+ return list(set(foods)) # Remove duplicates
65
 
66
  def estimate_sizes(image, foods):
67
+ start = time.time()
68
+ img_cv = cv2.cvtColor(image, cv2.COLOR_RGB2BGR).resize((640, 640)) # Match YOLO size
69
+ sizes = {}
70
+ total_area = img_cv.shape[0] * img_cv.shape[1]
71
+ for food, _ in foods:
72
+ # Dummy: assume area proportion (refine with food-specific weights later)
73
+ area = total_area / len(foods) # Even split for now
74
+ grams = min(500, int(area / (640 * 640) * 100)) # 100g per ~640k pixels
75
+ sizes[food] = grams
76
+ print(f"Size estimation took {time.time() - start:.2f}s")
77
  return sizes
78
 
79
  def fetch_nutrition(foods_with_sizes, nutritionix_key):