图片相似度识别(相似图片识图)

小编

可以做“图片相似度识别/相似图片识图”,常见有 3 类方案,取决于你要识别的“相似”是哪种:

1. 简单相似:判断是否同一张或轻微改动

适合:去重、找重复图、压缩/裁剪/加水印后的相似图。

方法

- 感知哈希:`pHash / aHash / dHash`

- 比较哈希距离,距离越小越相似

优点

- 快

- 适合海量图片去重

图片相似度识别(相似图片识图)

- 实现简单

缺点

- 对大幅裁剪、换背景、不同角度不太稳

Python 示例

```python

from PIL import Image

import imagehash

img1 = Image.open("1.jpg")

img2 = Image.open("2.jpg")

hash1 = imagehash.phash(img1)

hash2 = imagehash.phash(img2)

distance = hash1 - hash2

print("哈希距离:", distance)

if distance <= 5:

print("非常相似")

elif distance <= 10:

print("较相似")

else:

print("不太相似")

```

安装:

```bash

pip install pillow imagehash

```

2. 语义相似:内容相似、同类图片识别

适合:

- 商品相似图搜索

- 人脸/服装/家具/车辆相似检索

- “这两张图是否表达相近内容”

- 以图搜图

方法

使用深度学习模型提取图片向量,例如:

- CLIP

- ResNet

- EfficientNet

- ViT

- 自训练视觉模型

流程:

```text

图片 → 模型提取特征向量 → 计算余弦相似度 → 得到相似图片

```

相似度计算

常用余弦相似度:

```python

from sklearn.metrics.pairwise import cosine_similarity

sim = cosine_similarity([vector1], [vector2])[0][0]

print(sim)

```

一般可以理解为:

| 相似度 | 含义 |

|||

| 0.90+ | 非常相似 |

| 0.75~0.90 | 较相似 |

| 0.50~0.75 | 有一定相似 |

| <0.50 | 相似度较低 |

3. 局部特征匹配:判断是否同一物体/同一场景

适合:

- 图像被裁剪

- 角度变化

- 局部匹配

- Logo/商品图识别

- 建筑物、海报、包装识别

方法

- SIFT

- ORB

- SURF

- OpenCV 特征点匹配

优点

- 对局部匹配较好

- 可以判断一张图是否包含另一张图的内容

缺点

- 对语义相似不敏感

- 对大规模图库检索不如向量检索方便

推荐方案

如果你只是做重复图检测

用:

```text

pHash + 哈希距离

```

适合快速判断:

```text

原图、压缩图、尺寸变化图、水印图

```

如果你要做“以图搜图”

推荐:

```text

CLIP / ResNet 提取向量 + Milvus/Faiss/Elasticsearch 向量检索

```

整体架构:

```text

图片库

↓

特征提取模型

↓

图片向量

↓

向量数据库 Faiss/Milvus

↓

输入一张图片

↓

检索 TopK 相似图片

```

如果你要做商品相似识别

推荐:

```text

CLIP 或专门训练的商品识别模型 + 向量检索

```

可以支持:

- 同款商品识别

- 相似商品推荐

- 图片去重

- 图片版权检测

- 电商以图搜图

一个简单的 CLIP 图片相似度示例

```python

import torch

import clip

from PIL import Image

from sklearn.metrics.pairwise import cosine_similarity

device = "cuda" if torch.cuda.is_available() else "cpu"

model, preprocess = clip.load("ViT-B/32", device=device)

def get_image_vector(image_path):

image = preprocess(Image.open(image_path)).unsqueeze(0).to(device)

with torch.no_grad():

features = model.encode_image(image)

features = features / features.norm(dim=-1, keepdim=True)

return features.cpu().numpy()[0]

vec1 = get_image_vector("1.jpg")

vec2 = get_image_vector("2.jpg")

score = cosine_similarity([vec1], [vec2])[0][0]

print("图片相似度:", score)

```

大规模相似图片检索方案

如果图片数量很多,例如几十万、几百万张,建议使用:

| 工具 | 用途 |

|||

| Faiss | 本地高性能向量检索 |

| Milvus | 分布式向量数据库 |

| Elasticsearch | 支持向量检索和普通搜索 |

| Qdrant | 轻量向量数据库 |

| Weaviate | 向量数据库 |

推荐架构:

```text

图片上传

↓

生成图片特征向量

↓

存入向量数据库

↓

查询图片生成向量

↓

向量检索

↓

返回最相似图片列表

```

你可以告诉我这几个信息,我可以给你具体实现方案

1. 你是要做哪种?

- 图片去重

- 以图搜图

- 商品相似识别

- 人脸相似识别

- Logo/商标识别

- 版权图片检测

2. 图片数量大概多少?

- 几百张

- 几万张

- 几百万张

3. 你希望用什么语言?

- Python

- Java

- PHP

- Node.js

- Go

4. 是否需要接口形式?

- 上传图片返回相似度

- 上传图片返回相似图片列表

- 批量图片去重

如果你只是想快速实现,我建议从:

```text

pHash 去重 + CLIP 向量相似度

```

这套方案开始。