项目故事
今天,我们介绍一个有趣的项目,该项目使用Nvidia Jetson Xavier NX,深度学习和计算机视觉。
在过去的几个月中,许多专业互动已转移到网上:会议,演示文稿或课程。通常,人们需要借助可视化的支持或简短的图表来强调想法,但是用计算机鼠标来做到这一点并不总是那么容易。并非每个人都有图形输入板。
因此,我们想到了如何解决此问题的想法:我们使用普通的RGB摄像头和一个人的手将任何墙壁或平坦的表面转换为交互式白板。
研究阶段
寻找实现此想法的方法,我们假设控制AI白板最简单的方法是使用指尖并选择以下手指组合进行控制:
然后,我们寻找诸如手部和/或指尖检测器之类的解决方案,这些解决方案将帮助我们快速有效地实施该系统。、
在对不同选项进行分析和测试期间,我们决定将流程分为3个主要阶段:
-图像中的手部检测
-指尖本地化
-与白板的交互
手势检测
作为一种手部检测器,我们选择了神经网络,因为它比传统的检测/跟踪对象的方法更灵活,尽管后者通常比神经网络更快(但是我们将在后面看到如何处理速度因子)。因此,作为一个手检测器,我们决定使用一个预训练的YOLO卷积神经网络。
为了完成这个pipeline,我们使用了一个经过预训练的改进VGG16卷积神经网络作为统一手势和指尖检测的指尖检测器,因为它是可用的最佳精确解决方案之一。
参考:
https://github.com/MahmudulAlam/Unified-Gesture-and-Fingertip-Detection
硬件选择
作为我们的主要组件,我们 将NVIDIA Jetson Xavier NX与Raspberry Pi相机配合使用, 使用JetPack 4.4,我们还利用了Tensorflow 1.15.3。
运行我们的第一个原型所需的最后一步是实现与AI白板的各种交互,即处理指尖检测器的输出。所有的代码和说明都放在github:
https://github.com/preste-ai/AI_whiteboard
遇到的问题
我们首先遇到了几个问题:
1.与手的检测有关的几个问题。检测器工作不稳定。特别是,尽管这是主要配置,但它无法正确地检测到只有食指指向的手。同样,当将手移离摄像机太远(超过一米)时,我们也遇到了一些问题,必须将系统设置得离墙很近,这非常不舒服。
2.另一个问题是视频处理速度(帧速率)-平均只有12帧每秒(fps)。Pipeline涉及两个深度神经网络,这并不令人感到意外。不幸的是,这种速度阻止了我们获得平滑的线条和自由绘制。
让我们看看我们如何处理这些问题!
改进
为了提高手部检测的精度,我们根据自己的数据重新训练了手部检测器的模型。收集了12000张手图像的小数据集(感谢同事的“手动”贡献!),并用计算机视觉注释工具(CVAT)进行了标记。经过数据分割,它给了我们9500倍的图像进行训练,1000对图像进行验证和1500倍的图像进行测试。
此外,我们使用了各种数据增强技术(通过图像预处理):亮度,平移,放大和缩小,旋转,剪切变换和水平翻转以及随后的归一化。经过这些操作后,我们需要使用规范化图像为经过重新训练的网络提供数据,以进行正确的推断。
该损失函数,我们用于训练网络是一个组合的交叉熵损失和均方损失。我们使用Adam优化器找到了模型的最佳权重。最终,我们对手持探测器的网络(Yolo)进行了100次训练,并为每批设置了32张图像。您可以在此处查看代码和所有参数。
然后,我们使用三个非常常见的指标,将重新训练的模型与用于第一个原型的模型的性能进行了比较:准确性,精度和召回率。为了确定检测的正确性,我们使用了IOU的值。如果IOU的值大于0.5,则我们认为检测器可以正确预测手的位置,否则-不能。
我们得到的结果如下:
检测器有了很大的改进。
然后,我们可以使用此升级版本来进一步改进我们的AI白板。
性能提升
尽管Jetson Xavier NX具有相当强大的图形处理器单元,但对于我们的神经网络管道,它仍然无法实现实时视频处理。
幸运的是,NVIDIA提供了一个库,可以充分利用基于GPU的硬件:TensorRT库。为了使用该库,我们将模型(手和指尖检测器)转换为TensorRT引擎。为此,我们遵循以下3个步骤:冻结图并删除训练节点(.h5-> .pb)将冻结的图形转换为onnx(.pb-> .onnx)将onnx模型转换为TensorRT引擎(.onnx-> .engine)
转换后,我们将TensorRT引擎序列化到设备上,并且每次AI白板启动时,代码都会加载它们。
注意:这里我们需要指出,TensorRT在优化阶段运行特定于设备的配置文件。因此,如果要使用其他硬件进行推理(与Xavier NX不同),则需要重建引擎。
然后,我们可以将Jetson设备切换到高性能模式后,将解决方案性能与捕获的图像形状为320x240进行比较。对于Jetson Xavier NX,我们使用了功耗模式ID 2(15W 6核)。
最终结果
好结果!我们的准确性和召回率仅略有下降,这对我们的目的而言并不重要。我们很高兴!
结果运行:
欢迎访问我们的存储库,其中包含所有说明以及模型和TensorRT引擎:
https://github.com/preste-ai/AI_whiteboard