机器视觉初步10:目标跟踪

news2024/9/21 2:39:58

目标跟踪是计算机视觉中的一个重要领域,主要目的是在视频序列中跟踪一个或多个目标对象。常见的目标跟踪方法分为三类:非机器学习方法、机器学习方法和深度学习方法1

文章目录

  • 1.非机器学习方法
    • a) 光流法(Optical Flow)
    • b) Haar特征与级联分类器(Haar-based Cascaded Classifier)
    • c) 卡尔曼滤波器(Kalman Filter)
  • 2.机器学习方法
    • a) K-最近邻(K-Nearest Neighbors, KNN)
    • b) 支持向量机(Support Vector Machine, SVM)
    • c) 随机森林(Random Forest)
  • 3.深度学习方法
    • a) 卷积神经网络(Convolutional Neural Network, CNN)
  • 4.神经网络目标跟踪方法
    • a) CNN目标跟踪
    • b) 循环神经网络(RNN)目标跟踪
  • 5. 变分自编码器(Variational Autoencoder, VAE)目标跟踪

1.非机器学习方法

a) 光流法(Optical Flow)

原理:根据图像序列中相邻像素之间的运动信息1,估计目标对象在不同时刻的像素位置。
在这里插入图片描述

Python实现:

from optical_flow import calcOpticalFlowPyrLK

# 视频序列输入
video = ...

# 创建光流对象
flow = calcOpticalFlowPyrLK(video, gray_img, prevImg=None, downsample=None, maxLevel=1, criteria=(TermCriteria(TermCriteria.EPS + TermCriteria.COUNT, 30, 1.0), TermCriteria.EPS, 0.1))

在这里插入图片描述

b) Haar特征与级联分类器(Haar-based Cascaded Classifier)

在这里插入图片描述

原理:使用Haar特征描述目标对象的局部特征,然后训练级联分类器来检测和跟踪目标对象。
可参考:Haar级联检测器
在这里插入图片描述

Python实现:

from haarcascades import HaarCascade

# 视频序列输入
video = ...

# 创建级联分类器
face_cascade = HaarCascade('haarcascade_frontalface_default.xml')

c) 卡尔曼滤波器(Kalman Filter)

原理:通过协方差矩阵和状态方程,估计目标对象的状态并进行跟踪。
Python实现:

from pykf import KalmanFilter

# 视频序列输入
video = ...

# 创建卡尔曼滤波器
kf = KalmanFilter()

2.机器学习方法

a) K-最近邻(K-Nearest Neighbors, KNN)

原理:将目标对象的特征向量与训练集中的所有对象进行比较,找到距离目标对象最近的K个邻居,选择前K个邻居中出现频率最高的类别作为目标对象的类别。2

在这里插入图片描述

Python实现:

from sklearn.neighbors import KNeighborsClassifier

# 视频序列输入
video = ...

# 创建KNN分类器
knn = KNeighborsClassifier(n_neighbors=3)

b) 支持向量机(Support Vector Machine, SVM)

原理:通过寻找一个超平面将样本数据分开,该超平面的法向量可以表征分类器的类别预测能力。
在这里插入图片描述
参考链接:支持向量机(SVM)——原理篇
Python实现:

from sklearn.svm import SVC

# 视频序列输入
video = ...

# 创建SVM分类器
svm = SVC(kernel='linear')

c) 随机森林(Random Forest)

原理:通过构建多个决策树模型,并使用投票机制来分类目标对象。随机森林可以处理非线性和高维数据。
在这里插入图片描述

参考文章:随机森林详解(从决策树理解随机森林)
Python实现:

from sklearn.ensemble import RandomForestClassifier

# 视频序列输入
video = ...

# 创建随机森林分类器
rf = RandomForestClassifier(n_estimators=100, random_state=42)

3.深度学习方法

a) 卷积神经网络(Convolutional Neural Network, CNN)

原理:使用卷积层、池化层和全连接层等组件,通过多层网络结构自动学习目标对象的特征表示。
在这里插入图片描述

Python实现:

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator

# 创建卷积神经网络模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(480, 640, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 编译模型
model.compile(optimizer=SGD(lr=0.001),
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 训练模型
training_generator = ImageDataGenerator(
    featurewise_center=False,
    samplewise_center=False,
    featurewise_std_normalization=False,
    samplewise_std_normalization=False,
    zca_whitening=False,
    zca_epsilon=1e-05,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True,
    vertical_flip=True)

model.fit_generator(training_generator.flow(input_image_folder, target_size=(480, 640), batch_size=32),
                    steps_per_epoch=training_generator.get_shelf_size(),
                    epochs=100,
                    validation_data=training_generator.flow(validation_image_folder, target_size=(480, 640), batch_size=32),
                    validation_steps=training_generator.get_shelf_size())

上述介绍了常见的目标跟踪方法和相应的Python实现。不同方法有各自的优缺点和适用场景,实际应用中需要根据具体需求选择合适的方法。

4.神经网络目标跟踪方法

神经网络目标跟踪方法基于卷积神经网络(CNN)和循环神经网络(RNN)等深度学习技术。这些方法能够通过大量数据和深度神经网络学习目标对象的特征表示,进而实现高准确度的目标跟踪。
在这里插入图片描述
参考文章:机器学习算法之——卷积神经网络(CNN)原理讲解

a) CNN目标跟踪

