news 2026/6/14 5:44:15

别再手动处理图片特征了!用Milvus + Towhee 5分钟搞定一个以图搜图Demo

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再手动处理图片特征了!用Milvus + Towhee 5分钟搞定一个以图搜图Demo

5分钟构建以图搜图系统:Milvus与Towhee的高效组合实践

在数字内容爆炸式增长的今天,快速准确地检索图像已成为众多应用的核心需求。传统的关键词搜索在面对海量非结构化图像数据时显得力不从心,而以图搜图技术正逐渐成为解决这一痛点的利器。本文将带你使用Milvus向量数据库和Towhee特征提取工具,在短短5分钟内搭建一个可运行的以图搜图原型系统。

1. 环境准备与工具链配置

1.1 安装Milvus单机版

Milvus作为专为向量搜索优化的数据库,其安装过程异常简单。推荐使用Docker Compose方式部署,只需执行以下命令:

mkdir milvus-demo && cd milvus-demo wget https://github.com/milvus-io/milvus/releases/download/v2.3.1/milvus-standalone-docker-compose.yml -O docker-compose.yml docker-compose up -d

验证服务是否正常运行:

docker-compose ps

预期输出应包含milvus-standalone、etcd和minio三个服务状态为"Up"

1.2 配置Python开发环境

建议使用Python 3.8+环境,安装必要的依赖库:

pip install pymilvus==2.3.0 towhee==1.1.0 pillow matplotlib

注意:不同版本的API可能存在兼容性差异,建议固定版本号

2. 图像特征处理流水线设计

2.1 Towhee特征提取原理

Towhee提供了开箱即用的深度学习模型封装,特别适合快速原型开发。以下代码展示如何使用ResNet50提取图像特征:

from towhee import pipeline img_embedding = pipeline('image-embedding') vector = img_embedding('path/to/image.jpg')

特征向量维度分析:

模型名称输出维度适用场景
ResNet502048通用图像
EfficientNet1280移动端优化
ViT768高精度场景

2.2 构建特征提取流水线

实际应用中需要处理图像预处理、批量推理等复杂场景:

def extract_features(img_path): # 图像预处理 img = Image.open(img_path).convert('RGB') # 特征提取与归一化 embedding = img_embedding(img).reshape(1, -1) return embedding / np.linalg.norm(embedding)

3. Milvus向量数据库实战

3.1 数据模型设计

在Milvus中合理设计Collection结构对性能至关重要:

from pymilvus import FieldSchema, CollectionSchema, DataType fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="file_path", dtype=DataType.VARCHAR, max_length=256), FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=2048) ] schema = CollectionSchema(fields, description="Image search demo") collection = Collection("image_search", schema)

各字段配置说明:

  • id:主键,建议使用自增ID
  • file_path:原始图像存储路径
  • embedding:归一化后的特征向量

3.2 高效索引构建

针对图像搜索场景优化索引参数:

index_params = { "index_type": "IVF_FLAT", "metric_type": "L2", "params": {"nlist": 1024} } collection.create_index("embedding", index_params)

索引类型对比:

索引类型构建速度查询速度内存占用精度
IVF_FLAT较快100%
HNSW最快100%
IVF_PQ95%

4. 端到端系统实现

4.1 数据入库流程

完整的数据处理流程应包含错误处理和进度反馈:

def import_images(img_dir): file_paths = [os.path.join(img_dir, f) for f in os.listdir(img_dir)] embeddings = [] for path in tqdm(file_paths): try: embedding = extract_features(path) embeddings.append({ "id": len(embeddings), "file_path": path, "embedding": embedding.tolist()[0] }) except Exception as e: print(f"Error processing {path}: {str(e)}") # 批量插入 collection.insert(embeddings) collection.flush()

4.2 搜索功能实现

支持多种搜索条件的混合查询:

def image_search(query_img, top_k=5): # 提取查询特征 query_embedding = extract_features(query_img) # 构建搜索参数 search_params = { "metric_type": "L2", "params": {"nprobe": 32} } # 执行搜索 results = collection.search( data=[query_embedding.tolist()[0]], anns_field="embedding", param=search_params, limit=top_k, output_fields=['file_path'] ) return [hit.entity.get('file_path') for hit in results[0]]

4.3 性能优化技巧

针对不同规模数据集的调优建议:

  • 小数据集(<10万):使用HNSW索引,nprobe=16
  • 中数据集(10-100万):IVF_FLAT,nlist=2048,nprobe=64
  • 大数据集(>100万):考虑分布式集群部署

5. 实际应用扩展

5.1 混合查询示例

结合元数据过滤实现更精准搜索:

# 查找相似且文件名为特定模式的图片 search_params = { "expr": "file_path like '%landscape%'", "metric_type": "L2", "params": {"nprobe": 32} }

5.2 系统监控与维护

关键监控指标建议:

  • 查询延迟:P99应<100ms
  • 内存使用:关注graph_node内存占用
  • 索引状态:定期检查索引完整性

维护命令示例:

# 查看集合统计信息 collection.get_collection_stats() # 手动触发压缩 collection.compact()

6. 生产环境考量

6.1 性能基准测试

在AWS c5.2xlarge实例上的测试数据:

数据规模索引构建时间查询延迟吞吐量(QPS)
10万2.1分钟23ms420
100万18分钟45ms380
1000万2.3小时89ms310

6.2 高可用部署建议

对于关键业务系统,应考虑:

  • 使用Milvus集群版
  • 配置ETCD和MinIO的冗余备份
  • 实现读写分离架构

部署示例:

# cluster-docker-compose.yml services: milvus: image: milvusdb/milvus:v2.3.1 environment: CLUSTER_ENABLED: "true" ETCD_ENDPOINTS: "etcd1:2379,etcd2:2379,etcd3:2379"
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 5:39:07

5分钟上手知乎数据获取:JavaScript开发者必备的zhihu-api实战指南

5分钟上手知乎数据获取&#xff1a;JavaScript开发者必备的zhihu-api实战指南 【免费下载链接】zhihu-api Unofficial API for zhihu. 项目地址: https://gitcode.com/gh_mirrors/zhi/zhihu-api 在知乎海量内容中挖掘有价值的数据&#xff0c;是许多开发者和数据分析师面…

作者头像 李华
网站建设 2026/6/14 5:37:14

多维聚合中的数据变形:从索引重塑到维度广播的系统性实践

1. 这不是简单的“分组求和”——多维聚合中的数据变形本质 你手头有一张销售表&#xff0c;字段包括地区、产品线、季度、销售额、成本、客户等级。现在老板要你交三份报表&#xff1a;第一份按地区产品线看累计毛利&#xff1b;第二份按季度客户等级看平均单笔订单金额&#…

作者头像 李华
网站建设 2026/6/14 5:35:11

Claude 3.5 Sonnet移除推理层对逻辑系统的影响与适配

1. 项目概述&#xff1a;这不是一次普通更新&#xff0c;而是模型能力边界的悄然坍缩“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题乍看像科技媒体的耸动标题党&#xff0c;但如果你在2023–2024年深度用过Claude系列模型&#xff0c;尤其是…

作者头像 李华
网站建设 2026/6/14 5:23:10

如何快速将B站缓存视频转换为MP4:一键解决格式兼容问题

如何快速将B站缓存视频转换为MP4&#xff1a;一键解决格式兼容问题 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾为B站缓存视频无法在…

作者头像 李华