一面
很友好,编程部分考察了下二叉堆,就结束了,前面聊了聊项目经历,关键是我也没项目,就尬尬的结束了。
问了问kaggle和天池的一些经历,我挑了那个PANDAS那个大场景目标跟踪的比赛说了说,多少是有点班门弄斧了,也是实在没得说。
二面
问了一些更深入的问题:
OTA中dynamic k为什么这么计算?
不同目标设定不同的正样本数量( dynamic k ):我们不可能为同一场景下的西瓜和蚂蚁分配同样的正样本数,如果真是那样,那要么蚂蚁有很多低质量的正样本,要么西瓜仅仅只有一两个正样本。Dynamic k 的关键在于如何确定k,有些方法通过其他方式间接实现了动态 k ,比如 ATSS、PAA ,甚至 RetinaNet ,同时,k的估计依然可以是 prediction aware 的,我们具体的做法是首先计算每个目标最接近的10个预测,然后把这个 10 个预测与 gt 的 iou 加起来求得最终的k,很简单有效,对 10 这个数字也不是很敏感,在 5~15 调整几乎没有影响。
Fair MOT你了解吗,简单讲讲?
CSTrack的机制?他的CCN如何理解,是self-attention吗?
这个多少懂一些,就多说了一些
Reid loss有哪些,OIM是什么?
balabala
RPN怎么训练的?
balabala
YOLOX最后几个epoch有什么变动?
我就回答了一个数据增强部分会关闭mosaic和mixup,面试老师提示说loss部分也有,一会得再看看源码,稍等补充
编码部分
实现了一下多头注意力机制,对我来说多少有点意外了,我以为会让我实现下OTA,幸亏不是
class Attention(nn.Module):
def __init__(self, dim, heads = 8, dim_head = 64, dropout = 0.):
super().__init__()
inner_dim = dim_head * heads
project_out = not (heads == 1 and dim_head == dim)
self.heads = heads
self.scale = dim_head ** -0.5
self.attend = nn.Softmax(dim = -1)
self.to_qkv = nn.Linear(dim, inner_dim * 3, bias = False)
self.to_out = nn.Sequential(
nn.Linear(inner_dim, dim),
nn.Dropout(dropout)
) if project_out else nn.Identity()
def forward(self, x):
qkv = self.to_qkv(x).chunk(3, dim = -1)
q, k, v = map(lambda t: rearrange(t, 'b n (h d) -> b h n d', h = self.heads), qkv)
dots = torch.matmul(q, k.transpose(-1, -2)) * self.scale
attn = self.attend(dots)
out = torch.matmul(attn, v)
out = rearrange(out, 'b h n d -> b n (h d)')
return self.to_out(out)
膜拜大佬!!!╰( ´・ω・)つ──☆✿✿✿