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 现在可以准确显示所需的程序集,以及第三方程序集必需的许可证。

Note: 依赖项可能需要额外的依赖项。

 

VisionPro Deep Learning 的 NuGet 数据包位于以下目录中:

  • C:\ProgramData\Cognex\VisionPro Deep Learning\X.X\Examples\packages

 

在示例中会自动设置 NuGet 提要,但必须将其设置为全局 Visual Studio NuGet 数据包提要。Cognex 强烈建议将 NuGet 包备份到另一个安全存储库(或等效存储库)并保留一份副本。然后应将此位置配置为新的 NuGet 提要。有关更多信息,请参阅以下 Microsoft 主题:托管您自己的 NuGet 提要

CAUTION:  如果安装了新版本,NuGet 将被覆盖。如果两个版本均不可用,则必须执行手动 NuGet 升级。

 

运行时 API 处理指南

聚焦模式支持并行处理,因为其处理是在图像基础上完成的。当您组织代码工作流以使用 API 在运行时工作区中处理聚焦工具时,可以利用这种并行处理功能。在阅读此页之前,强烈建议您查看 NVIDIA GPU 选择和配置以了解有关并行处理工具的更多详细信息。

 

当您在运行时环境中使用 VisionPro Deep Learning API 执行处理任务时,您将处理线程、GPU、样本等对象以组织 API 代码工作流。

对象 说明/备注
工作区 线程安全
线程安全
工具 线程安全
样本

处理图像的容器对象

非线程安全

图像

具有要处理的实际图像数据的对象

非线程安全

缓冲区

接收结果的对象

非线程安全

线程  

 

初始化多个 GPU 设备时,您有 2 个通过调用 API 来调用处理的选项。

Note: 以下工作流策略的应用仅限于处理聚焦模式工具。有关更多详细信息,请参阅 GPU 分配

 

提供“空列表”作为设备列表参数

如果在调用 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)。