基于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.rhkb.cn/news/337369.html

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

相关文章

mac电脑鼠标键盘共享软件:ShareMouse for Mac 激活版

ShareMouse 是一款跨平台的键盘和鼠标共享软件,它允许用户在多台计算机之间共享同一组键盘和鼠标,实现无缝的操作和控制。该软件适用于 Windows 和 macOS 系统,并且支持多种连接方式,包括局域网连接和无线连接。 使用 ShareMouse&…

Blueprints - Collision Presets相关

一些以前的学习笔记归档; 在Static Mesh或SkeletalMesh等的属性中,都有Collision Presets: 其中Oject Type只是一个枚举参数,代表设置该Actor为什么类型,Collision Responses代表该Actor对各种类型的Actor有什么反应&a…

HQChart使用教程100-uniapp如何在vue3运行微信小程序

HQChart使用教程100-uniapp如何在vue3运行微信小程序 症状原因分析解决思路解决步骤1. 修改vender.js2. 修改HQChartControl.js 完整实例HQChart代码地址 症状 HQChart插件在uniappvue3的项目编译成小程序以后, 运行会报错,见下图。 原因分析 查了下…

解决docker容器: bash: ping: command not found, 并制作镜像

一. 出现原因 从 dockerhub 拉下来的镜像都是最轻量级的, 不会安装各种工具, 所以使用 ping, vim 等命令, 会出现 command not found 二. 解决方式 2.1 安装工具包 进入到一个正在运行的容器内部, 执行命令: apt-get update 之后会发现, 容器正在更新软件包, 不过最终会由…

apache大数据各组件部署搭建(超级详细)

apache大数据数仓各组件部署搭建 第一章 环境准备 1. 机器规划 准备3台服务器用于集群部署,系统建议CentOS7+,2核8G内存 172.19.195.228 hadoop101 172.19.195.229 hadoop102 172.19.195.230 hadoop103 [root@hadoop101 ~]# cat /etc/redhat-release CentOS Linux rele…

aws emr启动standalone的flink集群

关键组件 Client,代码由客户端获取并做转换,之后提交给JobMangerJobManager,对作业进行中央调度管理,获取到要执行的作业后,会进一步处理转换,然后分发任务给众多的TaskManager。TaskManager,数…

【设计模式】创建型-建造者模式

前言 在面向对象的软件开发中,构建复杂对象时经常会遇到许多挑战。一种常见的解决方案是使用设计模式,其中建造者模式是一个强大而灵活的选择。本文将深入探讨建造者模式的原理、结构、优点以及如何在实际项目中应用它。 一、复杂的对象 public class…

vue3学习使用笔记

1.学习参考资料 vue3菜鸟教程:https://www.runoob.com/vue3/vue3-tutorial.html 官方网站:https://cn.vuejs.org/ 中文文档: https://cn.vuejs.org/guide/introduction.html Webpack 入门教程:https://www.runoob.com/w3cnote/webpack-tutor…

手机离线翻译哪个好?断网翻译也能超丝滑

有时在异国他乡,面对语言不通的窘境,即便是简单的对话也变得异常困难,真是挑战满满! 然而,能离线翻译的软件让语言障碍不再是问题,不必依赖网络也能轻松进行翻译啦~ 只需下载所需的语言包,选择…

Nginx企业级负载均衡:技术详解系列(14)—— 账户认证功能

你好,我是赵兴晨,97年文科程序员。 你有没有听说过Nginx的账户认证功能?这可不只是一个技术问题,它关系到我们上网时的安全和便利。就像家里需要一把钥匙才能进们一样,Nginx的账户认证功能就是确保有只有授权的人才能…

登录校验及全局异常处理器

登录校验 会话技术 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束.在一次会话中可以包含多次请求和响应会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话请求间共享数据会话跟踪方案 客户端…

华为 CANN

华为 CANN 1 介绍1.1 概述1.2 CANN 是华为昇腾计算产业的重要一环1.3 昇腾系列处理器1.4 昇腾 AI 产业1.5 从 AI 算法到产品化落地流程1.6 多样性计算架构1.7 人工智能各层级图示1.8 人工智能技术发展历史 2 CANN vs CUDA支持平台优化方向编程接口生态系统与应用性能与功能 3 C…

Qt xml学习之calculator-qml

1.功能说明:制作简易计算器 2.使用技术:qml,scxml 3.项目效果: 4.qml部分: import Calculator 1.0 //需要引用对应类的队友版本 import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 1.4 import QtScxml…

[深度学习]yolov10+bytetrack+pyqt5实现目标追踪

【简介】 利用YOLOv10、ByteTrack和PyQt5实现目标追踪是一个强大的组合,可以为用户提供一个交互式的实时目标追踪界面。以下是一个简化版的实现思路描述: 首先,YOLOv10是一个先进的目标检测算法,能够准确识别视频或图像中的目标…

OC IOS 文件解压缩预览

热很。。热很。。。。夏天的城市只有热浪没有情怀。。。 来吧,come on。。。 引用第三方库: pod SSZipArchive 开发实现: 一、控制器实现 头文件控制器定义: // // ZipRarViewController.h // // Created by carbonzhao on 2…

更新mirh connect 内置derby数据库密码

更新mirh connect 内置derby数据库密码 1、下载derby连接客户端 https://archive.apache.org/dist/db/derby/ 选择任意版本即可,比如 https://archive.apache.org/dist/db/derby/db-derby-10.14.2.0/db-derby-10.14.2.0-bin.zip 2、连接mirh文件数据库 1、把mi…

12 FreeRTOS 调试与优化

1、调试 1.1 打印 在FreeRTOS工程中使用了microlib,里面实现了printf函数。 只需要实现一下以下函数即可使用printf。 int fputc(int ch; FILE *f); 假如要从串口实现打印函数: int fputc( int ch, FILE *f ) {//指定串口USART_TypeDef* USARTx USAR…

黑马一站制造数仓实战2

问题 DG连接问题 原理:JDBC:用Java代码连接数据库 Hive/SparkSQL:端口有区别 可以为同一个端口,只要不在同一台机器 项目:一台机器 HiveServer:10000 hiveserver.port 10000 SparkSQL:10001…

如何克隆非默认分支

直接git clone下来的我们知道是默认分支,那如何克隆其他分支呢: 比如这个,我们想克隆AdvNet。 我们可以在本地文件夹打开Git Bash 依次输入: git clone --branch AdvNet https://github.com/wgcban/SemiCD.git cd SemiCD git b…

Java基础入门day62

day62 AJAX 概念 AJAX: Asynchronous Javascript And XML AJAX是一种无需重新加载整个网页的情况下,能够更新部分网页的技术 AJAX是一种用于创建快速动态网页的技术 通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新 传统…