rdsarjito commited on
Commit
8a26e5a
Β·
1 Parent(s): 2a3f5bb
Files changed (1) hide show
  1. app.py +77 -40
app.py CHANGED
@@ -40,23 +40,39 @@ def load_css():
40
  margin: 1rem 0;
41
  }
42
 
43
- /* Results styling */
44
- .result-positive {
45
- background: linear-gradient(135deg, #ff6b6b, #ff8e8e);
46
- color: white;
47
- padding: 1rem;
48
  border-radius: 8px;
49
  margin: 0.5rem 0;
50
- box-shadow: 0 2px 4px rgba(255, 107, 107, 0.3);
 
 
 
 
51
  }
52
 
53
- .result-negative {
54
- background: linear-gradient(135deg, #51cf66, #69db7c);
55
- color: white;
56
- padding: 1rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  border-radius: 8px;
58
- margin: 0.5rem 0;
59
- box-shadow: 0 2px 4px rgba(81, 207, 102, 0.3);
 
60
  }
61
 
62
  /* Button styling */
@@ -155,7 +171,8 @@ def load_model():
155
  def predict_allergen(model, vectorizer, input_text):
156
  X_input = vectorizer.transform([input_text])
157
  prediction = model.predict(X_input)
158
- return prediction[0]
 
159
 
160
  # === Scraping bahan dari Cookpad ===
161
  def get_ingredients_from_cookpad(url):
@@ -182,34 +199,54 @@ def get_ingredients_from_cookpad(url):
182
  except Exception as e:
183
  return None, f"Terjadi kesalahan: {str(e)}"
184
 
185
- # === Display results with custom styling ===
186
- def display_results(results):
187
  st.markdown("### 🎯 Hasil Analisis Alergen")
188
 
189
- positive_results = []
190
- negative_results = []
191
-
192
- for allergen, status in results.items():
193
- if status == 1:
194
- positive_results.append(allergen)
195
- else:
196
- negative_results.append(allergen)
197
 
198
- # Display positive results (allergens detected)
199
- if positive_results:
200
- st.markdown("#### ⚠️ **Alergen Terdeteksi:**")
201
- for allergen in positive_results:
202
- st.markdown(f'<div class="result-positive">🚨 <strong>{allergen}</strong></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 in negative_results:
208
- st.markdown(f'<div class="result-negative">βœ“ {allergen}</div>', unsafe_allow_html=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
209
 
210
- # Show summary
211
- if not positive_results:
212
- st.markdown('<div class="result-negative">πŸŽ‰ <strong>Tidak ada alergen berbahaya terdeteksi!</strong></div>', unsafe_allow_html=True)
 
 
 
 
 
 
 
 
 
 
 
213
 
214
  # === Main UI ===
215
  def main():
@@ -298,11 +335,11 @@ def main():
298
  st.warning("⚠️ Mohon masukkan bahan makanan terlebih dahulu.")
299
  else:
300
  with st.spinner("πŸ”„ Sedang menganalisis..."):
301
- pred = predict_allergen(model, vectorizer, input_text)
302
  results = dict(zip(labels, pred))
303
 
304
  st.success("βœ… Analisis selesai!")
305
- display_results(results)
306
 
307
  elif input_mode == "πŸ”— URL Cookpad":
308
  st.markdown("### πŸ”— Analisis dari URL Cookpad")
@@ -364,11 +401,11 @@ def main():
364
 
365
  # Predict allergens
366
  joined_ingredients = " ".join(ingredients)
367
- pred = predict_allergen(model, vectorizer, joined_ingredients)
368
  results = dict(zip(labels, pred))
369
 
370
  st.markdown("---")
371
- display_results(results)
372
 
373
  # Clear progress indicators
374
  progress_bar.empty()
 
40
  margin: 1rem 0;
41
  }
42
 
43
+ /* Results styling - matching the image design */
44
+ .allergen-result {
45
+ padding: 1rem 1.5rem;
 
 
46
  border-radius: 8px;
47
  margin: 0.5rem 0;
48
+ font-size: 1rem;
49
+ font-weight: 500;
50
+ display: flex;
51
+ align-items: center;
52
+ gap: 0.5rem;
53
  }
54
 
55
+ .allergen-detected {
56
+ background-color: #f8d7da;
57
+ color: #721c24;
58
+ border: 1px solid #f1aeb5;
59
+ }
60
+
61
+ .allergen-safe {
62
+ background-color: #d1e7dd;
63
+ color: #0f5132;
64
+ border: 1px solid #a3cfbb;
65
+ }
66
+
67
+ .allergen-summary {
68
+ background-color: #fff3cd;
69
+ color: #664d03;
70
+ border: 1px solid #ffecb5;
71
+ padding: 1rem 1.5rem;
72
  border-radius: 8px;
73
+ margin: 1rem 0;
74
+ font-weight: 600;
75
+ text-align: center;
76
  }
77
 
78
  /* Button styling */
 
171
  def predict_allergen(model, vectorizer, input_text):
172
  X_input = vectorizer.transform([input_text])
173
  prediction = model.predict(X_input)
174
+ probabilities = model.predict_proba(X_input)
175
+ return prediction[0], probabilities[0]
176
 
177
  # === Scraping bahan dari Cookpad ===
178
  def get_ingredients_from_cookpad(url):
 
199
  except Exception as e:
200
  return None, f"Terjadi kesalahan: {str(e)}"
201
 
202
+ # === Display results with custom styling matching the image ===
203
+ def display_results(results, probabilities, labels):
204
  st.markdown("### 🎯 Hasil Analisis Alergen")
205
 
206
+ # Emoji mapping for each allergen
207
+ allergen_emojis = {
208
+ 'Susu': 'πŸ₯›',
209
+ 'Kacang': 'πŸ₯œ',
210
+ 'Telur': 'πŸ₯š',
211
+ 'Makanan Laut': '🦐',
212
+ 'Gandum': '🌾'
213
+ }
214
 
215
+ detected_allergens = []
 
 
 
 
216
 
217
+ # Display each allergen result
218
+ for i, (allergen, status) in enumerate(results.items()):
219
+ emoji = allergen_emojis.get(allergen, 'πŸ“‹')
220
+ confidence = probabilities[i][1] * 100 # Get probability for positive class
221
+
222
+ if status == 1: # Detected
223
+ detected_allergens.append(allergen)
224
+ st.markdown(f'''
225
+ <div class="allergen-result allergen-detected">
226
+ {emoji} {allergen}: Terdeteksi ⚠️ ({confidence:.2f}%)
227
+ </div>
228
+ ''', unsafe_allow_html=True)
229
+ else: # Not detected
230
+ st.markdown(f'''
231
+ <div class="allergen-result allergen-safe">
232
+ {emoji} {allergen}: Tidak Terdeteksi βœ“ ({confidence:.2f}%)
233
+ </div>
234
+ ''', unsafe_allow_html=True)
235
 
236
+ # Display summary
237
+ if detected_allergens:
238
+ allergen_list = ", ".join(detected_allergens)
239
+ st.markdown(f'''
240
+ <div class="allergen-summary">
241
+ Resep ini mengandung alergen: {allergen_list}
242
+ </div>
243
+ ''', unsafe_allow_html=True)
244
+ else:
245
+ st.markdown(f'''
246
+ <div class="allergen-summary">
247
+ πŸŽ‰ Tidak ada alergen berbahaya terdeteksi dalam resep ini!
248
+ </div>
249
+ ''', unsafe_allow_html=True)
250
 
251
  # === Main UI ===
252
  def main():
 
335
  st.warning("⚠️ Mohon masukkan bahan makanan terlebih dahulu.")
336
  else:
337
  with st.spinner("πŸ”„ Sedang menganalisis..."):
338
+ pred, probs = predict_allergen(model, vectorizer, input_text)
339
  results = dict(zip(labels, pred))
340
 
341
  st.success("βœ… Analisis selesai!")
342
+ display_results(results, probs, labels)
343
 
344
  elif input_mode == "πŸ”— URL Cookpad":
345
  st.markdown("### πŸ”— Analisis dari URL Cookpad")
 
401
 
402
  # Predict allergens
403
  joined_ingredients = " ".join(ingredients)
404
+ pred, probs = predict_allergen(model, vectorizer, joined_ingredients)
405
  results = dict(zip(labels, pred))
406
 
407
  st.markdown("---")
408
+ display_results(results, probs, labels)
409
 
410
  # Clear progress indicators
411
  progress_bar.empty()