文章主要用高斯分布来表示目标,就是一个目标用高斯分布来覆盖,目标中心点的值越大。
整个网络主要有bone net特征提取网络和输出部分组成,网络结果如上图所示,特征提取网络就不细讲了。用高斯分布来表示目标,网络第三个分支/hm输出部分网络如下:
nn.Sequential( nn.Conv2d(64, 256, kernel_size=3, padding=1, bias=True),
nn.ReLU(inplace=True),
nn.Conv2d(256, classes, kernel_size=final_kernel, stride=1, padding=final_kernel // 2, bias=True))
其实就是一个conv2d(64,256),relu(),conv2d(256,1),最后的输出为n_category×128×128,一个类别一个通道,其中每个点的值表示:是目标的概率有多大。上图是只有一个类别的情况。
网络定义为:
nn.Sequential( nn.Conv2d(64, 256, kernel_size=3, padding=1, bias=True),
nn.ReLU(inplace=True),
nn.Conv2d(256, 2, kernel_size=final_kernel, stride=1, padding=final_kernel // 2, bias=True))
分支最后输出:2×128×128,所有类别用共同的预测宽度w和高度h。
网络定义为:
nn.Sequential( nn.Conv2d(64, 256, kernel_size=3, padding=1, bias=True),
nn.ReLU(inplace=True),
nn.Conv2d(256, 2, kernel_size=final_kernel, stride=1, padding=final_kernel // 2, bias=True))
分支输出:2×128×128,每个点的两个值表示,当前index为目标时hm输出位置的偏差,所有类别用共同的w,h预测值。
总结: 整个网络还是很好理解的。
output = self.model(images)[-1]
hm = output['hm'].sigmoid_()
wh = output['wh']
reg = output['reg']
就是正常的前向,hm的输出要经过sigmoid。
hmax = nn.functional.max_pool2d(heat, (kernel, kernel), stride=1, padding=pad)
scores, inds, clses, ys, xs = _topk(heat, K=K)