针对伪装目标检测,本论文提出了Positioning and Focus Network (PFNet),该网络包含两个模块,定位(positioning module,PM)和聚焦(focus module,FM)。其中,定位模块从全局定位目标可能所在的位置,聚焦模块对区域进行识别并消除干扰来完善分割结果。
对于一张RGB图像,先用Resnet-50做backbone,提取出的多层特征,再送入四层卷积层减小通道数量;然后通过PM模块定位可能的目标位置;最后通过多个FM模块来发现和移除 false-positive 和 false-negative 的 distractions。
def __init__(self, backbone_path=None):
super(PFNet, self).__init__()
# params
# backbone
resnet50 = resnet.resnet50(backbone_path)
self.layer0 = nn.Sequential(resnet50.conv1, resnet50.bn1, resnet50.relu)
self.layer1 = nn.Sequential(resnet50.maxpool, resnet50.layer1)
self.layer2 = resnet50.layer2
self.layer3 = resnet50.layer3
self.layer4 = resnet50.layer4
# channel reduction
self.cr4 = nn.Sequential(nn.Conv2d(2048, 512, 3, 1, 1), nn.BatchNorm2d(512), nn.ReLU())
self.cr3 = nn.Sequential(nn.Conv2d(1024, 256, 3, 1, 1), nn.BatchNorm2d(256), nn.ReLU())
self.cr2 = nn.Sequential(nn.Conv2d(512, 128, 3, 1, 1), nn.BatchNorm2d(128), nn.ReLU())
self.cr1 = nn.Sequential(nn.Conv2d(256, 64, 3, 1, 1), nn.BatchNorm2d(64), nn.ReLU())
# positioning
self.positioning = Positioning(512)
# focus
self.focus3 = Focus(256, 512)
self.focus2 = Focus(128, 256)
self.focus1 = Focus(64, 128)
for m in self.modules():
if isinstance(m, nn.ReLU):
m.inplace = True
PM包括一个 channel attention block
和一个 spatial attention block
。
channel attention block
中:
通过输入的 C x H x W 的张量 F 获得 k、q、v,在 C 上做attention,i 和 j 的关系是C上的关系,输出得到 F’,对于 F‘ 乘上一个可学习的超参数,并累加一个identify mapping。
spatial attention block
中:
首先对 F’ 用1 x 1的卷积改变其通道数来获得q’ 和 k’,v‘ 的通道数不变,在空间上做attention,i 和 j 的关系是位置 N=H x W上的关系,接下来的操作同 CA 类似。
FM的目的就是发现和消除 false-positive 和 false-negative 的错误预测。
具体步骤见如下代码及注释。
def forward(self, x, y, in_map):
# x; current-level features
# y: higher-level features
# in_map: higher-level prediction
up = self.up(y) # Conv+BN+ReLU+双线性插值上采样
input_map = self.input_map(in_map)
f_feature = x * input_map # foreground-attentive features
b_feature = x * (1 - input_map) # background-attentive features
fp = self.fp(f_feature) # Context Exploration
fn = self.fn(b_feature) # Context Exploration
refine1 = up - (self.alpha * fp) # 抑制模糊的背景(false-positive)
refine1 = self.bn1(refine1)
refine1 = self.relu1(refine1)
refine2 = refine1 + (self.beta * fn) # 增强丢失的目标(false-negative)
refine2 = self.bn2(refine2)
refine2 = self.relu2(refine2)
output_map = self.output_map(refine2)
return refine2, output_map
其中的Context Exploration Block如下所示。
DConv是膨胀卷积,目的是增加模型的感受野。
通过CE,模型能获得大尺度上感知上下文的特征的能力。
在PFNet中有4个输出的预测值,一个是PM,另外的是FM,
对于PM模块,使用bce和iou损失。
对于FM模块,使用weighted bce和weighted iou损失。
最后的一个总损失即: