基于VGG16使用图像特征进行迁移学习的时装推荐系统

在这里插入图片描述

前言

系列专栏:【深度学习:算法项目实战】✨︎
涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记忆、自然语言处理、深度强化学习、大型语言模型和迁移学习。

利用图像特征提取的时尚推荐系统是一种通过分析时尚物品(如服装、配饰)的视觉内容,向用户推荐类似或互补产品的技术。

本文所提供的数据集由女性时尚物品的图像组成,包括各种服装和配饰。每张图片都代表一件独特的商品,按类型(如连衣裙、上衣、裙子)、风格(如休闲、正式、运动)以及颜色和图案等其他属性进行分类。这些图像以统一格式收集,以方便特征提取和分析过程。主要目标是开发一个时尚推荐系统,该系统可以分析输入的时尚单品图像,并根据视觉相似性从数据集中推荐相似的单品。

  • 提取特征: 利用预先训练好的 CNN 模型(如 VGG16、ResNet)从数据集中的每张图像中提取综合特征,捕捉纹理、颜色和形状等方面。
  • 测量相似性: 采用一种相似性测量方法(如余弦相似性),将提取的输入图像特征与数据集中的图像特征进行定量比较。
  • 推荐单品: 根据相似度得分,识别并推荐与输入单品视觉相似度最高的 N 个单品。

目录

  • 1. 相关数据集
    • 1.1 导入必要库
    • 1.2 加载数据集
  • 2. 构建模型(VGG16)
  • 3. 模型评估
  • 4. 总结

1. 相关数据集

利用图像特征构建时尚推荐系统涉及几个关键步骤,同时利用计算机视觉和机器学习技术。以下是利用图像特征构建时尚推荐系统的详细过程:

  1. 收集各种时尚物品的数据集。该数据集应包括不同颜色、图案、款式和类别的各种物品。
  2. 确保所有图像的格式(如 JPEG、PNG)和分辨率一致。
  3. 执行预处理功能,为特征提取准备图像。
  4. 选择预先训练好的 CNN 模型,如 VGG16、ResNet 或 InceptionV3。这些模型在 ImageNet 等大型数据集上经过预先训练,能够从图像中提取强大的特征表征。
  5. 将每张图像通过 CNN 模型提取特征。
  6. 定义衡量特征向量之间相似性的指标。
  7. 根据与输入图像的相似度对数据集图像进行排序,并推荐最相似的前 N 个项目。
  8. 实现一个最终函数,该函数封装了从预处理输入图像、提取特征、计算相似度到输出推荐的整个过程。

因此,这个过程从收集基于时尚服装的图片数据集开始。您可以从这里下载数据集。

1.1 导入必要库

现在,让我们通过导入必要的 Python 库,开始利用图像特征构建时尚推荐系统

import os
from zipfile import ZipFilefrom PIL import Image
import matplotlib.pyplot as pltimport glob
import numpy as npfrom tensorflow.keras.models import Model
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input
from tensorflow.keras.applications.vgg16 import preprocess_input

1.2 加载数据集

zip_file_path = '/content/women fashion.zip'
extraction_directory = '/content/women_fashion/'if not os.path.exists(extraction_directory):os.makedirs(extraction_directory)with ZipFile(zip_file_path, 'r') as zip_ref:zip_ref.extractall(extraction_directory)extracted_files = os.listdir(extraction_directory)
print(extracted_files[:10])
['women fashion', '__MACOSX']

在上面的代码中,一个位于 Google Colab 上路径为“/content/women fashion.zip ”的名为 “women fashion.zip ”的压缩文件正在被解压缩到指定目录“/content/women_fashion/”。首先,我们检查提取目录是否存在,如果不存在,则使用 os.makedirs() 创建该目录。然后,使用 Python 的 ZipFile 模块,以读取模式打开 zip 文件,并将其内容解压缩到指定目录。

zip 文件包含一个名为 women fashion 的目录和一些 macOS 使用的元数据 (__MACOSX)。让我们忽略 macOS 元数据,专注于women fashion目录,列出其内容以了解我们所拥有的图片类型和数量:

# correcting the path to include the 'women fashion' directory and listing its contents
extraction_directory_updated = os.path.join(extraction_directory, 'women fashion')# list the files in the updated directory
extracted_files_updated = os.listdir(extraction_directory_updated)
extracted_files_updated[:10], len(extracted_files_updated)
(['black floral saree.jpg','black, sequined dress with thin shoulder straps.jpg','dark blue, knee-length dress with thin straps.jpg','classic black slip dress with a midi length.jpg','black off-shoulder dress with belt.jpg','white, intricately detailed top and a flowing dark blue skirt.jpg','Women-off-the-shoulder-sexy-embroidery-fashion-party-dress-1.png','fitted, off-the-shoulder white dress with horizontal ribbed texture.jpg','one-shoulder, fitted dress that features sequin embellishments and sheer panels.jpg','fitted, short, yellow dress with short sleeves.jpeg'],97)

