毕设- 基于机器视觉的目标跟踪算法
毕设成品 基于机器视觉的目标跟踪算法
文章目录
0 前言
🔥计算机视觉、图像处理、毕业辅导、作业帮助、代码获取,远程协助,代码定制,私聊会回复!
✍🏻作者简介:机器学习,深度学习,卷积神经网络处理,图像处理
🚀B站项目实战:https://space.bilibili.com/364224477
😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+
🤵♂代做需求:@个人主页
项目效果:
毕业设计 机器视觉的目标跟踪算法
🧿 项目分享:见文末!
2 目标跟踪效果
3 目标跟踪的两种方法
3.1 方法1
通过初始化帧进行跟踪,在视频的第一帧选定初始目标位置后
3.2 方法2
通过基于目标检测的方法进行跟踪,在每一帧图像中首先识别并提取出所有具有兴趣的目标物体;随后将这些目标与上一帧中已识别出的目标建立联系以实现持续的跟踪效果。其优点在于能够实时追踪出现在整个视频中的各种新出现的目标;然而需要注意的是这种方法的前提条件是需要具备一个高效可靠的"目标检测"算法作为支撑。
学长主要介绍了Option2的工作原理及其核心逻辑
4 Tracking By Detecting的跟踪过程
Step1:
Step2: 采用某种策略将Step1中的检测结果与前一帧的检测目标一一对应起来(假设前一帧共有N个检测目标)。具体来说,在M×N个候选对中筛选出最匹配的一对。
针对Step2中涉及的'某项方法'来说,具体而言,存在多种方法用于关联目标,这些方法各有特点且适用场景不同。例如,如常见的计算两帧间两个目标间的欧几里得距离(即平面两点间的直线距离),该比例越接近1,则认为这两个目标属于同一物体。此外,还可以添加其他判断条件,如我采用的IOU算法:计算两个目标Box(即位置大小方框)的交并比,该值越接近1就越可能是同一目标;此外,还可以根据两个目标的外观特征进行比较,这通常需要通过一种外观模型进行比较,可能会耗费更多的时间。
在关联的过程中,会出现三种情况:
1)在上一帧中的N个目标中找到了本次检测到的目标,说明正常跟踪到了;
未在前一帧中发现本次检测的目标表明该目标仅在当前帧中首次出现因此我们需要将其记录下来以便于后续帧之间的关联
在上一帧中存在某个目标对象,在当前帧中并未被检测到相关的目标信息,则表明该目标可能因视野范围缩小而消失,并需将其从当前处理结果中剔除。(需注意这种可能性的存在,在实际应用中可能由于检测误差而导致本体未被识别)
4.1 存在的问题
如前述该Tracking Mechanism 在常规环境下表现出色。然而,在视频画面中若出现快速移动的目标,则会在连续两帧画面中导致同一目标之间的位移显著增大;此时该Tracking Mechanism 可能会因定位误差而出现性能问题。

如图所示,在每一帧中均以不同线条样式标注出目标位置:用实线框标注的目标位置分别位于第一帧和第二帧;用虚线框标注的目标位置分别位于第一帧和第二帧。具体而言,在以下两种情况下可实现较为精确地对齐:一是当目标运动速度较慢时;二是即便采用隔帧检测的方式也能维持较高的匹配精度。然而,在实际应用中我们发现:当目标运动速度较快(或者跨越多帧进行检测)时,在后续一帧图像中可能出现如下现象:原本位于前一框架中的A点将会移动至当前框架中的B点位置;而原本位于当前框架中的B点也会被移动至其他非预期的位置区域。基于上述情况可以看出:若采用上述对齐方法将导致结果出现偏差
那么怎样才能更加准确地进行跟踪呢?
4.2 基于轨迹预测的跟踪方式
由于第二帧位置与第一帧位置之间的对比关联可能导致误差的存在,在这种情况下我们可以通过以下方式减少这种误差的影响:即在进行对比前先预测目标下一时刻可能出现的位置并将其与当前预测结果进行比较这样即使存在一定的预测偏差也能有效降低因速度快导致的相关误差
如上图所示,在进行关联前的阶段中,在基于图中所示的情况下,在进行关联前的第一步操作中, 我们首先估算出A和B在下一帧中的位置; 然后将这些预估的位置与实际检测到的目标位置进行配对; 这种方法能够完美地解决前面提到的问题. 理论上来说,"无论目标移动的速度多快",这种关联方法依然能够正常工作."那么问题来了",如何推断出目标在下一帧的位置?
多种方法可用于预测目标的运动轨迹。其中一种是利用卡尔曼滤波技术对目标过去几帧的位置信息进行建模,并在此基础上推断出其下一时刻的空间坐标。另一种则是通过自适应拟合的方法生成运动模型,并据此推算出未来时刻的目标位置坐标。在实际应用中,则是通过自适应拟合的方法建立运动模型,并以此推算出目标在下一时刻的具体位置坐标。

基于上文所述的图表,请问您是想了解什么?基于前6个位置的数据信息,请问我是否能够构建出一条参数化的路径?请注意,并非直线而是某种曲线轨迹。进而推断出目标在下一个时间点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 最后
项目效果:
毕业设计 机器视觉的目标跟踪算法
作者简介
热文推荐
作者简介
