使用NVIDIA TX2作为Azure IoT Edge设备实现物体检测

一、摘要

本篇博客将介绍使用NVDIA Jstson TX2开发板作为Azure IoT Edge设备,实现在设备上进行物体检测,并且通过Azure IoT方便地管理和配置该IoT设备,方便地进行物体检测模型的更新。

二、环境搭建相关

1. 关于NVIDIA Jstson TX2

NVIDIA Jetson 是业内领先的 AI 计算平台,它面向移动嵌入式系统市场中的 GPU 加速并行处理。在深度学习和计算机视觉方面的高性能、低能耗计算,使得 Jetson 成为计算密集型嵌入式项目的理想平台[1]。
NVIDIA Jstson TX2是一台模块化的AI计算机,采用NVIDIA Pascal™ 架构,性能强大,但外形小巧,节能高效,非常适合机器人、无人机、智能摄像机和便携医疗设备等智能边缘设备。
从硬件上看,其基于ARM 64位架构,这使其在很多开发时所需要的软件架构支持也不同,之后将介绍本次开发中遇到的软件架构问题。NVIDIA Jstson TX2开发套件包含了一块核心板和一块拓展板,核心板安装于拓展板上,为其提供各类接口拓展,拓展版包含了USB 3.0、摄像头接口、SATA接口、千兆网口、天线接口、HDMI视频输出、PCI-E、电源接口等。具体的硬件规格如下表:

Board NVIDIA Jetson TX2
GPU NVIDIA Pascal™, 256 CUDA cores
CPU HMP Dual Denver 2/2 MB L2 + Quad ARM® A57/2 MB L2
Video 4K x 2K 60 Hz Encode (HEVC), 4K x 2K 60 Hz Decode (12-Bit Support)
Memory 8 GB 128 bit LPDDR4, 59.7 GB/s
Display 2x DSI, 2x DP 1.2 / HDMI 2.0 / eDP 1.4
CSI Up to 6 Cameras (2 Lane), CSI2 D-PHY 1.2 (2.5 Gbps/Lane)
PCIE Gen 2
Data Storage 32 GB eMMC, SDIO, SATA
Other CAN, UART, SPI, I2C, I2S, GPIOs
USB USB 3.0 + USB 2.0
Connectivity 1 Gigabit Ethernet, 802.11ac WLAN, Bluetooth
Mechanical 50 mm x 87 mm (400-Pin Compatible Board-to-Board Connector)

软件上,NVIDIA Jstson TX2运行aarch 64架构的Ubuntu 16.04操作系统,在很多情况下与我们常用的x86_x64架构Ubuntu是一样的,但是部分库和软件不兼容该架构。TX2在首次使用时需要进行刷机,安装NVIDIA为其定制的JetPack开发工具包,其包含系统镜像、CUDA Toolkit和其他一些开发工具。安装JetPack需要额外一台Ubuntu 14.04或者16.04的host,并与TX2连接到同一网络,还需要连接显示器,鼠标键盘等,具体的步骤见官方的文档Jetson Developer Kit User Guide [2],网上也有很多相关教程,这里不做赘述。
另外这里给出一些收集到的TX2相关博客,可以作为参考:[3][4][5]

2. Azure IoT Edge相关模块对TX2的支持情况

从Azure IoT Edge的官方支持页面[6]可以看出,官方支持AMD64和ARM32两种架构,不支持TX2的ARM64架构,IoT Edge Runtime的正常安装是不可行的。但是搜索资料发现可以通过手动指定edgeAgent、edgeHub的镜像为arm32v7版的实现模块的正常运行[7]。常用的模块3个镜像地址如下:

edgeAgent:

microsoft/azureiotedge-agent:1.0.0-preview022-linux-arm32v7

edgeHub:

microsoft/azureiotedge-hub:1.0.0-preview022-linux-arm32v7

tempSensor:

microsoft/azureiotedge-simulated-temperature-sensor:1.0.0-preview022-linux-arm32v7

使用该命令修改配置文件中的连接字符串:

