资讯 社区 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

物体检测服务器端SDK集成文档-Linux-Atlas

简介

本文档介绍EasyEdge/EasyDL的Linux Atlas SDK的使用方法。

注意Atlas有两种产品形态,Atlas 200和Atlas 300, 请参见此处的文档说明

  • 网络类型支持:图像分类
  • 硬件支持:

    • CPU: aarch64
    • Atlas 300 卡
  • 操作系统支持:Atlas指定的Linux版本, Ubuntu 16.04 x86_64 或 centos 7 x86_64 , 请从Atlas文档中下载。

Release Notes

时间 版本 说明
2020.3.23 0.1 初始版本,支持图像分类

性能数据

数据仅供参考,实际数值根据使用线程数、利用率等情况可能有所波动

模型类型 模型算法 芯片类型 SDK类型 实测硬件 单次预测耗时
EasyDL 图像分类 高性能 Atlas 300 Atlas 300 Atlas 800服务器 9ms
EasyDL 图像分类 高精度 Atlas 300 Atlas 300 Atlas 800服务器 12ms
EasyDL 物体检测 高性能 Atlas 300 Atlas 300 Atlas 800服务器 11ms
EasyDL 物体检测 高精度 Atlas 300 Atlas 300 Atlas 800服务器 31ms

atlas 300 加速卡注意事项

一般服务器(HOST侧)安装多个300加速卡,,每个300加速卡有4个芯片。一个芯片(DEVICE侧)可以认为是一个单独的系统,并且不共享储存系统。

每个芯片都有独立的device-id,可以通过命令查看:sudo npu-smi info

由于模型需要在芯片上运行。因此运行SDK前,需要手动将模型复制到每个单独芯片的储存系统上。

测试atlas 300的官方demo

环境准备

请参见此处的文档说明, 搭建环境,测试HelloDavinci demo通过后,再测试本demo

修改300加速卡SSH密码(可选)

请在咨询华为技术人员后,修改Device登录密码

ssh HwHiAiUser@192.168.1.199
#登录后会强制修改密码
ssh HwHiAiUser@192.168.1.198

快速开始

SDK在以下环境中测试通过

  • ubuntu 16.04, Atlas 800 服务器指定版本;

Atlas DDK 的ddk_info信息:

{
    "VERSION": "1.3.8.B902", 
    "NAME": "DDK", 
    "TARGET": "ASIC"
}

1.安装软件

sudo apt-get install sshpass build-essential

2. 测试Demo

编译运行:

下载后,模型资源文件默认已经打包在开发者下载的SDK包中,

Step 0:使用HwHiAiUser登录

Step 1: 运行一次install-demo.sh脚本,会得到测试demo。

Step 2:请在官网获取序列号,填写在demo_async.cpp及demo_sync.cpp的开始处license_key字段。

step3: 准备测试图片

覆盖image目录下的 1.jpg,更多图片可以用于demo中的批量测试模式

step4(可选): 修改test_300.sh下的以下开发板登录信息

export DDK_PATH=$HOME/tools/che/ddk/ddk # ddk的安装路径

declare -a DIVICE_IPS=("192.168.1.199") # 300加速卡芯片的ip地址,device=0 对应192.168.1.199
DEVICE_PASSWORD="Huawei@SYS3" # 之前 修改300加速卡SSH密码
MAIN_CPP="demo_async.cpp" # demo_async.cpp" 异步接口, “demo_async.cpp" 同步接口

OpenCV_install_dir=/home/HwHiAiUser/opencv_x64/ # OpenCV 3.4版本,需要存在${OpenCV_install_dir}/share/OpenCV/OpenCVConfig.cmake文件

step5: 运行demo,会自动编译OpenCV 3.4库, 如果报错请自行编译,目录设置在 OpenCV_install_dir

cd demo
sh test_300.sh

图像分类demo运行效果:

[stat] [100001]image/1.jpg(4 images) time used: 41ms (at 1583765958531) total:705ms
[result][100001][image/1.jpg][281470472005664] is: n07747607 orange 0.973633 950; 