现在,让我们来看看数据集中的第一张图片:

# function to load and display an image
def display_image(file_path):image = Image.open(file_path)plt.imshow(image)plt.axis('off')plt.show()# display the first image to understand its characteristics
first_image_path = os.path.join(extraction_directory_updated, extracted_files_updated[0])
display_image(first_image_path)

请添加图片描述
现在,我们将创建一个包含所有图像文件路径的列表,用于稍后从数据集中的每张图像中提取特征:

# directory path containing your images
image_directory = '/content/women_fashion/women fashion'image_paths_list = [file for file in glob.glob(os.path.join(image_directory, '*.*')) if file.endswith(('.jpg', '.png', '.jpeg', 'webp'))]# print the list of image file paths
print(image_paths_list)

在上述代码中,glob 模块用于生成存储在目录中的图像的文件路径列表。glob.glob 函数搜索与指定模式匹配的文件,在本例中为*.*,它匹配目录中的所有文件。然后,列表理解会过滤这些文件,只包含具有特定图像文件扩展名(.jpg、.png、.jpeg、.webp)的文件。它确保 image_paths_list 只包含图像文件的路径,而不包括目录中可能存在的任何其他文件类型。

2. 构建模型(VGG16)

现在,我们将从所有时尚图像中提取特征:

base_model = VGG16(weights='imagenet', include_top=False)
model = Model(inputs=base_model.input, outputs=base_model.output)def preprocess_image(img_path):img = image.load_img(img_path, target_size=(224, 224))img_array = image.img_to_array(img)img_array_expanded = np.expand_dims(img_array, axis=0)return preprocess_input(img_array_expanded)def extract_features(model, preprocessed_img):features = model.predict(preprocessed_img)flattened_features = features.flatten()normalized_features = flattened_features / np.linalg.norm(flattened_features)return normalized_featuresall_features = []
all_image_names = []for img_path in image_paths_list:preprocessed_img = preprocess_image(img_path)features = extract_features(model, preprocessed_img)all_features.append(features)all_image_names.append(os.path.basename(img_path))
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5
58889256/58889256 [==============================] - 0s 0us/step
1/1 [==============================] - 1s 715ms/step
1/1 [==============================] - 0s 486ms/step
1/1 [==============================] - 0s 463ms/step
1/1 [==============================] - 1s 623ms/step
1/1 [==============================] - 1s 840ms/step
1/1 [==============================] - 1s 747ms/step
1/1 [==============================] - 1s 583ms/step
1/1 [==============================] - 0s 463ms/step
1/1 [==============================] - 0s 463ms/step
1/1 [==============================] - 0s 471ms/step
1/1 [==============================] - 1s 509ms/step
1/1 [==============================] - 0s 457ms/step
1/1 [==============================] - 0s 474ms/step
1/1 [==============================] - 0s 459ms/step
1/1 [==============================] - 0s 481ms/step
1/1 [==============================] - 0s 465ms/step
1/1 [==============================] - 0s 486ms/step
1/1 [==============================] - 1s 678ms/step
1/1 [==============================] - 1s 846ms/step
1/1 [==============================] - 1s 1s/step
1/1 [==============================] - 1s 760ms/step
1/1 [==============================] - 1s 810ms/step
1/1 [==============================] - 1s 832ms/step
1/1 [==============================] - 1s 796ms/step
1/1 [==============================] - 1s 598ms/step
1/1 [==============================] - 0s 461ms/step
1/1 [==============================] - 0s 472ms/step
1/1 [==============================] - 0s 461ms/step
1/1 [==============================] - 0s 477ms/step
1/1 [==============================] - 0s 481ms/step
1/1 [==============================] - 0s 473ms/step
1/1 [==============================] - 0s 466ms/step
1/1 [==============================] - 0s 476ms/step
1/1 [==============================] - 0s 468ms/step
1/1 [==============================] - 0s 479ms/step
1/1 [==============================] - 0s 471ms/step
1/1 [==============================] - 1s 605ms/step
1/1 [==============================] - 1s 548ms/step
1/1 [==============================] - 1s 679ms/step
1/1 [==============================] - 1s 703ms/step
1/1 [==============================] - 1s 596ms/step
1/1 [==============================] - 1s 1s/step
1/1 [==============================] - 1s 1s/step
1/1 [==============================] - 1s 590ms/step
1/1 [==============================] - 0s 462ms/step
1/1 [==============================] - 0s 482ms/step
1/1 [==============================] - 0s 464ms/step
1/1 [==============================] - 0s 470ms/step
1/1 [==============================] - 0s 484ms/step
1/1 [==============================] - 0s 467ms/step
1/1 [==============================] - 0s 483ms/step
1/1 [==============================] - 0s 464ms/step
1/1 [==============================] - 0s 481ms/step
1/1 [==============================] - 0s 463ms/step
1/1 [==============================] - 0s 479ms/step
1/1 [==============================] - 0s 464ms/step
1/1 [==============================] - 0s 499ms/step
1/1 [==============================] - 0s 466ms/step
1/1 [==============================] - 1s 735ms/step
1/1 [==============================] - 1s 894ms/step
1/1 [==============================] - 2s 2s/step
1/1 [==============================] - 1s 1s/step
1/1 [==============================] - 1s 852ms/step
1/1 [==============================] - 1s 912ms/step
1/1 [==============================] - 1s 1s/step
1/1 [==============================] - 1s 908ms/step
1/1 [==============================] - 1s 871ms/step
1/1 [==============================] - 1s 1s/step
1/1 [==============================] - 1s 579ms/step
1/1 [==============================] - 0s 471ms/step
1/1 [==============================] - 0s 462ms/step
1/1 [==============================] - 0s 466ms/step
1/1 [==============================] - 1s 574ms/step
1/1 [==============================] - 1s 807ms/step
1/1 [==============================] - 1s 809ms/step
1/1 [==============================] - 1s 608ms/step
1/1 [==============================] - 0s 460ms/step
1/1 [==============================] - 0s 467ms/step
1/1 [==============================] - 0s 468ms/step
1/1 [==============================] - 0s 463ms/step
1/1 [==============================] - 0s 474ms/step
1/1 [==============================] - 0s 478ms/step
1/1 [==============================] - 0s 477ms/step
1/1 [==============================] - 0s 469ms/step
1/1 [==============================] - 0s 475ms/step
1/1 [==============================] - 0s 463ms/step
1/1 [==============================] - 0s 479ms/step
1/1 [==============================] - 0s 462ms/step
1/1 [==============================] - 0s 485ms/step
1/1 [==============================] - 0s 471ms/step
1/1 [==============================] - 0s 480ms/step
1/1 [==============================] - 0s 462ms/step
1/1 [==============================] - 0s 476ms/step
1/1 [==============================] - 0s 466ms/step
1/1 [==============================] - 1s 692ms/step
1/1 [==============================] - 1s 848ms/step