sudo vim /etc/azure-iot-edge/config.json

使用以下命令控制IoT Edge模块的运行:

sudo iotedgectl start
sudo iotedgectl stop
sudo iotedgectl status

由于很多模块需要使用到Python的azure-iothub-device-client,而官方不支持,需要从手动编译安装,具体步骤参考[8],编译生成的以下几个文件是编写自定义IoT Edge模块时import iothub_client所必须的。
iothub_client

由于IoT Edge的各个模块都在Docker中运行,因此需要能正确进行DNS解析,如果Docker的DNS解析存在问题,可以参考[9]中的解决方法。

3. 深度学习框架对TX2的支持情况

  1. CNTK
    无官方支持的版本可以用于TX2,可以通过手动安装从源码编译正常运行,但是不支持CNTK 的Python版本。在TX2上也无法安装Anaconda,因此不推荐使用CNTK作为框架。在TX2上手动编译安装CNTK的步骤见[10]。
  2. YOLO
    YOLO对TX2的支持很好,且安装方便,推荐使用,安装步骤可以参考[11]。YOLO的结果显示需要安装OpenCV,通常在安装JetPack时可以一并自动安装,如果需要单独安装,可以参考[12]中针对TX2的OpenCV安装步骤。
  3. 其他框架
    其他框架暂时没做测试,了解到支持Tensorflow和TensorRT。

三、IoT Edge物体检测Demo

本文使用NVIDIA TX2开发套件作为IoT Edge设备,在设备上使用YOLO实现了实时物体检测,并且可以通过Azure IoT Hub控制设备,实现模型的自动下载和更新。下图为实现的整体架构图:
struct
首先通过Azure上的GPU VM训练YOLO的物体检测模型,并将训练完成的模型保存到Azure 文件存储。然后配置IoT Edge设备,安装YOLO框架和IoT Edge模块,模块在来自Azure IoT Hub的消息控制下,自动从Azure文件存储下载指定的新检测模型,并使用模型进行物体检测。下面将分别介绍以上架构的各部分实现:

1. 模型训练和存储

首先使用Microsoft的Visual Object Tagging Tool (VoTT)标注工具对物体检测的训练数据进行标注,具体的工具使用方式和下载地址见[13]。标注的样例如下图:
tag
将所有数据标注完成后,点击程序上的Object Detection->Export Tags,并选择格式为YOLO:
export
本项目训练使用的是Azure中国北2数据中心的NC6s v3虚拟机,配备了NVIDIA V100 GPU,仅用很短的时间就可完成模型训练。如果数据集较大,可以考虑选择带多块V100 GPU的虚拟机,本次训练使用100张图片的训练集。
vm
创建完成虚拟机后,通过SSH连接到Azure VM,安装NVIDIA驱动、CUDA和YOLO。NVIDIA驱动和CUDA安装步骤可以参考[14],YOLO的安装和模型训练方法参考[15]。将由VoTT导出的标注数据上传到Azure VM的YOLO安装文件夹,注意修改ojb.data文件中的几个文件路径为上传后对应的路径。训练时指定obj.data文件、yolo-obj.cfg文件和可选的预训练模型darknet53.conv.74即可开始训练,控制台输出如下内容开始训练:
training
训练时可以注意观察输出内容(如下图),其中的7604、7605、7606为当前训练的迭代次数,avg前的数字为平均的loss(越小越好),当前损失已经小于1,大约在0.8浮动,说明模型训练的已经差不多了,具体各项输出的解释参考[16]。
trainout
训练完成的模型通常保存在backup文件夹中,训练程序将间隔一定迭代次数保存一次模型,可以根据修改时间确定哪个是最新的模型,训练次数大于1000后模型名通常为yolo-obj.backup,复制后可以修改文件名为yolo-obj.weights方便之后使用。
将obj.data、obj.names、yolo-obj.cfg和yolo-obj.weights这4个文件下载到本地放置于同一文件夹。将obj.data里的names参数改为names = obj.names,删去train、valid和backup的三行。在yolo-obj.cfg中修改batch=1和subdivisions=1。
modelfiles
最后,在Azure上创建一个存储账户,并新建文件共享,将上述训练完成的4个文件放置于其中一个文件共享,如第一版本的模型文件放置于modelv1,新训练完成的模型放置于modelv2。需要记下存储账户的连接字符串和访问密钥用于之后的模型自动下载。
files

