Мода — это постоянно развивающаяся отрасль, которая требует постоянной адаптации и инноваций, чтобы оставаться актуальной, а оставаться в курсе последних тенденций может быть сложной задачей. В этом сообщении в блоге я исследую, как ResNet50 можно использовать для создания надежных систем рекомендаций по моде, которые могут предоставлять покупателям персонализированный выбор модной одежды, делая их покупки удобными и приятными. Это захватывающая сфера, и одним из последних технологических достижений в отрасли является использование алгоритмов глубокого обучения для систем рекомендаций по моде. В этом блоге мы рассмотрим, как использовать модель ResNet50 для создания системы рекомендаций по моде.

На данный момент мы создаем одну веб-страницу с потоковым освещением в локальной системе, чтобы увидеть 10 рекомендуемых изображений модных товаров, которые похожи на изображение запроса.

Что такое Реснет50?

ResNet50 — это глубокая сверточная нейронная сеть, представленная Microsoft Research в 2015 году. Это мощная модель, которая была обучена на миллионах изображений и может распознавать широкий спектр объектов, включая модные предметы. Это делает его идеальным выбором для создания системы рекомендаций по моде. Подробное объяснение можно найти в другом моем блоге на Resnet50.

Мы не будем полностью обучать модель resnet50 с нуля (поскольку она уже обучена на наборе данных imagenet), мы используем здесь концепцию трансферного обучения и просто извлекаем функции, передавая изображения набора данных (кредиты: Param aggarwal), набор данных состоит из 44 тыс. изображений модных товаров.

Мы передадим 44 тыс. изображений в модель resnet50 и возьмем вывод последней конв. блокировать до ср. объединение, результирующий результат будет двумерным массивом размером 44k * 2048, где каждое изображение имеет 2048-мерный вектор, называемый функциями.

Почему Стримлит?

Streamlit предоставляет простой и интуитивно понятный API, который позволяет создавать веб-приложения, используя всего несколько строк кода Python.

Streamlit — это библиотека Python с открытым исходным кодом, которая позволяет разработчикам быстро и легко создавать веб-приложения для проектов по науке о данных и машинному обучению. С помощью Streamlit разработчики могут создавать интерактивные веб-приложения, которые позволяют пользователям визуализировать, исследовать и анализировать данные в режиме реального времени.

Streamlit предоставляет простой и интуитивно понятный API, который позволяет разработчикам создавать веб-приложения, используя всего несколько строк кода Python. Он включает встроенную поддержку широкого спектра инструментов визуализации и анализа данных, включая диаграммы, таблицы, карты и модели машинного обучения.

Для получения дополнительной информации посетите их официальный веб-сайт.

План действий

  1. Импорт модели: импортируйте модель resnet50, используя keras с preprocessing_input, чтобы просто обработать изображение.
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input
############################ Defining Model##############################################
model=ResNet50(weights='imagenet',include_top=False, input_shape=(224,224,3))
model.trainable=False
model=tf.keras.Sequential([model,GlobalMaxPool2D()])
model.summary()

2. Извлечение признаков: передайте изображения размером 44 КБ в модель restnet50 и извлеките признаки, а затем сведите их для преобразования в одномерный вектор. Извлеченные функции и изображения должны храниться в файлах рассола, чтобы при передаче рекомендации индекс результирующих функций получал изображения взамен.

############### One time Code: need to extract features of 44k images, U can run this  ######
def image_preprocess(path,model):
    img=image.load_img(path, target_size=(224,224))
    img_arr=image.img_to_array(img)
    ex_img_arr=np.expand_dims(img_arr,axis=0)
    pre_pr_img=preprocess_input(ex_img_arr)
    result=model.predict(pre_pr_img).flatten()
    normal_result=result/norm(result)
    return normal_result
path=r'C:\Users\TanishSharm\Desktop\Fashion_recom_sys\myntradataset\images'

images=[os.path.join(path,files) for files in os.listdir(path)]

pickle.dump(images,open('images.pkl','wb'))
feature_list=[]
for file in tqdm(images):
    feature_list.append(image_preprocess(file, model))
pickle.dump(feature_list,open('fetaures.pkl','wb'))

3. Загрузить извлеченные функции: чтобы получить рекомендацию для заданной точки запроса с использованием показателей расстояния.

################################Loading Stored Features and images##################################
file_img=pickle.load(open(r'C:\Users\TanishSharma\Desktop\Fashion_recom_sys\images.pkl','rb'))
feature_list=(pickle.load(open(r'C:\Users\TanishSharma\Desktop\Fashion_recom_sys\fetaures.pkl','rb')))

4. Сохранение изображений: мы используем Streamlit для создания этой системы. Создайте одну кнопку загрузки, которая предоставит возможность просмотра, затем нажмите на загрузку изображения, и оно будет сохранено в папке загрузок на вашем локальном компьютере.

st.title('Fashion Recommender system')## title of the webpage
###################### Method to Save Uploaded Image into local############################
def Save_img(upload_img):
    try:
        with open(os.path.join('uploads',upload_img.name),'wb') as f:
            f.write(upload_img.getbuffer())
        return 1
    except:
        return 0
########### To display upload button onto screen######################
upload_img=st.file_uploader("Choose an image") 

