Hugging Face 社区中蓬勃发展的计算机视觉
在 Hugging Face 上,我们为与社区一起推动人工智能领域的民主化而感到自豪。作为这个使命的一部分,我们从去年开始专注于计算机视觉。开始只是 Transformers 中 Vision Transformers (ViT) 的一个 PR,现在已经发展壮大: 8 个核心视觉任务,超过 3000 个模型,在 Hugging Face Hub 上有超过 1000 个数据集。
自从 ViTs 加入 Hub 后,已经发生了大量激动人心的事情。在这篇博客文章中,我们将从 Hugging Face 生态系统中总结已经发生的和将要发生的进展,以支持计算机视觉的持续发展。
下面是我们要覆盖的内容:
- 支持的视觉任务和流水线
- 训练你自己的视觉模型
- 和
timm
整合 - Diffusers
- 对第三方库的支持
- 开发
- 以及更多内容!
启动社区: 一次一个任务
Hugging Face Hub 拥有超过 10 万个用于不同任务的公共模型,例如: 下一词预测、掩码填充、词符分类、序列分类等。截止今天,我们支持 8 个核心视觉任务,提供许多模型的 checkpoints:
- 图像分类
- 图像分割
- (零样本) 目标检测
- 视频分类
- 深度估计
- 图像到图像合成
- 无条件图像生成
- 零样本图像分类
每个任务在 Hub 上至少有 10 个模型等待你去探索。此外,我们支持视觉和语言的交叉任务,比如:
- 图像到文字 (图像说明,光学字符识别)
- 文字到图像
- 文档问答
- 视觉问答
这些任务不仅需要最先进的基于 Transformer 的架构,如 ViT、Swin、DETR,还需要 纯卷积 的架构,如 ConvNeXt、ResNet、RegNet,甚至更多!像 ResNets 这样的架构仍然与无数的工业用例非常相关,因此在 Transformers 中也支持这些非 Transformers 的架构。
还需要注意的是,在 Hub 上的这些模型不仅来自 Transformers 库,也来自于其他第三方库。例如,尽管我们在 Hub 上支持无条件图像生成等任务,但我们在 Transformers 中还没有任何模型支持该任务 (比如 这个链接)。支持所有的机器学习任务,无论是使用 Transformers 还是第三方库来解决,都是我们促进一个协作的开源机器学习生态系统使命的一部分。
对 Pipelines 的支持
我们开发了 Pipelines 来为从业者提供他们需要的工具,以便轻松地将机器学习整合到他们的工具箱中。对于给定与任务相关的输入,他们提供了一种简单的方法来执行推理。我们在 Pipelines 里支持 7 种视觉任务。下面是一个使用 Pipelines 进行深度估计的例子:
from transformers import pipeline
depth_estimator = pipeline(task="depth-estimation", model="Intel/dpt-large")
output = depth_estimator("http://images.cocodataset.org/val2017/000000039769.jpg")
# This is a tensor with the values being the depth expressed
# in meters for each pixel
output["depth"]
即使对于视觉问答任务,接口也保持不变:
from transformers import pipeline
oracle = pipeline(model="dandelin/vilt-b32-finetuned-vqa")
image_url = "https://huggingface.co/datasets/Narsil/image_dummy/raw/main/lena.png"
oracle(question="What is she wearing?", image=image_url, top_k=1)
# [{'score': 0.948, 'answer': 'hat'}]
训练你自己的模型
虽然能够使用现成推理模型是一个很好的入门方式,但微调是社区获得最大收益的地方。当你的数据集是自定义的、并且预训练模型的性能不佳时,这一点尤其正确。
Transformers 为一切与训练相关的东西提供了 训练器 API。当前, Trainer
无缝地支持以下任务: 图像分类、图像分割、视频分类、目标检测和深度估计。微调其他视觉任务的模型也是支持的,只是并不通过 Trainer
。
只要损失计算包含在 Transformers 计算给定任务损失的模型中,它就应该有资格对该任务进行微调。如果你发现问题,请在 GitHub 上 报告。
我从哪里可以找到代码?
Hugging Face 示例脚本 包括不同的 自监督预训练策略 如 MAE,和 对比图像到文本预训练策略 如 CLIP。这些脚本对于研究社区和愿意在预训练模型上从头训练自定义数据语料的从业者来说是非常宝贵的资源。
不过有些任务本来就不适合微调。例子包括零样本图像分类 (比如 CLIP),零样本目标检测 (比如 OWL-ViT),和零样本分割 (比如 CLIPSeg)。我们将在这篇文章中重新讨论这些模型。
与 Datasets 集成
Datasets 提供了对数千个不同模态数据集的轻松访问。如前所述,Hub 有超过 1000 个计算机视觉的数据集。一些例子值得关注: ImageNet-1k、Scene Parsing、NYU Depth V2、COYO-700M 和 LAION-400M。这些在 Hub 上的数据集,只需两行代码就可以加载它们:
from datasets import load_dataset
dataset = load_dataset("scene_parse_150")
除了这些数据集,我们提供了对增强库如 albumentations 和 Kornia 的集成支持。社区可以利用 Datasets 的灵活性和性能,还有这些库提供的强大的增强变换能力。除此之外,我们也为核心视觉任务提供 专用的数据加载指南: 图像分类,图像分割,目标检测和深度估计。
timm
timm
,即 pytorch-image-models,是一个最先进的 PyTorch 图像模型、预训练权重和用于训练、推理、验证的实用脚本的开源集合。
pytorch-image-models 项目仓库:
https://github.com/rwightman/pytorch-image-models
我们在 Hub 上有超过 200 个来自 timm
的模型,并且有更多模型即将上线。查看 文档 以了解更多关于此集成的信息。
Diffusers
Diffusers 提供预训练的视觉和音频扩散模型,并且用作推理和训练的模块化工具箱。有了这个库,你可以从自然语言输入和其他创造性用例中生成可信的图像。下面是一个例子:
from diffusers import DiffusionPipeline
generator = DiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
generator.to(“cuda”)
image = generator("An image of a squirrel in Picasso style").images[0]
这种类型的技术可以赋予新一代的创造性应用,也可以帮助来自不同背景的艺术家。查看 官方文档 以了解更多关于 Diffusers 和不同用例的信息。
基于扩散模型的文献正在快速发展,这就是为什么我们与 乔纳森·惠特克 合作开发一门课程。这门课程是免费的,你可以点击 这里 查看。
对第三方库的支持
Hugging Face 生态系统的核心是 Hugging Face Hub,它让人们在机器学习上有效合作。正如前面所提到的,我们在 Hub 上不仅支持来自 Transformers 的模型,还支持来自其他第三方包的模型。为此,我们提供了几个 实用程序,以便你可以将自己的库与 Hub 集成。这样做的主要优点之一是,与社区共享工件 (如模型和数据集) 变得非常容易,从而使你的用户可以更容易地尝试你的模型。
当你的模型托管在 Hub 上时,你还可以为它们 添加自定义推理部件。推理部件允许用户快速地检查模型。这有助于提高用户的参与度。
计算机视觉演示空间
使用 Hugging Hub Spaces 应用,人们可以轻松地演示他们的机器学习模型。空间支持与 Gradio、Streamlit 和 Docker 的直接集成,使从业者在展示他们的模型时有很大的灵活性。你可以用 Spaces 引入自己的机器学习框架来构建演示。
在 Spaces 里,Gradio 库提供几个部件来构建计算机视觉应用,比如 Video、Gallery 和 Model3D。社区一直在努力构建一些由 Spaces 提供支持的令人惊叹的计算机视觉应用:
- 从输入图像的预测深度图生成 3D 体素
- 开放词汇语义分割
- 通过生成字幕来讲述视频
- 对来自 YouTube 的视频进行分类
- 零样本视频分类
- 视觉问答
- 使用零样本图像分类为图像找到最佳说明以生成相似的图像
AutoTrain
AutoTrain 提供一个”零代码“的解决方案,为文本分类、文本摘要、命名实体识别等这样的任务训练最先进的机器学习模型。对于计算机视觉,我们当前支持 图像分类,但可以期待更多的任务覆盖。
AutoTrain 还支持 自动模型评估。此应用程序允许你用在 Hub 上的各种 数据集 评估 Transformers 模型。你的评估结果将会显示在 公共排行榜 上。你可以查看 下列博客 以获得更多细节。
技术理念
在此部分,我们像向你分享在 Transformers 里添加计算机视觉背后的理念,以便社区知道针对该领域的设计选择。
尽管 Transformers 是从 NLP 开始的,但我们今天支持多种模式,比如: 视觉、音频、视觉语言和强化学习。对于所有的这些模式,Transformers 中所有相应的模型都享有一些共同的优势:
- 使用一行代码
from_pretrained()
即可轻松下载模型 - 用
push_to_hub()
轻松上传模型 - 支持使用 checkpoint 分片技术加载大型的 checkpoints
- 优化支持 (使用 Optimum 之类的工具)
- 从模型配置中初始化
- 支持 PyTorch 和 TensorFlow (非全面支持)
- 以及更多
与分词器不同,我们有预处理器 (例如 链接中的预处理器) 负责为视觉模型准备数据。我们一直努力确保在使用视觉模型时依然有轻松和相似的用户体验:
from transformers import ViTImageProcessor, ViTForImageClassification
import torch
from datasets import load_dataset
dataset = load_dataset("huggingface/cats-image")
image = dataset["test"]["image"][0]
image_processor = ViTImageProcessor.from_pretrained("google/vit-base-patch16-224")
model = ViTForImageClassification.from_pretrained("google/vit-base-patch16-224")
inputs = image_processor(image, return_tensors="pt")
with torch.no_grad():
logits = model(**inputs).logits
# model predicts one of the 1000 ImageNet classes
predicted_label = logits.argmax(-1).item()
print(model.config.id2label[predicted_label])
# Egyptian cat
即使对于一个困难的任务如目标检测,用户体验也不会改变很多:
from transformers import AutoImageProcessor, AutoModelForObjectDetection
from PIL import Image
import requests
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
image_processor = AutoImageProcessor.from_pretrained("microsoft/conditional-detr-resnet-50")
model = AutoModelForObjectDetection.from_pretrained("microsoft/conditional-detr-resnet-50")
inputs = image_processor(images=image, return_tensors="pt")
outputs = model(**inputs)
# convert outputs (bounding boxes and class logits) to COCO API
target_sizes = torch.tensor([image.size[::-1]])
results = image_processor.post_process_object_detection(
outputs, threshold=0.5, target_sizes=target_sizes
)[0]
for score, label, box in zip(results["scores"], results["labels"], results["boxes"]):
box = [round(i, 2) for i in box.tolist()]
print(
f"Detected {model.config.id2label[label.item()]} with confidence "
f"{round(score.item(), 3)} at location {box}"
)
输出为:
Detected remote with confidence 0.833 at location [38.31, 72.1, 177.63, 118.45]
Detected cat with confidence 0.831 at location [9.2, 51.38, 321.13, 469.0]
Detected cat with confidence 0.804 at location [340.3, 16.85, 642.93, 370.95]
Detected remote with confidence 0.683 at location [334.48, 73.49, 366.37, 190.01]
Detected couch with confidence 0.535 at location [0.52, 1.19, 640.35, 475.1]
视觉零样本模型
大量的模型以有趣的方式重新修订了分割和检测等核心视觉任务,并引入了更大的灵活性。我们支持 Transformers 中的一些:
- CLIP 支持带提示的零样本图像分类。给定一张图片,你可以用类似”一张{}的图片“这样的自然语言询问来提示 CLIP 模型。期望是得到类别标签作为答案。
- OWL-ViT 允许以语言为条件的零样本目标检测和以图像为条件的单样本目标检测。这意味着你可以在一张图片中检测物体即使底层模型在训练期间没有学过检测它们!你可以参考 下列笔记本 以了解更多。
- CLIPSeg 支持以语言为条件的零样本图像分割和以图像为条件的单样本图像分割。这意味着你可以在一张图片中分割物体即使底层模型在训练期间没有学过分割它们!你可以参考说明此想法的 这篇博客文章。GroupViT 也支持零样本分割。
- X-CLIP 展示对视频的零样本泛化。准确地说是支持零样本视频分类。查看 下列笔记本 以获得更多细节。
社区期待在今后的日子里看到 Transformers 支持更多的计算机视觉零样本模型。
开发
我们的 CTO 说:”真正的艺术家能将产品上市“
我们通过 Inference Endpoints 支持这些视觉模型的开发。Inference Endpoints 直接集成了与图像分类、目标检测、图像分割相关的兼容模型。对于其他模型,你可以使用自定义处理程序。由于我们还在 TensorFlow 中提供了许多来自 Transformers 的视觉模型用于部署,我们建议使用自定义处理程序或遵循这些资源:
- 在 Hugging Face 上用 TF 服务开发 TensorFlow 视觉模型
- 在 Kubernets 上用 TF 服务开发 ViT
- 在 Vertex AI 上开发 ViT
- 用 TFX 和 Vertex AI 开发 ViT
结论
在这篇文章中,我们向你简要介绍了 Hugging Face 生态系统目前为下一代计算机视觉应用提供的支持。我们希望你会喜欢使用这些产品来可靠地构建应用。
不过还有很多工作要做。 以下是您可以期待看到的一些内容:
- Datasets 对视频的直接支持
- 支持更多和工业界相关的任务,比如图像相似性
- 图像数据集与 TensorFlow 的交互
- 来自 Hugging Face 社区关于计算机视觉的课程
像往常一样,我们欢迎你的补丁、PR、模型 checkpoints、数据集和其他贡献!
感谢 Omar Sanseviero, Nate Raw, Niels Rogge, Alara Dirik, Amy Roberts, Maria Khalusova, and Lysandre Debut for their 精心审阅和校对这篇文章,感谢 Chunte Lee 创作的博文缩略图
原文: https://hf.co/blog/cv_state
作者: Sayak Paul
译者: AIboy1993 (李旭东)
译者: zhongdongy (阿东)
Hugging Face 社区中蓬勃发展的计算机视觉的更多相关文章
- go, iris , nuxt, 服务端渲染等技术在helloworld开发者社区中的应用与实践
大家好,helloworld.net 上线已经有近半年的时间了,转眼过的好快,在这半年的时间里,迭代了近10多个版本,优化了很多的体验,交互上的不足之处,同时也上线了我们的安卓 app, 苹果的因为还 ...
- Python之父重回决策层,社区未来如何发展?
春节假期结束了,大家陆续地重回到原来的生活轨道上.假期是一个很好的休息与调节的机会,同时,春节还有辞旧迎新的本意,它是新的轮回的开端. 在 Python 社区里,刚发生了一件大事,同样有开启新纪元的意 ...
- 社区O2O的发展与未来
虽然很多人都自我标榜为社区O2O,其实,在现在这个时间点上,社区O2O可以说是根本不存在的. 社区是什么?对用户来说,社区包括房子,包括邻居,包括宠物,包括保安,包括广场舞,也包括跳广场舞的大妈, ...
- OpenStack社区中的GO语言之争
1 背景介绍 Swift之前几乎所有的代码都是用Python实现的,但是性能一直不理想, 社区为了解决性能问题,尝试过很多方法,后来发现用Golang语言进行一部分代码重写, 性能得到了一定的提升,社 ...
- 第一篇 - bsp抓取python中文开发者社区中的所有高级教程
工具:python3.6 pycharm 库:bs4 + urllib 第一步:读取html源码 from bs4 import BeautifulSoup import urllib.reques ...
- 恭喜社区喜提三枚新 Committer!
点击上方 蓝字关注我们 ✎ 编 者 按 Apache DolphinScheduler 社区最近又迎来三位新的 Committer,凭借对社区的高质量贡献,社区很荣幸地邀请他们加入 Committer ...
- 非代码的贡献也能成为Committer,我与DolphinScheduler社区的故事
点亮 ️ Star · 照亮开源之路 https://github.com/apache/dolphinscheduler // 每个人对于"开源社区"的定义都不一样, ...
- 疫情对国内5G发展的影响
导读 2020年春节期间,“新型冠状病毒”引发了自SARS之后又一次全国性疫情,而世卫组织也将之列为国际关注的突发公共卫生事件,随后多国发布了针对中国的旅行警告和入境限制,从当前情况来看,疫情对中国各 ...
- Image Processing and Computer Vision_Review:A survey of recent advances in visual feature detection—2014.08
翻译 一项关于视觉特征检测的最新进展概述——http://tongtianta.site/paper/56761 摘要 -特征检测是计算机视觉和图像处理中的基础和重要问题.这是一个低级处理步骤,它是基 ...
- React 在服务端渲染的实现
原文地址:Server-Side React Rendering 原文作者:Roger Jin 译者:牧云云 React 在服务端渲染的实现 React是最受欢迎的客户端 JavaScript 框架, ...
随机推荐
- 建议收藏| 学python的看过来,Python 史上最全第三方库收集
发现一个宝藏网站: GitHub 上有一个 Awesome - XXX 系列的资源整理,这个系列以"全"闻名,但凡是有一定知识度的领域.语言.框架等,都有自己的 awesome-x ...
- 一个基于线程池和epoll的IO事件管理器
前面几篇博客介绍了Epoll, ThreadPool, 其中 Epoll 封装了epoll的各类api, 可在epoll句柄中添加/修改/删除 fd 的 各类事件(EPOLLIN | EPOLLOUT ...
- Kafka相关问题
Kafka有哪几个部分组成 生产者.消费者.topic.group.partition kafka的group1)定义:即消费者组是 Kafka 提供的可扩展且具有容错性的消费者机制.在Kafka中, ...
- 开始 go
为什么开始想转 go ? 毕业三年多,一直从事的是 Java , 大学学的也是 Java ,本来想一直干下去的,可是似乎 Java 水涨船高,面试要求也越来越高. 曾经一起毕业的同事自学 go ,已经 ...
- js获取当前日期的前七天,月份+日(数组)
1.定义一个空对象. let dayArr = []: 2.时间格式化 function formatterDate(date,fmt){ let nowDate = { yyy ...
- redis 简单安装
参考官网,安装步骤基本照搬redis官网,其他只做简单说明https://redis.io/download/https://redis.io/docs/getting-started/install ...
- node后台项目所需中间件梳理
0.nodemon 全局工具,监听项目文件变动,并自动重启项目 一.node内置模块 1.fs fs.readFile() 读取指定文件中的内容fs.writeFile() 向指定的文件中写入内容 ...
- PINNs的网络大小与过拟合
PINNs中网络越大时,会不会产生过拟合呢 虽然PINNs可以不用到数据,但是我认为物理约束所带来的信息也是有限的 因此当网络变得很大时,也有可能产生过拟合现象吧 但是在神经元分裂那篇文章中,训练停滞 ...
- 什么是Vuex
Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享. 优点: 能够在Vuex中集中管理共享的数居,易于开发和后期维护 能够高效地实现组件之间的数据共享,提高开发效率 存 ...
- JMeter控制器遍历一组数据
1.获取数据列表,通过JSON提取器提取所有name信息 获取到的name总条数 = name_matchNr = 4 2.通过添加控制器遍历一组数据 2.1 方式一:添加循环控制器 循环控制次数为 ...