2. IoT Edge模块和控制程序部署

根据[17]中的Azure官方文档进行模块开发,由于TX2需要手动编译的azure-iothub-device-client库,因此官方的示例代码需要进行修改(如下图),修改完成的一个IoT Edge模块示例放置于[https://github.com/zf6770/azureiot]。模块编写完成后build模块,并且push到docker hub,最后使用修改完成的deployment.json文件进行设备部署即可,设备将自动下载运行模块。
modulecodes
本项目在IoT Edge设备上部署的架构如下图。PythonModule主要作用为负责与Azure IoT Hub进行通信,接收控制信息,将控制信息转发给运行于宿主的Control.py控制程序;PythonModule还定期发送模拟的IoT Edge设备状态信息。Control.py控制程序接收来自PythonModule控制指令,负责执行指令,包括控制YOLO检测程序生命周期、从Azure文件存储下载模型等。YOLO检测程序使用下载的模型进行物体检测,并将检测结果实时显示在图形界面窗口中。
edgearch
模块部署完成正常运行时IoT Hub显示的状态:
modules

3. 控制模型更新

在IoT Edge设备运行Control.py程序,程序将自动开始YOLO物体检测、显示检测结果,并且接收来自IoT Hub的控制信息。程序开启默认使用modelv1模型,该模型仅检测百威啤酒,运行截图如下:
modulev1
当新模型在Azure VM训练完成,这里使用modelv2作为新模型,modelv2可以同时检测百威啤酒和青岛啤酒,并已经保存在Azure文件存储,如下图:
v2files
在Azure IoT Hub选择向设备发送信息,SWI modelv2,即为切换模型为modelv2:
SWI
设备收到指令后将自动暂停检测,下载新模型,并重新开始检测:
downloading
重新开始检测后,使用modelv2已经可以识别青岛啤酒,模型更新完成:
modelv2

四、总结

该方案使用Azure IoT配合NVIDIA TX2作为物联网边缘设备,用户可以在物联网边缘实现实时的物体检测、瑕疵检测等计算机视觉相关的任务,并将结果收集汇总于Azure,做进一步处理;用户可利用Azure IoT相关组件方便地管理和监控设备,对物联网设备的参数、检测模型进行统一、快速地更新和配置,大大降低了用户维护的成本,有效提升生产效率。

五、参考资料

[1] https://www.nvidia.com/zh-cn/autonomous-machines/embedded-systems/
[2] https://developer.nvidia.com/embedded/downloads#?tx=$product,jetson_tx2
[3] https://blog.csdn.net/haoqimao_hard/article/category/7700304
[4] https://www.ncnynl.com/archives/201706/1747.html
[5] https://blog.csdn.net/csdnhuaong/article/details/80172296
[6] https://docs.microsoft.com/zh-cn/azure/iot-edge/support#operating-systems
[7] https://github.com/Azure/iot-edge-v1/issues/582
[8] https://github.com/Azure/azure-iot-sdk-python/blob/master/doc/python-devbox-setup.md
[9] https://blog.csdn.net/sgs595595/article/details/78811680
[10] https://github.com/nglee/CNTK
[11] https://blog.csdn.net/dhaduce/article/details/80379792
[12] https://jkjung-avt.github.io/opencv3-on-tx2/
[13] https://github.com/Microsoft/VoTT
[14] https://blog.csdn.net/zf6770/article/details/81222826
[15] https://pjreddie.com/darknet/yolo/
[16] https://blog.csdn.net/maweifei/article/details/81137563
[17] https://docs.microsoft.com/zh-cn/azure/iot-edge/how-to-develop-python-module

猜你喜欢

转载自blog.csdn.net/zf6770/article/details/82831500