用Jetson Xavier检测无人机拍摄的行人

Jaiyam Sharma
4070 0 2020-07-01

本文转载自:https://towardsdatascience.com/detecting-pedestrians-and-bikers-on-a-drone-with-jetson-xavier-93ce92e2c597

因为需要KX上网才能阅读,所以我们翻译发到这里。内容版权归属文章作者。


无人机是每个制造商和发烧友都想尝试的最酷的技术之一。随着无人机的普及,人工智能正在迅速发展,我们现在处于可以在无人机上进行对象检测和语义分割的状态。在此博客文章中,我将分享如何对无人机拍摄的图像执行目标检测。

有关当前问题的一些基础知识:

1.首先,必须意识到我们不能在通用嵌入式硬件(如树莓派)上实际运行对象检测,而需要用于AI推理的专用硬件。

2.其次,如果您运行常用的对象检测模型,例如在COCO和Pascal VOC数据集上训练的YOLO或SSD,则它们根本无法发挥出色。这是因为从高处看物体的视野与在地面上的视野有很大不同。因此,推理数据的分布将与模型在训练期间遇到的分布有很大不同,这将导致模型失败。

一些解决方案:

1.如本文标题中所述,我将在撰写本文时使用Nvidia的面向自动化机器人的最高端嵌入式处理器。如果您想使用Jetson TX2或nano,我将在文章后期提供一些建议,以改善其性能。

2.为了解决数据分布不同的问题,斯坦福大学的研究人员发布了一个名为Stanford Drone数据集的数据集,该数据集包含从无人机中拍摄的多个视频以及每个视频每一帧的标签。有被检测六类:BikerCarBusCartSkaterPedestrian

任何训练好的斯坦福数据集的物体检测模型都应该很好地检测这六个物体。在本文中,我们将使用RetinaNet,这是Facebook(FAIR)发布的一个非常好的对象检测模型,该模型可以通过在训练过程中学习专注于困难示例的方式来塑造损失函数,从而学习得更好。有关RetinaNet的更多详细信息,请参见此处

尽管FAIR的Detectron 2模型Zoo有几个模型可以下载和使用,但是它们都在COCO和Pascal数据集上进行了训练,正如我们所讨论的,这对我们的任务没有用。 从零开始在斯坦福数据集上训练模型将是一项艰巨的任务。幸运的是,我发现Nvidia在DeepStream SDK上提供了一个在此数据集上训练的模型,作为其网络研讨会之一的一部分。如果您想在不培训自己的模型的情况下开始使用,最快的方法是注册网络研讨会 ,网络研讨会资源的一部分,你可以将模型下您要查找的文件stanford_resnext50.onnx大小约为150 MB。

拥有此文件后,您可以使用retinanet-examples来自GitHub 存储库的C ++ API onnx文件转换为引擎plan文件,该引擎文件专门针对您正在使用的Jetson设备进行编译。以下是这些步骤:

git clone https://github.com/NVIDIA/retinanet-examples.git
cd retinanet-examples/extras/cppapi
mkdir build && cd build
cmake -DCMAKE_CUDA_FLAGS="--expt-extended-lambda -std=c++11" ..
make
cp /path/to/onnx/file . #copy onnx file to this directory
./export stanford_resnext50.onnx engine.plan


engine.plan成功创建,可以使用该infer实用工具测试图像上模型的性能:

./infer engine.plan image.jpg


这将写入一个名为的文件detections.png,其中将包含图像中检测到的对象的边界框。我从斯坦福数据集中的一个视频中提供了一张图像作为模型的输入,下面是它的内容:



我们可以看到该模型检测到了几个在人行道上行走的行人。对于Pascal或COCO训练过的模型,这是不可能的。该图像的纵横比看起来很奇怪,因为推断实用程序将图像的大小调整为1280x1280,这是模型的输入大小。

现在我们可以在单个图像中检测到行人,通过infer.cpp在cppapi目录中编辑文件将其扩展到视频很简单。我想出了这个:

要使用该脚本,保存为infervideo.cppcppapi目录设置和编辑CMakeLists.txt添加的行中添加infervideo可执行文件并将其链接到retinanet与其他库。

一旦你完成,你可以切换到该build目录,并调用cmakemake以前一样:

cmake -DCMAKE_CUDA_FLAGS =“-expt-extended-lambda -std = c ++ 11” .. 
make
建立目标之后,您将在构建目录中看到一个名为的新可执行文件,该可执行文件infervideo可以用作:


./infervideo engine.plan input.mov output.mp4

这将创建一个名为的新视频output.mp4,其中将显示每个对象的边界框。如果您想对来自无人机的实时视频流执行对象检测,则只需提供摄像机的gstreamer管道作为脚本的第二个参数,它将同时处理摄像机。

我使用上面的脚本对我的母校新德里IIT德里校园拍摄的视频进行了推理。我为绘制边界框使用了0.2的低阈值,这就是为什么下面的视频中存在一些误报的原因。

如果您在Xavier上运行上面提供的脚本,您会发现视频的每一帧需要150毫秒进行推理。这在Xavier上非常缓慢,而在较小的Jetson(如TX2或nano)上甚至会更慢。我们可以采取一些措施来改善性能:

1.我们在这篇文章中创建的引擎是用于fp16精度的。您可以以整数精度运行此模型,这将显着提高其性能。为此,您可以使用Stanford数据集中的一小部分数据和trtexectensorRT 的实用程序来创建INT8校准文件,并将该文件提供给export我们的构建目录中的实用程序。

2.实际上,任何实时对象检测管道都不会在每个帧上执行完全推断,而是通常将其与计算成本低廉的跟踪器(例如卡尔曼滤波器或光流)混合在一起。您可以使用opencv的KalmanFilter类来跟踪跨帧的对象,并且每4或5帧仅执行一次推理。如果无人机在推理之间没有突然的剧烈运动,则在实践中会很好地工作。

3.我们使用的模型非常大,因为它需要1280x1280的图像。您可以在较低分辨率的图像甚至自定义数据集上训练模型,以显着改善模型的延迟和吞吐量。训练模型的说明位于retinanet-examples存储库中,但这最好在具有CUDA启用GPU的优秀x86工作站上完成。

本博客文章适用于在Jetson Xavier上部署retinanet模型时遇到困难并记述我的努力以使无人机上运行良好的对象检测管道的人员。尽管我们获得的结果比使用Coco / Pascal模型可能获得的结果要好得多,但仍需要进行很多改进以使模型在Jetson设备上实时运行。请以此为您自己的项目的起点,如果您有任何其他建议来改善性能,请在下面做评论。