ModelBox 端云协同AI开发套件(RK3568)上手指南(应用开发篇)

举报
HWCloudAI 发表于 2022/12/08 09:35:23 2022/12/08
【摘要】 ModelBox 端云协同AI开发套件(RK3568)上手指南 应用开发 1. 远程连接开发板我们推荐在PC端使用VS Code远程连接开发板来对设备操作。 1)下载VS CodeVS Code官网下载安装Windows x64版本的编辑器。 2)安装Remote-SSH在VS Code中安装Remote-SSH插件,安装完成后侧边栏将出现远程连接Remote Explorer的图标。 3...

ModelBox 端云协同AI开发套件(RK3568)上手指南

应用开发

1. 远程连接开发板

我们推荐在PC端使用VS Code远程连接开发板来对设备操作。

1)下载VS Code

VS Code官网下载安装Windows x64版本的编辑器。

2)安装Remote-SSH

在VS Code中安装Remote-SSH插件,安装完成后侧边栏将出现远程连接Remote Explorer的图标。

3)进入SSH配置文件

点击VS Code侧边栏的Remote Explorer图标,在弹出的SSH TARGETS界面中点击齿轮图标,选择一个SSH配置文件路径。

4)配置SSH连接

配置SSH连接,参考下图,其中Host是自己设置的盒子名称,HostName是盒子ip地址,User是SSH连接用户名。保存配置文件,SSH TARGETS将出现该Host图标,点击图标后面的连接图标。

5)连接到主机

第一次连接时需要选择远程主机的操作系统类型,这里我们选择Linux

选择Continue

输入密码:

注意:第一次连接会自动下载VS Code相关软件到远程主机上,耗时较长,且需要多次输入登录密码。

6)打开文件夹

点击Open Folder

7)进入开发目录

选择一个路径作为ModelBox SDK和应用存放的目录,再次输入密码,即可连接到开发板的该路径下进行应用开发。

2. 注册HiLens设备

1)在HiLens管理控制台专业版的设备管理板块点击右上角的“注册设备”按钮:

2)参考下图填写注册信息,设置一个设备名称,设备类型选择“RK系列(轻量)”,其他可以保持默认,点击右下角的“下一步”:

3)下载固件和证书文件

4)安装HiLens Agent(开发板需联网)

将上一步下载的HiLens_Device_Agent拷贝到开发板上(拖动文件到VS Code界面中即可),执行命令安装Agent服务:

tar -xvf [Agent安装包名称]
bash install_manual.sh

5)注册设备

将第3步下载的与设备名称同名的证书文件拷贝到开发板上(拖动文件到VS Code界面中即可),执行如下注册命令:

hdactl register_bind -p [证书文件名称]

注册成功后将在HiLens设备列表页面看到该设备:

注:注册成功后设备状态会显示“运行中”,就可以进行ModelBox技能开发了;如果想要安装部署技能市场上的技能,需要付费激活,激活后激活状态才会显示“已激活”

3. 下载ModelBox sdk

1)在HiLens管理控制台专业版的技能开发-工具/插件板块下载RK系列的ModelBox sdk:

2)将sdk拷贝到开发板上(拖动文件到VS Code界面中即可),解压可得到sdk如下:

其中modelbox-rk-aarch64文件夹即为ModelBox核心库,包含ModelBox运行环境、内置的功能单元等,create.py为创建ModelBox工程、创建功能单元、编译运行等的辅助工具。进入sdk目录,执行create.py可看到辅助工具的用法介绍(需使用python3.8版本进行编码开发):

rock@rock-3a:~/███/modelbox$ ./create.py

Usage: Create ModelBox project and flowunit

NOTE : you must firstly use bellow cmd to create a project in workspace
    create.py -t server -n your_proj_name {option: -s name, create this project from a solution}, support hilens deployment
 or create.py -t project -n your_proj_name {option: -s name, create this project from a solution}
AND  : use bellow cmd to create  [c++|python|infer]  flowunit in this project
    create.py -t c++ -n your_flowunit_name -p your_proj_name
AND  : call workspace/your_proj_name/build_project.sh to build your project, call bin/main.sh[bat] to run
FINAL: create.py -t rpm -n your_proj_name to package your project (the same folder with create.py) if upload to hilens

NOTE: create.py -t editor -n your_proj_name to start web ui editor to edit your graph