n07747607 orange 分类名
0.973633 分类概率
950 分类名的序号

物体检测的demo运行效果:

[stat] time used : 101ms; all time used:478
images[3] result:
label:no2_ynen;prob:0.985352 loc:[(0.459961,0.839844), (0.5625,0.988281)]

no2_ynen 分类名 , 也可以获取分类名的序号
0.985352 分类概率
loc:[(0.459961,0.839844), (0.5625,0.988281)], 检测框的位置。 (0.459961,0.839844)表示左上角的点,(0.5625,0.988281)右下角的点;
如原始图片608, 左上角(0.459961*608,0.839844*608), 右下角(0.5625*608,0.988281*608)

SDK接口使用

使用该方式,将运行库嵌入到开发者的程序当中。

同步接口使用流程

请优先参考Demo的使用流程。遇到错误,请优先参考文件中的注释解释,以及日志说明。

    // step 0: 设置序列号
    global_controller()->set_licence_key("set your license here");

    // step 1: 配置模型资源目录
    AtlasConfig config; 
    config.model_dir = {模型文件目录};

    // step 2: 创建并初始化Predictor; 
    auto predictor = global_controller()->CreateEdgePredictor(config);
    int ret = predictor->init();
    # 若返回非0,请查看输出日志排查错误原因。
    auto img = cv::imread({图片路径});
    // step 3: 预测图像
    std::vector<EdgeResultData> result2;
    predictor->infer(img, result2);
    # 解析result2即可获取结果

异步接口使用流程

// step 0: 设置序列号
global_controller()->set_licence_key("set your license here");

// step 1: 配置模型资源目录
AtlasConfig config; 
config.model_dir = {模型文件目录};

// step 3: 创建Predictor;这这里选择合适的引擎
auto predictor = global_controller()->CreateEdgePredictor(config);

// step 4: 设置异步回调
predictor->set_result_handler(YOUR_HANDLER);

// step 5: 初始化
int ret = predictor->init();
# 若返回非0,请查看输出日志排查错误原因。

// step 6: 预测图像
auto img = cv::imread({图片路径});
color_format = kBGR;
float threshold = 0.1;

uint64_t seq_id;
predictor->infer_async(img, color_format, 0.1, nullptr, seq_id);
# YOUR_HANDLER里面有seq_id的回调结果

设置序列号

请在网页控制台中申请序列号,并在init初始化前设置。 LinuxSDK 首次使用需联网授权。

  • 接口
virtual int set_licence_key(const std::string& license) = 0;

日志配置

设置 EdgeLogConfig 的相关参数。具体含义参考文件中的注释说明。

EdgeLogConfig log_config;
log_config.enable_debug = true;
global_controller()->set_log_config(log_config);

日志及报错

日志

日志需要开启Atlas 的 INFO级别,/etc/slog.conf中配置关闭zip格式。清空/var/dlog 目录,运行atlas 300 官方示例代码,可以在/var/dlog目录下看见host和device开头的2个日志文件,中间是明文的info级别的日志

日志共有3处:

  • host 测的easyedge.log。 当前运行目录下。
  • device侧的easyedge.device.xxx.log。 device侧的日志,在芯片的同名目录下。
  • /var/dlog host 与device开头的log文件,ddk运行日志,其中device侧有略微延时

通用错误码

错误码 常量 解释
1000004 RESOURCE_LOAD_FAIL 缺少data/model/conf.json文件或者该文件以及被改动。下载包中的data/model下的所有文件都不要改动,尝试使用默认配置。或者按照报错复制到对应目录。
7000001 AUTH_FAILED 服务端校验序列号失败
7000002 AUTH_LICENSE_INVALID 校验序列号
7000003 AUTH_LICENSE_EXPIRED 序列号过期
500001 NET_CURL_PERFORM_FAILED 服务端校验序列号的请求因为网络原因失败
600001 GET_MACHINE_ID_FAILED 没有相关权限,请反馈

Atlas SDK 错误码

