使用 Grok 从时尚图片中提取结构化数据:🤖 + 🤵♂️ → 📄
想象一下:您正在经营一家在线服装店。新库存上架,1000件新品,从时尚西装到舒适毛衣。您的团队激动不已……直到标签噩梦开始。有人必须仔细查看每一张图片,记下“黑色细条纹西装”或“红色波点连衣裙”,并祈祷他们不会把“海军蓝”和“午夜蓝”搞混。这项工作细致、耗时且昂贵。
为什么从图像中提取标签/元数据很重要?
为什么要费心打标签?这归结为基本原因:标签是让在线零售顺畅运行的关键。顾客搜索“黑色西装”或“波点连衣裙”,期望立即获得相关的结果。没有标签?他们就找不到想要的东西。标签不一致?他们可能会转向竞争对手。跳过标签,不仅浪费时间,销售额、相关性和顾客好感度也会受到影响。标签不是可有可无的,而是必不可少的。
现在想象一下另一方面:如果您可以使用 AI 处理这些图像,并在几秒钟内获得像这样的清晰结构化数据,会怎么样?
完全自动化、快速且智能,这就是 Grok 发挥作用的地方。xAI 的多模态强大模型,配备视觉和语言能力,非常适合从图像中提取结构化数据。
在这本食谱中,我们将打开 服装属性数据集,并释放 Grok 来完成繁重的工作。最后,您将看到如何自动化从图像中提取结构化数据的过程,衡量性能甚至自定义您提取的数据。
目录
探索数据集
我们使用的数据集是服装属性数据集,这是一个开源集合,包含 1,000 多张穿着各种时尚服装的人类图片,可在 kaggle 上免费获取。图片附带了描述每张图片中存在的属性的真实标签。原始数据集以矩阵形式提供这些属性,但我们已将它们转换为 JSON,以便在此食谱中更易于使用。
正如数据集的 README 中所强调的,真实属性是通过使用六名付费人工标注员获得的。对于某些属性,真实标签为“未知”,这意味着六名人工标注员无法就该属性达成一致。
让我们来看一个示例图像及其附带的真实属性,您可以更改下面函数的输入,以探索不同的图像、属性对,从而了解我们正在处理的数据。
在这里我们可以看到,数据集包含各种不同的属性,描述了照片中存在的颜色、图案以及领子和门襟等结构特征。如果这是一个电子商务应用程序,这些将为搜索、过滤和库存分类等功能提供支持。
我们将使用 Grok 自动为给定照片提取这些属性。此外,由于此数据集包含真实属性,我们可以对我们的方法进行评估(evals),以了解我们系统的性能。此外,这些评估可以揭示预期结果与实际结果之间的差异,作为诊断工具。这使得我们可以有针对性地调查意外结果,从而系统地改进我们的方法,而不是依赖猜测。
您可能会注意到,尤其是在包含更复杂服装的照片中,属性/模式相当简单和模糊。例如,这里的颜色和图案属性没有指定它们指的是哪些项目。也可能在同一张照片中,不同的服装物品具有不同的颜色和图案。
但别担心,稍后我们将展示如何使用 Grok 将数据提取到新的自定义模式中,该模式更加灵活,并解决了这些缺点。
图像理解 API 快速回顾
让我们从一个简单的提示开始,向 grok-2-vision-latest
询问它在图片中看到了什么。
注意:确保您已导出名为
XAI_API_KEY
的环境变量,或在本文库根目录下的.env
文件中设置该变量,如果您想运行 Jupyter Notebook 的话。如果您还没有 API 密钥,请访问我们的 控制台 获取。
不错。仅仅通过这个非常基本的提示,Grok 就给出了照片的描述性回答,包括关于男士服装的详细信息,甚至指出了领带上的图案,所有这些都没有被明确告知要这样做。让我们改进我们的提示,以提取数据集中提供的属性。
结构化数据提取
在这里,我们设计了一个提示,要求 Grok 分析提供的图像,并具体提取我们数据集中感兴趣的属性。最后,我们要求 Grok 输出与我们属性模式匹配的 JSON 响应,使用 XML 标签以确保只返回 JSON 数据。让我们试一试!
好的,看起来我们正在获取一些类似的数据。然而,让我们对评估方法更科学一些,并编写一些适当的评估代码。我们将对一批图像运行上述提示,然后将 Grok 提取的属性与真实属性进行比较。这将量化 Grok 识别每个属性的准确性,并突出哪些属性带来了挑战或产生了不一致的结果。
评估
完整数据集包含 1856 张图像,但对于本食谱,我们将只处理 250 张。让我们利用异步 API 并发处理图像,加快我们的提取过程。
使用异步 API 并发处理图像
首先,让我们编写一个异步版本的 analyze_image
函数,它将利用 AsyncOpenAI
客户端的一个实例。然后,我们可以使用 asyncio
并发调用此函数,以最大程度地减少处理大量图像所需的时间。
让我们使用新异步函数处理单张图像,以确保其正常工作。
让我们使用新的异步方法创建一个函数来批量处理图像,其中包含一个 max_in_flight_requests
参数来限制并发请求。您应该调整此参数以匹配您的层级速率限制,您可以通过 xAI 控制台 上的模型页面查看 grok-2-vision
和其他模型的速率限制。
计算我们的评估指标
现在我们已经使用 Grok(我们的预测)收集了提取的属性,我们将它们与数据集中的真实属性进行比较,并计算诸如 准确度、精确度、召回率 和 F1 分数 等指标。我们还将展示每个属性的 混淆矩阵。最后,如果存在不匹配,我们将打印图像 ID 和 Grok 预测与真实标签之间的差异,以便我们可以进一步调查该特定图像、属性对。
注意:下面的指标计算排除了真实属性标签值为“未知”时的比较/计算。在下面的代码中,给定属性的有效样本是那些标签不为“未知”的样本。
Grok 在大多数属性上表现出色,在性别、袖长和领带检测方面都达到了高准确率,这表明它在清晰、独特的视觉特征方面具有优势。然而,Grok 在门襟和领口等更模糊或复杂的属性上表现不佳。让我们深入了解 Grok 预测与真实情况不同的图像。
错误分析和查看我们的数据
尽管在性别方面得分很高,但仍有一些图像中 Grok 的预测与真实情况不同。让我们看看其中一些图像。
啊哈!我们可以看到在这些图片中男女都在照片中,但是我们要求 Grok 使用的模式只指定了一种性别。所以 Grok 的预测与真实标签不同是有道理的,因为它只是简单地选择了与真实标签相反的性别。因此,Grok 本身并没有错,更多的情况是我们对数据模式做了一些假设(每张照片只有一种性别),而这些假设被证明是错误的。
让我们对我们发现准确性较低的其他一些属性(例如领口属性)也进行同样的操作。
本指南中的所有图像都经过面部模糊处理以保护隐私,这在原始服装属性数据集中是不存在的,其中面部是可见的。这种面部模糊通常会遮挡领口区域,使得 Grok 难以准确识别 V 领或圆领等形状,尤其是在主体距离较远或领口被姿势或衣领部分遮挡的情况下。如果我们查看图像,例如 7、10 和 12,我们可以看到面部模糊确实遮挡了领口,很可能干扰了 Grok 准确分类的能力。
让我们比较一些颜色属性中表现不佳的不匹配项,看看是否能发现其他见解。
上图是 Grok 预测图像中存在红色而真实标签中没有的情况。这些图像的共同点是图像中**确实**出现了红色,但**不是**主要或中心服装的颜色。例如,第一张图片中男士的围巾——这可能导致我们假设人工标注员可能有明确指示,只标注主要服装的颜色。因此,在这种情况下,Grok 实际上做得很好,因为所有这些图像确实都包含红色。
最后,让我们对蓝色也做同样的处理。
上图显示了 Grok 检测到蓝色存在,而真实标签没有显示蓝色的情况,在所有这些图像中我们都可以看到蓝色(即使它非常微小)。这触及到一个重要的细节——我们用来评估模型性能的评估指标与现实世界中期望的结果紧密校准非常重要。在这种情况下,由于我们为这个食谱对这个在线数据集进行了一些改装,真实属性与我们的期望有所不同。
这项工作的意义,即手动检查我们的数据并比较实际结果与预期结果之间的差异,怎么强调都不过分,尤其是在生产环境中部署 GenAI/LLM 驱动的软件时。这个过程暴露了我们一个天真的假设:我们的数据集中每张照片只包含一个人。深入研究通过错误分析发现的这些失败案例至关重要。它不仅揭示了诸如多人、遮挡等隐藏的边缘情况,而且还揭示了我们方法中存在的错误假设。通过系统地研究我们的系统在何处以及为何出错,我们可以优先修复、完善我们的模型、提示和方法来处理现实世界的复杂性,并构建更健壮、更可靠的软件,而不是依赖过于简化的期望。
所以,查看我们的数据揭示了我们用来提取属性的模式的一些缺点
- 它没有考虑到单张图片中的多个人
- 它似乎无法很好地处理多种颜色
- 它没有明确定义哪些颜色和图案归属于哪件衣物。
让我们创建一个自定义模式,以有效地解决所有这些挑战。我们的方法将首先使用 Pydantic 设计一个自定义数据模式/模型,以定义清晰的数据结构。然后,我们将利用 Grok 的结构化输出功能,根据自然语言响应填充此模型。该过程将涉及两次 API 调用:首先,我们将使用 Grok Vision 分析图像并生成具有某些固有结构的自然语言描述;其次,我们将该输出传递给常规 Grok 模型,它将对其进行精炼并使用结构化响应功能将其格式化为我们的 Pydantic 模型。这样,我们既获得了视觉分析的自然语言灵活性,又获得了最终输出中结构化数据的精确性。让我们看看这在实践中是如何运作的。
使用 Pydantic 和结构化输出 API 进行自定义模式解析
我们设计的 Pydantic 模型通过提供更健壮、更详细的结构克服了我们原始模式的局限性。我们创建了一个包含相关属性的 ClothingItem
模型,实现了对单个服装部件更细粒度的分析。值得注意的是,该模型支持每个物品多种颜色,增加了灵活性。我们还引入了一个 Person
模型,它将一个人与他们所穿的多个服装物品关联起来,我们还在人物层面引入了一些全新的属性,例如 age_group
、posture
和 hair_presence
。最后,在顶层,我们有 AnnotatedImage
模型,它封装了一个或多个人,将所有内容整合到图像内容的全面表示中。
太棒了,Grok 成功识别了图像中的两个主题以及他们的性别、服装细节,包括单个物品的颜色和图案。它还准确地提取了我们新添加的属性,例如姿势和年龄组。令人印象深刻的是,我们已经将一张图像作为输入,并在几秒钟内将其转换为结构化、分层的 Pydantic 模型。通过以这种格式组织数据,执行各种下游任务变得轻而易举,例如将其保存到数据库,进行详细的时尚趋势分析,或启用自动化标记和分类以进行进一步处理。
由于我们没有为这个新模式明确标记数据,因此我们无法在不首先收集这些数据的情况下对其进行评估。但是,我们鼓励您在不同的图像上测试上述流程,以查看其性能,尝试调整提示和 Pydantic 模型,看看您还可以提取哪些其他酷炫内容。
结论
至此,我们对本指南中一些强大工具和技术的探索就结束了!我们已经逐步介绍了如何使用 Grok Vision 从图像中提取结构化数据,利用 AsyncClient
高效处理大量图像,并深入研究使用真实标签进行评估,以揭示模型在何处表现出色,在何处遇到困难,并突出边缘情况和我们对数据的假设。通过将 grok-2-vision
与 grok-2
和结构化输出相结合,我们还了解了如何将复杂数据转换为根据您需求定制的自定义模式。
xAI 团队正在努力通过每次更新改进这些功能,我们很高兴看到您将用它们构建什么。请务必查看我们的 文档页面,了解有关使用 xAI API 开发的所有详细信息!