Want to Become a Sponsor? Contact Us Now!🎉

LLM
如何使用GPT-4V:逐步指南

如何使用GPT-4进行图像生成和分析

Published on

本逐步指南探讨了GPT-4V的创新功能,包括图像生成和分析,为利用这种先进的AI模型进行文本和视觉内容创作提供实用建议。

GPT-4的出现标志着人工智能领域的重大演进,将其能力扩展到超越文本,包括图像生成和分析。本文深入探讨了GPT-4的多方面功能,重点介绍其处理和生成图像的能力,并提供了关于如何有效利用这些功能的全面指南。

什么是GPT-4?

GPT-4,或称为生成式预训练变换器4,是由OpenAI开发的先进的AI模型的新版本。它因具备增强的理解和生成类似于人类文本的能力而独树一帜,但是GPT-4的与众不同之处在于它可以与图像进行交互。这包括根据文本描述生成图像(GPT-4 Vision或GPT-4V)、分析图像中的内容,甚至可以读取图片中的文本,使其成为各种应用的多功能工具。

理解GPT-4的图像能力

GPT-4的视觉能力通常称为GPT-4 Vision或GPT-4V,使其能够根据文本描述处理和生成图像。这意味着您可以上传一张图片进行分析,或者要求模型从头开始创建新的图像。无论是用于创建艺术作品、为内容生成图像,还是从图像中提取信息,GPT-4V都能处理多种任务,使其成为GPT-4套件的强大补充。

如何使用GPT-4生成图像

使用GPT-4生成图像非常简单。用户可以输入所想要的图像的详细描述,模型将生成相应的图像。这个功能对于艺术家、设计师和内容创作者而言特别有用,他们可以将自己的创意变为现实,而无需手动绘制或设计技能。它还非常有价值,可以创建与基于文本的内容相补充的视觉效果,提升整体用户体验。

如何使用GPT-4进行图像分析

除了生成图像,GPT-4还可以分析和解释照片中的内容。这包括阅读图像中的文本、识别物体和理解场景。要使用此功能,用户可以将图像上传到平台,GPT-4将根据其分析结果提供见解。这一能力对于涉及基于图像的研究、数据提取和辅助观感的任务尤其有用,例如为视觉障碍用户阅读文本。

GPT-4 Vision的实际应用

GPT-4的图像能力潜在应用广泛。在教育领域,它可以通过生成视觉辅助工具或分析历史照片来促进互动学习。市场营销人员可以使用GPT-4为活动创建引人注目的视觉效果,或者分析消费者的照片以获得见解。此外,在创意产业中,GPT-4可以通过生成初始概念或根据反馈修改现有视觉效果来辅助设计过程。

如何将GPT-4V与RAG结合 - 创建服装搭配应用程序

Anakin AI - The Ultimate No-Code AI App Builder

欢迎来到服装搭配应用程序Jupyter笔记本!本项目展示了GPT-4V模型在分析服装物品图像并提取颜色、风格和类型等关键特征方面的强大功能。我们的应用程序的核心依赖于由OpenAI开发的这种先进图像分析模型,它能够准确地识别输入服装物品的特征。

GPT-4V是一个将自然语言处理与图像识别结合起来的模型,使其能够理解并根据文本和视觉输入生成响应。

在GPT-4V模型的基础上,我们利用自定义匹配算法和RAG技术来搜索我们的知识库,以找到与识别的特征相匹配的物品。该算法考虑了颜色兼容性和风格一致性等因素,为用户提供适合的推荐。通过本笔记本,我们旨在展示这些技术在创建服装推荐系统中的实际应用。

使用GPT-4 Vision + RAG(检索增强生成)的组合具有以下几个优势:

  • 上下文理解:GPT-4 Vision可以分析输入图像并理解上下文,例如所描绘的对象、场景和活动。这可以在各个领域(如室内设计、烹饪或教育)中提供更准确和相关的建议或信息。
  • 丰富的知识库:RAG结合了GPT-4的生成能力与检索组件,可以访问不同领域的大量信息。这意味着系统可以根据广泛的知识提供建议或见解,从历史事实到科学概念等等。
  • 定制化:该方法可根据各种应用中的特定用户需求或偏好进行轻松定制。无论是根据用户对艺术品的口味提供建议,还是根据学生的学习水平提供教育内容,系统都可以适应性地提供个性化体验。

