Towards Real-Time Multi( 二 )


这里可以根据场景调整适合自己的参数 , 比如针对车可以调整宽高比为3:1 , 而针对狗可以调整为3:2 , 前背景阈值也可以自行调整 , 具体参数视情况而定 。
检测的损失函数包含两部分 , 分别是分类损失和定位损失 , 分类损失使用交叉熵损失 , 定位损失使用-L1损失 , 和 R-CNN一致 。
表观特征分支
这里是论文中的难点所在 , 它采用了三元组的形式实现 。这里还没有理解清除 , 可以参考文章:
Real-Time Multi-
分析:为什么该模型效率优于其他模型? 1. SDE
以 + 为例 , 这个算法分为检测和重识别两个步骤:
pred = model(img, augment=opt.augment)[0]# 目标检测...outputs = deepsort.update(xywhs, confss, im0) # 目标重识别
为什么说SDE没有用到可能存在的共享结构呢?
我们先查看的输出结果:
for i, det in enumerate(pred):...bbox_xywh = []confs = []for *xyxy, conf, cls in det:...
可以看到检测网络输出的结果仅仅只有目标的位置、置信度以及类别 , 并没有保存目标的特征信息 。
我们跟进目标重识别的()方法:
如图 , 红框有个(, )函数 , 继续跟进
def _get_features(self, bbox_xywh, ori_img):im_crops = []for box in bbox_xywh:x1, y1, x2, y2 = self._xywh_to_xyxy(box)im = ori_img[y1:y2, x1:x2]im_crops.append(im)# 根据目标框坐标裁剪图片if im_crops:features = self.extractor(im_crops)# 提取目标特征else:features = np.array([])return features
可以看到这里利用一个特征提取器对裁剪后的目标图片提取特征 。
看到这里我们应该可以明白了SDE效率低下的原因:既然检测器本来就是通过特征图的方式完成目标位置检测的 , 那么Re-ID又进行了特征提取 , 这就可能会重复前面进行的工作 , 浪费资源 。
2. Two-stage
我们以-RCNN为例 。
-RCNN网络图:
主要看中间的RPN部分 。我们知道RPN的工作就是将骨干网络输出的共享特征图通过分类与回归两条分支完成对目标进行前背景分类和坐标回归 , 其内部实现基于 。
RPN的输出为 , 它包括目标的坐标信息以及分类信息(只能确定前景和背景) 。该坐标信息是映射到原图像的 。
我们注意在之前做了一步操作:通过目标的坐标信息映射到 map上 , 将区域特征从 map从抠出来作为池化层的输入 。回到上面的三种模型图中 , 这里的区域特征可以共享于 model , 这是比SDE一个明显的优点:即只提取了一次特征 , 但是可用于两个模块 。
但是由于-RCNN仍然是二阶段的 , RPN只能确定目标是否属于前景 , 区域特征仍然要输送到头部网络实现目标细分类依据边框的精准回归 , 虽然提高了运行时间 , 但仍然达不到实时效果 。
环境搭建与实验复现
这里可以参考我的另一篇文章:
下的 Real-Time Multi- 的环境搭建与训练
【Towards Real-Time Multi】参考 JDE 《 Real-Time Multi- 》学习笔记目标跟踪 -Real-Time Multi-Real-Time Multi-rcnn中Roi 层的个人理解