源码:https://github.com/dbolya/yolact
num_class是算上背景的类别,比如你的类别就一个person,那么记得此时的num_class应该为2,因为还需要算上背景啊。
YOLACT的网络结构及输出
YOLACT的backbone结构
其中_make_layer就是常规的resnet101中的_make_layer,具体是如何操作的可以查看源码https://github.com/dbolya/yolact
其中浅蓝色的就是后续将要使用的特征图。
YOLACT的FPN结构
FPN选用了backbone结构结构中的1、2、3作为输入,得到新的输出,也就是橘黄色的三角形0到4。
YOLACT的proto结构
将FPN中的输出0作为proto的输入,最终得到proto的输出(1,138,138,32)。
YOLACT的pred_heads结构
其中的3表示每个位置有3个预设anchor_box,然后对FPN中的所有特征图都进行操作,得到对应的bbox,conf,mask,priors,proto。
还有一个输出segm,具体的操作如下图所示:
所以综上所述,网络训练时的输出preds共包括:
'loc':每个anchorbox的预测偏移量,形状为(1,19248,4)
'conf':每个anchorbox的类别预测,形状为(1,19248,num_class)
'mask':就是论文中指出的mask系数,形状为(1,19248,32)
'priors':预设的anchorbox的坐标,形状为(19248,4)
'proto':与mask系数配合使用的分割特征图,形状为(1,138,138,32)
'segm':得到一个类似分割的热度图,这里的形状为(1,num_class-1,69,69),我估计segm是为了使得网络快速收敛用的。
YOLACT的损失函数
具体调用的方式在train.py中的类class NetLoss(nn.Module)
self.criterion(self.net, preds, targets, masks, num_crowds)
接下来介绍这几个参数:
net:就是上面的网络结构。
preds:是一个字典,上面红色字体部分就是preds中字典的内容。
targets:一般的形状为(batch,n,5),batch就是输入了常规的batchsize,n表示一张图片中有几个目标物体,5当中前4个表示目标物体的坐标,第5个数字表示该目标物体的类别。
masks:一般形状为(batch,n,550,550),这个n不是固定的,batch中的每张图片得到的目标物体数量都不相同,这个mask和maskrcnn那个是一样的。
num_crowds:(batch,)表示拥挤程度,0表示不拥挤,1表示拥挤,一般都是0。