Ubuntu-KCF/DSST算法无人机跟踪仿真/实物保姆级教程

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

 KCF算法无人机跟踪

介绍


自己搭建的无人机跟踪实验主要讲软件硬件的需要等等

 基础知识准备


整个系统需要两部分识别程序和控制无人机运动的程序都是Python脚本但运行需要在Ubuntu下用ROS进行通讯所以需要学习ROS的一些基础用法

首先安装Ubuntu双系统不要用虚拟机后面没法操作了双系统不麻烦而且很香看整个教程讲的很详细Ubuntu双系统安装教程

安装好Ubuntu之后需要安装ROS这里推荐用小鱼的一键安装上链接小鱼的ROS一键安装

ROS教程看赵虚左的课程简单看个3章就可以了点这个链接ROS机器人入门后面还有他做的文档ROS文档

ROS基本会用了以后可以跑一些别人的代码例程推荐一下肖坤的无人机仿真系列继续上链接肖坤教程主要看以下几章仿真平台基础配置、目标检测与跟踪、darknet环境安装。其实跟我之后要介绍的方法不太一样但你可以玩玩这个仿真环境有个感受他用的是YOLO算法

除了他这个比较复杂的仿真我自己搭建的很简单的仿真环境是看这个教程学习的你也可以学习一下看看Gazebo里面很多东西是怎么设置的上链接PX4实现移动无人机跟踪物体仿真

