目标跟踪(3)MultiTracker : 基于 OpenCV (C++Python) 的多目标跟踪

Python033

目标跟踪(3)MultiTracker : 基于 OpenCV (C++Python) 的多目标跟踪,第1张

在这篇文章中,我们将介绍如何使用通过 MultiTracker 类实现的 OpenCV 的多对象跟踪 API。我们将共享C++ 和 Python 代码。

大多数计算机视觉和机器学习的初学者都学习对象检测。如果您是初学者,您可能会想为什么我们需要对象跟踪。我们不能只检测每一帧中的对象吗?

让我们来探究一下跟踪是有用的几个原因。

首先,当在视频帧中检测到多个对象(例如人)时,跟踪有助于跨帧建立对象的身份。

其次,在某些情况下,对象检测可能会失败,但仍可能跟踪对象,因为跟踪考虑了对象在前一帧中的位置和外观。

第三,一些跟踪算法非常快,因为它们做的是局部搜索,而不是全局搜索。因此,我们可以通过每n帧进行目标检测,并在中间帧中跟踪目标,从而为我们的系统获得很高的帧率。

那么,为什么不在第一次检测后无限期地跟踪对象呢?跟踪算法有时可能会丢失它正在跟踪的对象。例如,当对象的运动太大时,跟踪算法可能跟不上。许多现实世界的应用程序同时使用检测和跟踪。

在本教程中,我们只关注跟踪部分。我们想要跟踪的对象将通过拖动它们周围的包围框来指定。

OpenCV 中的 MultiTracker 类提供了多目标跟踪的实现。它是一个简单的实现,因为它独立处理跟踪对象,而不对跟踪对象进行任何优化。

让我们逐步查看代码,了解如何使用 OpenCV 的多目标跟踪 API。

2.1 第 1 步:创建单一对象跟踪器

多目标跟踪器只是单目标跟踪器的集合。我们首先定义一个函数,该函数接受一个跟踪器类型作为输入,并创建一个跟踪器对象。OpenCV有8种不同的跟踪器类型:BOOSTING, MIL, KCF,TLD, MEDIANFLOW, GOTURN, MOSSE, CSRT。

如果您想使用 GOTURN 跟踪器,请务必阅读这篇文章并下载 caffe 模型。

在下面的代码中,给定跟踪器类的名称,我们返回跟踪器对象。这将在稍后用于多目标跟踪器。

Python

C++

2.2 第 2 步:读取视频的第一帧

多目标跟踪器需要两个输入

给定这些信息,跟踪器在所有后续帧中跟踪这些指定对象的位置。 在下面的代码中,我们首先使用 VideoCapture 类加载视频并读取第一帧。这将在稍后用于初始化 MultiTracker。

Python

C++

2.3 第 3 步:在第一帧中定位对象

接下来,我们需要在第一帧中定位我们想要跟踪的对象。该位置只是一个边界框。 OpenCV 提供了一个名为 selectROI 的函数,该函数会弹出一个 GUI 来选择边界框(也称为感兴趣区域 (ROI))。 在 C++ 版本中,selectROI 允许您获取多个边界框,但在 Python 版本中,它只返回一个边界框。所以,在 Python 版本中,我们需要一个循环来获取多个边界框。 对于每个对象,我们还选择一种随机颜色来显示边界框。 代码如下所示。

Python

C++

getRandomColors 函数相当简单

2.4 第 3 步:初始化 MultiTracker

到目前为止,我们已经读取了第一帧并获得了对象周围的边界框。这就是我们初始化多目标跟踪器所需的所有信息。

我们首先创建一个 MultiTracker 对象,并向其中添加与边界框一样多的单个对象跟踪器。在此示例中,我们使用 CSRT 单对象跟踪器,但您可以通过将下面的 trackerType 变量更改为本文开头提到的 8 个跟踪器之一来尝试其他跟踪器类型。 CSRT 跟踪器不是最快的,但在我们尝试的许多情况下它产生了最好的结果。

您还可以使用包裹在同一个 MultiTracker 中的不同跟踪器,但当然,这没什么意义。

MultiTracker 类只是这些单个对象跟踪器的包装器。正如我们从上一篇文章中知道的那样,单个对象跟踪器是使用第一帧初始化的,并且边界框指示我们想要跟踪的对象的位置。 MultiTracker 将此信息传递给它在内部包装的单个对象跟踪器。

Python

C++

2.5 第 4 步:更新 MultiTracker 并显示结果

最后,我们的 MultiTracker 已准备就绪,我们可以在新帧中跟踪多个对象。我们使用 MultiTracker 类的 update 方法来定位新框架中的对象。每个跟踪对象的每个边界框都使用不同的颜色绘制。

Python

C++

C++

Python

Step1 基础配置:

Ghost是依托于node.js的,所以要先搭建node环境。

sudo apt-get update

sudo apt-get install -y python-software-properties python g++ make

sudo add-apt-repository ppa:chris-lea/node.js

sudo apt-get update

sudo apt-get install nodejs

这些命令全部执行完毕以后,要确认是否配置成功。在终端输入:

node -v

v0.10.36

显示node的版本号,即为安装成功。

