DETR源码DEBUG

数据处理与dataloader

main.py

coco.py是处理数据的文件,此模型只能使用coco数据集格式,自己的数据集只能转换为coco格式。其中读取一个数据,包含图像大小、目标尺寸、id等

其中prepare预处理函数

其中anno是图像中的目标信息,只提取iscrowd=0的,表示单个目标,不重叠的目标。boxes提取目标的x,y,w,h值,将boxes[:, 2:] += boxes[:, :2]表示得到了x1,y1,x2,y2。并判断是否过界。

位置编码

detr.py中的DETR类

通过backbone其中是resnet得到特征图向量以及每个位置编码,其中位置编码不是对原始图像的编码而是特征图的编码

其中Backbone函数如下可以看出是通过resnet

继续跳入对应的Jonier类

进入位置编码函数

一共有两种位置编码,对奇数特征使用正弦位置编码,偶数特征用余弦编码。

其中10000就是经验值,表示距离越远位置差异越大的时候,两个词的关系越来越疏远。

第二种是可学习的位置编码,通过构造权重向量来学习,本文使用正余弦编码。mask表示了其中padding的值,通过取反将true表示包含目标的元素,分别进行行方向的累加和列方向的累加。并将位置进行归一化。

执行上述公式,在进行concat,从128维度到256维度,分别对应两个位置编码。

mask与编码模块

进入transformer类

先将特征图进行拉长并进行reshape操作,得到(840,8,256)其中840是长乘宽表示24*35共840个像素,256表示每个像素含有256维的特征向量。其中query_embed只在decoder中发挥作用,mask代表840个位置中哪些是Padding则标记不需要,其中encoder中对应的src是序列,哪一些是不需要做attention是padding得到的,位置编码。

进入transformer_encoderlayer (是实际来执行多头注意力机制的)transformerencoder是重复进行encoderlayer

在特征上不加入位置上的v值,使用内置的Multiattention函数。多次进行layer后得到输出特征。

进入DecoderLayer

tgt初始化为0,后续会不断的更新。其中使用的多头注意力机制和encoder层使用的不是同一个,不是共享的。tgt2是decoder自己的多头注意力机制得到的query向量,与原始的tgt相加。

这里的q是decoder中提供的query向量,k和v是encoder得到的memory向量。此时是和encoder进行多头注意力机制。

输出结果返回,进入损失函数

损失函数,使用匈牙利匹配算法。这里的matcher即是损失函数。分类、回归、GIOU

matcher.py

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值