Logo
Section 1 / 3

使用视觉Transformer进行图像分类(ViT和DeiT)

通过 ViT 和 DeiT 探索图像分类中的变换方法、网络架构以及自注意力机制。

导入

使用视觉Transformer进行图像分类(ViT和DeiT)

通过 ViT 和 DeiT 探索图像分类中的变换方法、网络架构以及自注意力机制。

深度网络学习到的数字分类表示

通用的编码器-解码器设计模式

混合方法:CNN 与 Transformer

ViT 中的分词(Tokenization)

ViT 的架构

ViT 的 Transformer 编码器

如果在大量数据上训练,ViT 可以成为优秀的分类器

1import cv2 2import torch 3import requests 4import numpy as np 5import matplotlib.pyplot as plt 6import matplotlib.patches as patches 7from transformers import OwlViTProcessor, OwlViTForObjectDetection 8 9processor = OwlViTProcessor.from_pretrained("google/owlvit-base-patch32") 10model = OwlViTForObjectDetection.from_pretrained("google/owlvit-base-patch32") 11 12def load_and_display_image(image_path): 13 """ 14 使用 OpenCV 加载并显示图像。 15 16 参数: 17 - image_path (str): 图像文件路径。 18 19 返回: 20 - image (numpy.ndarray): 加载的图像。 21 """ 22 # 使用 OpenCV 读取本地图像 23 image = cv2.imread(image_path)[:, :, ::-1] 24 25 # 显示图像 26 plt.imshow(image) 27 plt.axis('off') 28 plt.show() 29 30 return image 31 32# 指定本地图像文件路径 33local_image_path_with_zebra = "test1.png" 34local_image_path_without_zebra = "test2.jpg" 35 36# 加载并显示图像 37image1 = load_and_display_image(local_image_path_with_zebra) 38image2 = load_and_display_image(local_image_path_without_zebra) 39 40# 图像的文本查询 41texts = [["Zebra"]] 42 43def process_image(image, processor, model): 44 """ 45 使用提供的处理器和模型处理图像以获得预测结果。 46 47 参数: 48 - image (numpy.ndarray): 输入图像。 49 - processor (OwlViTProcessor): OwlViT 模型的处理器。 50 - model (OwlViTForObjectDetection): 目标检测模型。 51 52 返回: 53 - boxes (torch.Tensor): 预测的边界框。 54 - scores (torch.Tensor): 预测的置信度分数。 55 - labels (torch.Tensor): 预测的标签。 56 """ 57 # 预处理输入 58 inputs = processor(text=texts, images=image, return_tensors="pt") 59 outputs = model(**inputs) 60 61 # 目标图像尺寸(高度, 宽度),用于缩放边界框预测 [batch_size, 2] 62 target_size = torch.Tensor([image.shape[:2]]) 63 64 # 将输出(边界框和类别 logits)转换为 COCO API 格式 65 results = processor.post_process(outputs=outputs, target_sizes=target_size) 66 67 # 获取对应文本查询的图像预测结果 68 boxes, scores, labels = results[0]["boxes"], results[0]["scores"], results[0]["labels"] 69 return boxes, scores, labels 70 71# 处理图像并获取预测结果 72boxes1, scores1, labels1 = process_image(image1, processor, model) 73boxes2, scores2, labels2 = process_image(image2, processor, model) 74 75def check_for_zebra(boxes, scores, labels, score_threshold=0.2): 76 """ 77 基于预测的边界框和分数判断图像中是否包含斑马。 78 79 参数: 80 - boxes (torch.Tensor): 预测的边界框。 81 - scores (torch.Tensor): 预测的分数。 82 - labels (torch.Tensor): 预测的标签。 83 - score_threshold (float): 判定检测有效的阈值。 84 85 返回: 86 - image_contains_zebra (bool): 若图像包含斑马返回 True,否则返回 False。 87 """ 88 image_contains_zebra = False 89 90 # 遍历预测的边界框、分数和标签 91 for box, score, label in zip(boxes, scores, labels): 92 # 四舍五入坐标以提高可读性 93 box = [round(i, 2) for i in box.tolist()] 94 95 # 检查分数是否超过阈值 96 if score >= score_threshold: 97 image_contains_zebra = True 98 99 return image_contains_zebra 100 101image1_contains_zebra = check_for_zebra(boxes1, scores1, labels1) 102print('Image1 one has zebra: ', image1_contains_zebra) 103 104image2_contains_zebra = check_for_zebra(boxes2, scores2, labels2) 105print('Image2 one has zebra: ', image2_contains_zebra)

计算机视觉中的Transformer

移位窗口(Swin)Transformer