接下来再确认一下npm安装是否成功,终端输入:

npm -v

同样,输出版本号为安装成功。

Step2配置Ghost:

首先要新建一个工作空间(文件夹)来存放Ghost:

sudo mkdir -p /var/www/

下载Ghost:

进入刚才创建的工作空间

cd /var/www/

下载Ghost并解压

sudo wget https://ghost.org/zip/ghost-latest.zip

sudo unzip -d ghost ghost-latest.zip

(解压的时候可能会出错,是因为没有下载解压工具unzip,执行命令下载即可,然后重复解压命令。)

sudo apt-get install unzip

安装Ghost的生产模块:

cd ghost/

sudo npm install --production

现在我们已经安装完了,但是需要设置之后,才能启动它。

Ghost设置:

sudo cp config.example.js config.js

这句话的意思复制config.example.js 并命名为config.js,我们要对config.js这个文件进行修改:

sudo nano config.js

(这句话是用nano打开config.js,提示没有安装nano的话,输入以下命令安装,然后重复上一条命令:)

sudo apt-get install nano

打开以后,修改以下被标注的区域:

config = {

// ### Production

// When running Ghost in the wild, use the production environment

// Configure your URL and mail settings here

production: {

url: 'http://my-ghost-blog.com',

###将‘ ’内部的内容修改为你的解析后的域名,注意带上http

mail: {

// Your mail settings

},

database: {

client: 'sqlite3',

connection: {

filename: path.join(__dirname, '/content/data/ghost.db')

},

debug: false

},

server: {

// Host to be passed to node's `net.Server#listen()`

host: '127.0.0.1',

###将‘127.0.0.1’改为‘0.0.0.0’

// Port to be passed to node's `net.Server#listen()`, for iisnode s$

port: '2368'

}

},

(...)

然后CTRL + X再输入Y然后敲ENTER退出。

现在已经配置好了Ghost,输入:

sudo npm start --production

大概会显示:

[email protected] start /var/www/ghost

>node index

Migrations: Database initialisation required for version 003

Migrations: Creating tables...

Migrations: Creating table: posts

[...]

然后现在你就可以让你的Ghost使用2368这个端口:http://你的域名.com:2368就可以看到Ghost本尊。

CTRL + C可以结束掉正在开启的Ghost

但是这还不是结束!

接下来要让你的Ghost一直处于运行状态。

Step4 配置服务器程序:

在终端执行:

sudo apt-get install nginx

接下来需要对Nginx进行一些配置:

sudo apt-get install nginx

sudo rm sites-enabled/default

sudo touch /etc/nginx/sites-available/ghost

sudo nano /etc/nginx/sites-available/ghost

然后把这些代码粘贴进去:

server {

listen 80

server_name your_domain.tld

###修该为你的域名

location / {

proxy_set_header X-Real-IP $remote_addr

proxy_set_header Host $http_host

proxy_pass http://127.0.0.1:2368

}

}

然后建立一个链接,将你新建的配置告诉Nginx:

sudo ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost

然后重启Nginx:

sudo service nginx restart

接下来创建一个新的用户,并给与他权限:

sudo adduser --shell /bin/bash --gecos 'Ghost application' ghost

sudo chown -R ghost:ghost /var/www/ghost/

然后用ghost用户使用系统:

su - ghost

现在我们要开启Ghost:

cd /var/www/ghost

npm start --production

然后你可以在浏览器输入你的域名来查看你的Ghost博客。

Step5 保持Ghost的运行:

我们得先退出ghost用户:

exit

接下来安装forever:

sudo npm install -g forever

然后执行:

NODE_ENV=production forever start index.js

接下来看一下forever是否挂在了index.js:

forever list

这个状态的话,你就可以开始你的Ghost之路了!这个状态的话,你就可以开始你的Ghost之路了!

结束进程命令:

forever index.js

大体上保留了OpenCV 2经典的C++和Python编程接口风格。其中,Python接口大大增强,也加入了Python 3.x的支持。一般来说,以前版本的程序只要做少数修改,就可以使用OpenCV 3了。另外还改善了Java接口,并且加入了MATLAB支持。

架构调整。图片、视频编解码从highgui模块分离出来,组成了imgcodecs和videoio。原先的OpenCL模块ocl事实上与其它模块融为一体,而CUDA加速模块gpu分解成了数个以cuda开头的模块。此外,除了官方支持的OpenCV代码,还有一些自发贡献的内容、不稳定的内容,或者版权尚存争议的内容,都放到了新的仓库opencv_contrib中。

更多新算法。新版本包括了TLD、鱼眼镜头模型等全新算法,还包括了一些更高层次可以直接拿来用的高级封装,比如汽车检测等。

引入T-API,使OpenCL加速更容易。目前可以参考OpenCV源代码中T-API的范例。可以发现,开启和关闭OpenCL加速,只需要一个语句就够了。这也就是为什么ocl模块会消失了吧。

更多指令集优化。除了之前为Intel CPU做的优化以外,OpenCV 3还容纳了ARM平台NEON指令集的支持。通过英特尔的帮助,OpenCV 3对x86和x64平台默认使用IPP