总的来说,GPT-4 Vision + RAG的结合方法提供了一个强大而灵活的解决方案,适用于各种与时尚相关的应用,充分利用了生成式和检索式AI技术的优势。

环境设置

首先,我们将安装必要的依赖项,然后导入库并编写一些后面将使用的实用函数。

class EmbeddingMatcher:
    def __init__(self, embeddings_df):
        self.embeddings_df = embeddings_df
 
    def match(self, query, num_results=5):
        # Convert the query to embeddings
        query_embedding = get_embeddings([query])[0]
 
        # Calculate the cosine similarity between the query embedding and all embeddings in the dataset
        embeddings = np.array(self.embeddings_df['embeddings'].tolist())
        similarities = np.dot(embeddings, query_embedding) / (np.linalg.norm(embeddings, axis=1) * np.linalg.norm(query_embedding))
 
        # Get the indices of the top matching embeddings
        top_indices = np.argsort(similarities)[::-1][:num_results]
 
        # Get the corresponding rows from the dataset
        top_matches_df = self.embeddings_df.iloc[top_indices]
 
        return top_matches_df

Now we can create an instance of the EmbeddingMatcher class and use it to find matching embeddings for a given query. The match method takes the query and the number of results to return. It calculates the cosine similarity between the query embedding and all embeddings in the dataset, sorts the similarities in descending order, and returns the top matching rows from the dataset.

Example Usage

matcher = EmbeddingMatcher(styles_df)
query = "blue jeans"
 
top_matches = matcher.match(query)
print(top_matches)

This will print the top matching rows from the dataset that contain embeddings similar to the query "blue jeans". You can modify the query and num_results parameters to search for different queries and control the number of results returned.

Note: In order to use this matching algorithm, you need to have the styles_df DataFrame with the embeddings column containing the pre-computed embeddings for the dataset. If you haven't generated the embeddings yet, please refer to the previous section on how to generate the embeddings. 在本部分中,我们将开发一个余弦相似度检索算法,在我们的数据框中找到相似的项。我们将使用我们自定义的余弦相似度函数来实现这个目的。虽然sklearn库提供了一个内置的余弦相似度函数,但其SDK的最新更新导致了兼容性问题,促使我们实现自己的标准余弦相似度计算。

如果您已经设置了一个向量数据库,您可以跳过此步骤。大多数标准数据库都配有自己的搜索函数,这简化了本指南中概述的后续步骤。然而,我们的目标是证明匹配算法可以根据特定要求进行定制,例如特定的阈值或指定返回的匹配数。

find_similar_items函数接受四个参数:

  • embedding:我们要查找匹配项的嵌入。
  • embeddings:要搜索以找到最佳匹配项的嵌入列表。
  • threshold(可选):此参数指定匹配项被视为有效的最低相似度得分。较高的阈值会导致更接近(更好)的匹配项,而较低的阈值则允许返回更多的项,尽管它们可能与初始embedding的匹配程度不太接近。
  • top_k(可选):此参数确定要返回的超过给定阈值的项的数量。这些将是所提供的embedding的得分最高的匹配项。
def cosine_similarity_manual(vec1, vec2):
    """计算两个向量之间的余弦相似度。"""
    vec1 = np.array(vec1, dtype=float)
    vec2 = np.array(vec2, dtype=float)
 
    dot_product = np.dot(vec1, vec2)
    norm_vec1 = np.linalg.norm(vec1)
    norm_vec2 = np.linalg.norm(vec2)
    return dot_product / (norm_vec1 * norm_vec2)
 
 
def find_similar_items(input_embedding, embeddings, threshold=0.5, top_k=2):
    """基于余弦相似度找到最相似的项。"""
    
    # 计算输入嵌入和所有其他嵌入之间的余弦相似度
    similarities = [(index, cosine_similarity_manual(input_embedding, vec)) for index, vec in enumerate(embeddings)]
    
    # 过滤掉低于阈值的相似度
    filtered_similarities = [(index, sim) for index, sim in similarities if sim >= threshold]
    
    # 根据相似度得分对过滤后的相似度进行排序
    sorted_indices = sorted(filtered_similarities, key=lambda x: x[1], reverse=True)[:top_k]
 
    # 返回得分最高的前k个最相似的项
    return sorted_indices
