关于显著性目标检测----近期个人理解
F3Net:Fusion, Feedback and Focus for Salient Object Detection
paper: https://arxiv.org/abs/1911.11445?context=cs.CV
code: https://github.com/weijun88/F3Net
主要创新点
-
CFM(Cross Feature Module) ----CFM采用选择性融合策略,抑制冗余信息,避免特征间的污染,重要特征之间相互补充。与传统的融合方法相比,CFM能够去除背景噪声,锐化边界。
(对低层高层特征先做两个卷积操作,然后两个做个乘法,再分别与原特征图相加,与现有研究中直接添加或拼接相比,CFM避免了引入fl和fh的冗余信息,这些信息可能会“污染”原有的特征,对显著性图的生成产生不利影响。)[不同卷积层产生不同的特征,(高层特征具有丰富的语义,但缺乏准确的位置信息;低层特征有丰富的细节,但充满了背景噪音)(感受野不同)]
-
CFD(Cascaded Feedback Decoder)----CFD包含多个子解码器,每个子解码器都包含自底向上和自顶向下的过程。
-
Pixel Position Aware Loss----提出了一个带权重的BCE和IOU Loss。将不同的权值分配给不同的像素,扩展了二进制交叉熵。每个像素的权重由其周围的像素决定。难分像素会得到更大的权重,而容易的像素会得到更小的权重。
BCE损失函数的三个缺点 :1》背景占优势的图像中, 前景像素的丢失将被稀释; 2》平等对待所有像素,没有主次之分; 3》独立计算每个像素的损失,忽略图像的全局结构。
def structure_loss(pred, mask):
weit = 1+5*torch.abs(F.avg_pool2d(mask, kernel_size=31, stride=1, padding=15)-mask) # 权重,值是改变的
wbce = F.binary_cross_entropy_with_logits(pred, mask, reduce='none')
wbce = (weit*wbce).sum(dim=(2,3))/weit.sum(dim=(2,3))
pred = torch.sigmoid(pred)
inter = ((pred*mask)*weit).sum(dim=(2,3))
union = ((pred+mask)*weit).sum(dim=(2,3))
wiou = 1-(inter+1)/(union-inter+1)
return (wbce+wiou).mean()
一些tips
1.多尺度训练:
# collate_fn如何取样本的,我们可以定义自己的函数来准确地实现想要的功能
def collate(self, batch):
size = [224, 256, 288, 320, 352][np.random.randint(0, 5)]
image, mask = [list(item) for item in zip(*batch)]
for i in range(len(batch)):
image[i] = cv2.resize(image[i], dsize=(size, size), interpolation=cv2.INTER_LINEAR)
mask[i] = cv2.resize(mask[i], dsize=(size, size), interpolation=cv2.INTER_LINEAR)
image = torch.from_numpy(np.stack(image, axis=0)).permute(0,3,1,2)
mask = torch.from_numpy(np.stack(mask, axis=0)).unsqueeze(1)
return image, mask
2.特征融合部分可以借鉴哈