本篇主要记录下如何使用hugging face来快速找到我们需要的模型,并通过已有模型来快速实现demo或是功能模块。贴上hugging face 官网链接:
hugging face model界面(需要魔法)
需要模板代码请跳转流程总结
目录
1.选择模型
进入网页后再左侧可以看到现阶段主流的模型分类选择你需要的实际场景进入搜索页面,这里我选择image Classfication(图片分类)进行演示。(当然你也可以直接搜索模型,选择分类则是可以进一步筛选模型)
这里选择google/vit-base-patch16-224来进行操作演示(ps:操作上所有一类的模型都是遵循同一套规则的,个人上传与大厂开源没有太大区别当然大厂开源会有更加详细的模型参数、效果说明等等)
初入门的兄弟们可以从大厂开源开始玩起来,一般大厂的都会有演示代码(会提供一个最基础的使用模版),很容易上手,下面这段代码就是Google 的演示代码,安装好依赖后我们就能跑起来了:(ps:我觉得演示图很像梨花猫)
from transformers import ViTImageProcessor, ViTForImageClassification
from PIL import Image
import requests
url = 'http://images.cocodataset.org/val2017/000000039769.jpg'
image = Image.open(requests.get(url, stream=True).raw)
processor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224')
model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224')
inputs = processor(images=image, return_tensors="pt")
outputs = model(**inputs)
logits = outputs.logits
# model predicts one of the 1000 ImageNet classes
predicted_class_idx = logits.argmax(-1).item()
print("Predicted class:", model.config.id2label[predicted_class_idx])
image.show()
2.创建模型+处理器对象
让我们来看一下这段简单的代码(ps:通过库下载模型不用魔法,可以直接跑)
from transformers import ViTImageProcessor, ViTForImageClassification
processor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224')
#model = ViTForImageClassification('google/vit-base-patch16-224') #不使用预训练权重
model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224')
print(model)
ps:插一嘴哈,每一个大类的processor和model声明会有区别,简单看一下对应的大厂实例就可快速get,当然你也可以翻hugging face的说明文档一劳永逸。。。
processor -------- 主要用来对数据进行预处理,在vit 16-224模型中就是将输入图片转码成224*224的size
model ------------- 声明模型,使用.from_pretrained表示使用的是预训练模型,会加载预训练权重,如果仅需要使用模型使用如下代码声明即可
model = ViTForImageClassification('模型名称')
通过print(model)可以打印出模型结构
可以看到vit模型主要vit(embeding,encoder,layernorm),classifier 2个组成部分。我们可以通过: model. 的方式来调用它们,当然也可打印出来查看结构
model.vit
model.classifier
3.使用本地数据预测
我们只需要在google实例代码简单修改一部分就可以了:
image = Image.open(requests.get(url, stream=True).raw)
替换为:(ps:windows 系统的童鞋记得加上'r'--> r'本地图片地址')
image = Image.open('本地图片地址')
4.模型简单糅合
好了到此为止我们就能跑通模型也就能简单的玩一玩了,下面介绍一下最基础的进阶玩法。还记得之前的模型结构么,我们可以单独拿出vit或者classifier来跑,所以我们完全可以用某个预训练模型来提取特征,然后将特征转换成另一个模型的输入然后进行预测。
from transformers import ViTImageProcessor, ViTForImageClassification
from PIL import Image
processor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224')
model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224')
image = Image.open('data/train/good/1.jpg')
inputs = processor(images=image, return_tensors="pt")
outputs = model.vit(**inputs)
我们使用model.vit(**inputs)来只调用vit模块而不进行分类,这里只是简单的提一句,后面会更新详细的微调博客。
5.流程总结
from transformers import ViTImageProcessor, ViTForImageClassification
from PIL import Image
processor = ViTImageProcessor.from_pretrained('模型名称')
model = ViTForImageClassification.from_pretrained('模型名称')
image = Image.open('输入地址')
#数据预处理
inputs = processor(images=image, return_tensors="pt")
#输出数据
outputs = model(**inputs)
#输出展示
logits = outputs.logits
predicted_class_idx = logits.argmax(-1).item()
print("Predicted class:", model.config.id2label[predicted_class_idx])
再强调下哈不同大类的processor和model的声明函数不同,outputs结构也可能有所差异,打个端点看下就能很快的输出想要的结果了(当然找大厂开源示例模板是最快的方式了)。