Spaces:
Sleeping
Sleeping
| 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] | |
| } | |
| } |