1.概述(www.nb-ai.com)
2.环境配置
- 支持的操作系统: Windows10/11 X64(老SDK也支持Linux系统)
此SDK只支持在Nvidia显卡上运行。不支持 AMD 等其他品牌!
-
支持的显卡类型:英伟达GPU(支持算力为“6.1”、“7.5”、“8.6”的GPU),2G以上显存。具体型号见工作台的模型下载界面中的“选择硬件”。
在英伟达官网可以查到显卡算力
-
支持的显卡驱动版本:不低于cuda version 11.6 (在终端命令窗口中输入“nvidia-smi.exe”即可查询cuda version)
-
环境依赖:Visual Studio 2017版本及以上。 Visual Studio下载链接。在官网下载好 Visual Studio 后进行安装,注意勾选“使用C++的桌面开发”和“通用Windows平台开发”。
-
如果您已经下载VS软件:
-
请在“工具”-“获取工具和功能”中下载安装包
-
在“工作负荷”中,勾选“使用C++的桌面开发”和“通用Windows平台开发”, 然后点击“修改”
-
3.快速入门
- 下面给出一个示例,帮助您快速了解如何使用SDK完成C++软件开发。本示例使用VS2019版本给出示例(使用VS2017及以上任一版本均可)
3.1 新建项目
-
打开 “Visual Studio”,点击“创建新项目”
-
选择“C++”、"Windows"、"控制台"、“空项目”,点击“下一步”
-
开始配置项目,更改项目名称和路径,注意名称和路径均不要出现中文字符。点击“创建”。本项目名称为
demo_cpp
。
3.2 修改运行配置
-
在红框中勾选“Release”
-
在红框中勾选“x64”
-
最终效果为:
3.3 解压SDK
-
将下载好的SDK文件解压到安全的路径下(因为要引用SDK,所以请不要删除),如下所示:
-
返回Visual Studio,在“解决资源管理器”中,右键,点击“在文件资源管理器中打开文件夹”
-
打开后,如下所示(我们代称这个当前路径为
proj_root/
,之后要用): -
在SDK文件夹中,将
demo.cpp
文件复制,粘贴到proj_root/
下:
3.4 关联源程序
-
在解决方案中,点击“显示所有文件”图标,如红框所示。
-
找到“demo.cpp”文件
-
右键,点击“包括在项目中”
-
这样就完成了源程序的关联
3.5 添加C/C++附加目录
-
右键
demo_cpp
,点击“属性” -
这时候弹出属性页。左侧栏选择“VC++目录”,右侧找到包含目录,点击下拉菜单,点击“编辑”
-
双击空白位置,点击“...”图标,开始加入文件路径
-
选择SDK中的
include
文件夹,然后点击“选择文件夹” -
发现原来空白的栏出现了文件路径,这代表路径添加成功,点击右下角“确定”,然后点击“应用”来保存更改。
3.6 添加附加库目录和附加依赖项
-
继续在属性页,点击“链接器”——“常规”——“附加库目录”——下拉菜单——“编辑”
-
点击空白栏,然后点击“...”图标来选择目录
-
选择SDK中的
lib
文件夹,然后点击“选择文件夹” -
此时原来空白的栏会出现一行文件路径,这代表路径添加成功,点击右下角“确定”
-
继续在属性页,点击“链接器”——“输入”——“附加依赖项”——下拉菜单——“编辑”
-
添加
opencv_world454.lib
和neuro_det_sdk.lib
。点击“确定”。 -
“附加依赖项”里出现了刚添加的文件名,这代表附加依赖项添加成功。点击“应用”来保存更改。
3.7 添加C++预处理器参数
-
继续在属性页,点击“C/C++”——“预处理器”——“预处理器定义”——下拉菜单——“编辑”。
-
添加
_SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
,然后点击“确定”。 -
点击“应用”来保存更改。再次点击“确定”,就把属性页关闭了。
3.8 添加系统环境变量
-
下面开始添加系统环境变量,打开“此电脑”,空白位置右键,然后选择“属性”,点击“高级系统设置”,点击“环境变量”,出现如下界面。然后选中“Path”,点击“编辑”
-
点击“新建”,再点击“浏览”
-
选择SDK文件夹下的
bin
文件夹: -
将此环境变量上移到第一个,然后点击确定
操作完成点击“确定”。
3.9 重启Visual Studio
3.10 配置License文件
- 请将
License.txt
文件放到proj_root/
文件夹下(放置License.txt
文件的位置请以当前文档为准) 关于如何生成License.txt
文件,参见: 如何获取License - Neurobot
3.11 修改示例代码
-
在
proj_root/
目录下的demo.cpp
文件给出了如何对图片进行预测的一个示例,用户仅需对demo.cpp
文件进行简单的修改,即可完成线下图片测试。 -
在
main
函数中,有6行TODO:
注释,分别对应测试图片文件夹的路径(image_folder_path
),模型文件夹的路径(model_path
),模型名称(model_name
),设备名称(device_name
),设备索引(device_index
),和检测阈值(detect_thres
)。请修改这六个变量的值。 -
注意:
model_name
可以随意起名但是不要重复;device_name
只能是"cpu"
或者"cuda"
;device_index
一般情况下默认是0,当你有多张显卡的时候,用此索引选择你要使用的显卡;detect_thres
是用来筛选检测目标的,如果检测目标的置信度低于此阈值,将被抛弃。阈值的取值范围是[0,1],默认值是-1,也就是0.7。 -
例如:
测试图片文件夹的路径
模型文件夹的路径
-
除了在
Main
函数中有六处含有TODO:
的注释,其他函数也有含有TODO:
的注释,例如:draw_box
、draw_info
和display_results
。请仔细阅读这些注释并根据需求自行修改数值或者代码。
3.12 运行程序
-
上述已经完成了必要的配置过程,下面开始运行程序。打开项目文件。打开
demo.cpp
文件,点击“启动”,开始运行程序 -
如运行成功,命令行界面会展示类似的以下信息:
Test image folder path: D:\nb-ai\test_image
Model path: D:\nb-ai\model\seg_gpu
Model name: test
Device name: cuda
Device index: 0
Detection threshold: -1
The total number of test images: 63
input device: cuda
infer device: cuda
[2023-07-28 19:00:11.522] [logging] [info] [model.cpp:35] [DirectoryModel] Load model: "D:\nb-ai\model\seg_gpu"
[2023-07-28 19:00:11.662] [logging] [info] [inference.cpp:44] {
···
}
[2023-07-28 19:00:12.399] [logging] [warning] [trt_net.cpp:24] TRTNet: Using an engine plan file across different models of devices is not recommended and is likely to affect performance or even cause errors.
[2023-07-28 19:00:13.731] [logging] [info] [inference.cpp:56] ["img"] <- ["image"]
[2023-07-28 19:00:13.731] [logging] [info] [inference.cpp:67] ["post_output"] -> ["dets"]
Batch size: 1
Reading the image: D:\nb-ai\test_image\000B16302318AE4F083DC80A6EA69EF75014582.bmp
Image size (height, width): 2048 2448
results in the 0-th image:
bbox_count=100
Model prediction takes 2.086 seconds
label: 螺帽
label_index: 0
confidential score: 0.99967
(x0, y0): (149.44,10.4562)
(x1, y1): (580.739,481.435)
row_index: 0
col_index: 0
mask_width: 434
mask_height: 474
...
-
测试照片的预测结果会以弹窗形式展示出来,例如:
-
这样就使用SDK完成了C++软件开发。
4. 调用函数说明
4.1 load_model()
-
定义:
- 该函数用于加载模型
-
参数说明:
参数 | 解释 |
---|---|
model_name | 模型名称 |
model_path | 模型所在路径 |
device_name | 选择CPU处理:device_name="cpu"; 选择GPU处理:device_name="cuda" |
device_index | 加载模型的显卡设备号。默认值为0(默认设备号),您也可以修改为其他设备号。 |
- 返回值:
- 返回一个int型变量。0代表执行成功,其他数字为错误码,具体如下:
返回值 | 定义 |
---|---|
0 | 执行成功 |
1 | 配置文件找不到 |
2 | 未找到batch参数 |
3 | 未找到dete_thres参数 |
4 | 未找到class参数 |
5 | 缺少运行所需dll文件 |
6 | ARG-英伟达显卡报错 |
7 | 不支持 |
8 | 越界 |
9 | 内存不足 |
10 | 加载模型相关文件不存在 |
11 | 加载失败 |
12 | 状态计数 |
50 | 模型类型错误或无法读取model.conf文件 |
100 | 模型device_name参数类型错误 |
4.2 get_batch()
-
定义:
- 得到单次处理的样本个数
-
参数说明:
参数 | 说明 |
---|---|
model_name | 模型名称(名称为英文名称) |
- 返回值:
- 返回一个int型变量(batch)
4.3 predict_model()
-
定义:
- 该函数用于预测待测试图片
-
参数说明:
参数 | 说明 |
---|---|
model_name | 模型名称(名称为英文名称) |
mats | 一个cv::Mat 数组,表示所有的测试图片 |
out_results | 一个DetectionResult 的二维向量,用来接收预测结果 |
detect_thres | 检测阈值,超过检测阈值即视为目标物体。detect_thres=-1代表默认值,默认检测阈值为0.7。 |
- 返回值:
- 返回一个类叫
DetectionResult
, 如下代码所示:
- 返回一个类叫
// Bounding box
// (x0, y0) coordinates represent the top left corner of the bounding box
// (x1, y1) coordinates represent the bottom right corner of the bounding box
struct Boxes {
float x0;
float y0;
float x1;
float y1;
};
// Detection results
// For OCR and Object Detection tasks, results are bounding box (box), confidence level (score),
// and category (label, label_index)
// For Pixel Segmentation task, results are bounding box (box), confidence level (score), category (label, label_index),
// and pixel segmentation image (mask, mask_width, mask_height)
struct DetectionResult {
Boxes box; // Bounding box containing the detected object
float score; // Score after predicting, ranging from 0 to 1
// The closer the score is to 1, the better the result is
std::string label; // The target's label name after predicting
int label_index; // Index of the label
cv::Mat mask; // Mask of the the detected object
int row_index; // Position of the the detected object, used for OCR sort (not useful right now)
int col_index; // Position of the the detected object, used for OCR sort (not useful right now)
int mask_width; // Width of the mask
int mask_height; // Height of the mask
};
状态码(status)具体如下:
状态码 | 定义 |
---|---|
0 | 执行成功 |
1 | 英伟达显卡报错 |
2 | 不支持 |
3 | 越界 |
4 | 内存不足 |
5 | 用于预测的相关文件不存在 |
6 | 预测失败 |
7 | 状态计数 |
8 | 无法获取预测的标签 |
9 | 预测的标签和结果数量不符 |
50 | 授权文件不存在或无权限读取 |
51 | 授权文件格式不正确 |
52 | 授权文件指纹不匹配 |
53 | 未到授权开始时间 |
54 | 授权过期 |
4.4 destroy_model()
-
定义:
- 该函数用于将模型从显卡中清除
-
参数说明:
参数 | 说明 |
---|---|
model_name | 模型名称(名称为英文名称) |
- 返回值:
- 无