【免费下载链接】tf_efficientnet_b3.ap_in1k
tf_efficientnet_b3.ap_in1k 是一个基于 EfficientNet-B3 的图像分类模型(ImageNet-1k + AdvProp 对抗训练),它输出的1536 维图像嵌入向量,可以直接用来搭建图片相似度搜索引擎。本文带你快速上手:从理解 1536 维向量,到用几行 Python 代码提取图像嵌入,再完成一个可运行的相似图片搜索 Demo。
一、30秒认识 tf_efficientnet_b3.ap_in1k
这是一款由论文原作者在 TensorFlow 中训练、后移植为 PyTorch 版本的经典图像模型,专为**图像嵌入(Image Embeddings)**与图像分类场景设计。它的核心特点:
| 指标 | 数值 | 说明 |
|---|---|---|
| 参数量 | 12.2 M | 轻量级,消费级显卡甚至 CPU 都能跑 |
| 计算量 | 1.9 GMACs | 推理速度非常快 |
| 输入尺寸 | 300 × 300 | 固定预处理规格 |
| 输出向量 | 1536 维 | 用于相似度检索的核心嵌入 |
| 训练数据 | ImageNet-1k(AdvProp 对抗训练) | 对噪声和扰动更鲁棒 |
💡 "ap_in1k" 的含义:ap = AdvProp(对抗训练),in1k = ImageNet-1k 数据集。对抗训练让提取的特征更稳定,对相似度搜索场景非常友好。
模型细节可参考 README.md#L16-L27。
二、仓库结构:5 个文件各司其职
整个仓库结构非常清晰,上手前建议先了解每个文件的用途:
| 文件 | 作用 |
|---|---|
| README.md | 模型卡:包含分类、特征图提取、图像嵌入三种用法示例 |
| config.json | 模型架构配置:类别数、特征维度、输入规格、归一化参数 |
| configuration.json | 框架声明:pytorch+image-classification任务 |
| model.safetensors | 权重文件(约 47 MB,推荐格式) |
| pytorch_model.bin | 权重文件(约 47 MB,传统格式) |
几个关键配置值得注意(见 config.json#L1-L12):
"num_features": 1536—— 这就是我们做相似度搜索的向量维度"input_size": [3, 300, 300]—— 模型固定吃 300×300 的图片"mean"/"std"均为0.5—— 预处理时的归一化参数(见 config.json#L17-L26)
三、1536 维向量为什么能搜索"相似图片"
核心思想很简单:把每张图片压缩成一个 1536 长的数字列表(向量),内容相似的图片,向量在空间中也靠得更近。
推理流程如下(源码用法见 README.md#L87-L117):
- 图片经 300×300 预处理后输入模型
- 卷积主干提取特征,得到
(1, 1536, 10, 10)的特征图 - 全局平均池化 + 分类头(
pre_logits=True),得到最终的(1, 1536)向量 - 用**余弦相似度(Cosine Similarity)**比较两个向量的夹角,越接近 1 越相似
这样,"找相似图片"就变成了纯粹的向量数学问题,天然适合批量索引和高速检索。
四、三步提取 1536 维图像嵌入
第一步:加载模型(去掉分类头,只保留特征提取能力):
import timm model = timm.create_model( 'tf_efficientnet_b3.ap_in1k', pretrained=True, num_classes=0, # 移除分类层,输出纯嵌入 ) model = model.eval()第二步:自动获取预处理配置(300×300 缩放 + 0.5/0.5 归一化):
import timm.data data_config = timm.data.resolve_model_data_config(model) transforms = timm.data.create_transform(**data_config, is_training=False)第三步:前向推理,拿到向量:
import torch from PIL import Image img = Image.open('photo.jpg').convert('RGB') output = model(transforms(img).unsqueeze(0)) embedding = output.squeeze(0).detach().cpu().numpy() print(embedding.shape) # (1536,)得到(1536,)的 NumPy 数组,这张图片就有了自己的"数字指纹"。
五、快速搭建图片相似度搜索引擎
有了批量提取嵌入的能力,搜索引擎就水到渠成。整体分两个阶段:
🔍 阶段一:建索引(离线,跑一次即可)
import numpy as np # 对图库中每张图片提取嵌入,堆成矩阵 # index: (N, 1536),N 为图片数量 index = np.stack([get_embedding(path) for path in image_paths]) np.save('image_index.npy', index)🚀 阶段二:查询(在线,毫秒级返回)
def search(query_path, index, image_paths, top_k=5): q = get_embedding(query_path) # (1536,) q = q / np.linalg.norm(q) # 归一化 scores = index @ q # 余弦相似度 top = np.argsort(scores)[::-1][:top_k] return [(image_paths[i], float(scores[i])) for i in top]💡 进阶玩法:图片量大到几万张以上时,可以把
image_index.npy导入 FAISS 等向量索引库,用近似最近邻(ANN)把检索压到毫秒级。
完整工作流一览:
1️⃣ 批量提取嵌入 → 2️⃣ 存入向量索引 → 3️⃣ 查询图提嵌入 → 4️⃣ 余弦相似度排序 → 5️⃣ 返回 Top-K 相似图
六、实战避坑:4 个容易踩的坑
- 归一化参数别改错:该模型的 mean/std 都是
0.5(不同于常见的 ImageNet 0.485/0.565 均值),直接用timm.data.create_transform自动生成最稳妥。 - 输入必须是 300×300:预处理会自动 resize + center crop(crop_pct 0.904),手动预处理时请对齐这个规格。
- 权重文件约 47 MB:model.safetensors 与 pytorch_model.bin 两种格式任选,优先选 safetensors,加载更快更安全。
- 比较前记得归一化:余弦相似度 = 归一化向量的点积,忘记归一化会导致高分图片"偏心",排序失真。
七、总结
tf_efficientnet_b3.ap_in1k 是搭建图片相似度搜索引擎的高性价比选择:12.2M 参数保证推理快,AdvProp 对抗训练保证嵌入稳,1536 维向量兼顾精度与存储成本。只需约 20 行 Python 代码,你就能把任意本地图片库变成"以图搜图"服务。
📚 延伸阅读:更多用法(特征图提取、分类示例)见 README.md#L29-L117,模型配置见 config.json。
【免费下载链接】tf_efficientnet_b3.ap_in1k
相关推荐
用convnext_large_mlp.clip_laion2b_augreg_ft_in1k提取图像嵌入:如何搭建图像相似度检索引擎
用convnext_large_mlp.clip_laion2b_augreg_ft_in1k提取图像嵌入:如何搭建图像相似度检索引擎 convnext_lar
tinynet_a.in1k图像嵌入实战:生成1280维特征向量,搞定图像搜索与相似度匹配
tinynet_a.in1k图像嵌入实战:生成1280维特征向量,搞定图像搜索与相似度匹配 本文带你使用 tinynet_a.in1k 模型生成 1280 维图
人工智能计算机视觉深度学习用dpn68.mx_in1k生成图像嵌入(Embedding):快速搭建图片相似度检索系统
用dpn68.mx_in1k生成图像嵌入(Embedding):快速搭建图片相似度检索系统 dpn68.mx_in1k 是 timm 库中一个基于 DPN(Du
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考