def find_matching_items_with_rag(df_items, item_descs):
   """使用余弦相似度找到每个描述最相似的项。"""
   
   # 从DataFrame中选择嵌入。
   embeddings = df_items['embeddings'].tolist()
 
   
   similar_items = []
   for desc in item_descs:
      
      # 生成输入项的嵌入
      input_embedding = get_embeddings([desc])
    
      # 根据余弦相似度找到最相似的项
      similar_indices = find_similar_items(input_embedding, embeddings, threshold=0.6)
      similar_items += [df_items.iloc[i] for i in similar_indices]
    
   return similar_items

分析模块

在此模块中,我们利用 gpt-4-vision-preview 来分析输入的图像并提取重要特征,如详细描述、风格和类型。分析是通过一个简单的 API 调用完成的,我们在调用中提供图像的 URL,要求模型识别相关特征。

为了确保模型返回准确的结果,我们在提示中使用了特定的技术:

  1. 输出格式规范:我们指示模型返回一个预定义结构的 JSON 块,包括:

    • items(str[]):一个字符串列表,每个字符串代表一件服装的简洁标题,包括风格、颜色和性别。这些标题与我们原始数据库中的productDisplayName属性非常相似。
    • category(str):最能代表给定项的类别。模型从原始风格数据框中存在的所有唯一articleTypes列表中进行选择。
    • gender(str):一个标签,指示该项适用于的性别。模型从选项 [Men, Women, Boys, Girls, Unisex] 中进行选择。
  2. 清晰简洁的指令

    • 我们清楚地指示了项标题应包含的内容以及输出格式应该是什么样子。输出应为 JSON 格式,但不包含模型响应通常包含的json标记。
  3. 一次完成示例

    • 为了进一步明确预期的输出,我们向模型提供了一个示例输入描述和相应的示例输出。虽然这可能增加了使用的标记数量(从而增加了调用的成本),但它有助于引导模型,并导致更好的整体性能。

通过遵循这种结构化方法,我们旨在从 gpt-4-vision-preview 模型中获得精确而有用的信息,以进行进一步的分析和集成到我们的数据库中。

