利用CLIP构建照片记忆应用

在这篇文章中,将探讨如何使用由OpenAI开发的CLIP图像模型来创建一个照片记忆应用。这个应用能够根据特定的主题,如地点、人物或照片中常见的概念,对照片进行分组,并最终将这些照片集合成一个视频,以便与朋友和家人分享。

构建照片记忆应用的步骤

要构建照片记忆应用,将执行以下步骤:

  • 安装所需的依赖项
  • 使用CLIP为文件夹中的每张图片计算嵌入向量
  • 使用CLIP根据文本查询(例如“人物”或“城市”)找到相关图片
  • 编写逻辑将相关图片转换成视频
  • 保存生成的幻灯片

可能会好奇:“什么是嵌入向量?”嵌入向量是图像、文本和其他数据的数值表示,可以比较它们。嵌入向量是本项目的关键:可以通过比较文本和图像嵌入向量来找到与想要制作记忆的主题相关的图片。

在开始构建应用之前,需要安装一些依赖项。运行以下命令来安装将在应用中使用的Python包:

pip install faiss-cpu opencv-python Pillow

(如果计算机支持CUDA GPU,请安装faiss-gpu而不是faiss-cpu

应用将处理一个图片文件夹和一个文本输入。然后,将返回一个包含与文本输入相关的图片的幻灯片。为此,需要计算两种类型的嵌入向量:每张图片的图像嵌入向量和幻灯片主题的文本嵌入向量。

之前编写的两个函数都返回嵌入向量。但还没有编写使用它们的逻辑!接下来,需要计算一个图片文件夹的图像嵌入向量。可以使用以下代码来实现:

index = faiss.IndexFlatL2(512) image_frames = [] for frame in os.listdir("./images"): frame = Image.open("./images/" + frame) embedding = get_image_embedding(frame) index.add(np.array(embedding)) image_frames.append(frame) with open("image_frames.json", "w+"): json.dumps(image_frames) faiss.write_index(index, "index.bin")

这段代码创建了一个“索引”。这个索引将存储所有的嵌入向量。可以使用文本嵌入向量高效地搜索这个索引,以找到幻灯片的图片。

接下来,需要检索幻灯片的图片。可以用一行代码来实现:

query = get_text("san francisco") D, I = index.search(query, 3)

在代码的第一行,调用了之前定义的get_text()函数来检索查询的文本嵌入向量。在这个例子中,查询是“san francisco”。然后,在图像索引中搜索嵌入向量与文本嵌入向量相似的图片。

在开始创建幻灯片之前,需要完成一个额外的步骤:需要找到将用于创建每个幻灯片的图片中最大的宽度和高度值。这是因为需要知道应该以什么分辨率保存视频。

来进行最后一步:创建幻灯片。所有的部分都已就绪。已经找到了与文本查询相关的图片,并计算了将用于幻灯片的分辨率。最后一步是创建一个使用这些图片的视频。

final_frames = [] for i, frame in enumerate(video_frames): if frame.shape[0] < largest_height: difference = largest_height - frame.shape[0] padding = difference // 2 frame = cv2.copyMakeBorder( frame, padding, padding, 0, 0, cv2.BORDER_CONSTANT, value=(0, 0, 0), ) if frame.shape[1] < largest_width: difference = largest_width - frame.shape[1] padding = difference // 2 frame = cv2.copyMakeBorder( frame, 0, 0, padding, padding, cv2.BORDER_CONSTANT, value=(0, 0, 0), ) final_frames.append(frame) video = cv2.VideoWriter( "video1.avi", cv2.VideoWriter_fourcc(*"MJPG"), 20, (largest_width, largest_height) ) for frame in final_frames: video.write(frame) cv2.destroyAllWindows() video.release()

这段代码创建了一个包含想要包含在图像中的所有帧的大列表。这些帧根据之前确定的最大高度和宽度用黑色像素填充。这确保了图片不会被拉伸以适应最大图片的完全相同的分辨率。然后将所有这些帧添加到视频中,并将结果保存到一个名为video.avi的文件中。

CLIP是一个多用途的工具,在计算机视觉领域有许多用途。在本指南中,展示了如何使用CLIP构建照片记忆应用。使用CLIP为文件夹中的所有图片计算了图像嵌入向量。然后将这些嵌入向量保存在索引中。

接下来,使用CLIP计算了一个文本嵌入向量,用它来找到与文本查询相关的图片。在示例中,这个查询是“san francisco”。最后,完成了一些后处理,以确保图片都是相同的大小,并将与查询相关的图片编译成幻灯片。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485