Transformers 4.37 中文文档(五)(3)https://developer.aliyun.com/article/1565243
图像引导的对象检测
除了使用文本查询进行零样本对象检测外,OWL-ViT 还提供了图像引导的对象检测。这意味着您可以使用图像查询在目标图像中找到相似的对象。与文本查询不同,只允许一个示例图像。
让我们以一张沙发上有两只猫的图像作为目标图像,以一张单猫图像作为查询:
>>> url = "http://images.cocodataset.org/val2017/000000039769.jpg" >>> image_target = Image.open(requests.get(url, stream=True).raw) >>> query_url = "http://images.cocodataset.org/val2017/000000524280.jpg" >>> query_image = Image.open(requests.get(query_url, stream=True).raw)
让我们快速查看这些图像:
>>> import matplotlib.pyplot as plt >>> fig, ax = plt.subplots(1, 2) >>> ax[0].imshow(image_target) >>> ax[1].imshow(query_image)
在预处理步骤中,现在需要使用query_images
而不是文本查询:
>>> inputs = processor(images=image_target, query_images=query_image, return_tensors="pt")
对于预测,不要将输入传递给模型,而是将它们传递给 image_guided_detection()。除了现在没有标签之外,绘制预测与以前相同。
>>> with torch.no_grad(): ... outputs = model.image_guided_detection(**inputs) ... target_sizes = torch.tensor([image_target.size[::-1]]) ... results = processor.post_process_image_guided_detection(outputs=outputs, target_sizes=target_sizes)[0] >>> draw = ImageDraw.Draw(image_target) >>> scores = results["scores"].tolist() >>> boxes = results["boxes"].tolist() >>> for box, score, label in zip(boxes, scores, labels): ... xmin, ymin, xmax, ymax = box ... draw.rectangle((xmin, ymin, xmax, ymax), outline="white", width=4) >>> image_target
零样本图像分类
原文链接:
huggingface.co/docs/transformers/v4.37.2/en/tasks/zero_shot_image_classification
零样本图像分类是一个任务,涉及使用未明确训练包含来自这些特定类别的标记示例的数据的模型将图像分类为不同的类别。
传统上,图像分类需要在特定一组带标签的图像上训练模型,该模型学习将某些图像特征“映射”到标签。当需要将这样的模型用于引入新标签集的分类任务时,需要进行微调以“重新校准”模型。
相比之下,零样本或开放词汇图像分类模型通常是多模态模型,已经在大量图像和相关描述的数据集上进行了训练。这些模型学习了对齐的视觉-语言表示,可用于许多下游任务,包括零样本图像分类。
这是一种更灵活的图像分类方法,允许模型推广到新的和未见过的类别,而无需额外的训练数据,并且使用户能够使用目标对象的自由形式文本描述查询图像。
在本指南中,您将学习如何:
- 创建一个零样本图像分类管道
- 手动运行零样本图像分类推理
在开始之前,请确保已安装所有必要的库:
pip install -q transformers
零样本图像分类管道
尝试使用支持零样本图像分类的模型进行推理的最简单方法是使用相应的 pipeline()。从Hugging Face Hub 上的检查点实例化一个管道:
>>> from transformers import pipeline >>> checkpoint = "openai/clip-vit-large-patch14" >>> detector = pipeline(model=checkpoint, task="zero-shot-image-classification")
接下来,选择一个您想要分类的图像。
>>> from PIL import Image >>> import requests >>> url = "https://unsplash.com/photos/g8oS8-82DxI/download?ixid=MnwxMjA3fDB8MXx0b3BpY3x8SnBnNktpZGwtSGt8fHx8fDJ8fDE2NzgxMDYwODc&force=true&w=640" >>> image = Image.open(requests.get(url, stream=True).raw) >>> image
将图像和候选对象标签传递给管道。在这里,我们直接传递图像;其他合适的选项包括图像的本地路径或图像 url。候选标签可以像这个例子中那样简单,也可以更具描述性。
>>> predictions = detector(image, candidate_labels=["fox", "bear", "seagull", "owl"]) >>> predictions [{'score': 0.9996670484542847, 'label': 'owl'}, {'score': 0.000199399160919711, 'label': 'seagull'}, {'score': 7.392891711788252e-05, 'label': 'fox'}, {'score': 5.96074532950297e-05, 'label': 'bear'}]
手动进行零样本图像分类
现在您已经看到如何使用零样本图像分类管道,让我们看看如何手动运行零样本图像分类。
首先从Hugging Face Hub 上的检查点加载模型和相关处理器。在这里,我们将使用与之前相同的检查点:
>>> from transformers import AutoProcessor, AutoModelForZeroShotImageClassification >>> model = AutoModelForZeroShotImageClassification.from_pretrained(checkpoint) >>> processor = AutoProcessor.from_pretrained(checkpoint)
让我们换一张不同的图片。
>>> from PIL import Image >>> import requests >>> url = "https://unsplash.com/photos/xBRQfR2bqNI/download?ixid=MnwxMjA3fDB8MXxhbGx8fHx8fHx8fHwxNjc4Mzg4ODEx&force=true&w=640" >>> image = Image.open(requests.get(url, stream=True).raw) >>> image
使用处理器为模型准备输入。处理器结合了一个图像处理器,通过调整大小和归一化来为模型准备图像,以及一个标记器,负责处理文本输入。
>>> candidate_labels = ["tree", "car", "bike", "cat"] >>> inputs = processor(images=image, text=candidate_labels, return_tensors="pt", padding=True)
通过模型传递输入,并对结果进行后处理:
>>> import torch >>> with torch.no_grad(): ... outputs = model(**inputs) >>> logits = outputs.logits_per_image[0] >>> probs = logits.softmax(dim=-1).numpy() >>> scores = probs.tolist() >>> result = [ ... {"score": score, "label": candidate_label} ... for score, candidate_label in sorted(zip(probs, candidate_labels), key=lambda x: -x[0]) ... ] >>> result [{'score': 0.998572, 'label': 'car'}, {'score': 0.0010570387, 'label': 'bike'}, {'score': 0.0003393686, 'label': 'tree'}, {'score': 3.1572064e-05, 'label': 'cat'}]
单目深度估计
原始文本:
huggingface.co/docs/transformers/v4.37.2/en/tasks/monocular_depth_estimation
单目深度估计是一个涉及从单个图像预测场景深度信息的计算机视觉任务。换句话说,它是从单个摄像机视角估计场景中物体的距离的过程。
单目深度估计具有各种应用,包括 3D 重建,增强现实,自动驾驶和机器人技术。这是一个具有挑战性的任务,因为它要求模型理解场景中物体之间以及相应深度信息之间的复杂关系,这些关系可能受到光照条件、遮挡和纹理等因素的影响。
本教程中展示的任务由以下模型架构支持:
DPT, GLPN
在本指南中,您将学习如何:
- 创建深度估计管道
- 手动运行深度估计推断
在开始之前,请确保已安装所有必要的库:
pip install -q transformers
深度估计管道
尝试使用支持深度估计的模型进行推断的最简单方法是使用相应的 pipeline()。从Hugging Face Hub 上的检查点实例化一个管道:
>>> from transformers import pipeline >>> checkpoint = "vinvino02/glpn-nyu" >>> depth_estimator = pipeline("depth-estimation", model=checkpoint)
接下来,选择要分析的图像:
>>> from PIL import Image >>> import requests >>> url = "https://unsplash.com/photos/HwBAsSbPBDU/download?ixid=MnwxMjA3fDB8MXxzZWFyY2h8MzR8fGNhciUyMGluJTIwdGhlJTIwc3RyZWV0fGVufDB8MHx8fDE2Nzg5MDEwODg&force=true&w=640" >>> image = Image.open(requests.get(url, stream=True).raw) >>> image
将图像传递给管道。
>>> predictions = depth_estimator(image)
管道返回一个带有两个条目的字典。第一个条目名为predicted_depth
,是一个张量,其值为每个像素的以米为单位的深度。第二个条目depth
是一个 PIL 图像,可视化深度估计结果。
让我们看一下可视化结果:
>>> predictions["depth"]
Transformers 4.37 中文文档(五)(5)https://developer.aliyun.com/article/1565245