Jetson Nano 2GB 系列文章(16):10 行代码威力
2021-04-17 14:14
在上一篇文章中,我们为大家介绍了 Hello AI World 环境安装,本篇文章将会带着大家感受 10 行代码的威力。
要感受这个项目的效果,最好的方式就是先体验一下它能带来的好处。因此一开始我们就为大家提供一个比较经典的范例,只用 10 行的 python 代码,实现对 90 种类别的深度学习物件检测(object detection)识别,在 Jetson Nano 2GB 上达到 10+FPS 性能。
对于不了解深度学习物件识别的初学者来说,可能不会有太多感受,但是稍微了解这个应用的人就会很清楚,即便非常优秀的 YOLOv4 算法或者 SSD-Moblienet 算法,在 Jetson Nano 2GB 上,能做到 4~6FPS 已经不容易了。但是在这里我们不去探索这些算法的内容,因为研究算法需要比较深厚的数学基础才行。
现在我们就来看看 Jetson-inference 这个开源项目是如何做到这个结果的,这里将代码呈现给大家,直接解说每一行的用途。详细的代码如下:
在说明代码之前,建议先把这段代码敲进你的 Jetson Nano 2GB 设备里,当然这个代码也适用于 Jetson 全系列产品,自行取个文件名,例如 “10lines.py” ,可以在设备中的任何一个位置。
这里唯一要先说明的地方就是第二行的蓝色部分,这里演示的摄像头是 CSI,所以蓝色参数部分用 “csi://0”,如果您只用 USB 摄像头,只需把这个地方根据您实际的摄像头编号,改成 “/ dev / video0” 即可。
假如没有 USB 摄像头,还需找到通用格式的视频文件,把参数部分改成视频文件的完整路径名,或者把视频文件复制到这个代码的位置。最简单的视频文件可以在你 Nano 上的 “/ usr / share / visionworks / sources / data ” 下面。
其他地方无需修改。存档后执行以下指令:
如何,是不是很神奇呢?只用 10 行的 Python 代码就能实现这样的功能!
接下来就解密一下这些代码的内容,让大家体会一下 jetson-inference 为大家所打造的一个非常强大的深度学习工作环境,主要包括 “视觉深度神经网络库(Vision DNN Library)” 与 “ 工具库 (Utilities Library)”。
代码第一行 “import jetson.utils” 就是导入工具库模块,接下去透过 videoSource() 建立 input 对象、videoOutput() 建立 output 对象,关于这两部分的细节,将在接下来的文章中进一步说明。
第四行 “import jetson.inference” 就是载入本项目最重要的 “深度学习推理应用” 的模块,然后用 detectNet() 建立 net 对象,处理后面的 “物件检测推理识别” 物件检测推理识别的任务,这部分至少需要给定 “模型代号” 变数以及作为检测最低要求的阈值(threshold)。
本系统最贴心的地方,就是为每个参数值都提供一个预设值,如果你忘记了给定设定值,系统还可以正常执行。
在 while 循环里,第 7 行从数据源读取一帧图像,然后到第 8 行用一个非常简单的 net.Detect(img) 函数,就能把这张图像中满足阈值的物件找出来,存放到 detections 数组中,这是非常亮眼的一个功能。
而让我们觉得更为惊奇的是,这么一道简单指令,在我们看到的地方,已经非常紧密地集成了 NVIDIA 非常强大的 TensroRT 加速引擎,立即将性能提升了数倍以上。
很多熟悉 NVIDIA 深度学习的人,都知道 TensorRT 的性能是多么令人惊羡,但集成过程又是那么地让人揪心,如今在这个项目中,初学者完全不必面对调用 TensroRT 的艰难,却能立即享受到如此优异的性能。
接下来,还有令人惊喜的地方,第 9 行这么简单的 “output.Render(img)” 指令,可以将 detections 数组里所有检测到的物件,包括框 / 颜色、类别名称、置信度这些数据,全部叠加到图像上,并且显示到画面上。
没错,就是这么一道短短的指令,居然做了这么多的事情。如果自己写过代码去将这些数据全部叠加在一起,就非常清楚这个步骤需要花费多少代码去执行。
最后,利用一个 “net.GetNetworkFPS()” 函数就轻松获取这一帧图像的计算性能,然后用 output.SetStatus() 将这些数据在显示框顶上实时更新。
如何,这样一个 10 行 Python 代码是不是很厉害呢?这里先让大家感受一下这个开源项目的厉害之处,后面的文章将带着大家深入学习几个最重要、最常用的函数内容,让读者可以循序渐进地用这些资源,开发出自己专属的应用。