如何确保ResNet50生成的图像嵌入可长期复现?
解决方案:固定ResNet50模型版本并本地存储权重
要确保图像嵌入的长期复现,核心是锁定模型架构版本、本地固化权重文件、统一依赖环境,以下是具体可行的实现方式:
一、手动下载指定版本的ResNet50权重并本地加载
1. 确定固定的模型版本
选择timm库中带明确版本标识的ResNet50(避免模糊的"resnet50"自动拉取最新版本),比如resnet50.a1_in1k(对应ImageNet-1K预训练的v1稳定版本)。
2. 下载权重到本地
通过timm工具下载对应权重并保存到本地路径(如./models/resnet50_a1_in1k.pth):
import timm import torch # 创建模型架构(关闭自动下载权重) model = timm.create_model('resnet50.a1_in1k', pretrained=False) # 从官方地址下载对应版本权重(URL可从timm模型文档获取) state_dict = timm.models.load_state_dict_from_url( 'https://download.pytorch.org/models/resnet50-0676ba61.pth', map_location='cpu' ) model.load_state_dict(state_dict) # 保存权重到本地目录 torch.save(model.state_dict(), './models/resnet50_a1_in1k.pth')
3. 在Towhee中使用本地模型
通过自定义算子封装本地模型,完全掌控推理逻辑:
import towhee import timm import torch from PIL import Image # 加载本地固定权重的模型 model = timm.create_model('resnet50.a1_in1k', pretrained=False) model.load_state_dict(torch.load('./models/resnet50_a1_in1k.pth')) model.eval() # 复用预训练模型匹配的预处理逻辑 transform = timm.data.create_transform(**timm.data.resolve_data_config(model.pretrained_cfg)) # 注册自定义Towhee嵌入算子 @towhee.register def local_resnet_embedding(img: Image.Image): tensor = transform(img).unsqueeze(0) with torch.no_grad(): # 提取2048维特征嵌入 embedding = model.forward_features(tensor).flatten(1) return embedding.numpy() # 构建推理Pipeline towhee_vectors = towhee.glob(*all_frame_paths).exception_safe() \ .image_decode() \ .local_resnet_embedding() \ .drop_empty() \ .tensor_normalize() \ .to_list()
二、直接通过Towhee算子指定本地权重(简洁版)
如果使用的Towhee版本支持pretrained_path参数,可直接跳过自定义算子,通过官方算子加载本地权重:
towhee_vectors = towhee.glob(*all_frame_paths).exception_safe() \ .image_decode() \ .image_embedding.timm( model_name="resnet50.a1_in1k", pretrained=False, pretrained_path="./models/resnet50_a1_in1k.pth" ) \ .drop_empty() \ .tensor_normalize() \ .to_list()
三、固化环境确保长期复现
除了模型权重,必须固定所有依赖库版本,避免因库更新导致的推理差异:
- 生成
requirements.txt文件,明确指定版本:
towhee==0.8.0 timm==0.9.8 torch==2.0.1 torchvision==0.15.2 pillow==9.5.0
- 将本地模型权重、
requirements.txt一起纳入版本控制(大文件建议用Git LFS管理),确保部署环境完全一致。
内容的提问来源于stack exchange,提问作者Dominik Sajovic
相关产品推荐
相关产品推荐

