簡介
本文出自FaceBook AI,方法很新穎,不同於已有的R-CNN一系列,也不同於Yolo一系列,也不同於FCOS、CenterNet等最新的Anchor Free模型。作者將目標檢測視爲direct set prediction problem(直接集預測)。
下載鏈接
本篇博客的部分內容參考自這裏
動機
simplify pipelines.
貢獻
本文將Transformer融入目標檢測的pipeline,實現了真正的No Anchor。實驗結果上,能夠超過精調的Faster R-CNN。
方法
方法的整體架構如下圖所示。
更爲具體的結構圖如下圖所示。其實就三個部分:backbone、transformer (encoder + decoder)、prediction heads。其中,backbone就是傳統的CNN結構,用於提取圖像的2D信息。encoder和decoder一會再說。prediction heads用於對decoder的輸出進行分類。
下面說encoder和decoder。下圖是更加清晰的encoder和decoder結構,來自原文的附錄。這裏比較有意思的是Object queries,我一直也沒太理解它的直觀意思,下面說一下我的大致理解。從作者的代碼中,能夠看出,所謂的Object queries其實是一個大小爲的變量,而且是通過訓練確定的!這裏的100是個超參數,表示對於每張圖片,預測100個bboxes。設爲100的原因是,數據集中有90個類別,100剛好合適。
有兩點值得注意的 1. 和NLP中的transformer不太一樣,DETR中在decoder部分將Object queries一起作爲輸入,而非序列化地一個一個輸入。2. 只用image features進行編碼是不夠的,需要融入位置信息,也就是上圖中的Spatial positional encoding部分。這部分我沒具體看,代碼裏是這樣的,有興趣的可以分析一下。
# spatial positional encoding
def forward(self, tensor_list: NestedTensor):
x = tensor_list.tensors
mask = tensor_list.mask
assert mask is not None
not_mask = ~mask
y_embed = not_mask.cumsum(1, dtype=torch.float32)
x_embed = not_mask.cumsum(2, dtype=torch.float32)
if self.normalize:
eps = 1e-6
y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale
x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale
dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device)
dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats)
pos_x = x_embed[:, :, :, None] / dim_t
pos_y = y_embed[:, :, :, None] / dim_t
pos_x = torch.stack((pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4).flatten(3)
pos_y = torch.stack((pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4).flatten(3)
pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2)
return pos
實驗
下圖是在COCO上的實驗結果,主要和Faster R-CNN進行了對比。