毕设开源 基于机器视觉的目标跟踪算法
文章目录
-
0 前言
-
2 目标跟踪效果
-
3 目标跟踪的两种方法
-
- 3.1 方法1
- 3.2 方法2
-
基于Tracking By Detecting方法的追踪流程
-
存在的主要问题
- 基于轨迹预测策略的追踪机制
-
5 训练代码
-
6 最后
-
0 前言
🔥 今天学长向大家分享一个毕业设计项目
为了让大家能够顺利且最省力地通过毕设, 学长为大家推荐了一些优秀的毕业设计案例. 今天为大家带来的是...
🚩 毕业设计 深度学习多目标跟踪 实时检测
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:4分
项目运行效果:
毕业设计 机器视觉的目标跟踪算法
🧿 项目分享:见文末!
2 目标跟踪效果


3 目标跟踪的两种方法
3.1 方法1
采用基于初始化帧的追踪方法,在视频的第一帧确定你的目标位置,并将这一操作交由追踪算法来完成。这种方法的主要局限性在于它仅能持续关注你最初选定的目标物体,在后续出现新的物体时则无法被追踪。然而这种方案在实际应用中具有较高的运行效率,并且其明显的不足之处在于无法适应新出现的目标对象
3.2 方法2
基于目标检测的方法用于执行追踪任务,在每一帧图像中首先识别出所有具有兴趣的目标物体,并将这些对象与前一帧中的相应对象建立联系以完成追踪任务。其优势在于能够持续追踪出现在视频中的新对象,并且需要注意的是这种方法的前提条件是有高效的"目标检测"算法作为支撑。
学长主要介绍了Option 2的具体实现逻辑, 即基于Tracking By Detecting的追踪机制.
4 Tracking By Detecting的跟踪过程
通过目标检测算法识别出每帧图像中的目标实例,并获取其相应的(位置信息、分类标签及置信度分数),其中系统识别出的目标总数设为M
**Step2:**采用特定方法对应于上一帧中的每一个检测目标(假设上一帧检测目标数量为N)。具体而言,在M×N个候选配对中识别出最匹配的配对。
在Step2中针对'某种方式'的具体而言,在实际应用中通常会采用多种方法来实现这种关联性。例如,在计算两帧之间的目标配准时(即配准问题),具体而言,在计算两帧之间的目标配准时(即配准问题),具体而言,在计算两帧之间的目标配准问题时(即配准问题),具体而言,在计算两帧之间对应点位置关系的问题上(即配准问题),我们可以采用以下几种不同的方法:其一是基于几何约束的方法(如欧几里得距离法)。例如,在计算两帧之间对应点位置关系的问题上(即配准问题),我们可以采用以下几种不同的方法:其一是基于几何约束的方法(如欧几里得距离法)。其二是利用匈牙利算法确定最优匹配对。除此之外,在实际应用中还可以引入其他辅助判断条件以提高准确性。例如常用的IOU指标就可以用于辅助判断:当两目标的目标框交并比值越接近1时(即越趋近于完全重合),则认为这两个目标属于同一物体。另外一种方法则是通过分析两目标的目标特征来进行识别比较。这通常需要结合外观模型进行分析与比较以提高识别精度。然而这样的方法虽然准确率较高但可能会增加计算复杂度
在关联的过程中,会出现三种情况:
1)在上一帧中的N个目标中找到了本次检测到的目标,说明正常跟踪到了;
在上一帧中的N个目标中未被本次检测所识别出的目标,则表示该目标为本帧中的新增目标;因此,在后续的跟踪关联过程中应当对该新出现的目标进行记录以便于下次追踪使用
在上一个画面中发现了一个特定的目标,在当前画面中却没有对应的任何目标与之相关联,则这表明该目标可能已经不在当前观察范围内了。需要注意的是这种情况可能是由于检测系统出现错误或者算法误判导致的,在这种情况下我们可能需要对该对象进行删除处理

4.1 存在的问题
该跟踪方法通常能够在正常条件下正常运行;然而,在视频中如果目标物体快速移动,则在同一目标在前后帧之间的移动距离非常大时会出现问题。