-h or --help:show help
-t or --template [c++|python|infer|project|server|rpm|editor]  create a template or package to rpm
-n or --name [your template name]
-p or --project  [your project name when create c++|python|infer]
-s or --solution [the solution name when create project] create a project from solution
-v or --version:show sdk version

rock@rock-3a:~/███/modelbox$

4. 开发Hello World应用

接下来我们用Python开发一个最简单的ModelBox应用:打开一个视频文件,在画面左上方写上“Hello World”,再输出到另一个视频文件中。

1)创建工程

使用create.py创建hello_world工程

rock@rock-3a:~/███/modelbox$ ./create.py -t server -n hello_world
sdk version is modelbox-rk-aarch64
success: create hello_world in /home/rock/███/modelbox/workspace

build success: you can run main.sh in ./bin folder

可以看到,第一次创建工程时,在ModelBox sdk目录下,自动生成了workspace文件夹,此文件夹将作为ModelBox应用的默认目录。workspace目录下创建了hello_world工程:

2)创建功能单元

hello_world工程创建python的draw_text功能单元:

rock@rock-3a:~/███/modelbox$ ./create.py -t python -n draw_text -p hello_world
sdk version is modelbox-rk-aarch64
success: create python draw_text in /home/rock/███/modelbox/workspace/hello_world/etc/flowunit/draw_text

可以看到,在hello_world工程的etc/flowunit目录(此目录将作为Python功能单元的默认存放目录)下,生成了draw_text文件夹,其中自动生成了Python功能单元所需的py文件和toml配置文件:

3)修改功能单元

draw_text.toml中配置该功能单元的名称、类别、输入输出端口等信息,当前不用修改;draw_text.py中描述了该功能单元的处理逻辑,这里我们增加OpenCV与NumPy包的引用(需要事先用pip install opencv-python命令安装OpenCV与NumPy的Python库),修改其中的process函数如下:

import cv2
import numpy as np
import _flowunit as modelbox

…

    def process(self, data_context):
        # Process the data
        in_data = data_context.input("in_1")
        out_data = data_context.output("out_1")

        # draw_text process code.
        # Remove the following code and add your own code here.
        for buffer_img in in_data:
            width = buffer_img.get('width')
            height = buffer_img.get('height')
            channel = buffer_img.get('channel')

            img_data = np.array(buffer_img.as_object(), copy=False)
            img_data = img_data.reshape((height, width, channel))

            cv2.putText(img_data, 'Hello World', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)

            out_buffer = self.create_buffer(img_data)
            out_buffer.copy_meta(buffer_img)
            out_data.push_back(out_buffer)

        return modelbox.Status.StatusCode.STATUS_SUCCESS

4)修改流程图

hello_world工程graph目录下默认生成了一个hello_world.toml流程图,修改其中的流程定义graphconf如下:

graphconf = """digraph hello_world {
    node [shape=Mrecord];
    queue_size = 4
    batch_size = 1
    input1[type=input]

    data_source_parser[type=flowunit, flowunit=data_source_parser, device=cpu, deviceid=0]
    video_demuxer[type=flowunit, flowunit=video_demuxer, device=cpu, deviceid=0]
    video_decoder[type=flowunit, flowunit=video_decoder, device=rknpu, deviceid=0, pix_fmt=bgr]
    draw_text[type=flowunit, flowunit=draw_text, device=cpu, deviceid=0]
    video_out[type=flowunit, flowunit=video_out, device=rknpu, deviceid=0]

    input1:input -> data_source_parser:in_data
    data_source_parser:out_video_url -> video_demuxer:in_video_url
    video_demuxer:out_video_packet -> video_decoder:in_video_packet
    video_decoder:out_video_frame -> draw_text:in_1
    draw_text:out_1 -> video_out:in_video_frame
}"""

5)配置输入和输出

我们需要准备一个mp4文件拷贝到hello_world工程中,将sdk目录下的solution/car_det/common/data/car_test_video.mp4拷贝到hello_world工程目录的data文件夹下,然后打开工程目录下bin/mock_task.toml文件,修改其中的任务输入和任务输出配置为如下内容:

# 任务输入,mock模拟目前仅支持一路rtsp或者本地url
# rtsp摄像头,type = "rtsp", url里面写入rtsp地址
# 其它用"url",比如可以是本地文件地址, 或者httpserver的地址,(摄像头 url = "0")
[input]
type = "url"
url = "../data/car_test_video.mp4"

# 任务输出,目前仅支持"webhook", 和本地输出"local"(输出到屏幕,url="0", 输出到rtsp,填写rtsp地址)
# (local 还可以输出到本地文件,这个时候注意,文件可以是相对路径,是相对这个mock_task.toml文件本身)
[output]
type = "local"
url = "../hilens_data_dir/hello.mp4"

6)构建工程

hello_world工程路径下执行build_project.sh进行工程构建:

rock@rock-3a:~/███/modelbox/workspace/hello_world$ ./build_project.sh

build success: you can run main.sh in ./bin folder

rock@rock-3a:~/███/modelbox/workspace/hello_world $

如果执行过程中dos2unix报错,请使用sudo apt-get install dos2unix安装:

./build_project.sh: line 26: dos2unix: command not found

7)运行应用

执行bin/main.sh运行应用(如果执行过程中报错,可用sudo su切换到root用户再运行):

rock@rock-3a:~/███/modelbox/workspace/hello_world$ ./bin/main.sh
[2022-05-17 08:59:55,009][ INFO][          main.cc:369 ] modelbox config path : /home/rock/███/modelbox/workspace/hello_world/bin/../graph/modelbox.conf
...
[2022-05-17 08:59:55,184][ INFO][    iva_config.cc:146 ] load config success
[2022-05-17 08:59:55,184][ INFO][   iva_manager.cc:168 ] grap path : /home/rock/███/modelbox/workspace/hello_world/bin/../graph/hello_world.toml
…
[2022-05-17 08:59:57,949][ INFO][      iva_task.cc:230 ] source_type: url
[2022-05-17 08:59:57,951][ INFO][      iva_task.cc:231 ] input_cfg: {"url":"/home/rock/███/modelbox/workspace/hello_world/bin/../bin/../data/car_test_video.mp4","url_type":"file"}
[2022-05-17 08:59:57,952][ INFO][      iva_task.cc:263 ] output_cfg: {"brokers":[{"cfg":"{\"headers\":null,\"url\":\"/home/rock/███/modelbox/workspace/hello_world/bin/../bin/../hilens_data_dir/hello.mp4\"}","name":"webhook","type":"webhook"}]}[2022-05-17 09:00:10,052][ INFO][mock_communicate.cc:483 ] Task SUCCEEDED, Mock will exit application
[2022-05-17 09:00:10,052][ INFO][iva_task_manager.cc:788 ] task finish. f79b102f-7bb4-43a7-a324-47a8601bf52b
…
[2022-05-17 09:00:10,054][ INFO][session_context.cc:41  ] session context finish se id:09a7d8b0-e883-4513-8981-b745e5ce7c15
...
[2022-05-17 09:00:10,064][ INFO][          main.cc:382 ] exit modelbox process

出现Task SUCCEEDED日志即表示这个图运行结束了,工程目录下的hilens_data_dir文件夹下将会生成视频文件hello.mp4,可以下载到PC端查看。

注意:如果没有为系统安装桌面环境,运行应用时可能会报错缺少某些库,可以先安装对应的库再运行。

  • 缺少libatomic.so.1库:
rock@rock-3a:~/███/modelbox/workspace/hello_world$ ./bin/main.sh
debain os need load libgomp
modelbox: error while loading shared libraries: libatomic.so.1: cannot open shared object file: No such file or directory
rock@rock-3a:~/███/modelbox/workspace/hello_world$ sudo apt-get update && sudo apt-get install -y libatomic1
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  gcc-10-base libgcc-s1 libgcc1 libgomp1 libstdc++6
The following NEW packages will be installed:
  libatomic1
The following packages will be upgraded:
  gcc-10-base libgcc-s1 libgcc1 libgomp1 libstdc++6
5 upgraded, 1 newly installed, 0 to remove and 247 not upgraded.
Need to get 654 kB of archives.
After this operation, 75.8 kB of additional disk space will be used.
...
Setting up libgcc1 (1:10.3.0-1ubuntu1~20.04) ...
Setting up libgomp1:arm64 (10.3.0-1ubuntu1~20.04) ...
Setting up libatomic1:arm64 (10.3.0-1ubuntu1~20.04) ...
Processing triggers for libc-bin (2.31-0ubuntu9) ...
rock@rock-3a:~/███/modelbox/workspace/hello_world$
  • 缺少libcurl.so.4库:
rock@rock-3a:~/███/modelbox/workspace/hello_world$ ./bin/main.sh
...
[2022-07-17 03:52:25,091][ERROR][ server_plugin.cc:79  ] Open library /home/rock/███/modelbox/workspace/hello_world/bin/../../../modelbox-rk-aarch64/lib/modelbox-iva-plugin.so failed, libcurl.so.4: cannot open shared object file: No such file or directory
...
rock@rock-3a:~/███/modelbox/workspace/hello_world$ sudo apt-get install -y libcurl4
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  libcurl4
0 upgraded, 1 newly installed, 0 to remove and 247 not upgraded.
Need to get 215 kB of archives.
After this operation, 660 kB of additional disk space will be used.
...
Setting up libcurl4:arm64 (7.68.0-1ubuntu2.12) ...
Processing triggers for libc-bin (2.31-0ubuntu9) ...
rock@rock-3a:~/███/modelbox/workspace/hello_world$
  • 缺少libGL.so.1库:
rock@rock-3a:~/███/modelbox/workspace/hello_world$ ./bin/main.sh
...
[2022-07-17 03:52:25,085][ WARN][flowunit_group.cc:388 ] draw_car_bbox: open failed: code: Invalid argument, errmsg: import draw_car_bbox@draw_car_bboxFlowUnit failed: ImportError: libGL.so.1: cannot open shared object file: No such file or directory
...
rock@rock-3a:~/███/modelbox/workspace/hello_world$ sudo apt-get install -y libgl1
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  libdrm-amdgpu1 libdrm-nouveau2 libdrm-radeon1 libgl1-mesa-dri libglapi-mesa libglvnd0 libglx-mesa0 libglx0 libllvm12 libxcb-dri2-0 libxcb-dri3-0
  libxcb-glx0 libxcb-present0 libxcb-sync1 libxcb-xfixes0 libxshmfence1
The following NEW packages will be installed:
  libdrm-amdgpu1 libdrm-nouveau2 libdrm-radeon1 libgl1 libgl1-mesa-dri libglapi-mesa libglvnd0 libglx-mesa0 libglx0 libllvm12 libxcb-dri2-0
  libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-sync1 libxcb-xfixes0 libxshmfence1
0 upgraded, 17 newly installed, 0 to remove and 247 not upgraded.
Need to get 24.1 MB of archives.
After this operation, 1004 MB of additional disk space will be used.
...
Setting up libgl1:arm64 (1.3.2-1~ubuntu0.20.04.2) ...
Processing triggers for libc-bin (2.31-0ubuntu9) ...
rock@rock-3a:~/███/modelbox/workspace/hello_world$

另外,如果运行日志中有类似下面这样的报错,可以忽略,这是应用在尝试与云侧通信校验license,但当前我们是在本地测试,不需要这类校验:

rock@rock-3a:~/███/modelbox/workspace/hello_world$ ./bin/main.sh
...
[2022-07-17 03:52:25,091][ERROR][iva_auth_info_updater.cc:29  ] IvaManager::SetIAMAuthInfo Not enough meassage. userId and (domain_id or vas_x_role_name) is empty.
...
[2022-07-17 03:52:25,091][ERROR][        iva_io.cc:118 ] tempAuthInfo is nullptr
...

8)生成视频流应用的流程图

除了使用视频文件进行测试,ModelBox还支持输入实时视频流,接下来我们试试在USB摄像头的实时画面上写“Hello World”,这个功能需要用到上面介绍的ModelBox PC Tool工具。

使用cp graph/hello_world.toml graph/hello_world_camera.toml命令生成新的流程图,修改hello_world_camera.toml中的流程定义graphconf如下,可以对比它与hello_world.toml的区别:

graphconf = """digraph hello_world {
    node [shape=Mrecord];
    queue_size = 4
    batch_size = 1
    input1[type=input]

    data_source_parser[type=flowunit, flowunit=data_source_parser, device=cpu, deviceid=0]
    local_camera[type=flowunit, flowunit=local_camera, device=rknpu, deviceid=0, pix_fmt=bgr, cam_width=1280, cam_height=720]
    draw_text[type=flowunit, flowunit=draw_text, device=cpu, deviceid=0]
    video_out[type=flowunit, flowunit=video_out, device=rknpu, deviceid=0]

    input1:input -> data_source_parser:in_data
    data_source_parser:out_video_url -> local_camera:in_camera_packet
    local_camera:out_camera_frame -> draw_text:in_1
    draw_text:out_1 -> video_out:in_video_frame
}"""

9)修改输入和输出配置

打开工程目录下bin/mock_task.toml文件,修改其中的任务输入和任务输出配置为如下内容:

# 任务输入,mock模拟目前仅支持一路rtsp或者本地url
# rtsp摄像头,type = "rtsp", url里面写入rtsp地址
# 其它用"url",比如可以是本地文件地址, 或者httpserver的地址,(摄像头 url = "0")
[input]
type = "url"
url = "0"

# 任务输出,目前仅支持"webhook", 和本地输出"local"(输出到屏幕,url="0", 输出到rtsp,填写rtsp地址)
# (local 还可以输出到本地文件,这个时候注意,文件可以是相对路径,是相对这个mock_task.toml文件本身)
[output]
type = "local"
url = "rtsp://192.168.2.2:8554/outstream"

注意,output条目下url配置中的ip是PC的ip地址,如果之前是用ModelBox PC Tool配置静态ip的方式设置的网络,那PC的ip地址就是192.168.2.2,否则需要做相应修改。

10)运行应用

将USB摄像头插到开发板上,双击任务栏上的ModelBox PC Tool工具图标弹出主界面,在Step2界面上选择“使用开发板侧视频流”,点击“启动推流”,推流服务将启动,ModelBox PC Tool工具也会再次最小化到任务栏上:

VS CodeTerminal中执行bin/main.sh camera运行应用:

rock@rock-3a:~/███/modelbox/workspace/hello_world$ ./bin/main.sh camera
[2022-05-17 08:59:55,009][ INFO][          main.cc:369 ] modelbox config path : /home/rock/███/modelbox/workspace/hello_world/bin/../graph/modelbox.conf
...
[2022-05-17 08:59:55,184][ INFO][    iva_config.cc:146 ] load config success
[2022-05-17 08:59:55,184][ INFO][   iva_manager.cc:168 ] grap path : /home/rock/███/modelbox/workspace/hello_world/bin/../graph/hello_world_camera.toml
…
[2022-05-17 09:00:10,054][ INFO][video_out_flowunit.cc:304 ] video_out url is rtsp://192.168.2.2:8554/outstream
[2022-05-17 09:00:10,064][ INFO][ ffmpeg_writer.cc:55  ] Open url rtsp://192.168.2.2:8554/outstream, format rtsp success

此时,浏览器将会自动打开,网页中的视频窗口将输出应用的实时画面:

5. 开发第一个AI应用

接下来我们开发一个车辆检测应用:打开一个视频文件,使用检测模型检测出画面中车辆并画框,再输出到另一个视频文件中。本应用作为模板案例已内置在sdk中,不需要另外下载。

1)创建工程

使用车辆检测模板创建car_det工程(注意与创建hello_world工程的区别):

rock@rock-3a:~/███/modelbox$ ./create.py -t server -n car_det -s car_det
sdk version is modelbox-rk-aarch64
success: create car_det in /home/rock/███/modelbox/workspace

2)查看推理功能单元

这个应用使用到了模型推理,需要用到推理功能单元,可以看到,在car_det工程目录的model文件夹下,存在yolox_infer推理功能单元文件夹,里面有yolox模型文件(yolox_nano_288x512.rknn)和模型配置文件(yolox_infer.toml),模型配置文件内容如下:

# Copyright (C) 2022 Huawei Technologies Co., Ltd. All rights reserved.

[base]
name = "yolox_infer"
device = "rknpu"
version = "1.0.0"
description = "car detection"
entry = "./yolox_nano_288x512.rknn"  # model file path, use relative path
type = "inference" 
virtual_type = "rknpu2" # inference engine type: rockchip now support rknpu, rknpu2(if exist)
group_type = "Inference"  # flowunit group attribution, do not change
is_input_contiguous = "false"  # input data attribution, do not change

# input port description, suporrt multiple input ports
[input]
[input.input1]
name = "input"
type = "uint8"
device = "rknpu"