原理:使用卷积神经网络(CNN)在训练数据集上学习目标对象的特征表示。然后,将这些特征表示用于目标检测和跟踪任务。
Python实现:

from tensorflow.keras.applications import ResNet50
from tensorflow.keras.applications.ResNet50 import preprocess_input, decode_predictions
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 加载预训练的ResNet50模型
model = ResNet50(weights='imagenet')

# 数据增强
train_generator = ImageDataGenerator(
    rescale=1./255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

# 训练模型
training_generator = train_generator.flow_from_directory('training_data',
                                                      target_size=(480, 640),
                                                      batch_size=32,
                                                      class_mode='binary')

# 编译模型
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(training_generator,
          epochs=5,
          steps_per_epoch=training_generator.get_imgs_count() // training_generator.get_batch_size())

# 预测
pred = model.predict(training_generator.flow('test_data', batch_size=32))
print(decode_predictions(pred, top=5))

b) 循环神经网络(RNN)目标跟踪

原理:使用循环神经网络(RNN)在序列数据上捕捉时间相关性,并在训练数据集上学习目标对象的特征表示。然后,将学习到的特征表示用于目标检测和跟踪任务。
Python实现:

import tensorflow as tf
from tensorflow.keras import layers, models, regularizers, optimizers, preprocessing

# 加载预训练的ResNet50模型
model = models.resnet50(pretrained=True)

# 数据增强
train_generator = preprocessing.image_data_generator(
    input_file='training_data',
    batch_size=32,
    num_epochs=5,
    shuffle=True)

# 编译模型
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(train_generator,
          epochs=5,
          steps_per_epoch=train_generator.get_imgs_count() // train_generator.get_batch_size())

# 预测
pred = model.predict(train_generator.flow('test_data', batch_size=32))
print(decode_predictions(pred, top=5))

上述介绍了神经网络目标跟踪方法和相应的Python实现。这些方法具有很高的准确度和鲁棒性,但需要大量的数据和计算资源进行训练。实际应用中,可以根据项目需求和资源限制选择合适的方法。

5. 变分自编码器(Variational Autoencoder, VAE)目标跟踪

原理:VAE 是一种基于神经网络的变分方法,用于生成数据的分布。在目标跟踪任务中,VAE 可以将目标对象的特征表示编码为高维隐空间,然后解码得到目标对象在新图像中的位置。
在这里插入图片描述
参考文章:一文理解变分自编码器(VAE)

Python实现:

import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Conv2D, Conv1D, Flatten, Embedding, BatchNormalization, Dropout
from tensorflow.keras.layers import LSTM, GRU, Dense, Input, TimeDistributed, Activation, Reshape
from tensorflow.keras.models import Model
from tensorflow.keras.losses import mean_squared_error
from tensorflow.keras.optimizers import Adam

# 输入数据
inputs = Input(shape=(784,))

# 提取目标对象特征
x = Conv2D(32, (3, 3), padding='same', activation='relu')(inputs)
x = Conv1D(64, (1, 1), padding='same', activation='relu')(x)
x = BatchNormalization(axis=1)(x)
x = Dropout(0.25)(x)
x = Conv2D(64, (3, 3), padding='same', activation='relu')(x)
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(100, activation='relu')(x)
x = Dense(10, activation='softmax')(x)

# 解码器
x = Embedding(input_dim=784, output_dim=100, input_length=inputs.get_shape().as_list()[-1])(x)
x = TimeDistributed(Dense(10, activation='softmax'))(x)

# 编码器
encoder = LSTM(128, dropout=0.5, return_sequences=True)(inputs)
encoder = GRU(128, dropout=0.5, return_sequences=True)(encoder)
encoder = TimeDistributed(Dense(10, activation='softmax'))(encoder)

# 编译模型
model = Model(inputs=inputs, outputs=[x, encoder])

# 编译损失和优化器
model.compile(loss=mean_squared_error, optimizer=Adam(lr=1e-3), metrics=['accuracy'])

# 训练模型
train_generator = Input(shape=(784,))
x_train = model(train_generator)
x_train = Dropout(0.25)(x_train)

# 测试模型
test_generator = Input(shape=(1000,))
x_test = model(test_generator)
x_test = Dropout(0.5)(x_test)

上述介绍了变分自编码器(VAE)目标跟踪方法和相应的Python实现。这种方法可以将目标对象的特征表示编码为高维隐空间,然后解码得到目标对象在新图像中的位置。VAE 具有较强的生成能力和鲁棒性,但计算资源需求较高。实际应用中,可以根据项目需求和资源限制选择合适的方法。


  1. "相邻像素之间的运动信息"是指像素在图像中的位置和方向之间的关系。这个信息可以用于深度感知、计算机视觉、图像处理、运动估计和跟踪等领域。
    在计算机视觉领域,像素之间的运动信息可以帮助我们了解物体的运动状态。例如,在目标跟踪任务中,可以通过分析相邻像素之间的运动信息来估计目标的运动轨迹。
    在图像处理中,运动信息可以用于计算图像的运动补偿或变换。例如,可以使用运动信息来插值模糊的图像或平滑图像中的运动。
    此外,运动信息还可以用于估计图像的运动参数,如速度和方向等。这些参数在计算机视觉、机器人导航和无人驾驶等领域中非常有用。
    需要注意的是,不同类型的图像可能具有不同的运动信息,因此在不同应用中需要针对性地处理。 ↩︎ ↩︎

  2. 邻近算法,或者说K最近邻(K-Nearest Neighbor,KNN)分类算法是数据挖掘分类技术中最简单的方法之一,是著名的模式识别统计学方法,在机器学习分类算法中占有相当大的地位。它是一个理论上比较成熟的方法。既是最简单的机器学习算法之一,也是基于实例的学习方法中最基本的,又是最好的文本分类算法之一。
    所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。Cover和Hart在1968年提出了最初的邻近算法。KNN是一种分类(classification)算法,它输入基于实例的学习(instance-based learning),属于懒惰学习(lazy learning)即KNN没有显式的学习过程,也就是说没有训练阶段,数据集事先已有了分类和特征值,待收到新样本后直接进行处理。与急切学习(eager learning)相对应。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【瑞萨RA_FSP】RTC——实时时钟

文章目录 一、RTC简介1. RTC 特性 二、RTC的结构框图1. RTC引脚2. 时钟分频3. 日历计数器/二进制计数器4. 闹钟功能 三、实验:用RTC提供日历时间1. 硬件设计2. 文件结构3. FSP配置4. 宏定义5. 初始化RTC6. RTC中断回调函数7. hal_entry函数 一、RTC简介 RA6M5 的RT…

虚幻引擎(UE5)-大世界分区WorldPartition教程(一)

文章目录 WC与WP的区别一、如何开启WP1.默认创建WP2.手动创建WP3.转换创建WP 二、设置World Partition参数三、启动流送总结 提示:以下是本篇文章正文内容,下面案例可供参考 WC与WP的区别 WorldCompostion(WC) 是UE4中制作大世界…

【java实战】emoj表情导致mySQL存储错误,完美解决

MySQL表的编码格式为utf-8,现在表内数据量巨大,已不能新建表更改表的编码格式。 采用手动编码将有问题的数据转化为utf8进行存储 工具类 import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util…

大数据Doris(五十):Export导出原理

文章目录 Export导出原理 一、原理 二、查询计划拆分 三、查询计划执行 Export导出原理 Doris Export、Select Into Outfile、MySQL dump三种方式数据导出。用户可以根据自己的需求导出数据。此外数据还可以以文件形式通过Borker备份到远端存储系统中,之后可以…

Gitlab升级报错一:rails_migration[gitlab-rails] (gitlab::database_migrations line 51)

Gitlab-ce从V14.0.12升级到V14.3.6或V14.10.5时报错:如下图: 解决办法: 先停掉gitlab: gitlab-ctl stop 单独启动数据库,如果不单独启动数据库,就会报以上错误 sudo gitlab-ctl start postgresql 解决办法&#x…

哈工大计算机网络课程网络层协议详解之:互联网控制报文协议(ICMP)

哈工大计算机网络课程网络层协议详解之:互联网控制报文协议(ICMP) 在互联网中,IP数据报的传输很容易出现差错,当出现差错时,最简单的处理办法就是对该IP数据报进行丢弃。但是,并不是直接丢弃就…

android 如何分析应用的内存(九)——libc回调

android 如何分析应用的内存(九) 接上文,在前面文章中,介绍了bionic库提供的各种功能,其中包括: 自定义的mallocmalloc hookmalloc debug 接下来,介绍的是bionic库提供的libc回调功能&#x…

【Java】Java核心 77:Dom4j 解析 XML综合案例

文章目录 1、需求2、案例效果3、案例分析4、自定义JDBC框架-代码实现4.1、Configuration4.2、注解4.3、映射类:Mapper4.4、SqlSession类 5、自定义JDBC框架的使用5.1、数据表5.2、创建实体类5.3、UserMapper接口5.4、配置文件:config.xml5.5、测试类5.5、…

当金融风控遇上人工智能,众安金融的实时特征平台实践

导读:随着企业数字化转型升级,线上业务呈现多场景、多渠道、多元化的特征。数据要素价值的挖掘可谓分秒必争,业务也对数据的时效性和灵活性提出了更高的要求。在庞大分散、高并发的数据来源背景下,数据的实时处理能力成为企业提升…

vCenter崩了之后重新搭建处理办法

一、需要重新搭的情况下,vCenter虚拟机是无法使用分布式端口组的,而此时所有的物理网卡都在分布式交换机上,这样vCenter虚拟机的网络是无法访问的,所以需要先找到需要一台esxi。 二、此时可以看到两个分布式交换机 正常情况下分布…

高性能商品秒杀抢购系统

完整资料进入【数字空间】查看——baidu搜索"writebug" Goirisrabbbitmqmysql构建高性能商品秒杀抢购系统 一、项目介绍 1. 课程目标 应用GoWeb快速构建秒杀系统全流程应用开发及架构化设计思维梳理逐级优化,轻松应对“秒杀”及类似高并发场景 2. 知…

layui框架学习(30:树形模块)

Layui中的树形组件模块tree用于以树形形式显示上下级结构的数据&#xff0c;类似于winform中的tree控件。tree模块的基本用法及显示效果如下所示&#xff1a; <div id"test"></div><br /><script>layui.use([tree,layer], function(){var tr…

python安装pyelliptic-.5.7报错ImportError: No module named setuptools

1.背景&#xff1a; python安装pyelliptic-.5.7模块报错 2.环境及版本&#xff1a; linux&#xff1a;centos-7.7 python&#xff1a; 2.7.5 pyelliptic&#xff1a;5.7 注意&#xff1a;这里是纯内网环境所以pip不能使用&#xff0c;我这里配置了一个内部yum源 3.解决思路&…

Spring Boot 中的事务注解

在应用程序中&#xff0c;事务管理是一个非常重要的概念。事务是指一系列的操作&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败。在Spring Boot中&#xff0c;可以使用事务注解来管理事务。在使用事务注解的时候&#xff0c;一个非常重要的概念就是事务传播行为。 …

js内存泄漏及排查详解

js内存泄漏及排查详解 常见内存泄漏及解决方案 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费&#xff0c;导致程序运行速度减慢甚至系统崩溃等严重后果。 隐式全局变量 在局部…

音频小说项目介绍

看小说、听音频&#xff0c;App,H5网站&#xff0c;小程序多端开发 一、主页 主页tabBar四个分类&#xff1a; 首页&#xff0c;分类&#xff0c;收藏&#xff0c;我的 最上方是搜索框 下方是轮播图&#xff0c;不但自动滚动&#xff0c;还有动画效果 下面分类有&#xf…

IDEA 或者SVN修改老项目的svn地址

公司svn地址修改了&#xff0c;ip修改了。本地还有代码没提交。这里介绍一下怎么在IDEA或svn修改为新地址&#xff0c;然后代码就可以直接提交了。网上也有文章介绍&#xff0c;但其中没注明一个关键点&#xff0c;导致很多人修改不成功。所以有了这篇文章。 IDEA下修改svn地址…

【Python】模块导入 ⑤ ( 主程序判断语句 | 模块中执行函数问题 | 制作自定义模块并执行函数 | 导入自定义模块会执行模块中的代码 )

文章目录 一、模块中执行函数问题1、制作自定义模块并执行函数2、导入自定义模块会执行模块中的代码3、主程序判断语句4、代码示例 - 主程序判断语句 一、模块中执行函数问题 1、制作自定义模块并执行函数 如果在自定义模块中 , 定义了函数 , 并且调用了该函数 ; 如下代码所示…

【TCP/IP】多播 - 定义、原理及编程实现 (TTL、多播组、多播消息)

目录 多播 多播的原理 多播的数据传输时的特点 TTL 的概念 TTL 和 多播组的配置方法 多播的编程与实现 发送者 接收者 多播 多播是一种介于单播和广播通信之间的技术方式&#xff0c;可以将发送者所需要发送的数据包分别发送给分散在不同子网中的一组接收者。 多播的原…

MySQL - 第11节 - MySQL事务管理

1.事务的概念 事务的概念&#xff1a; • 上层看起来比较简单的需求&#xff0c;可能对应的后端要做很多工作&#xff0c;后端这些工作组合起来才是一个完整的需求解决的方案。 • 事务由一条或多条SQL语句组成&#xff0c;这些语句在逻辑上存在相关性&#xff0c;共同完成一个…