def analyze_image(image_base64, subcategories):
    response = client.chat.completions.create(
        model=GPT_MODEL,
        messages=[
            {
            "role": "user",
            "content": [
                {
                "type": "text",
                "text": """给定一张服装的图像,分析该服装并生成一个包含以下字段的 JSON 输出:"items"、"category" 和 "gender"。
                           使用您对时尚趋势、风格和性别偏好的理解,为如何搭配这件服装提供准确和相关的建议。
                           "items"字段应该是一个与图片中的服装搭配良好的服装标题的列表。每个项应该代表包含了该项的风格、颜色和性别的服装的标题。"""

该markdown文件的中文翻译:

选择category必须在以下类型列表中进行:{subcategories}。
选择gender必须在以下列表中进行:[Men, Women, Boys, Girls, Unisex]
不要包含图片项的描述。不要在输出中包含```json```标签。

示例输入:表示一件黑色皮夹克的图片。

示例输出:{"items": ["修身的白色女T恤", "白色帆布鞋", "女士黑色紧身牛仔裤"], "category": "夹克", "gender": "女士"}
返回需要描述的特征
```python
def analyze_image(image_base64, subcategories):
    request_payload = {
        "inputs": [
            {
                "type": "image",
                "image": {
                    "base64": image_base64,
                },
            },
            {
                "type": "prompt",
                "prompt": "Translate the following English description to Chinese:\n\nThe category needs to be chosen between the types in this list: {subcategories}.\nYou have to choose between the genders in this list: [Men, Women, Boys, Girls, Unisex]\nDo not include the description of the item in the picture. Do not include the ```json ``` tag in the output.\n\nExample Input: An image representing a black leather jacket.\n\nExample Output: {\"items\": [\"Fitted White\n\nWomen's T-shirt\", \"White Canvas Sneakers\", \"Women's Black Skinny Jeans\"], \"category\": \"Jackets\", \"gender\": \"Women\"}\n\"",
            },
            {
                "type": "output",
                "output": {
                    "log_level": "quiet",
                },
            },
        ],
    }
    response = openai.ChatCompletion.create(
        model="gpt-4.0-turbo",
        messages=request_payload['inputs'],
        max_tokens=300,
    )
    features = response.choices[0].message.content
    return features

使用示例图片测试提示

为了评估提示的效果,让我们从我们的数据集中加载并测试它使用一些图像选择。我们将使用来自"data/sample_clothes/sample_images"文件夹的图像,确保有各种风格、性别和类型。这是所选择的样本:

  • 2133.jpg:男士衬衫
  • 7143.jpg:女士衬衫
  • 4226.jpg:休闲男士印花T恤

通过使用这些不同的图像测试提示,我们可以评估它准确分析并提取不同类型服装和配饰的相关特征的能力。

我们需要一个将.jpg图像编码为base64的实用函数

import base64
 
def encode_image_to_base64(image_path):
    with open(image_path, 'rb') as image_file:
        encoded_image = base64.b64encode(image_file.read())
        return encoded_image.decode('utf-8')
# 设置图像路径并选择一个测试图像
image_path = "data/sample_clothes/sample_images/"
test_images = ["2133.jpg", "7143.jpg", "4226.jpg"]
 
# 将测试图像编码为base64
reference_image = image_path + test_images[0]
encoded_image = encode_image_to_base64(reference_image)
# 从DataFrame中选择唯一的子类别
unique_subcategories = styles_df['articleType'].unique()
 
# 分析图像并返回结果
analysis = analyze_image(encoded_image, unique_subcategories)
image_analysis = json.loads(analysis)
 
# 显示图像和分析结果
display(Image(filename=reference_image))
print(image_analysis)

接下来,我们处理图像分析的输出,并使用它来过滤和显示与我们的数据集匹配的项。以下是代码的详细解释:

  1. 提取图像分析结果:我们从image_analysis字典中提取物品描述、类别和性别。

  2. 过滤数据集:我们将styles_df数据帧过滤,只包含与图像分析中的性别(或无性别)匹配且不属于与分析图像相同类别的物品。

  3. 查找匹配的物品:我们使用find_matching_items_with_rag函数在过滤后的数据集中查找与从分析图像提取的描述匹配的物品。

  4. 显示匹配的物品:我们创建一个HTML字符串来显示匹配物品的图像。我们使用物品ID构建图像路径,并将每个图像附加到HTML字符串中。最后,我们使用display(HTML(html))在笔记本中渲染图像。

此单元格有效地演示了如何使用图像分析的结果来过滤数据集并可视化显示与分析图像特征相匹配的物品。

# 从分析中提取相关特征
item_descs = image_analysis['items']
item_category = image_analysis['category']
item_gender = image_analysis['gender']
 
 
# 过滤数据,只查找与分析图像的性别(或无性别)匹配且不同类别的项
filtered_items = styles_df.loc[styles_df['gender'].isin([item_gender, 'Unisex'])]
filtered_items = filtered_items[filtered_items['articleType'] != item_category]
print(str(len(filtered_items)) + " 剩余项")
 
# 基于输入项描述找到最相似的项
matching_items = find_matching_items_with_rag(filtered_items, item_descs)
 
# 显示匹配的项(对于图像分析的每个描述,这将显示2个项)
html = ""
paths = []
for i, item in enumerate(matching_items):
    item_id = item['id']
        
    # 图像文件的路径
    image_path = f'data/sample_clothes/sample_images/{item_id}.jpg'
    paths.append(image_path)
    html += f'<img src="{image_path}" style="display:inline;margin:1px"/>'
 
# 以提醒我们搜索的内容的方式打印匹配的项描述
print(item_descs)
# 显示图像
display(HTML(html))

守护栏

在使用大型语言模型(LLM)(如GPT-4V)时,“守护栏”(guardrails)指的是旨在确保模型的输出保持在所需的参数或范围内的机制或检查。这些守护栏对于保持模型的输出质量和相关性非常重要,特别是在处理复杂或微妙的任务时。

守护栏的作用如下:

  1. 准确性:它们有助于确保模型的输出准确且与提供的输入相关。
  2. 一致性:它们在处理类似或相关的输入时保持模型的响应一致性。
  3. 安全性:它们防止模型生成有害、冒犯或不恰当的内容。
  4. 上下文相关性:它们确保模型的输出在特定任务或领域的语境中是相关的。 在我们的案例中,我们使用GPT-4V分析时尚图像并提供与原始服装相辅相成的物品建议。为了实施防护措施,我们可以优化结果:在从GPT-4V获取最初的建议之后,我们可以将原始图像和建议的物品发送回模型中。然后,我们可以要求GPT-4V评估每个建议的物品是否确实适合原始服装。

这使得模型有能力根据反馈或附加信息进行自我校正和调整。通过实施这些防护措施并启用自我纠正,我们可以增强模型在时尚分析和推荐领域的输出可靠性和实用性。

为了实现这一点,我们编写了一个提示,要求LLM对于建议的物品是否与原始服装相匹配进行简单的“是”或“否”回答。这种二元回答有助于简化优化过程,并确保模型提供清晰和可操作的反馈。

def check_match(reference_image_base64, suggested_image_base64):
    response = client.chat.completions.create(
        model=GPT_MODEL,
        messages=[
            {
            "role": "user",
            "content": [
                {
                "type": "text",
                "text": """您将获得两幅不同服装项目的图片。
                            您的目标是判断这两个图像中的物品是否适合一起穿搭。
                            第一幅图像是参考物品(用户试图与另一个物品进行搭配的物品)。
                            您需要决定第二个物品是否与参考物品搭配得很好。
                            您的回答必须是一个包含以下字段的JSON输出: "answer", "reason"。
                            "answer"字段必须是"是"或"否"之一,取决于您认为这些物品是否能很好地搭配在一起。
                            "reason"字段必须是您决策的简短解释,不包括两幅图像的描述。
                            在输出中不要包含```json ```标签。
                           """,
                },
                {
                "type": "image_url",
                "image_url": {
                    "url": f"data:image/jpeg;base64,{reference_image_base64}",
                },
                },
                {
                "type": "image_url",
                "image_url": {
                    "url": f"data:image/jpeg;base64,{suggested_image_base64}",
                },
                }
            ],
            }
        ],
        max_tokens=300,
    )
    # 从响应中提取相关特征
    features = response.choices[0].message.content
    return features

最后,让我们确定上述识别出的哪些物品真正适合这个服装。

# 选择生成图像的唯一路径
paths = list(set(paths))
 
for path in paths:
    # 将测试图像编码为base64
    suggested_image = encode_image_to_base64(path)
    
    # 检查物品是否匹配
    match = json.loads(check_match(encoded_image, suggested_image))
    
    # 显示图像和分析结果
    if match["answer"] == 'yes':
        display(Image(filename=path))
        print("物品匹配!")
        print(match["reason"])

我们可以观察到,初始潜在物品列表已经进一步优化,得到了更加精选的选择,与服装相符。此外,模型提供了为什么认为每个物品是一个好匹配的解释,为决策过程提供了有价值的见解。

回顾

在本教程中,我们探索了将GPT-4与Vision和其他机器学习技术应用于时尚领域。我们演示了如何分析服装物品图像,提取相关特征,并利用这些信息找到与原始服装相配的物品。通过实施防护措施和自我修正机制,我们优化了模型的建议,以确保其准确性和上下文相关性。

这种方法在现实世界中有几个实际用途,包括:

  1. 个性化购物助手:零售商可以使用这项技术向客户提供个性化的服装推荐,增强购物体验,提高客户满意度。
  2. 虚拟衣橱应用:用户可以上传自己的服装物品图像,创建虚拟衣橱,并获得与现有物品相匹配的新物品建议。
  3. 时尚设计与造型:时尚设计师和造型师可以使用这个工具尝试不同的组合和风格,简化创作过程。

然而,需要牢记的一点是成本。使用LLMs和图像分析模型可能会产生成本,特别是如果使用频繁。重点考虑实施这些技术的成本效益是很重要的。gpt-4-vision-preview的价格为每1000个令牌0.01美元。对于一张256像素x 256像素的图像,这相当于0.00255美元。

总的来说,这个指南为时尚与人工智能的交叉领域的进一步探索和发展奠定了基础,为更个性化和智能的时尚推荐系统打开了大门。

结论

GPT-4在图像处理和生成方面的拓展标志着人工智能发展的重要里程碑。通过理解如何利用GPT-4的视觉能力,用户可以利用人工智能的力量以前无法想象的方式创建和分析图像。无论是用于创造性、教育性还是分析性的目的,GPT-4为将视觉内容整合到数字世界中打开了新的可能性,增强了内容的创作和理解能力。

Anakin AI - The Ultimate No-Code AI App Builder