最初加载的 VGG16 模型不包含顶层分类层(include_top = False),因此适合用于特征提取而非分类。

在上述代码中,使用 VGG16 模型(一种在 ImageNet 数据集上预先训练过的流行卷积神经网络)实现了特征提取过程,从存储在 image_path_list 中的图像中提取视觉特征。来自 image_paths_list 的每个图像路径都要经过一系列步骤处理:加载图像并将其大小调整为 224×224 像素,以符合 VGG16 输入大小的要求,将其转换为 NumPy 数组,并进行预处理以适应模型的预期输入格式。

然后将预处理后的图像输入 VGG16 模型以提取特征,随后对其进行扁平化和归一化处理,从而为每张图像创建一致的特征向量。这些特征向量(all_features)及其对应的图像文件名(all_image_names)被存储起来,为下一步利用图像特征建立时尚推荐系统提供了结构化数据集。

3. 模型评估

现在,我将编写一个函数,根据图片特征推荐时尚图片:

from scipy.spatial.distance import cosinedef recommend_fashion_items_cnn(input_image_path, all_features, all_image_names, model, top_n=5):# pre-process the input image and extract featurespreprocessed_img = preprocess_image(input_image_path)input_features = extract_features(model, preprocessed_img)# calculate similarities and find the top N similar imagessimilarities = [1 - cosine(input_features, other_feature) for other_feature in all_features]similar_indices = np.argsort(similarities)[-top_n:]# filter out the input image index from similar_indicessimilar_indices = [idx for idx in similar_indices if idx != all_image_names.index(input_image_path)]# display the input imageplt.figure(figsize=(15, 10))plt.subplot(1, top_n + 1, 1)plt.imshow(Image.open(input_image_path))plt.title("Input Image")plt.axis('off')# display similar imagesfor i, idx in enumerate(similar_indices[:top_n], start=1):image_path = os.path.join('/content/women_fashion/women fashion', all_image_names[idx])plt.subplot(1, top_n + 1, i + 1)plt.imshow(Image.open(image_path))plt.title(f"Recommendation {i}")plt.axis('off')plt.tight_layout()plt.show()

