嘉定区网站建设,wordpress怎么进行301 htaccess,同学录网站开发的背景,微信公众号费用标准#x1f49b;前情提要#x1f49b;
本文是传知代码平台中的相关前沿知识与技术的分享~
接下来我们即将进入一个全新的空间#xff0c;对技术有一个全新的视角~
本文所涉及所有资源均在传知代码平台可获取
以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦#x…前情提要
本文是传知代码平台中的相关前沿知识与技术的分享~
接下来我们即将进入一个全新的空间对技术有一个全新的视角~
本文所涉及所有资源均在传知代码平台可获取
以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦
以下内容干货满满跟上步伐吧~ 导航小助手 本章重点一. 概述二. 模型主体框架三.演示效果四.核心逻辑总结 本章重点
DETR[端到端目标检测] 一. 概述
在目标检测需要许多手工设计的组件例如非极大值抑制NMS基于人工经验生成的先验框(Anchor)等。DETR这篇文章通过将目标检测作为一个直接的集合预测问题减少了人工设计组件的知识简化了目标检测的流程。给定一组固定的可学习的目标查询DETR推理目标和全局图像的上下文关系由于DETR没有先验框的约束因此对于较大的物体预测性能会更好。 二. 模型主体框架 如图所示为DETR的主体框架由于直接采用transformer结构模型的计算量较大因此DETR首先采用CNN卷积神经网络进行抽取特征此时生成的特征图一般而言降采样32倍。之后将提取的特征图送Transformer的encoder结构中进行自注意力的交互获取特征图中每个像素和其他像素之间关系。decoder首先预设了N个查询该N个查询首先进行自注意力机制除去模型中的冗余框之后与来自Encoder的特征进行交互形成数量为N查询该查询通过线性层生成模型预测的类别和相应的边界框输出最终预测得到结果。
在实验的时候N的数据要大于一张图片上所含有所有物体的数量在计算损失函数的时候DETR首先采用匈牙利算法去寻找到正确的匹配方式。之后再去计算bbox和分类的损失值。由于 L1 损失函数对于不同大小的边界框产生的误差不相同因此我们采用了GIoU 损失函数去弥补这些误差。下图所示是DETR更详细的示意图 主干网络
针对于一张通道数大小为3的图片首先经过CNN的骨干网络得到一个通道数为2048该数据是我们人工设置的
Transformer编码器 Transformer解码器
与标准的Transformer架构中的decoder不同DETR没有采用掩码机制因此N个预测的边界框可以同时输出。由于解码器仍然具有置换不变性因此我们采用可学习的位置编码作为解码器的输入嵌入并把它称为object query。通过多个层结构该object query最终转变为输出的边界框通过FFN结构生成N个坐标点和分类的对象。 上图所示是模型Transformer的主要结构来自CNN主干网络的图像特征被送到transformer编码器中在每个多头自注意力机制中与空间位置编码相加作为多头自注意力机制的键和查询生成q,k,v需要矩阵相乘并不是一个直接的结果。作为在解码器和编码器进行注意力机制计算之前首先object query需要进行一个自注意力机制该步骤是为了去除模型中的冗余框。 三.演示效果
DETR 进行目标检测
DETR 交叉注意力机制可视化 query表示当前物体的标号下方对应的是相应的名称
DETR自注意力机制可视化 上方显示的点可以人工手动调整 四.核心逻辑
DETR模型的基本框架
class DETR(nn.Module): This is the DETR module that performs object detection def __init__(self, backbone, transformer, num_classes, num_queries, aux_lossFalse): Initializes the model.Parameters:backbone: torch module of the backbone to be used. See backbone.pytransformer: torch module of the transformer architecture. See transformer.pynum_classes: number of object classesnum_queries: number of object queries, ie detection slot. This is the maximal number of objectsDETR can detect in a single image. For COCO, we recommend 100 queries.aux_loss: True if auxiliary decoding losses (loss at each decoder layer) are to be used.super().__init__()self.num_queries num_queriesself.transformer transformerhidden_dim transformer.d_modelself.class_embed nn.Linear(hidden_dim, num_classes 1)self.bbox_embed MLP(hidden_dim, hidden_dim, 4, 3)self.query_embed nn.Embedding(num_queries, hidden_dim)self.input_proj nn.Conv2d(backbone.num_channels, hidden_dim, kernel_size1)self.backbone backboneself.aux_loss aux_lossdef forward(self, samples: NestedTensor): The forward expects a NestedTensor, which consists of:- samples.tensor: batched images, of shape [batch_size x 3 x H x W]- samples.mask: a binary mask of shape [batch_size x H x W], containing 1 on padded pixelsIt returns a dict with the following elements:- pred_logits: the classification logits (including no-object) for all queries.Shape [batch_size x num_queries x (num_classes 1)]- pred_boxes: The normalized boxes coordinates for all queries, represented as(center_x, center_y, height, width). These values are normalized in [0, 1],relative to the size of each individual image (disregarding possible padding).See PostProcess for information on how to retrieve the unnormalized bounding box.- aux_outputs: Optional, only returned when auxilary losses are activated. It is a list ofdictionnaries containing the two above keys for each decoder layer.if isinstance(samples, (list, torch.Tensor)):samples nested_tensor_from_tensor_list(samples)# backbone 网络进行了两个操作分别是获取特征图和位置编码features, pos self.backbone(samples)src, mask features[-1].decompose()assert mask is not None# input_proj: src: [2,2048,28,38]-[2,256,28,38] 改变特征图的通道维数# mask: [2,28,38] mask的通道维数为1 pos: [2,256,28,38] query表示查询也就是图片里面可能有多少物体的个数hs self.transformer(self.input_proj(src), mask, self.query_embed.weight, pos[-1])[0]outputs_class self.class_embed(hs)outputs_coord self.bbox_embed(hs).sigmoid()# 都只使用最后一层decoder输出的结果out {pred_logits: outputs_class[-1], pred_boxes: outputs_coord[-1]}if self.aux_loss:out[aux_outputs] self._set_aux_loss(outputs_class, outputs_coord)return outtorch.jit.unuseddef _set_aux_loss(self, outputs_class, outputs_coord):# this is a workaround to make torchscript happy, as torchscript# doesnt support dictionary with non-homogeneous values, such# as a dict having both a Tensor and a list.return [{pred_logits: a, pred_boxes: b}for a, b in zip(outputs_class[:-1], outputs_coord[:-1])]Transformer模块
class Transformer(nn.Module):def __init__(self, d_model512, nhead8, num_encoder_layers6,num_decoder_layers6, dim_feedforward2048, dropout0.1,activationrelu, normalize_beforeFalse,return_intermediate_decFalse):super().__init__()encoder_layer TransformerEncoderLayer(d_model, nhead, dim_feedforward,dropout, activation, normalize_before)encoder_norm nn.LayerNorm(d_model) if normalize_before else Noneself.encoder TransformerEncoder(encoder_layer, num_encoder_layers, encoder_norm)decoder_layer TransformerDecoderLayer(d_model, nhead, dim_feedforward,dropout, activation, normalize_before)decoder_norm nn.LayerNorm(d_model)self.decoder TransformerDecoder(decoder_layer, num_decoder_layers, decoder_norm,return_intermediatereturn_intermediate_dec)self._reset_parameters()self.d_model d_modelself.nhead nheaddef _reset_parameters(self):for p in self.parameters():if p.dim() 1:nn.init.xavier_uniform_(p)def forward(self, src, mask, query_embed, pos_embed):# flatten NxCxHxW to HWxNxC [2,256,28,38]bs, c, h, w src.shape# src: [2,256,28,38]-[2,256,28*38]-[1064,2,256]# pos_embed: [2,256,28,38]-[2,256,28*38]-[1064,2,256]src src.flatten(2).permute(2, 0, 1)pos_embed pos_embed.flatten(2).permute(2, 0, 1)# query_embed:[100,256]-[100,1,256]-[100,2,256]query_embed query_embed.unsqueeze(1).repeat(1, bs, 1)# mask: [2,28,38]-[2,1064]mask mask.flatten(1)# 其实也是一个位置编码表示目标的信息一开始被初始化为0 [100,2,256]tgt torch.zeros_like(query_embed)# memory的shape和src的一样是[1064,2,256]memory self.encoder(src, src_key_padding_maskmask, pospos_embed)hs self.decoder(tgt, memory, memory_key_padding_maskmask,pospos_embed, query_posquery_embed)# hs 不止输出最后一层的结构而是输出解码器所有层结构的输出情况# hs: [6,100,2,256]-[6,2,100,256] [depth,batch_size,num_query,channel]# 一般只使用最后一层特征所以未hs[-1]return hs.transpose(1, 2), memory.permute(1, 2, 0).view(bs, c, h, w) 总结
综上我们基本了解了“一项全新的技术啦” ~~
恭喜你的内功又双叒叕得到了提高
感谢你们的阅读
后续还会继续更新欢迎持续关注哟~
如果有错误❌欢迎指正呀
✨如果觉得收获满满可以点点赞支持一下哟~✨
【传知科技 – 了解更多新知识】