Spaces:
Sleeping
Sleeping
rdsarjito commited on
Commit Β·
a344e41
1
Parent(s): 7c2d2d3
20
Browse files
.DS_Store
ADDED
|
Binary file (6.15 kB). View file
|
|
|
app.py
CHANGED
|
@@ -111,13 +111,14 @@ def load_css():
|
|
| 111 |
margin: 1rem 0;
|
| 112 |
}
|
| 113 |
|
| 114 |
-
/* Ingredient list styling */
|
| 115 |
-
.
|
| 116 |
background: #f8f9fa;
|
| 117 |
-
padding:
|
| 118 |
-
|
| 119 |
-
border-
|
| 120 |
-
|
|
|
|
| 121 |
}
|
| 122 |
|
| 123 |
/* Footer */
|
|
@@ -143,11 +144,13 @@ def load_model():
|
|
| 143 |
with open("saved_models/XGBoost_model.pkl", "rb") as f:
|
| 144 |
return pickle.load(f)
|
| 145 |
|
| 146 |
-
# === Prediksi ===
|
| 147 |
def predict_allergen(model, vectorizer, input_text):
|
| 148 |
X_input = vectorizer.transform([input_text])
|
| 149 |
prediction = model.predict(X_input)
|
| 150 |
-
|
|
|
|
|
|
|
| 151 |
|
| 152 |
# === Scraping bahan dari Cookpad ===
|
| 153 |
def get_ingredients_from_cookpad(url):
|
|
@@ -174,30 +177,36 @@ def get_ingredients_from_cookpad(url):
|
|
| 174 |
except Exception as e:
|
| 175 |
return None, f"Terjadi kesalahan: {str(e)}"
|
| 176 |
|
| 177 |
-
# === Display results with custom styling ===
|
| 178 |
-
def display_results(results):
|
| 179 |
st.markdown("### π― Hasil Analisis Alergen")
|
| 180 |
|
| 181 |
positive_results = []
|
| 182 |
negative_results = []
|
| 183 |
|
| 184 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 185 |
if status == 1:
|
| 186 |
-
positive_results.append(allergen)
|
| 187 |
else:
|
| 188 |
-
negative_results.append(allergen)
|
| 189 |
|
| 190 |
# Display positive results (allergens detected)
|
| 191 |
if positive_results:
|
| 192 |
st.markdown("#### β οΈ **Alergen Terdeteksi:**")
|
| 193 |
-
for allergen in positive_results:
|
| 194 |
-
st.markdown(f'<div class="result-positive">π¨ <strong>{allergen}</strong></div>', unsafe_allow_html=True)
|
| 195 |
|
| 196 |
# Display negative results (safe allergens)
|
| 197 |
if negative_results:
|
| 198 |
st.markdown("#### β
**Aman dari Alergen:**")
|
| 199 |
-
for allergen in negative_results:
|
| 200 |
-
|
|
|
|
| 201 |
|
| 202 |
# Show summary
|
| 203 |
if not positive_results:
|
|
@@ -290,11 +299,11 @@ def main():
|
|
| 290 |
st.warning("β οΈ Mohon masukkan bahan makanan terlebih dahulu.")
|
| 291 |
else:
|
| 292 |
with st.spinner("π Sedang menganalisis..."):
|
| 293 |
-
pred = predict_allergen(model, vectorizer, input_text)
|
| 294 |
results = dict(zip(labels, pred))
|
| 295 |
|
| 296 |
st.success("β
Analisis selesai!")
|
| 297 |
-
display_results(results)
|
| 298 |
|
| 299 |
elif input_mode == "π URL Cookpad":
|
| 300 |
st.markdown("### π Analisis dari URL Cookpad")
|
|
@@ -345,18 +354,18 @@ def main():
|
|
| 345 |
else:
|
| 346 |
st.success("β
Bahan berhasil diambil!")
|
| 347 |
|
| 348 |
-
# Display ingredients in a
|
| 349 |
st.markdown("**π§Ύ Daftar Bahan:**")
|
| 350 |
-
|
| 351 |
-
|
| 352 |
|
| 353 |
# Predict allergens
|
| 354 |
joined_ingredients = " ".join(ingredients)
|
| 355 |
-
pred = predict_allergen(model, vectorizer, joined_ingredients)
|
| 356 |
results = dict(zip(labels, pred))
|
| 357 |
|
| 358 |
st.markdown("---")
|
| 359 |
-
display_results(results)
|
| 360 |
|
| 361 |
# Clear progress indicators
|
| 362 |
progress_bar.empty()
|
|
|
|
| 111 |
margin: 1rem 0;
|
| 112 |
}
|
| 113 |
|
| 114 |
+
/* Ingredient list styling - UPDATED */
|
| 115 |
+
.ingredients-container {
|
| 116 |
background: #f8f9fa;
|
| 117 |
+
padding: 1rem;
|
| 118 |
+
border-radius: 10px;
|
| 119 |
+
border-left: 4px solid #667eea;
|
| 120 |
+
margin: 1rem 0;
|
| 121 |
+
line-height: 1.6;
|
| 122 |
}
|
| 123 |
|
| 124 |
/* Footer */
|
|
|
|
| 144 |
with open("saved_models/XGBoost_model.pkl", "rb") as f:
|
| 145 |
return pickle.load(f)
|
| 146 |
|
| 147 |
+
# === Prediksi dengan probabilitas ===
|
| 148 |
def predict_allergen(model, vectorizer, input_text):
|
| 149 |
X_input = vectorizer.transform([input_text])
|
| 150 |
prediction = model.predict(X_input)
|
| 151 |
+
# Mendapatkan probabilitas prediksi
|
| 152 |
+
probabilities = model.predict_proba(X_input)
|
| 153 |
+
return prediction[0], probabilities[0]
|
| 154 |
|
| 155 |
# === Scraping bahan dari Cookpad ===
|
| 156 |
def get_ingredients_from_cookpad(url):
|
|
|
|
| 177 |
except Exception as e:
|
| 178 |
return None, f"Terjadi kesalahan: {str(e)}"
|
| 179 |
|
| 180 |
+
# === Display results with custom styling and percentage ===
|
| 181 |
+
def display_results(results, probabilities):
|
| 182 |
st.markdown("### π― Hasil Analisis Alergen")
|
| 183 |
|
| 184 |
positive_results = []
|
| 185 |
negative_results = []
|
| 186 |
|
| 187 |
+
labels = ['Susu', 'Kacang', 'Telur', 'Makanan Laut', 'Gandum']
|
| 188 |
+
|
| 189 |
+
for i, (allergen, status) in enumerate(results.items()):
|
| 190 |
+
# Mendapatkan probabilitas untuk kelas positif (index 1)
|
| 191 |
+
positive_prob = probabilities[i][1] * 100 if len(probabilities[i]) > 1 else 0
|
| 192 |
+
|
| 193 |
if status == 1:
|
| 194 |
+
positive_results.append((allergen, positive_prob))
|
| 195 |
else:
|
| 196 |
+
negative_results.append((allergen, positive_prob))
|
| 197 |
|
| 198 |
# Display positive results (allergens detected)
|
| 199 |
if positive_results:
|
| 200 |
st.markdown("#### β οΈ **Alergen Terdeteksi:**")
|
| 201 |
+
for allergen, prob in positive_results:
|
| 202 |
+
st.markdown(f'<div class="result-positive">π¨ <strong>{allergen}</strong> - Tingkat Kepercayaan: {prob:.1f}%</div>', unsafe_allow_html=True)
|
| 203 |
|
| 204 |
# Display negative results (safe allergens)
|
| 205 |
if negative_results:
|
| 206 |
st.markdown("#### β
**Aman dari Alergen:**")
|
| 207 |
+
for allergen, prob in negative_results:
|
| 208 |
+
confidence = 100 - prob # Confidence untuk kelas negatif
|
| 209 |
+
st.markdown(f'<div class="result-negative">β {allergen} - Tingkat Kepercayaan: {confidence:.1f}%</div>', unsafe_allow_html=True)
|
| 210 |
|
| 211 |
# Show summary
|
| 212 |
if not positive_results:
|
|
|
|
| 299 |
st.warning("β οΈ Mohon masukkan bahan makanan terlebih dahulu.")
|
| 300 |
else:
|
| 301 |
with st.spinner("π Sedang menganalisis..."):
|
| 302 |
+
pred, probabilities = predict_allergen(model, vectorizer, input_text)
|
| 303 |
results = dict(zip(labels, pred))
|
| 304 |
|
| 305 |
st.success("β
Analisis selesai!")
|
| 306 |
+
display_results(results, probabilities)
|
| 307 |
|
| 308 |
elif input_mode == "π URL Cookpad":
|
| 309 |
st.markdown("### π Analisis dari URL Cookpad")
|
|
|
|
| 354 |
else:
|
| 355 |
st.success("β
Bahan berhasil diambil!")
|
| 356 |
|
| 357 |
+
# Display ingredients in a single container - UPDATED
|
| 358 |
st.markdown("**π§Ύ Daftar Bahan:**")
|
| 359 |
+
ingredients_text = ", ".join(ingredients)
|
| 360 |
+
st.markdown(f'<div class="ingredients-container">{ingredients_text}</div>', unsafe_allow_html=True)
|
| 361 |
|
| 362 |
# Predict allergens
|
| 363 |
joined_ingredients = " ".join(ingredients)
|
| 364 |
+
pred, probabilities = predict_allergen(model, vectorizer, joined_ingredients)
|
| 365 |
results = dict(zip(labels, pred))
|
| 366 |
|
| 367 |
st.markdown("---")
|
| 368 |
+
display_results(results, probabilities)
|
| 369 |
|
| 370 |
# Clear progress indicators
|
| 371 |
progress_bar.empty()
|