Advertisement

基于机器视觉的目标跟踪算法

阅读量:

基于机器视觉的目标跟踪算法

文章目录

0 前言

✍🏻作者简介:机器学习,深度学习,卷积神经网络处理,图像处理
🚀B站项目实战:https://space.bilibili.com/364224477
😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+
🤵‍♂个人主页:@purple的个人主页
项目效果:

毕业设计 机器视觉的目标跟踪算法

项目获取:

https://gitee.com/sinonfin/algorithm-sharing

2 目标跟踪效果

3 目标跟踪的两种方法

3.1 方法1

通过初始化帧进行目标跟踪,在视频的第一帧中确定目标后,并将其交由跟踪算法去实现目标追踪。这种方法仅限于追踪第一帧选定的目标对象,在后续帧中出现新的物体时则无法被追踪到。其优势在于运行效率较高。然而明显的缺点是无法追踪新增的目标。

3.2 方法2

该系统采用基于目标检测的追踪机制,在每一帧图像中首先识别并定位出所有具有研究价值的目标物体;随后将这些目标与上一帧中已识别出的目标进行对应配对和信息匹配,从而完成追踪过程;值得注意的是,这种方案的一个显著优势是可以持续监测并识别出现在视频中的任意新出现的目标物体;然而需要注意的是,这种方法的有效性依赖于具备高效可靠的实时目标检测技术作为基础支撑。

学长主要介绍了Option2的实现方式,并详细讲解了基于Tracking By Detecting追踪方法的工作原理。

4 Tracking By Detecting的跟踪过程

**Step1:**通过目标检测算法,在每一帧中识别出感兴趣的目标,并提取出其(位置坐标, 分类, 可信度)信息;假设一共提取了M个目标;

**Step2:**通过特定方法将Step1中的检测结果与上一帧中的检测目标一一对应起来。具体而言,在M×N个Pair中找到最接近匹配的Pair。

对于Step 2中使用的那种方法而言,在实际操作中可能会遇到多解性问题难以直接得到精确解的情况。例如,在计算两帧之间对应关系时通常会采用欧几里得距离(平面两点间的直线距离)这一指标来衡量两帧中两个目标之间的关联程度;而当两者之间的最小距离被确定后则可以通过匈牙利算法(Hungarian Algorithm)来找出最优配对关系;此外在判断两目标是否为同一物体时还可以考虑其他因素如外观特征匹配等,并非只能依赖上述方法;当然在实际应用中还可以根据具体需求添加一些辅助条件以提高识别精度如采用交并比值(IoU指标)来衡量两目标Box(位置大小方框)间的重叠程度等

在关联的过程中,会出现三种情况:

1)在上一帧中的N个目标中找到了本次检测到的目标,说明正常跟踪到了;

未在上一帧中的N个目标中匹配到本次检测的目标表明该目标属于当前这一个框架。因此我们需要将其登记以便于下次跟踪建立关联。

在前一帧内存在一个特定的目标,在当前帧内并未发现与其相关联的目标。这表明该目标很可能已经从观察范围内消失,并需将其从当前处理结果中排除。(值得注意的是这里的"可能",因为这可能是由于检测错误导致的同一物体未被识别)

4.1 存在的问题

如前所述地指出的该种跟踪方法在常规场景下表现出良好的性能。然而,在视频序列中若目标物体移动速度极快,则在同一场景下连续两帧图像中的同一目标物体会产生较大的位移距离差异,在这种情况下前述该种跟踪方式将无法维持稳定的追踪效果

在这里插入图片描述

如图所示,在第一帧中用实线框标示了目标位置,在第二帧中则用虚线框标示。当运动速度较慢时(或称低速运动),使用先前的方法能够准确地将(A,A’)与(B,B’)进行对应;然而,在快速运动的情况下(例如隔帧检测),由于A迅速移动到与B相同的位置,则会破坏这种对应关系。此时若采用上述关联方法就会得到错误的结果。

那么怎样才能更加准确地进行跟踪呢?

4.2 基于轨迹预测的跟踪方式

鉴于通过第二帧的位置与第一帧的位置进行关联可能会导致误差存在的情况,在这种情况下我们可以预先预测目标的下一帧可能出现的位置并将其与该预测位置进行比较这样一来只要我们的预测具有足够的精确度基本上就可以消除之前提到的速度过快所导致的误差

根据图中所示,在进行对比关联之前,请先对A和B两目标在下一帧内的位置进行预测,并将实际检测到的目标位置与之前的预测结果进行比对连接。从而完美解决了上述提到的问题。理论上无论目标移动速度有多快仍能实现良好的对焦效果。那么问题来了:如何准确估计目标在下一帧内的位置?

多种方法可用于目标运动预测。其中一种是基于卡尔曼滤波的方法;另一种则是利用自适应模型来进行位置估计。在实际操作中,则采用自适应模型来进行位置预测。

在这里插入图片描述

基于上图所示的数据,在分析前6个时间点的位置信息后

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))
    
    
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-13/wr0C9fTSqlG56LaxMNOBmbnPhcot.png)

6 最后

项目效果:

毕业设计 机器视觉的目标跟踪算法

全部评论 (0)

还没有任何评论哟~