Upload 3 files
8976954 verified
import streamlit as st
import numpy as np
import pickle
from PIL import Image
from sklearn.neighbors import NearestNeighbors
import os
import tensorflow as tf
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input
from tensorflow.keras.preprocessing import image
from tensorflow.keras.layers import GlobalMaxPool2D
from numpy.linalg import norm
# Başlık
st.title("👕 Fashion Product Recommender")
st.write("Lütfen bir ürün görseli yükleyin, size benzer ürünleri önerelim.")
# Modeli önbelleğe al
@st.cache_resource
def load_model():
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
base_model.trainable = False
model = tf.keras.Sequential([
base_model,
GlobalMaxPool2D()
])
return model
# Özellik çıkaran fonksiyon
def extract_features(img_path, model):
img = image.load_img(img_path, target_size=(224, 224))
img_array = image.img_to_array(img)
expanded = np.expand_dims(img_array, axis=0)
preprocessed = preprocess_input(expanded)
result = model.predict(preprocessed).flatten()
normalized = result / norm(result)
return normalized
# Görsel yükleyici
uploaded_file = st.file_uploader("Bir görsel seç (.jpg, .png)", type=["jpg", "png"])
if uploaded_file is not None:
st.image(uploaded_file, caption="Yüklenen Ürün", use_column_width=True)
# Geçici kaydet
temp_path = "temp.jpg"
with open(temp_path, "wb") as f:
f.write(uploaded_file.read())
# Model ve veriyi yükle
model = load_model()
try:
feature_list = pickle.load(open("Images_features.pkl", "rb"))
filenames = pickle.load(open("filenames.pkl", "rb"))
except Exception as e:
st.error("❌ Özellik dosyaları yüklenemedi. 'Images_features.pkl' ve 'filenames.pkl' dosyalarını kontrol edin.")
st.stop()
# Özellik çıkar
try:
input_feature = extract_features(temp_path, model)
neighbors = NearestNeighbors(n_neighbors=6, algorithm='brute', metric='euclidean')
neighbors.fit(feature_list)
distances, indices = neighbors.kneighbors([input_feature])
st.subheader("🔍 En Benzer Ürünler:")
for idx in indices[0]:
# Hugging Face zip destekli gösterim
try:
filename = filenames[idx].replace("images/", "") # örn: '10640.jpg'
st.image("images.zip@" + filename, width=200)
except Exception as e:
st.warning(f"Görsel gösterilemedi: {filenames[idx]}")
except Exception as e:
st.error(f"Bir hata oluştu: {str(e)}")