基于Transformer模型的目标检测算法BETR模型

小夏 科技 更新 2024-02-01

Transformer 模型刚发布时,主要用于处理 NLP 任务,比如机器翻译,但随着注意力机制模型的普及,许多基于 Transformer 模型的魔术修改模型也陆续发布,Transformer 模型的注意力机制也被 Google 团队证明可以用于计算机视觉任务, 尤其是SWIN的Transformer模型的发布,将Transformer模型带入了计算机视觉领域。在之前的文章中,我们还介绍了另一个基于 Transformer 模型的模型,用于计算机视觉任务。 而 betr 模型不仅可以用于目标检测,还可以用于对象分割,本期我们将基于 transformer 模型实现 betr 模型。

from pil import imageimport requestsimport matplotlib.pyplot as pltimport torchfrom torch import nnfrom torchvision.models import resnet50import torchvision.transforms as ttorch.set_grad_enabled(false);

基于 Transformer 模型的目标检测算法实现的第一步是导入 Python 的第三方库,主要是 torch,以确保在运行此问题之前已经成功安装了 torch 库。

classes = [ 'n/a', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'n/a', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'n/a', 'backpack', 'umbrella', 'n/a', 'n/a', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'n/a', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'n/a', 'dining table', 'n/a', 'n/a', 'toilet', 'n/a', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microw**e', 'oven', 'toaster', 'sink', 'refrigerator', 'n/a', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']colors = [[0.000, 0.447, 0.741], 0.850, 0.325, 0.098], 0.929, 0.694, 0.125], 0.494, 0.184, 0.556], 0.466, 0.674, 0.188], 0.301, 0.745, 0.933]]

这里我们需要创建一个列表,一个是存储 betr 模型可以检测到的所有对象标签,另一个是颜色数据,方便我们后期可视化。

transform = t.compose([ t.resize(800), t.totensor(),t.normalize([0.485, 0.456, 0.406], 0.229, 0.224, 0.225])]def box_cxcywh_to_xyxy(x): x_c, y_c, w, h = x.unbind(1) b = [(x_c - 0.5 * w), y_c - 0.5 * h), x_c + 0.5 * w), y_c + 0.5 * h)] return torch.stack(b, dim=1)def rescale_bboxes(out_bbox, size): img_w, img_h = size b = box_cxcywh_to_xyxy(out_bbox) b = b * torch.tensor([img_w, img_h, img_w, img_h], dtype=torch.float32) return b

这里我们设置了一些功能,方便对对象进行标注,更方便后期的可视化操作。 一旦上面的初始化完成,我们就可以构建我们的 betr 模型了。

根据 Betr 模型的框架图,我们知道这里有两个关键框架,一个是 CNN 卷积神经网络层,另一个是 Transformer 模型的编码器和解码器部分。

