API
VisionPro Deep Learning 通过 API 支持完全相同的功能。它通过下列编程语言支持 API:
-
C (C++)
-
C# (.NET)
API 概览
对于要利用 API 的人而言,强烈建议先通读一下本文档中介绍的 VisionPro Deep Learning GUI 的所有详细信息,因为在利用 VisionPro Deep Learning 工具方面,GUI 和 API 的所有功能概念和演练都相同。有关每种编程语言 API 的详细信息,请参阅下面路径中的 API 文档
-
C
-
API 文档:
C:\Program Files\Cognex\VisionPro Deep Learning\2.1\Develop\docs -
示例代码:
C:\ProgramData\Cognex\VisionPro Deep Learning\2.1\Examples\c++
-
-
C#
-
API 文档:
C:\Program Files\Cognex\VisionPro Deep Learning\2.1\Develop\docs
-
示例代码:
C:\ProgramData\Cognex\VisionPro Deep Learning\2.1\Examples\c++
-
目标框架
- 非 UI NuGet 数据包现在的目标是 NET Standard 2.0
- UI 程序集和可执行文件现在的目标是 .NET Framework 4.7.2
- 非 UI 可执行文件现在的目标是 .NET Core 3.1
NuGet 数据包
NuGet 数据包基于项目,并有依赖项。 在可能的情况下,VisionPro Deep Learning 的 .NET 库针对跨平台框架进行编译。所有与 UI 相关的程序集都是针对 .NET Framework 4.7.2 或 NET Standard 2.0 编译的。由于 VisionPro Deep Learning 继承了 ViDi,因此在 API 的许多部分中都保留了名称 ViDi
程序集 | 框架目标 |
---|---|
ViDi.NET.Local |
NET Standard 2.0 |
ViDi.NET.Logging |
NET Standard 2.0 |
ViDi.NET.Remote |
NET Standard 2.0 |
ViDi.NET.Remote.Service |
NET Standard 2.0 |
ViDi.NET.Remote.Client |
NET Standard 2.0 |
ViDi.NET |
NET Standard 2.0 |
ViDi.NET.Base |
NET Standard 2.0 |
ViDi.NET.Common |
NET Standard 2.0 |
ViDi.NET.Extensions |
NET Standard 2.0 |
ViDi.NET.Interfaces |
NET Standard 2.0 |
ViDi.NET.UI.Interfaces |
.NET Framework 4.7.2 |
ViDi.NET.GUI |
.NET Framework 4.7.2 |
ViDi.NET.UI |
.NET Framework 4.7.2 |
ViDi.NET.VisionPro |
.NET Framework 4.7.2 |
引入了 NuGet 数据包,以便轻松确定使用特定 Cognex Deep Learning Studio 功能所需的程序集。
例如,ViDi.NET.UI 现在可以准确显示所需的程序集,以及第三方程序集必需的许可证。
VisionPro Deep Learning 的 NuGet 数据包位于以下目录中:
-
C:\ProgramData\Cognex\VisionPro Deep Learning\X.X\Examples\packages
在示例中会自动设置 NuGet 提要,但必须将其设置为全局 Visual Studio NuGet 数据包提要。Cognex 强烈建议将 NuGet 包备份到另一个安全存储库(或等效存储库)并保留一份副本。然后应将此位置配置为新的 NuGet 提要。有关更多信息,请参阅以下 Microsoft 主题:托管您自己的 NuGet 提要
运行时 API 处理指南
聚焦模式支持并行处理,因为其处理是在图像基础上完成的。当您组织代码工作流以使用 API 在运行时工作区中处理聚焦工具时,可以利用这种并行处理功能。在阅读此页之前,强烈建议您查看 NVIDIA GPU 选择和配置以了解有关并行处理工具的更多详细信息。
当您在运行时环境中使用 VisionPro Deep Learning API 执行处理任务时,您将处理线程、GPU、样本等对象以组织 API 代码工作流。
对象 | 说明/备注 |
工作区 | 线程安全 |
流 | 线程安全 |
工具 | 线程安全 |
样本 |
处理图像的容器对象 非线程安全 |
图像 |
具有要处理的实际图像数据的对象 非线程安全 |
缓冲区 |
接收结果的对象 非线程安全 |
线程 |
初始化多个 GPU 设备时,您有 2 个通过调用 API 来调用处理的选项。
提供“空列表”作为设备列表参数
如果在调用 API 时为“设备列表”参数使用空列表,则在任何可用(未占用、已释放)的 GPU 上执行处理。这意味着您没有选择特定的 GPU 来处理特定的工具。建议在以下情况下使用此策略:
-
只需要并行处理而没有任何其他目的:
-
只想测试并行处理代码是否正常工作。
-
无论属于哪种情况,您都希望代码实现始终且仅以并行方式执行。
-
要处理 2 个预期处理时间彼此相似的工具,这意味着它们适合在不指定特定 GPU 的情况下并行处理
-
并行处理 1 个工具,这意味着您想利用多个 GPU 通过并行处理来提升处理能力。
为了便于解释,我们来看一个简单的案例:您需要使用 2 个线程和 2 个GPU 处理 1 个聚焦模式工具。
如果您提供一个空列表作为设备列表参数并在 2 个线程(线程 0 和线程 1)中处理此工具,则其中一个线程,例如线程 0,仅占用 GPU 0 一段时间来处理图像。
当 GPU 0 被线程 0 占用时,GPU 0 被锁定,因此线程 1 访问 GPU 1 并占用它来处理来自此工具的另一个图像。
线程 0 使用 GPU 0 处理完一个图像后,将释放 GPU 0,如果线程 1 的处理作业在等待列表(队列)中等待,则线程 1 可以占用 GPU 0。这样,这一个工具就可以使用 2 个 GPU 和 2 个线程并行处理。
提供“非空列表”作为设备列表参数
如果在调用 API 时为“设备列表”参数使用非空列表,则在所提供的“设备列表”中可用(未占用、已释放)的 GPU 上执行处理。这意味着您要选择包含一个或多个 GPU 的列表来处理特定工具。建议在以下情况下使用此策略:
-
要处理 2 个预期处理时间彼此相差很大的工具,这意味着其中一个工具可能成为并行处理的另一个工具的瓶颈(如果此工具没有单独分配的指定 GPU)。
-
要控制哪些 GPU 应该用于处理特定的工具,哪些不应该。
为了便于解释,我们来看一个简单的案例:您需要使用 2 个线程和 2 个GPU 处理 1 个聚焦模式工具。
如果您提供一个包含 GPU 0(用于线程 0)的列表和一个包含 GPU 1(用于线程 1)的列表,每个列表都作为设备列表参数,并在 2 个线程(线程 0 和线程 1)中处理此工具,则将 GPU 0 单独分配给线程 0,将 GPU 1 分配给线程 1。
线程 0 仅使用 GPU 0,直到它完成一组给定图像的处理作业,线程 1 和 GPU 1 也是如此。
在另一个案例中,这次您必须使用 2 个线程(用于工具 A 的线程 0,用于工具 B 的线程 1)和 3 个 GPU(GPU 0、GPU 1、GPU 2)处理 2 个聚焦模式工具(A、B)。工具 B 的处理时间要长得多,因为要处理的图像数量明显大于工具 A 的图像数量,或者工具 B 的图像数据分辨率远高于工具 A。
即使在这种情况下,您也可以使用空设备列表进行并行处理。与提供非空设备列表时相比,总处理时间(完成 A 和 B 的处理所需的时间)将保持不变。
但是这种情况存在的问题是,工具 B 的处理可能会减慢工具 A 的处理速度,因为在大多数情况下,由于工具 B 的工作量很大,并且聚焦工具的处理是在图像上完成的,线程 1 将占用 3 个 GPU。
因此,如果您希望并行处理工具 A 和 B,同时不会显著减慢工具 A 的处理速度,可以为线程 1 提供设备列表 [GPU 1] 或 [GPU 1, GPU 2],以确保这些 GPU 专用于处理工具 B。同时,您还可以为线程 0 提供一个设备列表或空列表。这将防止工具 B 在并行处理中成为工具 A 的瓶颈。
使用 API 的多个 GPU 利用率
通过 C API 初始化
通过 C API 的初始化是使用 VIDI_UNIT vidi_initialize(VIDI_INT gpu_mode, VIDI_STRING gpu_devices) 参数执行的。
GPU 模式 gpu_mode | 无 GPU 支持 | 每个工具一个设备 |
---|---|---|
Int 值 |
-1 |
0 |
C 定义 |
VIDI_GPU_MODE_NO_SUPPORT |
VIDI_GPU_MODE_SINGLE_DEVICE_PER_TOOL |
用以下参数处理时:
- vidi_runtime_process
- vidi_runtime_process_single_tool
- vidi_runtime_process_sample
- vidi_training_stream_process_sample
- vidi_training_tool_process_database
- vidi_training_process_sample
GPU 设备选择是使用 VIDI_STRING gpu_list 参数执行的。
GPU 设备 gpu_list | 默认值 | 设备列表 |
---|---|---|
字符串值 |
" " |
"0,1,2" |
C 定义 |
VIDI_AUTO_SELECT_GPU_DEVICE |
|
说明 |
使用所有可用的 GPU。 |
仅使用指定 GPU(如 0、1 和 2)。 |
通过 .NET API 初始化
使用以下项目之一创建新控件时:
- ViDi2.Runtime.Local.Control (ViDi2.GpuMode gpuMode, List<int> gpuDevice)
- ViDi2.Runtime.Local.Control (LibraryAccess libraryAccess, ViDi2.GpuMode gpuMode, List<int> gpuDevices, bool activateDebugLogging)
- ViDi2.Training.Local.Control (ViDi2.GpuMode gpuMode, List<int> gpuDevice)
- ViDi2.Training.Local.Control (LibraryAccess libraryAccess, ViDi2.GpuMode gpuMode, List<int> gpuDevices, bool activateDebugLogging)
GPU 模式 | ViDi2.GpuMode gpuMode |
---|---|
每个工具一个设备(默认) |
GpuMode.SingleDevicePerTool |
无 GPU 支持 |
Gpu.Mode.NoSupport |
用以下参数处理时:
- ViDi2.Runtime.ITool.Process
- ViDi.Runtime.IStream.Process
- ViDi2.Training.ITool.Process
- ViDi.Training.IStream.Process
- ViDi2.IDatabase.Process
设备选择是通过 List<int> gpuDevices 参数执行的。
List<int> gpuDevices | 默认值 | 设备列表 |
---|---|---|
值 |
null |
new List<int> {0,1} |
说明 |
使用所有可用的 GPU。 |
仅使用指定 GPU(如 0 和 1)。 |