import streamlit as st import pandas as pd from PIL import Image import cv2 import os import time import torch from joblib import load import matplotlib.pyplot as plt import os os.environ['TRANSFORMERS_CACHE'] = '/app/cache' from transformers import AutoImageProcessor, AutoModelForImageClassification from streamlit.components.v1 import html # عنوان التطبيق st.title("نظام تحليل الصور وتقدير العمر والجنس") # تحميل بيانات CSV def load_data(): try: data = pd.read_csv('recom.csv', encoding='utf-8') return data except FileNotFoundError: st.warning("ملف البيانات غير موجود") return pd.DataFrame() data = load_data() # تحميل نماذج التنبؤ @st.cache_resource def load_models(): try: # Load the processor and models first processor = AutoImageProcessor.from_pretrained("dima806/fairface_age_image_detection") age_model = AutoModelForImageClassification.from_pretrained("dima806/fairface_age_image_detection") gender_model = AutoModelForImageClassification.from_pretrained("dima806/fairface_gender_image_detection") return processor, age_model, gender_model except Exception as e: st.error(f"حدث خطأ في تحميل النماذج: {e}") return None, None, None processor, age_model, gender_model = load_models() # وظيفة للتنبؤ بالعمر والجنس def predict_image(image): try: # Preprocess the image inputs = processor(images=image, return_tensors="pt") # Perform inference with torch.no_grad(): age_logits = age_model(**inputs).logits gender_logits = gender_model(**inputs).logits # Get predictions predicted_age_idx = age_logits.argmax(-1).item() predicted_gender_idx = gender_logits.argmax(-1).item() # Decode predictions predicted_age = age_model.config.id2label[predicted_age_idx] predicted_gender = gender_model.config.id2label[predicted_gender_idx] return predicted_age, predicted_gender except Exception as e: st.error(f"حدث خطأ أثناء التنبؤ: {e}") return None, None def cards(recommendations): # Custom CSS for the cards css = """ """ # Create a complete HTML document cards_html = f""" {css}
""" # Build the flex cards for _, row in recommendations.iterrows(): # Handle missing image case image_url = row.get('image', '') if pd.notna(row.get('image', '')) else "https://via.placeholder.com/220x160?text=No+Image" cards_html += f"""
{row.get('name', '')}

{row.get('name', '')}

{row.get('type', '')} | {row.get('genre', '')}

العمر: {row.get('age_group', '')} | الجنس: {row.get('gender', '')}

""" cards_html += """
""" # Use Streamlit's html component to render the HTML properly html(cards_html, height=320, scrolling=False) # وظيفة لعرض التوصيات بناءً على العمر والجنس def show_recommendations(age, gender, data): if data.empty: st.warning("لا توجد بيانات توصيات متاحة") return # فلترة البيانات بناءً على العمر والجنس (يمكن تعديل هذا المنطق حسب احتياجاتك) try: # تحويل العمر إلى رقم للتصفية # تصفية حسب الجنس # يمكنك تعديل منطق التوصية هنا حسب عمود العمر في بياناتك recommendations = data.loc[ (data['gender'] == gender) & (data['age_group'] ==age) ] st.subheader("التوصيات المقترحة:") if not recommendations.empty: # عرض التوصيات باستخدام بطاقات cards(recommendations) else: st.warning(recommendations) except Exception as e: st.error(f"حدث خطأ في عرض التوصيات: {e}") st.dataframe(data.sample(5)) # إنشاء قائمة جانبية للاختيارات option = st.sidebar.selectbox( "اختر طريقة إدخال الصورة", ("تحميل من الملف", "التقاط من الكاميرا") ) # متغير للصورة uploaded_image = None captured_image = None image_to_predict = None if option == "تحميل من الملف": uploaded_file = st.file_uploader("اختر صورة لتحميلها", type=['jpg', 'png', 'jpeg']) if uploaded_file is not None: # عرض شاشة التحميل with st.spinner('جاري معالجة الصورة...'): uploaded_image = Image.open(uploaded_file) image_to_predict = uploaded_image st.success("تم تحميل الصورة بنجاح!") # عرض الصورة st.image(uploaded_image, caption="الصورة المرفوعة", use_column_width=True) else: # خيار التقاط صورة من الكاميرا st.write("اضغط على الزر لتفعيل الكاميرا") picture = st.camera_input("التقاط صورة") if picture: with st.spinner('جاري معالجة الصورة...'): captured_image = Image.open(picture) image_to_predict = captured_image st.success("تم التقاط الصورة بنجاح!") # زر لمعالجة الصورة واستخراج البيانات if st.button("تحليل الصورة"): if image_to_predict is not None and processor is not None and age_model is not None and gender_model is not None: with st.spinner('جاري تحليل الصورة...'): predicted_age, predicted_gender = predict_image(image_to_predict) if predicted_age is not None and predicted_gender is not None: # عرض النتائج st.subheader("نتائج التحليل:") col1, col2 = st.columns(2) with col1: st.metric("العمر المتوقع", predicted_age) with col2: st.metric("الجنس المتوقع",predicted_gender) # عرض التوصيات show_recommendations(predicted_age.lower().strip(), predicted_gender.lower().strip(), data) else: st.error("فشل في تحليل الصورة") else: if image_to_predict is None: st.warning("الرجاء تحميل أو التقاط صورة أولاً") else: st.error("النماذج غير جاهزة للتحليل") # قسم لإضافة ملف CSV جديد إذا لزم الأمر st.sidebar.header("إدارة البيانات") new_csv = st.sidebar.file_uploader("رفع ملف بيانات جديد (CSV)", type=['csv']) if new_csv is not None: try: new_data = pd.read_csv(new_csv, encoding='utf-8') new_data.to_csv('data.csv', index=False) st.sidebar.success("تم تحديث بيانات CSV بنجاح!") data = load_data() # إعادة تحميل البيانات except Exception as e: st.sidebar.error(f"حدث خطأ: {e}")