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('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}")