在上述代码中,我们定义了一个 recommend_fashion_items_cnn 函数,该函数通过基于深度学习的特征提取,向用户推荐与给定输入图片相似的时尚单品。它利用 VGG16 模型从图像中提取高维特征向量,捕捉图像的视觉本质。

对于指定的输入图像,该函数会对图像进行预处理,提取其特征,并计算该特征向量与数据集中其他图像特征向量(all_features)之间的余弦相似度。它根据相似度对这些图像进行排序,并选择前 N 个最相似的图像进行推荐,同时通过从相似指数列表中过滤掉输入图像的指数,明确排除将输入图像推荐给自己的可能性。

最后,该函数将通过显示输入图片及其推荐来实现可视化。

现在,我们来看看如何使用此函数,根据输入图片中的相似方式推荐图片:

input_image_path = '/content/women_fashion/women fashion/dark, elegant, sleeveless dress that reaches down to about mid-calf.jpg'
recommend_fashion_items_cnn(input_image_path, all_features, image_paths_list, model, top_n=4)

时尚图片描述
您只需将图像路径作为输入,就会看到类似的时尚建议图片作为输出。

4. 总结

因此,这就是如何使用 Python 编程语言,利用图像特征构建时尚推荐系统。使用图像特征的时尚推荐系统利用计算机视觉和机器学习技术来分析时尚产品的视觉方面(如颜色、纹理和风格),并向用户推荐类似或互补的产品。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【React篇】简述React-Router 的实现原理及工作方式

React Router 路由的基础实现原理分为两种,如果是切换 Hash 的方式,那么依靠浏览器 Hash 变化即可;如果是切换网址中的 Path,就要用到 HTML5 History API 中的 pushState、replaceState 等。在使用这个方式时,还需要在…

数据库管理软件:Navicat Premium 17 中文激活版

Navicat Premium 是一套可创建多个连接的数据库开发工具,让你从单一应用程序中同时连接 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 。它与 OceanBase 数据库及 Amazon RDS、Amazon Aurora、Amazon Redshift、Microsoft Azure、Oracle Clo…

万字解析线控底盘技术

文章出处:汽车学堂Automooc 引言 在当今这个由科技驱动的时代,汽车电动化、智能化已成为汽车行业的热门话题。特斯拉的自动驾驶功能、蔚来的换电模式、以及比亚迪的刀片电池技术,这些创新不仅引领着市场趋势,也推动着消费者对智…

Leetcode2028. 找出缺失的观测数据

Every day a Leetcode 题目来源:2028. 找出缺失的观测数据 解法1:模拟 统计当前 m 个元素的总和 curSum sum(rolls),总共 mn 个元素和为 total (m n) * mean。 排除 2 种情况: total - curSum > 6 * n:n 个…

链表(2)反转链表

题目描述 反转一个单链表。(题目来源) 思路一 其实,反转一个单向链表,我们可以看成是将链表中的每个结点的指向反向(即从后一个结点指向前一个结点)。 我们在考虑情况的时候,还是可以先考虑一般…

变种水仙花

变种水仙花 题干要求: 变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于…

Ollama 本地大模型框架

该篇教程主要讲解*Ollama的安装和简单使用* Ollama: 在本地启动并运行大型语言模型。 主要流程目录: 1.安装 2.使用 2.1.下载模型 2.2.简单使用 2.3.中文模型 2.4.中文社区 3.总结 1.安装 创建一个容器 切换”高级视图“ 参考填写 ollama oll…

java家政上门系统源码,App端采用uniapp开发编写,可打包H5 、微信小程序、微信公众号、Android、IOS等。

家政上门系统是一种通过互联网或移动应用平台,为用户提供在线预约、下单、支付和评价家政服务的系统。该系统整合了家政服务资源,使用户能够便捷地找到合适的服务人员,同时也为家政服务人员提供了更多的工作机会。 本套家政上门系统源码&…

Golang | Leetcode Golang题解之第120题三角形最小路径和

题目&#xff1a; 题解&#xff1a; func minimumTotal(triangle [][]int) int {n : len(triangle)f : make([]int, n)f[0] triangle[0][0]for i : 1; i < n; i {f[i] f[i - 1] triangle[i][i]for j : i - 1; j > 0; j-- {f[j] min(f[j - 1], f[j]) triangle[i][j]…