5. Генерировать рекомендацию: теперь функции сохранены и будут передавать новое изображение запроса в модель resnet50, она будет генерировать функции, которые будут выравниваться дальше. Здесь мы используем метрики евклидова расстояния, чтобы найти рекомендуемые 10 ближайших соседей или посмотреть похожие изображения. Ниже приведены два метода извлечения рекомендаций по функциям и продуктам.

######################## Method to Extract features of new query image#######################
def feature_extraction(path,model):
    img=image.load_img(path, target_size=(224,224))# Load image in size of 224,224,3
    img_arr=image.img_to_array(img)# storing into array
    ex_img_arr=np.expand_dims(img_arr,axis=0)## Expanding the dimension of image
    pre_pr_img=preprocess_input(ex_img_arr)## preprocessing the image
    result=model.predict(pre_pr_img).flatten()### to make 1d vector
    normal_result=result/norm(result)## Normalize the result using norm func from linalg(numpy)
    return normal_result

def prod_recom(features, feature_list):
    neb=NearestNeighbors(n_neighbors=10,algorithm='brute',metric='euclidean') #using brute force algo here as data is not too big
    neb.fit(feature_list)## fit with feature list
    dist, ind=neb.kneighbors([features])# return distance and index but we use index to find out nearest images from stored features vector 
    return ind

Вызовет эти функции для извлечения функции, получения 10 рекомендаций и создания разделов рекомендуемых изображений в приложении с потоковой подсветкой. Найдите ниже код для того же самого.

### Condition to check if image got uploaded then call save_img method to save and preprocess image followed by extract features and recommendation
if upload_img is not None:
    if Save_img(upload_img):
        st.image(Image.open(upload_img))     
        st.header("file uploaded successfully")
        features=feature_extraction(os.path.join("uploads",upload_img.name),model)
        progress_text = "Hold on! Result will shown below."
        my_bar = st.progress(0, text=progress_text)
        for percent_complete in range(100):
            time.sleep(0.02)
            my_bar.progress(percent_complete + 1, text=progress_text) ## to add progress bar untill feature got extracted
        ind=prod_recom(features, feature_list)# calling recom. func to get 10 recommendation
        ### to create 10 section of images into the screen
        col1,col2,col3,col4,col5,col6,col7,col8,col9,col10=st.columns(10)
        
        ##for each section image shown by below code
        with col1:
            st.image(Image.open(file_img[ind[0][0]]))
        with col2:
            st.image(Image.open(file_img[ind[0][1]]))
        with col3:
            st.image(Image.open(file_img[ind[0][2]]))
        with col4:
            st.image(Image.open(file_img[ind[0][3]]))
        with col5:
            st.image(Image.open(file_img[ind[0][4]]))
        with col6:
            st.image(Image.open(file_img[ind[0][5]]))
        with col7:
            st.image(Image.open(file_img[ind[0][6]]))
        with col8:
            st.image(Image.open(file_img[ind[0][7]]))
        with col9:
            st.image(Image.open(file_img[ind[0][8]]))
        with col10:
            st.image(Image.open(file_img[ind[0][9]]))
        # st.text("Using Spotify ANNoy")
        # df = pd.DataFrame({'img_id':file_img, 'img_repr': feature_list})
        # f=len(df['img_repr'][0])
        # ai=AnnoyIndex(f,'angular')        
        # for i in tqdm(range(len(feature_list))):
        #     v=feature_list[i]
        #     ai.add_item(i,v)
        # ai.build(10) # no of binary tress want to build more number of tree more accuracy 
        # neigh=(ai.get_nns_by_item(0,5))
        # with col1:
        #         st.image(Image.open(file_img[neigh[0]]))
        # with col2:
        #                 st.image(Image.open(file_img[neigh[1]]))
        # with col3:
        #                 st.image(Image.open(file_img[neigh[2]]))
        # with col4:
        #                 st.image(Image.open(file_img[neigh[3]]))

        # for i in range(len(neigh)):
        #     with st.columns(i):
        #         st.image(Image.open(file_img[neigh[i]]))
    else:
        st.header("Some error occured")

найдите полный код файла .py в моем профиле на github.

ШАГИ

  1. Создайте новый проект в своей среде IDE (pycharm, spyder, Vscode и т. д.), вставьте загруженный набор данных из данного ресурса в ту же папку.
  2. Выполните указанные 2 шага в разделе «План действий» выше и сохраните функции на локальном компьютере в той же папке.
  3. Откройте cmd-> активируйте python env-> Streamlit запустите main.py

4. Просмотрите любое изображение модного продукта и подождите пару секунд. Ниже будут показаны 10 похожих продуктов.

Рекомендация может быть улучшена на основе метрик расстояния. Вы можете попробовать различные метрики, такие как Манхэттенское расстояние, Расстояние Минковского и Расстояние Хэмминга, и посмотреть результаты. Или можно попробовать индекс раздражения (посредством Spotify, используемого в музыкальных рекомендациях), чтобы найти из лучших рекомендуемых продуктов.

Заключение

Система рекомендаций по моде, использующая ResNet50, может предоставить пользователям персонализированный опыт покупок и помочь ритейлерам модной одежды увеличить продажи. Анализируя особенности модных вещей, система может рекомендовать похожие вещи, которые с большей вероятностью заинтересуют пользователя. Поскольку алгоритмы глубокого обучения продолжают развиваться, мы можем ожидать появления более сложных систем рекомендаций по моде в будущем.