四时宝库

程序员的知识宝库

超级干货以图搜图实现

一、应用场景

电商平台

商品搜索:用户上传商品图片,系统通过图片识别技术找到相似或相同的商品,提高购物体验。

自动标签:通过图片内容自动生成标签,提升商品管理效率。

社交媒体

相似内容推荐:通过分析用户上传的图片,推荐相似的内容或用户,提高用户粘性。

版权保护:识别盗版图片,保护原创作者的权益。

艺术领域

艺术品鉴定:通过上传艺术品图片,自动匹配数据库中的相关信息,提供鉴定服务。

艺术品推荐:根据用户上传的艺术品图片,推荐相似风格的作品,提升用户体验。

安全监控

人员识别:通过监控视频中的图像,快速识别人员,提高安全性。

车辆识别:识别监控视频中的车辆,提高交通管理效率。


干货来了:

图像特征提取, 落地。


def extract_features(img_path):
    """
    从指定路径加载图像,进行预处理,然后通过模型提取特征向量
    :param img_path: 图像路径
    :return: 特征向量
    """
    img = image.load_img(img_path, target_size=(1024, 1024))
    img_data = image.img_to_array(img)
    img_data = np.expand_dims(img_data, axis=0)
    img_data = preprocess_input(img_data)
    features = model.predict(img_data)
    return features.flatten()

为了再百万记录中快速的查询到所需的图片。我们在提前特征的时候同时记录索引

# 初始化 FAISS 索引(使用内积作为余弦相似度)
dimension = 2048  # ResNet50 的输出维度
index = faiss.IndexFlatIP(dimension)  # 使用内积作为相似度度量
# 保存索引
faiss.write_index(index, 'image_features_index.faiss')

通过上传的图片特征进行,图片特征比对,实现以图搜图。

# 开始比对计时
start_time = time.time()

# 提取新图像的特征向量
new_features = extract_features(new_img_path)
new_features = new_features / np.linalg.norm(new_features)  # 对新图像的特征进行归一化

# 进行相似性搜索,返回 k 个最近邻居
k = 1
D, I = index.search(np.array([new_features]), k)

# 结束比对计时
end_time = time.time()

# 计算比对时间
search_time = end_time - start_time

# 打印最近的 k 个图像名称和相似度(内积)
for i, idx in enumerate(I[0]):
    img_name = list(image_features.keys())[idx]
    similarity = D[0][i]
    print(f'Image: {img_name}, Similarity: {similarity}')

print(f"图像比对完成,耗时:{search_time:.2f} 秒")


本次我们采用的模型为ResNet50

# 初始化 ResNet50 模型
model = ResNet50(weights='imagenet', include_top=False, pooling='avg')

阅读是一种习惯,点赞是一种美德。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接