旅游行业:解锁收入增长的新策略!

随着科技的飞速发展和人们生活水平的提高&#xff0c;旅游行业已成为全球范围内最具活力和潜力的行业之一。然而&#xff0c;在这个充满机遇与挑战的市场中&#xff0c;如何确保收入的持续增长&#xff0c;成为每一家旅游企业都必须面对的问题。在这个背景下&#xff0c;用友BI…

虚拟现实环境下的远程教育和智能评估系统(七)

在后端代码的基础上&#xff0c;利用vue框架设计前端界面&#xff0c;至此&#xff0c;用户界面基本成型&#xff0c;后续添加其他进阶功能&#xff1b; 另&#xff0c;前后端交互相关&#xff1a; UsersVO.java package com.roncoo.education.user.feign.interfaces.vo;impor…

Llama改进之——分组查询注意力

引言 今天介绍LLAMA2模型引入的关于注意力的改进——分组查询注意力(Grouped-query attention,GQA)1。 Transformer中的多头注意力在解码阶段来说是一个性能瓶颈。多查询注意力2通过共享单个key和value头&#xff0c;同时不减少query头来提升性能。多查询注意力可能导致质量下…

易联众智能自动办理平台,AI赋能让数字政务服务“触手可及”

“城乡居民参保怎么办”“要去XX省工作了,帮我办理异地就医备案”……通过口语化的文字、语音提问,易联众智能自动办理平台的AI助理都可以准确理解对话,并依据政策文件给出详细回答,人机对话像聊天一样轻松。 近日,宁德市民王先生高兴地说:“过去办理医保业务不懂流程,容易走弯…

Vue常用自定义指令、纪录篇

文章目录 一、元素尺寸发生变化时二、点击元素外自定义指令三、元素拖拽自定义指令四、防抖自定义指令五、节流自定义指令六、权限判断自定义指令 一、元素尺寸发生变化时 使用场景&#xff1a; 当元素的尺寸发生变化时需要去适配一些元素时。 或者在元素尺寸发生变化时要去适配…

TiDB学习9:Ti Cloud简介

目录 1. 为什么选择TiDB 2. 多租户 3. TiDB架构 4. 什么是TiDB Cloud 5. TiDB Cloud Provider Region 6. TiDB Cloud 入门 6.1 在浏览器中打开TiDB Cloud 6.2 创建您的账户 6.3 Developer Tier 与Dedicated Tier 6.3.1 Developer Tier 6.3.2 Dedicated Tier 6.3.2.…

[HUBUCTF 2022 新生赛]RSAaaa

题目&#xff1a; EXP 就你小子是黑客&#xff1f; 我忘记怎么解密了&#xff01; 靠你了&#xff0c;大黑阔&#xff01;(536970330703, 65537) message: 473878130775 40132555282 40132555282 94619939727 72818765591 208015808884 42561234694 159353248388 27748063975 1…

逆天工具一键修复图片,视频去码。简直不要太好用!

今天&#xff0c;我要向您推荐一款功能强大的本地部署软件&#xff0c;它能够在您的计算机上一键修复图片和视频&#xff0c;去除令人不悦的码赛克&#xff08;轻度马赛克&#xff09;。这款软件是开源的&#xff0c;并在GitHub上公开可用&#xff0c;您可以免费下载并使用。 …

vector的功能讲解与底层实现

本文主要介绍vector的内容以及使用和模拟实现。 vector在英文翻译中是矢量的意思&#xff0c;但在c中他的本质是一个顺序表&#xff08;容器&#xff09;&#xff0c;是一个类模板&#xff0c;&#xff08;用模板创建变量就要参考我们之前的实例化内容了&#xff09;用可以改变…

dnsrecon一键开始负载平衡检测(KALI工具系列十四)

目录 1、KALI LINUX简介 2、lbd工具简介 3、在KALI中使用lbd 3.1 测试目标域名是否存在负载不平衡 4、总结 1、KALI LINUX简介 Kali Linux 是一个功能强大、多才多艺的 Linux 发行版&#xff0c;广泛用于网络安全社区。它具有全面的预安装工具和功能集&#xff0c;使其成为…

TCP协议详解及其相关的10个核心机制(面试重点)

TCP协议的报文格式 TCP协议有连接&#xff0c;可靠性传输&#xff0c;面向字节流&#xff0c;全双工。 他的数据格式如图&#xff1a; 根据他的数据格式&#xff0c;在这里我们只知道 16位源端口号&#xff08;表示客户端这里的端口号&#xff09;&#xff0c;16位目的端口号&…