Spaces:
Running
Running
import torch | |
from fastapi import FastAPI, File, UploadFile | |
from fastapi.responses import HTMLResponse | |
from transformers import EfficientNetImageProcessor, EfficientNetForImageClassification | |
from PIL import Image | |
import io | |
import sqlite3 | |
import os | |
app = FastAPI() | |
# Ensure the db directory exists | |
DB_DIR = "/app/db" | |
os.makedirs(DB_DIR, exist_ok=True) | |
# Load the EfficientNet-B0 model | |
model_name = "google/efficientnet-b0" | |
feature_extractor = EfficientNetImageProcessor.from_pretrained(model_name) | |
model = EfficientNetForImageClassification.from_pretrained(model_name) | |
# Mapping EfficientNet-B0 ImageNet labels to Bengali fruit names | |
fruit_mapping = { | |
"Granny Smith": "আপেল", | |
"banana": "কলা", | |
"orange": "কমলা", | |
"strawberry": "স্ট্রবেরি", | |
"pomegranate": "ডালিম", | |
"lemon": "লেবু", | |
"pineapple": "আনারস", | |
"jackfruit": "কাঠাল" | |
} | |
# Health benefits and recommended intake | |
benefits_mapping = { | |
"আপেল": { | |
"intake": "১টি মাঝারি আপেল (১৫০ গ্রাম)", | |
"diabetic": "১/২টি", | |
"benefits": [ | |
"হজম সমস্যা: কোষ্ঠকাঠিন্য ও IBS উপশম করে", | |
"ডায়াবেটিস নিয়ন্ত্রণ: রক্তে শর্করার মাত্রা স্থিতিশীল রাখে", | |
"হার্ট ডিজিজ: LDL কোলেস্টেরল ১০-১৫% কমায়", | |
"ওজন নিয়ন্ত্রণ: মেটাবলিক সিন্ড্রোম রোধ করে" | |
] | |
}, | |
"কলা": { | |
"intake": "১-২টি মাঝারি কলা (১০০-১৫০ গ্রাম)", | |
"diabetic": "১টি", | |
"benefits": [ | |
"উচ্চ রক্তচাপ: দিনে ২টি কলা স্ট্রোকের ঝুঁকি ২১% কমায়", | |
"ডিপ্রেশন: সেরোটোনিন উৎপাদন বাড়িয়ে মুড উন্নত করে", | |
"হজম সমস্যা: আলসার ও গ্যাস্ট্রাইটিসে উপকারী", | |
"ক্রীড়াবিদদের জন্য: মাসল ক্র্যাম্প প্রতিরোধ করে" | |
] | |
}, | |
"কমলা": { | |
"intake": "১টি বড় কমলা বা ১ গ্লাস জুস", | |
"diabetic": "১/২টি", | |
"benefits": [ | |
"ইমিউনিটি: সাধারণ সর্দি-কাশির স্থায়িত্ব ২৩% কমায়", | |
"কিডনি স্টোন: সাইট্রেট স্টোন গলাতে সাহায্য করে", | |
"রক্তাল্পতা: আয়রন শোষণ ৬৭% বাড়ায়", | |
"ত্বকের ক্যান্সার: UV রশ্মির ক্ষতি থেকে রক্ষা করে" | |
] | |
}, | |
"স্ট্রবেরি": { | |
"intake": "৫-৬টি স্ট্রবেরি (১০০ গ্রাম)", | |
"diabetic": "১-২টি", | |
"benefits": [ | |
"ক্যান্সার: টিউমার বৃদ্ধি ৫০% ধীর করে", | |
"গর্ভাবস্থা: নিউরাল টিউব ডিফেক্ট প্রতিরোধ করে", | |
"আর্থ্রাইটিস: জয়েন্টের ব্যথা ৩০% কমায়", | |
"চোখের ছানি: অক্সিডেটিভ স্ট্রেস কমায়" | |
] | |
}, | |
"ডালিম": { | |
"intake": "১টি মাঝারি ডালিম (১৫০ গ্রাম) বা ১/২ কাপ দানা", | |
"diabetic": "১/৪ কাপ দানা", | |
"benefits": [ | |
"হৃদরোগ প্রতিরোধ: রক্তচাপ কমায়, ধমনীর স্থিতিস্থাপকতা বাড়ায়", | |
"রক্তস্বল্পতা দূর করে: আয়রন ও ভিটামিন সি হিমোগ্লোবিন বৃদ্ধি করে", | |
"ক্যান্সার প্রতিরোধ: প্রোস্টেট ও ব্রেস্ট ক্যান্সার", | |
"গাঁটের ব্যথা কমায়: Arthritis উপশম করে", | |
"মস্তিষ্কের স্বাস্থ্য: আলঝেইমার্স রোগের ঝুঁকি কমায়" | |
] | |
}, | |
"লেবু": { | |
"intake": "১টি মাঝারি লেবু বা ১/২ গ্লাস জুস", | |
"diabetic": "১/৪টি", | |
"benefits": [ | |
"ইমিউনিটি: ভিটামিন সি দিয়ে রোগ প্রতিরোধ ক্ষমতা বাড়ায়", | |
"হজম: অ্যাসিডিটি ও বদহজম কমায়", | |
"ত্বকের যত্ন: অ্যান্টিঅক্সিডেন্ট দিয়ে ত্বক উজ্জ্বল করে", | |
"ওজন কমানো: মেটাবলিজম বাড়াতে সাহায্য করে" | |
] | |
}, | |
"আনারস": { | |
"intake": "১ কাপ কাটা আনারস (১৫০ গ্রাম)", | |
"diabetic": "১/২ কাপ", | |
"benefits": [ | |
"হজম: ব্রোমেলিন এনজাইম দিয়ে প্রোটিন ভাঙতে সাহায্য করে", | |
"প্রদাহ কমায়: আর্থ্রাইটিস ও পেশির ব্যথা উপশম করে", | |
"ইমিউনিটি: ভিটামিন সি দিয়ে সংক্রমণ প্রতিরোধ করে", | |
"দাঁতের স্বাস্থ্য: মাড়ির প্রদাহ কমায়" | |
] | |
}, | |
"কাঠাল": { | |
"intake": "১ কাপ কাটা কাঠাল (১৫০ গ্রাম)", | |
"diabetic": "কম পরিমাণে", | |
"benefits": [ | |
"শক্তি: উচ্চ কার্বোহাইড্রেট দিয়ে শক্তি বাড়ায়", | |
"ইমিউনিটি: ভিটামিন এ ও সি দিয়ে রোগ প্রতিরোধ করে", | |
"হৃদরোগ: পটাশিয়াম দিয়ে রক্তচাপ নিয়ন্ত্রণ করে", | |
"কোষ্ঠকাঠিন্য: ফাইবার দিয়ে হজমশক্তি বাড়ায়" | |
] | |
} | |
} | |
# SQLite database initialization for nutrition | |
def init_db(): | |
conn = sqlite3.connect(os.path.join(DB_DIR, "fruit_nutrition.db")) | |
c = conn.cursor() | |
c.execute('''CREATE TABLE IF NOT EXISTS fruits ( | |
id INTEGER PRIMARY KEY AUTOINCREMENT, | |
name TEXT UNIQUE, | |
vitamin TEXT, | |
mineral TEXT, | |
carbohydrate TEXT, | |
protein TEXT, | |
amino_acid TEXT)''') | |
fruits_data = [ | |
("আপেল", "ভিটামিন সি, ভিটামিন এ", "পটাশিয়াম, ম্যাগনেসিয়াম", "১৪ গ্রাম", "০.৩ গ্রাম", "নেই"), | |
("কলা", "ভিটামিন বি৬, ভিটামিন সি", "পটাশিয়াম", "২৭ গ্রাম", "১.১ গ্রাম", "ট্রিপটোফ্যান"), | |
("কমলা", "ভিটামিন সি", "ক্যালসিয়াম, পটাশিয়াম", "১২ গ্রাম", "০.৯ গ্রাম", "নেই"), | |
("স্ট্রবেরি", "ভিটামিন সি, ভিটামিন কে", "ম্যাঙ্গানিজ, ফোলেট", "৮ গ্রাম", "০.৭ গ্রাম", "নেই"), | |
("ডালিম", "ভিটামিন সি", "আয়রন, ক্যালসিয়াম", "১৯ গ্রাম", "১.৭ গ্রাম", "নেই"), | |
("লেবু", "ভিটামিন সি", "পটাশিয়াম, ম্যাগনেসিয়াম", "৯ গ্রাম", "১.১ গ্রাম", "নেই"), | |
("আনারস", "ভিটামিন সি, ভিটামিন বি৬", "ম্যাঙ্গানিজ, পটাশিয়াম", "২২ গ্রাম", "০.৫ গ্রাম", "নেই"), | |
("কাঠাল", "ভিটামিন এ, ভিটামিন সি", "পটাশিয়াম, ম্যাগনেসিয়াম", "৩৮ গ্রাম", "১.৭ গ্রাম", "নেই") | |
] | |
c.executemany("INSERT OR IGNORE INTO fruits (name, vitamin, mineral, carbohydrate, protein, amino_acid) VALUES (?, ?, ?, ?, ?, ?)", fruits_data) | |
conn.commit() | |
conn.close() | |
# New database for diabetic-specific information | |
def init_diabetes_db(): | |
conn = sqlite3.connect(os.path.join(DB_DIR, "fruit_diabetes.db")) | |
c = conn.cursor() | |
c.execute('''CREATE TABLE IF NOT EXISTS diabetes_info ( | |
id INTEGER PRIMARY KEY AUTOINCREMENT, | |
fruit_name TEXT UNIQUE, | |
glycemic_index TEXT, | |
portion_size TEXT, | |
best_time TEXT, | |
precautions TEXT)''') | |
diabetes_data = [ | |
("আপেল", "নিম্ন (৩৮)", "১/২টি মাঝারি", "সকাল বা দুপুর", "অতিরিক্ত খাবেন না"), | |
("কলা", "মাঝারি (৫১)", "১টি ছোট", "সকালে", "পাকা কলা এড়িয়ে চলুন"), | |
("কমলা", "নিম্ন (৪৩)", "১/২টি", "দুপুরে", "জুস এড়িয়ে ফল খান"), | |
("স্ট্রবেরি", "নিম্ন (৪০)", "১-২টি", "যেকোনো সময়", "পরিমিত খান"), | |
("ডালিম", "নিম্ন (৫৩)", "১/৪ কাপ দানা", "সকালে", "বীজ সহ খান"), | |
("লেবু", "খুব নিম্ন (২০)", "১/৪টি", "যেকোনো সময়", "চিনি ছাড়া ব্যবহার করুন"), | |
("আনারস", "মাঝারি (৫৯)", "১/২ কাপ", "সকালে", "পরিমিত খান"), | |
("কাঠাল", "মাঝারি (৫৭)", "২-৩টি কোয়া", "দুপুরে", "অতিরিক্ত এড়িয়ে চলুন") | |
] | |
c.executemany("INSERT OR IGNORE INTO diabetes_info (fruit_name, glycemic_index, portion_size, best_time, precautions) VALUES (?, ?, ?, ?, ?)", diabetes_data) | |
conn.commit() | |
conn.close() | |
init_db() | |
init_diabetes_db() | |
# Serve the HTML file | |
async def home(): | |
with open("index.html", "r", encoding="utf-8") as f: | |
return f.read() | |
# Prediction endpoint | |
async def predict(file: UploadFile = File(...)): | |
image = Image.open(io.BytesIO(await file.read())).convert("RGB") | |
inputs = feature_extractor(images=image, return_tensors="pt") | |
with torch.no_grad(): | |
outputs = model(**inputs) | |
predicted_class_idx = outputs.logits.argmax(-1).item() | |
predicted_label = model.config.id2label[predicted_class_idx].split(",")[0].strip() | |
bengali_fruit = fruit_mapping.get(predicted_label, predicted_label) | |
# Fetch nutrition from database | |
conn = sqlite3.connect(os.path.join(DB_DIR, "fruit_nutrition.db")) | |
c = conn.cursor() | |
c.execute("SELECT vitamin, mineral, carbohydrate, protein, amino_acid FROM fruits WHERE name = ?", (bengali_fruit,)) | |
nutrition = c.fetchone() | |
conn.close() | |
if not nutrition: | |
nutrition = ("অজানা", "অজানা", "অজানা", "অজানা", "অজানা") | |
# Fetch health benefits | |
benefits_info = benefits_mapping.get(bengali_fruit, { | |
"intake": "অজানা", | |
"diabetic": "অজানা", | |
"benefits": ["তথ্য নেই"] | |
}) | |
# Fetch diabetes info | |
conn = sqlite3.connect(os.path.join(DB_DIR, "fruit_diabetes.db")) | |
c = conn.cursor() | |
c.execute("SELECT glycemic_index, portion_size, best_time, precautions FROM diabetes_info WHERE fruit_name = ?", (bengali_fruit,)) | |
diabetes_info = c.fetchone() | |
conn.close() | |
if not diabetes_info: | |
diabetes_info = ("অজানা", "অজানা", "অজানা", "অজানা") | |
return { | |
"filename": file.filename, | |
"predicted_class": bengali_fruit, | |
"nutrition": { | |
"vitamin": nutrition[0], | |
"mineral": nutrition[1], | |
"carbohydrate": nutrition[2], | |
"protein": nutrition[3], | |
"amino_acid": nutrition[4] | |
}, | |
"health": { | |
"intake": benefits_info["intake"], | |
"diabetic": benefits_info["diabetic"], | |
"benefits": benefits_info["benefits"] | |
}, | |
"diabetes": { | |
"glycemic_index": diabetes_info[0], | |
"portion_size": diabetes_info[1], | |
"best_time": diabetes_info[2], | |
"precautions": diabetes_info[3] | |
} | |
} |