然后建议自己跑一下YOLO算法感受一下目标识别程序的大概我自己当时就是这么学习的放一下当时老师给我们的链接YOLOv5的安装与使用这个直接在Windows环境下跑就可以了按照帖子里面的步骤即可写的非常详细。把猫狗数据集放在了网盘里最开始学习用猫狗是很容易上手的上链接[猫狗数据集](链接https://pan.baidu.com/s/1LXnXUBP1HeC75UqqTdMbZA?pwd=tq1k 提取码tq1k)

 KCF的基本原理


原理在网上都是百度到这是我自己画的图是找到KCF的MATLAB代码一步一步运行程序跑出来的可以看清楚每一步操作对图片做了什么工作你也可以这么做有利于对原理的理解

在这部分学习KCF原理的时候会有一个图像的HOG特征也就是颜色梯度直方图当时在做实验的时候发现人物处于草地这种复杂背景中时会比水泥地这种简单背景跟踪效果更好因为HOG提取的是一个图像的轮廓信息而草地本身就很复杂了相对水泥地来说就特别不友好针对这种问题可以用颜色来区分等等方法。我觉得如果单纯做图像的可以去考虑这些

 KCF的python程序


这部分介绍几个KCF的Python程序以及其改进版本
1.opencv-KCF这个是直接用python第三方库直接封装好的代码直接运行的可能需要安装一些第三方库pip install opencv-python opencv-python-contrib如果还有别的错误直接百度解决就好了。下面具体讲一下这个代码怎么运行的

 

 

 

 

 

 2.第二个主要是说明CSRT 在上述图3那里能够添加一个新的算法CSRT没有其他的改动这个算法的特点是能够适应尺度变化而且对于非矩形目标的跟踪效果更好不再具体讲代码这个没有具体文件自己改一下调用算法就行了。

 3.第三个说一下DSST算法 这个对于目标的尺度大小变化最鲁棒而且是在无人机上使用效果最好的有了上述代码经验我们在自此基础上看DSST算法的代码


这里调用的tracker.py是网上大佬手撸出来的每一个小段都有详细的注释可以参考学习一下整个流程到底是啥意思。然后tracker.py中还调用了一个fhog.py的文件这个是跟踪使用的图像特征HOGfhog是其升级版而且他的代码用了C++加速所以最后运行速度还是很客观的关于hog的性质理解可以参考这两个链接HOG特征笔记HOG特征-简书

所以这个代码共有三个文件run.py  tracker.py  fhog.py  需要运行的是run.py

 4.第四个代码说一下动态框选 由于上述手撸的DSST程序有个小小的缺点就是他会在相机打开的那一瞬间的一帧中让你选择需要跟踪的目标进行框选所以在无人机上的应用就会很麻烦最好是画面一直在动 **等目标何时出现了我再进行框选。** 这个想法我目前认为可以跟YOLO算法结合一下让YOLO也有可选择性也挺好的。下面讲一下这个代码我怎么改的也是跟网上的大佬写的代码拼接...需要运行的是run2.py

调用tracker函数就和DSST那个代码一样了所以这个脚本主要功能是能 **动态框选** 

 5.第五个代码说一下如何初始化多个跟踪器进行性能对比 这部分代码仍然是在上一个代码的基础上加以修改得到的我们的目标即通过一个同矩形进行初始化保证每个算法得到的初始信息是相同的进而对比各种算法性能优劣需要运行的是run3.py简略介绍如下

效果图如下


至此识别跟踪算法的python程序就讲解完毕了我还上传了KCF的MATLAB代码版本是原著作者的代码写的比较清晰可以自己一步一步进行运行看其数学远离因为KCF是最典型的相关滤波跟踪算法相比深度学习算法它很多数学操作是仍然能看到的对理解图像识别算法有很大的意义。

接下来讲解一下如何将识别算法的信息可以用起来控制四旋翼无人机进行运动即控制程序。

KCF及相关算法的MATLAB代码

写KCF那个大神的源代码在他的主页上代码我也在这个帖子里的文件夹上传了但视频序列的文件夹有点大我弄个百度网盘放进来其他的DSST代码和SAMF代码也是可以直接百度网盘下载大神的网页还有别的研究可以自己去学习一下这部分MATLAB的代码可以自己一步一步运行来看数学逻辑比python要好懂原理都一样但由于我们后面用到的都是python文件就不详细介绍了这块了如果不懂可以和我联系

由于跑代码需要用到的视频集有点多放不太下这里放上百度网盘链接 https://pan.baidu.com/s/1lTdPkDHkJppBgDq2-WD5Bw?pwd=gmao提取码gmao

直接下载百度网盘的代码吧可以直接运行这个帖子里的少视频集直接运行run.m文件

无人机跟踪程序介绍

仿真

先上原理框图这里需要稍微懂一点ROS因为我也只是懂一点点我理解到的ROS在这个任务中的工作主要就是收发信息节点管理统一接口方式这样。

这部分会有gazebo仿真和实物两部分一般都先在Gazebo上先把代码跑通然后开始调试无人机实物这样效率比较高前面也放了肖坤的大环境可以跑跑里面的键盘控制无人机室内飞行跟控制小海龟是一样的这里也是放一个我学习Gazebo仿真时的一个网上的教程PX4实现移动无人机跟踪物体仿真

然后对上面这个例程进行一些小的修改给四旋翼安装一个下置摄像头在无人机升起到固定高度之后运用摄像头捕获到的图像使用KCF系列算法对小车进行识别然后根据小车识别框在整个视频画面中距离中心的距离来控制无人机飞行这里的目标就是始终保持小车在无人机画面的中心。

在这一块还有一个毕设中的小思考因为在实物验证中师兄帮忙飞四旋翼每次飞行的高度肯定是不一样的那么伴随着跟踪框在争个画面中的移动速度是不一样的它反应速度也会不同离得太近的时候过于灵敏离得太远的时候反应很慢跟不上所以师兄的建议就是把高度信息引入控制回路中这个高度信息是PX4就可以获取的这个我也在仿真中跑通并在实物上运行成果了。

无人机ROS控制代码

首先讲Gazebo仿真的

Gazebo建模在文章开头给过链接了按照那个文章进行建模然后修改核心代码将控制C代码制作成工作空间的格式然后运行Python不需要这个可以一个一个Python文件运行来打开节点

在仿真中控制无人机垂直飞到一定高度然后打开摄像头跟踪下方小车然后用键盘控制小车移动无人机就会跟踪小车进行移动了。

在用这个程序将无人机飞起来之后打开摄像头运行KCF系列程序

运行KCF会手动框选目标小车此时需要速度快一点不然无人机会飘走KCF程序会将目标框的坐标输出出来通过ROS程序发送给控制程序

然后运行控制程序根据目标框中心的坐标与整个摄像头屏幕中心的偏离程度来进行控制PID控制输出无人机的速度信息封装成MAVROS信息发送给飞控板

上实物

在上面仿真跑通之后就需要将程序移植到实物四旋翼上对真实目标进行跟踪啦当时我们测试了两套硬件设备。

第一套使用NVIDIA jetson xavier nx作为板载计算机其GPU搭载48个Tensor核心的384核NVIDIA Volta™ GPU视觉加速器采用7通道VLIW视觉处理器此计算机适用于无人机、智能摄像头、高分辨率传感器和其他IoT嵌入式系统等高性能AI系统。目标识别使用USB单目摄像头其下方的Inter T265是追踪摄像头用于室内吊挂飞行时的室内定位使用其包含两个语言镜头传感器、一个IMU和一个VPU这样其可以利用环境中的视觉特征进行定位追踪GPS用于室外实验定位使用Pixhawk飞控模块其是一款无人机控制系统

第二套使用Inter迷你电脑NUC11TNKi5 薄款作为板载计算机其使用了i5-1135G7处理器8G内存整机功率可以达到120瓦与NVIDIA jetson xavier nx相比此板载计算机的优势在于其优异的CPU性能对于相关滤波跟踪算法此类只需要元素点乘运算而不需要像基于深度学习的目标跟踪算法那样海量的矩阵运算在此计算机上测试跟踪算法的帧率能够比nx计算机快3-4倍这样更有利于目标的稳定跟踪。

如果用深度学习比如YOLO算法的话还是NX更快的而且那个T265i是专门用来室内定位的室外直接用GPS因为PX4的程序是只有在知道位置信息的情况下才能进入off broad模式的即板外模式这里的板是说pixhawkpixhawk外就是无人机上携带的那个计算机NX或者NUC。还有一个inter的T435i摄像头海智同学是用这个摄像头和NX板来做YOLO的跟踪435i的特点是有红外测距所以他需要将摄像头读到物体的距离信息引入到跟踪程序当中但当时发现一个BUG就是红外对阳光下和阴影下测距会产生极大的漂移使无人机不知道该怎么飞具体现象就是无人机跟踪我好好的我从阳光下进入阴影处的一刹那无人机就傻眼了。而我用这种普通的USB摄像头单目的是不能直接得到距离信息的需要有一个相机倾斜安装角度和引入飞机高度以及视频像素来计算物体的距离距离的测算写到代码中应该不会出现这个温度影响的漂移但这个代码我懒惰了不想写了。。。

还发现了一个问题就是DSST算法已经能够很好的跟随物体的前后移动大小的变化来改变框的大小了我根据这个框的大小来控制无人机的前后运动使得跟踪框的大小基本保持一个固定的大小但帧数提高后会使得跟踪框大小变化速度快传到控制无人机那块之后就使得无人机前后晃动很快白杨师兄建议加一个均值滤波这个我可没懒惰给写出来了

这里有两种均值滤波一种是每10帧取平均当作一帧数据用但这样会降低帧率使得控制还是阶跃而当我们把前10帧取平均当作第1帧数据第2帧到第11帧取平均当作第2帧数据这样下来帧率并没有变化但目标框的大小变化会变得很平滑。
从3帧平均5帧平均到10帧平均都试一下最后会发现10帧平均的时候已经比较平滑啦。

实物无人机控制方法

在用实物飞行时摄像头连接到NUC上时会出现找不到那个是摄像头的USB的现象就会使程序启动失败而且好像是先在ROS中开启MAVROS再开启摄像头进行识别具体记不清了时间有点久了....然后写了一个寻找Usb的小程序当然更好的方法是绑定接口我懒了也没学...

还有一个细节是需要在地面站电脑上装远程桌面nomachine和录屏软件Kazam

实物飞行运行的代码是DSST算法这个算法有更好的尺度适应能力更好的跟踪目标的移动这里的DSST代码也进行了加入ROS节点的修改与上面介绍的KCF大同小异代码已经上传大家可以自己进行学习。

十次滤波控制程序上面有提到就是将十次速度输出进行均值滤波但仍然是十次输出不改变频率这样无人机的运动就会变得光滑

最后现场图如下帅气智哥担当目标~无人机可以跟随目标前后上下左右移动而且移动比较光滑

至此整个教程就结束啦可能还有一些小细节没有写进去时间太久了记不太清了很多硬件的东西没有详细介绍比如飞控板和机载电脑以及摄像头的连接等等这些大家可以自己去搜索一下。

代码可以到我的gitee上下载an_KCF系列算法无人机跟踪: (gitee.com)顺便帮忙点个小心心呀

感谢

感谢毕业设计中老师、师兄和同学们的鼓励与帮助


参考文献

1.双系统启动效果_哔哩哔哩_bilibili

2.小鱼的一键安装系列 | 鱼香ROS

3.【Autolabor初级教程】ROS机器人入门_哔哩哔哩_bilibili

4.Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

5.仿真平台基础配置 · 语雀

6. (17条消息) PX4无人机-Gazebo仿真实现移动物体的跟踪_解矣。的博客-CSDN博客_gazebo 无人机

7.YOLO V5的安装与使用_?-ldl的博客-CSDN博客_yolov5下载

8.『ML笔记』HOG特征提取原理详解+代码_布衣小张的博客-CSDN博客_hog代码

9.图像学习-HOG特征 - 简书 (jianshu.com)

10.João F. Henriques

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Ubuntu