错误码值 常量 含义 报错示例信息 示例解释及解决方式
12000011 FILE_NOT _READABLE 资源文件不可读 data/model/params IS NOT READABLE data/model/params,这个文件不可读。SDK下载包中的data/model下的所有文件都不要改动,尝试使用默认配置。或者按照报错复制到对应目录。
12000012 HIAI_ERRORLIST _FILE status.h.list不是原始文件 data/model/status.h.list IS TOO SMALL 下载包中的data/model下的所有文件都不要改动,包括status.h.list
12000102 PREDICTOR_NOT_INITED create后没有调用init()函数 please call init() first 调用infer函数前没有调用init()
12000103 PREDICTOR_NO_HANDLER create后没有调用set_result_handler()函数 please call set_result_handler() first 调用infer_async函数前没有调用set_result_handler(),建议init前调用
12000104 PREDICTOR_ALREADY_INITED init()不管是否成功,不能连续调用。 don't call init() more than once 如果失败,请再次新建一个Predictor
12000105 BATCH_SIZE AltasConfig里的batch_size设置与model_name不符合 model batch size is 1; your config batch size is 4 batch_size设置里4,model_name设置里params,不对应导致报错。model_name应该设置为params-batch4
12000106 INPUT_WIDTH preprocess_args.json被改动 model input tensor width is 224; your config resize is 226 请勿修改preprocess_args.json
12000107 INPUT_HEIGHT 同上 同上 同上
12000201 BATCH_TOO_MANY_IMAGES 一次输入的图片大于batch_size too_many_images input:2; batch_size is 1 调用infer函数,输入了2张图片,大于batch数。如果batch=1的话,每次infer只能传一张图。
12000202 IMAGE_FORMAT_CHANNELS infer函数输入的color_format与cv::Mat里的channel数不匹配 EdgeColorFormat is not according to cv channels; format is 101; channels is 3; seq_id1 101表示kRGBA,cv::Mat里channel应该期望是4。如果是直接读的图片,填kBGR。
12200001 ENGINE_MATRIX _COMMON Atlas DDK Matrix部分(非CreateGraph函数)接口报错。即返回值HIAI_StatusT不是HIAI_OK。具体解释见Atlas官方文档。 hiai::Graph::ParseConfigFile (graph.prototxt) ; status Code is 16855066 ; HIAI ERROR CODE is 101 HIAI_GRAPH_PROTO_FILE _PARSE_FAILED_CODE, 调用hiai::Graph:: ParseConfigFile()返回16855066, 对应的status.h.list中的错误码是101。保留日志,具体见Atlas官方文档。
12200002 ENGINE_AI_COMMON Atlas DDK Device引擎部分hiai::AIStatus 不为hiai::SUCCESS _ai_model_manager->Process() 保留日志,具体见Atlas官方文档。
12200003 ENGINE_MATRIX_INIT Atlas DDK CreateGraph() 初始化DDK报错。具体解释见Atlas官方文档。 hiai::Graph::CreateGraph(); data/model/graph.prototxt ; status Code is 16855190 ; HIAI ERROR CODE is 225 HIAI_FILE_NOT_EXIST_CODE, 示例为缺少libatlas_device.so导致
12200004 EDGEATLAS_ENGINE MATRIX_INIT_DEVICE Atlas DDK CreateGraph() 初始化DDK报错,这个报错很可能是device侧出现问题 hiai::Graph::CreateGraph() ;data/model/graph.prototxt ; status Code is 16855057 ; HIAI ERROR CODE is 92 HIAI_GRAPH_ENGINE _INIT_FAILED_CODE 需要具体排查DEVICE侧日志再次找具体报错,发现原因
12200005 ENGINE_ARGS_NULL 内部错误 请反馈
12300001 SYNC_INFER_TIMEOUT 调用infer同步接口时,内部会调用infer_async函数,这个函数超时 infer sync wait timout more than 10ms 内部会调用infer_async函数超过10ms。1.不要并发过高 2. 超时参数略微大些。
上一篇
Linux集成文档-Python
下一篇
图像分类服务器端SDK集成文档-EdgeKitProxy