数据处理与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