class detr_model(nn.module): def __init__(self, num_classes, hidden_dim=256, nheads=8,num_encoder_layers=6, num_decoder_layers=6): super().init(CNN卷积神经网络层selfbackbone = resnet50() del self.backbone.fc self.conv = nn.conv2d(2048, hidden dim, 1) 变压器层自体transformer = nn.Transformer(隐藏的 DIM、NHEADS、NUM 编码器层、NUM 解码器层) **类和盒层自带linear_class = nn.linear(hidden_dim, num_classes + 1) self.linear_bbox = nn.线性(隐藏式调光,4个)输出位置编码自带query_pos = nn.parameter(torch.rand(100, hidden dim)) 输出空间自体的位置编码row_embed = nn.parameter(torch.rand(50, hidden_dim // 2)) self.col_embed = nn.parameter(torch.rand(50, hidden dim 2)) def forward(self, inputs): resnet-50 CNN 卷积神经网络 x = self.backbone.conv1(inputs) x = self.backbone.bn1(x) x = self.backbone.relu(x) x = self.backbone.maxpool(x) x = self.backbone.layer1(x) x = self.backbone.layer2(x) x = self.backbone.layer3(x) x = self.backbone.layer4(x) 从 2048 转换为 256 特征 h = 自身conv(x) 位置编码 h, w = hshape[-2:] pos = torch.cat([self.col_embed[:w].unsqueeze(0).repeat(h, 1, 1),self.row_embed[:h].unsqueeze(1).repeat(1, w, 1),]dim=-1).flatten(0, 1).unsqueeze(1) 变压器层 h = 自身transformer(pos + 0.1 * h.flatten(2).permute(2, 0, 1),self.query_pos.unsqueeze(1)).transpose(0, 1) 最终输出是标签和框返回

构建 betr 模型后,我们可以直接使用它,在使用它之前,我们需要 betr 的预训练模型。

detr = detr_model(num_classes=91)state_dict = torch.hub.load_state_dict_from_url( url='', map_location='cpu', check_hash=true)detr.load_state_dict(state_dict)detr.eval();

现在我们已经设置了 detr 模型,我们需要使用 torchhub.将 State Dict 从 url 函数加载到 betr 预训练模型中,模型完成后,我们使用 Load State Dict 加载模型并进行求值。 然后我们可以使用 betr 模型。

def detect(im, model, transform): img = transform(im).unsqueeze(0) assert img.shape[-2] <= 1600 and img.shape[-1] <= 1600, '支持的最大支持量 **1600*1600' outputs = model(img) probas = outputs['pred_logits'].softmax(-1)[0, :1] keep = probas.max(-1).values > 0.7 bboxes_scaled = rescale_bboxes(outputs['pred_boxes'][0, keep], im.size) return probas[keep], bboxes_scaled

在这里,我们构建了一个检测函数,允许我们使用模型进行对象检测,然后我们可以为模型加载模型的副本。 在这里,我们选择一个大于 0 的置信水平7 个标签和数据的可视化。

im = image.open('11.jpg').convert('rgb')scores, boxes = detect(im, detr, transform)def plot_results(pil_img, prob, boxes): plt.figure(figsize=(16,10)) plt.imshow(pil_img) ax = plt.gca() for p, (xmin, ymin, xmax, ymax), c in zip(prob, boxes.tolist(),colors * 100): ax.add_patch(plt.rectangle((xmin, ymin), xmax - xmin, ymax - ymin, fill=false, color=c, linewidth=3)) cl = p.argmax() text = f': ' ax.text(xmin, ymin, text, fontsize=15,bbox=dict(facecolor='yellow', alpha=0.5)) plt.axis('off') plt.show() plot_results(im, scores, boxes)

首先,我们加载一个需要测试的 **,并将 ** 传递给 betr 模型进行目标检测,目标检测完成后,我们可以获取模型的对象标签、置信度和对象框信息**。 获取到这些对象信息后,我们就可以进行数据可视化操作了,这里我们建立了一个绘图结果函数,方便数据可视化操作。

Transformer 模型是谷歌关注的,你只需要** 但是,随着 VIT 模型的发布,可以将 Transformer 模型应用于计算机视觉任务,本期介绍的 Detr 模型是基于 Transformer 模型和 CNN 卷积神经网络相结合的目标检测模型。

相似文章

    基于Transformer模型的长文本生成研究

    随着神经网络的快速发展,Transformer模型作为一种基于注意力机制的深度学习习模型,在长文本生成任务的自然语言处理领域崭露头角。本文将介绍基于Transformer模型的长文本生成,重点介绍其在语义理解和创造性表达中的应用。从单词到句子再到文本,Transformer 模型学习语言 习 的结构...

    1202 03 基于进球预期模型和机构数据的欧洲主要联赛模拟预测

    欧洲主要联赛。通过将模型的预期进球数与该机构的实际让分指数进行比较,分析了两支球队之间的实力差异。重大高难度比赛。意甲 热那亚恩波利,预期进球数。.差值为.主队预计 棍高水或让 贴纸低水位,经纪公司居然打开了主队让棍高水位,稍低开主队,主队打风险,有平局空间。德甲 波鸿 VfL 沃尔夫斯堡,预期进球...

    大型语言模型简介:基于 Amazon Bedrock 的概述

    本文介绍了基于 Bedrock 的大型语言模型,Bedrock 是亚马逊云科技推出的大型语言模型和生成式 AI 系列。大型语言模型是具有数十亿个参数 B 的预训练语言模型 例如 GPT Bloom Llama 该模型可用于各种自然语言处理任务,例如文本生成 机器翻译和自然语言理解。大型语言模型的这些...

    颠覆变形金刚霸主!Mamba 的新架构解决了致命的错误,并将推理速度提高了 5 倍

    小编 编辑部深度学习习进入新时代,变形金刚霸主地位即将被颠覆 年月日,它诞生了,让NLP直接改变了天空,而统治自然语言领域多年的Transformer,终于要被新的架构打破。Transformer 功能强大,但它有一个致命的错误 核心注意力层无法扩展到长期上下文。刚刚,来自CMU和普林斯顿大学的研究...

    变形金刚不读《红楼梦》

    在 Transformer 的自注意力机制中,每个 token 都与所有其他 token 相关联。因此,如果我们有 n 个标记,那么自注意力的计算复杂度为 o n 随着序列长度 n 的增加,所需的计算量和存储空间量会直线增长,这会导致非常大的计算和存储开销。这意味着,当你不再满足于将一个 字的段落喂...