如图所示,在第一帧中用实线框标示出目标位置,在第二帧中则用虚线框标示出目标位置。当目标运动速度较慢时(或者采用隔帧检测),这种情况下通过之前的跟踪方式能够准确地将(A, A')和(B, B')进行关联匹配。然而,在快速运动场景下(或采用隔帧检测),由于A物体会移动至前一帧中的B位置,并导致B物体现在处于其他位置的状态,则基于上述关联方法将会得出错误的结果
那么怎样才能更加准确地进行跟踪呢?
4.2 基于轨迹预测的跟踪方式
由于第二帧位置与前一帧位置之间的对比关系可能导致定位偏差,在这种情况下我们需要采取相应的措施以避免定位错误的发生。为此,在进行对比分析之前我们可以预先对目标下一帧的位置进行预判然后将其与当前实际观测结果进行比较从而有效降低因速度过快带来的影响。

如上图所示,在进行关联处理之前,请先预判A和B在下一帧的时间节点处的位置,并通过实际检测得到的目标位置与预判的目标位置进行对应匹配,并能完美地解决上述所提及的问题。理论上而言,则不论目标移动的速度有多快亦能实现有效联结。那么问题就来了:如何预判目标在下一帧的时间节点处的位置?
多种方法可用,在实际应用中我们可以采用卡尔曼滤波技术结合目标前几帧的运动轨迹进行预判其下一帧位置。另外一种途径是利用自身拟合出的数学模型进行预测。

根据图中所示,在前六个连续帧的位置信息基础上,我们可以推导出一条从时间点T延伸至XY坐标的曲线(值得注意的是这条曲线并非图形绘制时所呈现的直线),随后进一步推断出目标在下一个时间点T+1处的位置。具体而言,在Python编程语言中利用numpy库能够实现这一功能的方法非常简便。
5 训练代码
这里记录一下训练代码,来日更新
if FLAGS.mode == 'eager_tf':
# Eager mode is great for debugging
# Non eager graph mode is recommended for real training
avg_loss = tf.keras.metrics.Mean('loss', dtype=tf.float32)
avg_val_loss = tf.keras.metrics.Mean('val_loss', dtype=tf.float32)
for epoch in range(1, FLAGS.epochs + 1):
for batch, (images, labels) in enumerate(train_dataset):
with tf.GradientTape() as tape:
outputs = model(images, training=True)
regularization_loss = tf.reduce_sum(model.losses)
pred_loss = []
for output, label, loss_fn in zip(outputs, labels, loss):
pred_loss.append(loss_fn(label, output))
total_loss = tf.reduce_sum(pred_loss) + regularization_loss
grads = tape.gradient(total_loss, model.trainable_variables)
optimizer.apply_gradients(
zip(grads, model.trainable_variables))
logging.info("{}_train_{}, {}, {}".format(
epoch, batch, total_loss.numpy(),
list(map(lambda x: np.sum(x.numpy()), pred_loss))))
avg_loss.update_state(total_loss)
for batch, (images, labels) in enumerate(val_dataset):
outputs = model(images)
regularization_loss = tf.reduce_sum(model.losses)
pred_loss = []
for output, label, loss_fn in zip(outputs, labels, loss):
pred_loss.append(loss_fn(label, output))
total_loss = tf.reduce_sum(pred_loss) + regularization_loss
logging.info("{}_val_{}, {}, {}".format(
epoch, batch, total_loss.numpy(),
list(map(lambda x: np.sum(x.numpy()), pred_loss))))
avg_val_loss.update_state(total_loss)
logging.info("{}, train: {}, val: {}".format(
epoch,
avg_loss.result().numpy(),
avg_val_loss.result().numpy()))
avg_loss.reset_states()
avg_val_loss.reset_states()
model.save_weights(
'checkpoints/yolov3_train_{}.tf'.format(epoch))
6 最后
项目运行效果:
毕业设计 机器视觉的目标跟踪算法
🧿 项目分享:见文末!
