float初始化_SiamRPN初始化代码记录

222e22c010c61ec4f3618b797203e724.png

作为经典的深度学习单目标跟踪算法,SiamRPN具有跟踪领域通用的第一帧初始化+每帧更新的范式,今天先记录根据第一帧信息初始化的代码。初始化的对象是什么,就是回归核与分类核,后续更新阶段会把这两个核当作卷积核,与每帧的instance_patch计算相关性。

初始化函数是Tracker类(class TrackerSiamRPN)中的一个方法,定义为:

def init(self, image, box):

其中image是第一帧图片,box是在第一帧中标注的目标框,它是一个4维向量: [Xtl, Ytl, w, h],Xtl和Ytl代表目标框左上角的坐标,w和h代表目标框的宽和高。

首先把图片转numpy数组,并将box的左上角坐标转换成从0开始的中心点坐标

image = np.asarray(image)
box = np.array( [ box[1]-1+(box[3]-1)/2,
                 box[0]-1+(box[2]-1)/2,
                 box[3], box[2] ], dtype=np.float32 )
self.center, self.target_sz = box[:2], box[2:]    # self.center:y,x; self.target_sz:h,w

需要注意,这里的中心坐标是(y, x),而不是(x, y),box的尺寸是(h, w)。接下来生成anchors:

self.response_sz = (self.cfg.instance_sz - self.cfg.exemplar_sz)//self.cfg.total_stride + 1
self.anchors = self._create_anchors(self.response_sz)

其中self.response_sz代表相关性计算后获得的特征图尺寸,由于模板和搜索区域前向传播通过的结构完全相同(siamese),故可以用二者输入尺寸之差除以特征提取网络的总步长快速计算得到,AlexNet中总步长为8。anchors均匀、密集地分布在该特征图上,_create_anchors函数在上一篇文章已经详细说明,此处不再赘述。

生成anchors以后,需要创建一个汉宁窗。汉宁窗是一个中心值最大、沿边缘方向逐渐衰减的矩阵,后续更新阶段将使用它对分类置信度tensor进行加权,降低那些分布在特征图边缘的点的响应:

self.hann_window = np.outer(                               # 生成一个17*17的汉宁窗
            np.hanning(self.response_sz),
            np.hanning(self.response_sz))
self.hann_window = np.tile(                                # 先将汉宁窗拉平,再沿x轴方向堆叠5次
            self.hann_window.flatten(),                    # 意思是特征图的每个位置上都有5种anchor
            len(self.cfg.ratios) * len(self.cfg.scales))

经过上面的处理,得到维度为(5*17*17,)的汉宁窗,它是一维数组,与更新阶段的response维度一致(下篇文章记录update),因此二者才能相加(带权重)。至此准备就绪,可以将模板前传了。

前传第一步,获得resize以前的模板

context = self.cfg.context * np.sum(self.target_sz)     # context = 0.5(w + h)
self.z_sz = np.sqrt(np.prod(self.target_sz + context))  # 计算resize前的模板尺寸  
self.x_sz = self.z_sz * self.cfg.instance_sz / self.cfg.exemplar_sz   # 计算相应的搜索区域尺寸,为后续的更新做好准备

可见resize前模板尺寸self.z_sz =

,根据z_sz,以及预设的resize后的模板与搜索区域尺寸之比,可以计算出resize前搜索区域x_sz的尺寸:self.x_sz = self.z_sz * 271 / 127。

前传第二步,裁剪并resize模板

self.avg_color = np.mean(image, axis=(0, 1))
exemplar_image = self._crop_and_resize(
        image, self.center, self.z_sz,
        self.cfg.exemplar_sz, self.avg_color)

其中self._crop_and_resize方法分为裁剪、resize两步,首先以box的中心即self.center为中心点,从原图中裁剪出长宽均为self.z_sz的正方形,然后通过插值将该正方形尺寸调整为(127, 127),作为孪生特征提取网络的输入。此处avg_color是一个三维向量,存储着原始图像的RGB三通道均值,当需要裁剪的正方形超出图像边界时,就用avg_color对图像进行padding(cv2.copyMakeBorder),确保裁剪得到的区域位于图像内部。

前传第三步,将resize后的模板通过特征提取网络和RPN,获得回归核与分类核

 exemplar_image = torch.from_numpy(exemplar_image).to(        # exemplar_image维度:[1,3,127,127]
        self.device).permute([2, 0, 1]).unsqueeze(0).float()
 with torch.set_grad_enabled(False):                          # 回归核维度:[20,512,4,4],论文中输入通道数是256,不过差别不大
        self.net.eval()                                       # 分类核维度:[10,512,4,4]
        self.kernel_reg, self.kernel_cls = self.net.learn(exemplar_image)

代码里的self.kernel_reg和self.kernel_cls就是算法的初始化对象,初始化over~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值