File size: 3,530 Bytes
e7891cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
723a5e8
 
 
e7891cd
723a5e8
e7891cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
723a5e8
 
 
e7891cd
723a5e8
e7891cd
 
 
 
 
 
 
723a5e8
e7891cd
 
 
 
723a5e8
 
e7891cd
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import gradio as gr
import json
from transformers import AutoProcessor, AutoModelForImageClassification
from PIL import Image
import torch

# Load food DB
with open("merged_foods_with_fruits (1).json", "r", encoding="utf-8") as f:
    data = json.load(f)

def all_foods():
    foods = []
    for category, items in data.items():
        foods.extend(items)
    return foods

def find_food(food_name: str):
    matches = []
    for item in all_foods():
        if food_name in item["نام"]:
            matches.append(item)
    return matches

# Load AI Model
model_name = "eslamxm/vit-base-food101"
processor = AutoProcessor.from_pretrained(model_name)
model = AutoModelForImageClassification.from_pretrained(model_name)

# English→Persian dictionary
english_to_persian = {
    "pizza": "پیتزا",
    "cheeseburger": "همبرگر",
    "burger": "همبرگر",
    "hamburger": "همبرگر",
    "hot dog": "هات داگ",
    "sandwich": "ساندویچ",
    "french fries": "سیب‌زمینی سرخ‌کرده",
    "fried chicken": "مرغ سوخاری",
    "shawarma": "شاورما",
    "kebab": "کباب",
    "rice": "برنج",
    "pasta": "پاستا",
    "sushi": "سوشی",
    "salad": "سالاد",
    "steak": "استیک",
    "chicken": "مرغ",
    "fish": "ماهی",
    "apple": "سیب",
    "banana": "موز",
    "orange": "پرتقال",
}

# Text search
def analyze_text(food):
    results = find_food(food)
    if results:
        return "\n\n".join(
            [f"🍽 {item['نام']} → 🔥 {item['کالری']} کالری | 💪 {item['پروتئین']} | 🍞 {item['کربوهیدرات']} | 🥓 {item['چربی']}" for item in results]
        )
    else:
        return "❌ غذا پیدا نشد"

# Image search
def analyze_image(img):
    image = Image.fromarray(img).convert("RGB")
    inputs = processor(images=image, return_tensors="pt")
    with torch.no_grad():
        outputs = model(**inputs)
        logits = outputs.logits
        predicted_class_id = logits.argmax(-1).item()

    english_label = model.config.id2label[predicted_class_id]
    persian_label = english_to_persian.get(english_label.lower(), english_label)

    results = find_food(persian_label)
    if results:
        return f"🍔 Prediction: {english_label}{persian_label}\n\n" + "\n\n".join(
            [f"🍽 {item['نام']} → 🔥 {item['کالری']} کالری | 💪 {item['پروتئین']} | 🍞 {item['کربوهیدرات']} | 🥓 {item['چربی']}" for item in results]
        )
    else:
        return f"🍔 Prediction: {english_label}{persian_label}\n❌ غذا در دیتابیس یافت نشد"

# Gradio UI
with gr.Blocks() as demo:
    gr.Markdown("## 🍽 Persian Food AI (نسخه دمو)")
    
    with gr.Tab("🔎 جستجو با متن"):
        food_input = gr.Textbox(label="نام غذا (مثال: پیتزا)")
        text_output = gr.Textbox(label="نتایج", lines=8)
        food_btn = gr.Button("جستجو")
        food_btn.click(fn=analyze_text, inputs=food_input, outputs=text_output)

    with gr.Tab("📷 تشخیص از عکس"):
        img_input = gr.Image(type="numpy", label="بارگذاری عکس غذا")
        img_output = gr.Textbox(label="نتایج", lines=8)
        img_btn = gr.Button("تحلیل عکس")
        img_btn.click(fn=analyze_image, inputs=img_input, outputs=img_output)

demo.launch()