电脑中有大量手机照片,要批量删除其中相似度高的,首先得有一个分析照片相似度的算法和模型。CLIP(Contrastive Language-Image Pre-Training)模型是由OpenAI在2021年发布的一种多模态预训练神经网络,旨在通过对比学习方法将图像和文本进行联合训练,从而实现对图像和文本之间关联性的理解和匹配。CLIP模型的核心思想是通过对比学习(Contrastive Learning)来学习大量的图像和对应的文本描述,形成一个能够理解两者之间关联的通用模型。具体来说,CLIP采用了两个独立的编码器:一个用于处理文本,另一个用于处理图像。这两个编码器分别提取文本和图像特征,并基于比对学习让模型学习到文本-图像的匹配关系。
在deepseek中输入提示词:
一步步思考,写一个Python脚本,完成批量删除相似照片的功能,具体步骤如下:
打开文件夹:F:\dpic;
读取文件夹里面所有的图像文件;
用CLIP提取文件夹所有图像的特征,然后计算它们的余弦相似度;
相似高的2张以上图片,只保留其中一个最佳图片,删除其余图片;
设置相似度阈值> 0.87
注意:每一步都要输出信息到屏幕上
源代码:
import os
from PIL import Image
import numpy as np
import torch
from transformers import CLIPProcessor, CLIPModel
from sklearn.metrics.pairwise import cosine_similarity
# 定义文件夹路径
folder_path = "F:\\dpic"
# 读取文件夹中的所有图像文件
image_files = [f for f in os.listdir(folder_path) if f.endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.JPG'))]
print(f"Found {len(image_files)} image files.")
# 加载CLIP模型和处理器
model_name = "openai/clip-vit-base-patch32"
model = CLIPModel.from_pretrained(model_name)
processor = CLIPProcessor.from_pretrained(model_name)
# 加载图像并提取特征
images = []
for file in image_files:
img_path = os.path.join(folder_path, file)
try:
img = Image.open(img_path)
inputs = processor(images=img, return_tensors="pt")
with torch.no_grad():
image_features = model.get_image_features(**inputs)
images.append((file, image_features.cpu().numpy().squeeze()))
except Exception as e:
print(f"Error loading image {file}: {e}")
print(f"Loaded {len(images)} images.")
# 提取图像特征
features = [img[1] for img in images]
# 计算余弦相似度
similarity_matrix = cosine_similarity(features)
# 删除相似度高的多余图像
to_delete = set()
for i in range(len(similarity_matrix)):
for j in range(i + 1, len(similarity_matrix)):
if similarity_matrix[i][j] > 0.87: # 设置相似度阈值
to_delete.add(images[j][0])
for file in to_delete:
file_path = os.path.join(folder_path, file)
try:
os.remove(file_path)
print(f"Deleted {file}")
except Exception as e:
print(f"Error deleting {file}: {e}")
print("Done.")
程序运行结果:
if similarity_matrix[i][j] > 0.87: # 这里设置相似度阈值,如果觉得不满意,可以调高或者调低。