Spaces:
Sleeping
Sleeping
Create main.py
Browse files
main.py
ADDED
@@ -0,0 +1,234 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import torch
|
2 |
+
from fastapi import FastAPI, File, UploadFile
|
3 |
+
from fastapi.responses import HTMLResponse
|
4 |
+
from transformers import EfficientNetImageProcessor, EfficientNetForImageClassification
|
5 |
+
from PIL import Image
|
6 |
+
import io
|
7 |
+
import sqlite3
|
8 |
+
import os
|
9 |
+
|
10 |
+
app = FastAPI()
|
11 |
+
|
12 |
+
# Load the EfficientNet-B0 model
|
13 |
+
model_name = "google/efficientnet-b0"
|
14 |
+
feature_extractor = EfficientNetImageProcessor.from_pretrained(model_name)
|
15 |
+
model = EfficientNetForImageClassification.from_pretrained(model_name)
|
16 |
+
|
17 |
+
# Mapping EfficientNet-B0 ImageNet labels to Bengali fruit names
|
18 |
+
fruit_mapping = {
|
19 |
+
"Granny Smith": "আপেল",
|
20 |
+
"banana": "কলা",
|
21 |
+
"orange": "কমলা",
|
22 |
+
"strawberry": "স্ট্রবেরি",
|
23 |
+
"pomegranate": "ডালিম",
|
24 |
+
"lemon": "লেবু",
|
25 |
+
"pineapple": "আনারস",
|
26 |
+
"jackfruit": "কাঠাল"
|
27 |
+
}
|
28 |
+
|
29 |
+
# Health benefits and recommended intake
|
30 |
+
benefits_mapping = {
|
31 |
+
"আপেল": {
|
32 |
+
"intake": "১টি মাঝারি আপেল (১৫০ গ্রাম)",
|
33 |
+
"diabetic": "১/২টি",
|
34 |
+
"benefits": [
|
35 |
+
"হজম সমস্যা: কোষ্ঠকাঠিন্য ও IBS উপশম করে",
|
36 |
+
"ডায়াবেটিস নিয়ন্ত্রণ: রক্তে শর্করার মাত্রা স্থিতিশীল রাখে",
|
37 |
+
"হার্ট ডিজিজ: LDL কোলেস্টেরল ১০-১৫% কমায়",
|
38 |
+
"ওজন নিয়ন্ত্রণ: মেটাবলিক সিন্ড্রোম রোধ করে"
|
39 |
+
]
|
40 |
+
},
|
41 |
+
"কলা": {
|
42 |
+
"intake": "১-২টি মাঝারি কলা (১০০-১৫০ গ্রাম)",
|
43 |
+
"diabetic": "১টি",
|
44 |
+
"benefits": [
|
45 |
+
"উচ্চ রক্তচাপ: দিনে ২টি কলা স্ট্রোকের ঝুঁকি ২১% কমায়",
|
46 |
+
"ডিপ্রেশন: সেরোটোনিন উৎপাদন বাড়িয়ে মুড উন্নত করে",
|
47 |
+
"হজম সমস্যা: আলসার ও গ্যাস্ট্রাইটিসে উপকারী",
|
48 |
+
"ক্রীড়াবিদদের জন্য: মাসল ক্র্যাম্প প্রতিরোধ করে"
|
49 |
+
]
|
50 |
+
},
|
51 |
+
"কমলা": {
|
52 |
+
"intake": "১টি বড় কমলা বা ১ গ্লাস জুস",
|
53 |
+
"diabetic": "১/২টি",
|
54 |
+
"benefits": [
|
55 |
+
"ইমিউনিটি: সাধারণ সর্দি-কাশির স্থায়িত্ব ২৩% কমায়",
|
56 |
+
"কিডনি স্টোন: সাইট্রেট স্টোন গলাতে সাহায্য করে",
|
57 |
+
"রক্তাল্পতা: আয়রন শোষণ ৬৭% বাড়ায়",
|
58 |
+
"ত্বকের ক্যান্সার: UV রশ্মির ক্ষতি থেকে রক্ষা করে"
|
59 |
+
]
|
60 |
+
},
|
61 |
+
"স্ট্রবেরি": {
|
62 |
+
"intake": "৫-৬টি স্ট্রবেরি (১০০ গ্রাম)",
|
63 |
+
"diabetic": "১-২টি",
|
64 |
+
"benefits": [
|
65 |
+
"ক্যান্সার: টিউমার বৃদ্ধি ৫০% ধীর করে",
|
66 |
+
"গর্ভাবস্থা: নিউরাল টিউব ডিফেক্ট প্রতিরোধ করে",
|
67 |
+
"আর্থ্রাইটিস: জয়েন্টের ব্যথা ৩০% কমায়",
|
68 |
+
"চোখের ছানি: অক্সিডেটিভ স্ট্রেস কমায়"
|
69 |
+
]
|
70 |
+
},
|
71 |
+
"ডালিম": {
|
72 |
+
"intake": "১টি মাঝারি ডালিম (১৫০ গ্রাম) বা ১/২ কাপ দানা",
|
73 |
+
"diabetic": "১/৪ কাপ দানা",
|
74 |
+
"benefits": [
|
75 |
+
"হৃদরোগ প্রতিরোধ: রক্তচাপ কমায়, ধমনীর স্থিতিস্থাপকতা বাড়ায়",
|
76 |
+
"রক্তস্বল্পতা দূর করে: আয়রন ও ভিটামিন সি হিমোগ্লোবিন বৃদ্ধি করে",
|
77 |
+
"ক্যান্সার প্রতিরোধ: প্রোস্টেট ও ব্রেস্ট ক্যান্সার",
|
78 |
+
"গাঁটের ব্যথা কমায়: Arthritis উপশম করে",
|
79 |
+
"মস্তিষ্কের স্বাস্থ্য: আলঝেইমার্স রোগের ঝুঁকি কমায়"
|
80 |
+
]
|
81 |
+
},
|
82 |
+
"লেবু": {
|
83 |
+
"intake": "১টি মাঝারি লেবু বা ১/২ গ্লাস জুস",
|
84 |
+
"diabetic": "১/৪টি",
|
85 |
+
"benefits": [
|
86 |
+
"ইমিউনিটি: ভিটামিন সি দিয়ে ���োগ প্রতিরোধ ক্ষমতা বাড়ায়",
|
87 |
+
"হজম: অ্যাসিডিটি ও বদহজম কমায়",
|
88 |
+
"ত্বকের যত্ন: অ্যান্টিঅক্সিডেন্ট দিয়ে ত্বক উজ্জ্বল করে",
|
89 |
+
"ওজন কমানো: মেটাবলিজম বাড়াতে সাহায্য করে"
|
90 |
+
]
|
91 |
+
},
|
92 |
+
"আনারস": {
|
93 |
+
"intake": "১ কাপ কাটা আনারস (১৫০ গ্রাম)",
|
94 |
+
"diabetic": "১/২ কাপ",
|
95 |
+
"benefits": [
|
96 |
+
"হজম: ব্রোমেলিন এনজাইম দিয়ে প্রোটিন ভাঙতে সাহায্য করে",
|
97 |
+
"প্রদাহ কমায়: আর্থ্রাইটিস ও পেশির ব্যথা উপশম করে",
|
98 |
+
"ইমিউনিটি: ভিটামিন সি দিয়ে সংক্রমণ প্রতিরোধ করে",
|
99 |
+
"দাঁতের স্বাস্থ্য: মাড়ির প্রদাহ কমায়"
|
100 |
+
]
|
101 |
+
},
|
102 |
+
"কাঠাল": {
|
103 |
+
"intake": "১ কাপ কাটা কাঠাল (১৫০ গ্রাম)",
|
104 |
+
"diabetic": "কম পরিমাণে",
|
105 |
+
"benefits": [
|
106 |
+
"শক্তি: উচ্চ কার্বোহাইড্রেট দিয়ে শক্তি বাড়ায়",
|
107 |
+
"ইমিউনিটি: ভিটামিন এ ও সি দিয়ে রোগ প্রতিরোধ করে",
|
108 |
+
"হৃদরোগ: পটাশিয়াম দিয়ে রক্তচাপ নিয়ন্ত্রণ করে",
|
109 |
+
"কোষ্ঠকাঠিন্য: ফাইবার দিয়ে হজমশক্তি বাড়ায়"
|
110 |
+
]
|
111 |
+
}
|
112 |
+
}
|
113 |
+
|
114 |
+
# SQLite database initialization for nutrition
|
115 |
+
def init_db():
|
116 |
+
conn = sqlite3.connect("fruit_nutrition.db")
|
117 |
+
c = conn.cursor()
|
118 |
+
c.execute('''CREATE TABLE IF NOT EXISTS fruits (
|
119 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
120 |
+
name TEXT UNIQUE,
|
121 |
+
vitamin TEXT,
|
122 |
+
mineral TEXT,
|
123 |
+
carbohydrate TEXT,
|
124 |
+
protein TEXT,
|
125 |
+
amino_acid TEXT)''')
|
126 |
+
fruits_data = [
|
127 |
+
("আপেল", "ভিটামিন সি, ভিটামিন এ", "পটাশিয়াম, ম্যাগনেসিয়াম", "১৪ গ্রাম", "০.৩ গ্রাম", "নেই"),
|
128 |
+
("কলা", "ভিটামিন বি৬, ভিটামিন সি", "পটাশিয়াম", "২৭ গ্রাম", "১.১ গ্রাম", "ট্রিপটোফ্যান"),
|
129 |
+
("কমলা", "ভিটামিন সি", "ক্যালসিয়াম, পটাশিয়াম", "১২ গ্রাম", "০.৯ গ্রাম", "নেই"),
|
130 |
+
("স্ট্রবেরি", "ভিটামিন সি, ভিটামিন কে", "ম্যাঙ্গানিজ, ফোলেট", "৮ গ্রাম", "০.৭ গ্রাম", "নেই"),
|
131 |
+
("ডালিম", "ভিটামিন সি", "আয়রন, ক্যালসিয়াম", "১৯ গ্রাম", "১.৭ গ্রাম", "নেই"),
|
132 |
+
("লেবু", "ভিটামিন সি", "পটাশিয়াম, ম্যাগনেসিয়াম", "৯ গ্রাম", "১.১ গ্রাম", "নেই"),
|
133 |
+
("আনারস", "ভিটামিন সি, ভিটামিন বি৬", "ম্যাঙ্গানিজ, পটাশিয়াম", "২২ গ্রাম", "০.৫ গ্রাম", "নেই"),
|
134 |
+
("কাঠাল", "ভিটামিন এ, ভিটামিন সি", "পটাশিয়াম, ম্যাগনেসিয়াম", "৩৮ গ্রাম", "১.৭ গ্রাম", "নেই")
|
135 |
+
]
|
136 |
+
c.executemany("INSERT OR IGNORE INTO fruits (name, vitamin, mineral, carbohydrate, protein, amino_acid) VALUES (?, ?, ?, ?, ?, ?)", fruits_data)
|
137 |
+
conn.commit()
|
138 |
+
conn.close()
|
139 |
+
|
140 |
+
# New database for diabetic-specific information
|
141 |
+
def init_diabetes_db():
|
142 |
+
conn = sqlite3.connect("fruit_diabetes.db")
|
143 |
+
c = conn.cursor()
|
144 |
+
c.execute('''CREATE TABLE IF NOT EXISTS diabetes_info (
|
145 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
146 |
+
fruit_name TEXT UNIQUE,
|
147 |
+
glycemic_index TEXT,
|
148 |
+
portion_size TEXT,
|
149 |
+
best_time TEXT,
|
150 |
+
precautions TEXT)''')
|
151 |
+
|
152 |
+
diabetes_data = [
|
153 |
+
("আপেল", "নিম্ন (৩৮)", "১/২টি মাঝারি", "সকাল বা দুপুর", "অতিরিক্ত খাবেন না"),
|
154 |
+
("কলা", "মাঝারি (৫১)", "১টি ছোট", "সকালে", "���াকা কলা এড়িয়ে চলুন"),
|
155 |
+
("কমলা", "নিম্ন (৪৩)", "১/২টি", "দুপুরে", "জুস এড়িয়ে ফল খান"),
|
156 |
+
("স্ট্রবেরি", "নিম্ন (৪০)", "১-২টি", "যেকোনো সময়", "পরিমিত খান"),
|
157 |
+
("ডালিম", "নিম্ন (৫৩)", "১/৪ কাপ দানা", "সকালে", "বীজ সহ খান"),
|
158 |
+
("লেবু", "খুব নিম্ন (২০)", "১/৪টি", "যেকোনো সময়", "চিনি ছাড়া ব্যবহার করুন"),
|
159 |
+
("আনারস", "মাঝারি (৫৯)", "১/২ কাপ", "সকালে", "পরিমিত খান"),
|
160 |
+
("কাঠাল", "মাঝারি (৫৭)", "২-৩টি কোয়া", "দুপুরে", "অতিরিক্ত এড়িয়ে চলুন")
|
161 |
+
]
|
162 |
+
|
163 |
+
c.executemany("INSERT OR IGNORE INTO diabetes_info (fruit_name, glycemic_index, portion_size, best_time, precautions) VALUES (?, ?, ?, ?, ?)", diabetes_data)
|
164 |
+
conn.commit()
|
165 |
+
conn.close()
|
166 |
+
|
167 |
+
# Initialize both databases
|
168 |
+
init_db()
|
169 |
+
init_diabetes_db()
|
170 |
+
|
171 |
+
# Serve the HTML file
|
172 |
+
@app.get("/", response_class=HTMLResponse)
|
173 |
+
async def home():
|
174 |
+
with open("index.html", "r", encoding="utf-8") as f:
|
175 |
+
return f.read()
|
176 |
+
|
177 |
+
# Prediction endpoint
|
178 |
+
@app.post("/predict")
|
179 |
+
async def predict(file: UploadFile = File(...)):
|
180 |
+
image = Image.open(io.BytesIO(await file.read())).convert("RGB")
|
181 |
+
inputs = feature_extractor(images=image, return_tensors="pt")
|
182 |
+
with torch.no_grad():
|
183 |
+
outputs = model(**inputs)
|
184 |
+
predicted_class_idx = outputs.logits.argmax(-1).item()
|
185 |
+
predicted_label = model.config.id2label[predicted_class_idx].split(",")[0].strip()
|
186 |
+
bengali_fruit = fruit_mapping.get(predicted_label, predicted_label)
|
187 |
+
|
188 |
+
# Fetch nutrition from database
|
189 |
+
conn = sqlite3.connect("fruit_nutrition.db")
|
190 |
+
c = conn.cursor()
|
191 |
+
c.execute("SELECT vitamin, mineral, carbohydrate, protein, amino_acid FROM fruits WHERE name = ?", (bengali_fruit,))
|
192 |
+
nutrition = c.fetchone()
|
193 |
+
conn.close()
|
194 |
+
if not nutrition:
|
195 |
+
nutrition = ("অজানা", "অজানা", "অজানা", "অজানা", "অজানা")
|
196 |
+
|
197 |
+
# Fetch health benefits
|
198 |
+
benefits_info = benefits_mapping.get(bengali_fruit, {
|
199 |
+
"intake": "অজানা",
|
200 |
+
"diabetic": "অজানা",
|
201 |
+
"benefits": ["তথ্য নেই"]
|
202 |
+
})
|
203 |
+
|
204 |
+
# Fetch diabetes info
|
205 |
+
conn = sqlite3.connect("fruit_diabetes.db")
|
206 |
+
c = conn.cursor()
|
207 |
+
c.execute("SELECT glycemic_index, portion_size, best_time, precautions FROM diabetes_info WHERE fruit_name = ?", (bengali_fruit,))
|
208 |
+
diabetes_info = c.fetchone()
|
209 |
+
conn.close()
|
210 |
+
if not diabetes_info:
|
211 |
+
diabetes_info = ("অজানা", "অজানা", "অজানা", "অজানা")
|
212 |
+
|
213 |
+
return {
|
214 |
+
"filename": file.filename,
|
215 |
+
"predicted_class": bengali_fruit,
|
216 |
+
"nutrition": {
|
217 |
+
"vitamin": nutrition[0],
|
218 |
+
"mineral": nutrition[1],
|
219 |
+
"carbohydrate": nutrition[2],
|
220 |
+
"protein": nutrition[3],
|
221 |
+
"amino_acid": nutrition[4]
|
222 |
+
},
|
223 |
+
"health": {
|
224 |
+
"intake": benefits_info["intake"],
|
225 |
+
"diabetic": benefits_info["diabetic"],
|
226 |
+
"benefits": benefits_info["benefits"]
|
227 |
+
},
|
228 |
+
"diabetes": {
|
229 |
+
"glycemic_index": diabetes_info[0],
|
230 |
+
"portion_size": diabetes_info[1],
|
231 |
+
"best_time": diabetes_info[2],
|
232 |
+
"precautions": diabetes_info[3]
|
233 |
+
}
|
234 |
+
}
|