# output port description, suporrt multiple output ports
[output]
[output.output1]
name = "output"
type = "float"

可以看到该模型有1个输入节点,1个输出节点。需要注意其中的virtual_type配置与npu类别有关,RK3568需配置为rknpu2;输入节点的device配置建议设为与该推理功能单元的上一个功能单元相同。
ModelBox内置了rknn推理引擎和推理逻辑,开发者只需要准备好模型、编辑好配置文件,即可使用该模型进行推理,无需编写推理代码。

如果想要创建另外的推理功能单元,可以使用如下命令,推理功能单元默认创建在工程目录的model文件夹下:

rock@rock-3a:~/███/modelbox$ ./create.py -t infer -n my_model -p car_det
sdk version is modelbox-rk-aarch64
success: create infer my_model in /home/rock/███/modelbox/workspace/car_det/model/my_model

另外,本案例使用的车辆检测模型是由PyTorch框架训练得到,我们事先使用rknn-toolkit2工具将它转换为RK3568支持的模型格式,感兴趣的话可以在RK3568模型转换验证案例中查看模型转换过程。

3)查看其他功能单元

车辆检测模型推理后需要做一些后处理操作得到检测框,再把检测框添加到原始画面中,我们已经准备好了对应的功能单元yolox_postdraw_car_bbox

4)查看执行脚本

car_det工程graph目录下带有多个流程图,配置文件modelbox.conf中的flow_path参数指定了技能运行时的流程图路径:

flow_path = "${APP_ROOT}/graph/car_det${HILENS_GRAPH_TYPE}.toml"

其中环境变量${APP_ROOT}在运行技能时将自动替换为当前工程的实际路径,而${HILENS_GRAPH_TYPE}可以在执行bin/main.sh脚本时输入流程图后缀名作为参数指定当前运行哪个图,打开该脚本看到相关参数内容为:

if [ "$1" = "default" -o "$1" = "" ]; then
  export HILENS_GRAPH_TYPE=
else
  export HILENS_GRAPH_TYPE=_$1
fi

默认执行与工程同名的流程图car_det.toml,如果输入bin/main.sh http即执行car_det_http.toml

5)查看默认流程图

与工程同名的car_det.toml流程图中的流程定义graphconf如下:

graphconf = """digraph car_det {
    node [shape=Mrecord];
    queue_size = 4
    batch_size = 1
    input1[type=input]

    data_source_parser[type=flowunit, flowunit=data_source_parser, device=cpu, deviceid=0]
    video_demuxer[type=flowunit, flowunit=video_demuxer, device=cpu, deviceid=0]
    video_decoder[type=flowunit, flowunit=video_decoder, device=rknpu, deviceid=0, pix_fmt=bgr]
    image_resize[type=flowunit, flowunit=resize, device=rknpu, deviceid=0, image_width=512, image_height=288]
    car_detection[type=flowunit, flowunit=yolox_infer, device=rknpu, deviceid=0]
    yolox_post[type=flowunit, flowunit=yolox_post, device=cpu, deviceid=0]
    draw_car_bbox[type=flowunit, flowunit=draw_car_bbox, device=cpu, deviceid=0]
    video_out[type=flowunit, flowunit=video_out, device=rknpu, deviceid=0]

    input1:input -> data_source_parser:in_data
    data_source_parser:out_video_url -> video_demuxer:in_video_url
    video_demuxer:out_video_packet -> video_decoder:in_video_packet
    video_decoder:out_video_frame -> image_resize:in_image
    image_resize:out_image -> car_detection:input
    car_detection:output -> yolox_post:in_feat
    video_decoder:out_video_frame -> draw_car_bbox:in_image
    yolox_post:out_data -> draw_car_bbox:in_bbox
    draw_car_bbox:out_image -> video_out:in_video_frame
}"""

查看任务配置文件bin/mock_task.toml,可以看到其中的任务输入和任务输出配置为如下内容:

# 任务输入,mock模拟目前仅支持一路rtsp或者本地url
# rtsp摄像头,type = "rtsp", url里面写入rtsp地址
# 其它用"url",比如可以是本地文件地址, 或者httpserver的地址,(摄像头 url = "0")
[input]
type = "url"
url = "../data/car_test_video.mp4"

# 任务输出,目前仅支持"webhook", 和本地输出"local"(输出到屏幕,url="0", 输出到rtsp,填写rtsp地址)
# (local 还可以输出到本地文件,这个时候注意,文件可以是相对路径,是相对这个mock_task.toml文件本身)
[output]
type = "local"
url = "../hilens_data_dir/car_test_result.mp4"

该流程图使用data/car_test_video.mp4文件进行车辆检测,检测结果绘制后保存为hilens_data_dir/car_test_result.mp4文件。

6)运行默认应用

car_det工程路径下执行build_project.sh进行工程构建:

rock@rock-3a:~/███/modelbox/workspace/car_det$ ./build_project.sh 

build success: you can run main.sh in ./run folder

rock@rock-3a:~/███/modelbox/workspace/car_det$

切换到root账号,执行bin/main.sh运行应用,运行结束后在hilens_data_dir目录下生成了car_test_result.mp4文件,可以下载到PC端查看。

7)查看HTTP流程图

除了开发视频推理类应用,我们还可以使用ModelBox开发HTTP服务类应用,打开car_det/graph/car_det_http.toml,看到流程定义graphconf如下:

graphconf = """digraph car_det {
    node [shape=Mrecord];
    queue_size = 4
    batch_size = 1
    input1[type=input]

    httpserver_sync_receive[type=flowunit, flowunit=httpserver_sync_receive_v2, device=cpu, deviceid=0, time_out_ms=5000, endpoint="http://0.0.0.0:8083/v1/car_det", max_requests=100]
    image_decoder[type=flowunit, flowunit=image_decoder, device=rknpu, deviceid=0, key="image_base64"]
    image_resize[type=flowunit, flowunit=resize, device=rknpu, deviceid=0, image_width=512, image_height=288]
    car_detection[type=flowunit, flowunit=yolox_infer, device=rknpu, deviceid=0]
    yolox_post[type=flowunit, flowunit=yolox_post, device=cpu, deviceid=0]
    httpserver_sync_reply[type=flowunit, flowunit=httpserver_sync_reply_v2, device=cpu, deviceid=0]

    input1:input -> httpserver_sync_receive:in_url
    httpserver_sync_receive:out_request_info -> image_decoder:in_encoded_image
    image_decoder:out_image -> image_resize:in_image
    image_resize:out_image -> car_detection:input
    car_detection:output -> yolox_post:in_feat
    yolox_post:out_data -> httpserver_sync_reply:in_reply_info
}"""

该流程图从HTTP请求中接收一张图片进行车辆检测,并返回检测结果。

8)运行HTTP应用

我们使用root账号运行car_det_http.toml流程图(注意命令后的http参数):

root@rock-3a:/home/rock/███/modelbox/workspace/car_det# ./bin/main.sh http
[2022-05-17 10:20:47,315][ INFO][          main.cc:369 ] modelbox config path : /home/rock/███/modelbox/workspace/car_det/bin/../graph/modelbox.conf
...
[2022-05-17 10:20:47,444][ INFO][    iva_config.cc:146 ] load config success
[2022-05-17 10:20:47,444][ INFO][   iva_manager.cc:168 ] grap path : /home/rock/███/modelbox/workspace/car_det/bin/../graph/car_det_http.toml
...
[2022-05-17 10:20:49,800][ INFO][httpserver_sync_receive.cc:188 ] Start server at http://0.0.0.0:8083/v1/car_det

看到Start server at http...字样的日志即表示HTTP服务已启动,等待调用。

9)调用HTTP服务

car_det/data目录下我们准备了HTTP调用的测试脚本test_http.py和测试图片car_test_pic.jpg,可以看到默认是在本机发起调用请求:

if __name__ == "__main__":
    port = 8083
    ip = "127.0.0.1"
    url = "/v1/car_det"
    img_path = "./car_test_pic.jpg"
    test_image(img_path, ip, port, url)

我们在VS Code中打开另一个终端,执行该脚本,将在car_det/data下生成测试图片的推理结果car_test_pic.jpg

当然,也可以将测试脚本和图片拷贝到PC上,并将test_http.py中的ip变量修改为开发板的ip进行远程调用测试。

至此,我们的第一个AI应用就已经开发好了。
有关ModelBox核心概念、功能单元和流程图开发的更多介绍,可查看ModelBox手册

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。