ModelBox介绍
ModelBox是一个适用于端边云场景的AI推理应用开发框架,提供了基于Pipeline的并行执行流程,能帮助AI应用开发者较快的开发出高效,高性能,以及支持软硬协同优化的AI应用。
易于开发
AI推理业务可视化编排开发,功能模块化,丰富组件库;c++,python多语言支持。
易于集成
集成云上对接的组件,云上对接更容易。
高性能,高可靠
pipeline并发运行,数据计算智能调度,资源管理调度精细化,业务运行更高效。
软硬件异构
CPU,GPU,NPU多异构硬件支持,资源利用更便捷高效。
全场景
视频,语音,文本,NLP全场景,专为服务化定制,云上集成更容易,端边云数据无缝交换。
易于维护
服务运行状态可视化,应用,组件性能实时监控,优化更容易。
模型训练
我们可以使用面向开发者的一站式AI开发平台ModelArts进行模型的训练:
ModelArts提供了包括数据标注,训练环境,预置算法在内的丰富的功能,甚至可以通过订阅预置算法实现零代码的模型训练工作。当然你也可以在本地训练自己的模型。我们假设你现在已经拥有了训练好的模型,接下来我们需要将训练好的模型转换成为可以在开发板上运行的模型。本案例可以直接用预训练好的模型进行初期应用的搭建即可。
模型转换
我们发布了开发板模型转换案例,参见RK3568模型转换验证案例 :
在这个案例中我们演示了从环境适配到模型的转换验证的全流程样例代码,开发者可以通过“Run in ModelArts”一键将Notebook案例在ModelArts控制台快速打开、运行以及进行二次开发等操作。
开发环境部署
使用开发板进行ModelBox AI应用开发有两种方式,一是开发板连接显示器和键盘鼠标,安装Ubuntu桌面,直接在开发板上进行开发;二是使用远程连接工具(如VS Code中的Remote-SSH)从PC端登录开发板进行开发。这里我们推荐第二种方式,因为PC端可以使用功能更丰富、界面更友好的IDE。
请参考此案例的开发环境部署先进行环境搭建:
应用开发
接下来我们会以疲劳驾驶检测demo为例,介绍如何使用ModelBox开发AI应用。
1.创建工程
SDK提供了工程脚本create.py,可以使用./create.py -h查看脚本帮助:
rock@rock-3a:~/yourpath/v1.0.8.21$ sudo ./create.py -h
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}, generally not use
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 {option: -i ip or ip:port to start editor server in your config ip:port}
NOTE: create.py -t demo to create solutions to runnable demo
for ex: create.py -t server -n my_det -s car_det
-h or --help:show help
-t or --template [c++|python|infer|yolo|project|server|rpm|editor|demo] create a template or package to rpm ...
-n or --name [your template name]
-p or --project [your project name when create c++|python|infer|yolo]
-s or --solution [the solution name when create project] create a project from solution
-c or --cfg [flowunit configure json, it's used by UI, you can use it too, but too complicated]
-v or --version:show sdk version
ModelBox提供了可视化图编排工具:Editor,可以使用./create.py -t editor开启图编排服务:服务默认ip即为192.168.2.111,如需配置其他ip或端口,可以通过-i ip:port参数进行配置。
在浏览器输入ip:port/editor即可进入可视化编辑界面,我们点击编排进入工程开发界面,如果进一步了解ModelBox相关内容,可以点击右上角帮助:
ModelBox提供了可视化图编排工具:Editor,可以使用./create.py -t editor开启图编排服务:服务默认ip即为192.168.2.111,如需配置其他ip或端口,可以通过-i ip:port参数进行配置。
在浏览器输入ip:port/editor即可进入可视化编辑界面,我们点击编排进入工程开发界面,如果进一步了解ModelBox相关内容,可以点击右上角帮助:进入编排界面,点击右上角新建项目:
我们在workspace的项目路径下,建立项目名称fatigue_detect,点击确认:
从默认的模板中可以看到,我们初始具备了一个http收发单元的默认图:
其中,区域1为SDK预置的高性能通用流单元,区域2为可视化编排界面,区域3为对应的图配置文件内容。同时,VS Code对应目录下也出现了fatigue_detect项目:
2.创建推理功能流单元
接下来,我们通过UI界面创建推理流单元:
点击右上角功能单元,创建单元
对于面部检测模型,我们将流单元命名为face_detection,模型文件名即为转换好的检测模型名:face_detect.rknn,此模型输入为图像,输出为特征向量,所以我们添加int类型的输入端口与float类型的输出端口。关于开发板的推理流单元创建,在处理类型时我们选择cuda,即为npu推理,推理引擎可选任意一款,目前开发板SDK可以自动进行识别转换。最后将功能单元分组修改为inference,点击确认,即可看到,在左侧inference页签下出现了新添加的推理流单元
同时,在VS Code工程model目录下可以看到创建好的推理流单元:
类似的,我们创建face_landmark_detection推理流单元:
3.创建后处理功能单元
除了推理流单元外,疲劳驾驶检测demo还需要一些通用功能单元:面部检测的后处理单元、感兴趣区域(面部检测区域)提取单元、疲劳逻辑判断单元,我们新建三个python功能单元来满足上述需求。
对于面部检测的后处理单元,我们希望通过原图和face_detection的两个输出向量解码出面部检测框,所以该单元应该有三个输入。此外,对于画幅中有无检测到面部两种状态,我们希望该功能单元分情况处理,检测到面部时,将面部检测结果送入感兴趣区域提取单元,没有检测到面部时,直接返回,因此功能单元类型选择:IF_ELSE。新建单元如下:
同样的,根据输入输出与功能单元状态,我们创建extract_roi和fatigue_detect两个功能单元:
4.流程图编排
拖拽
需要的功能单元全部创建好后,我们可以着手编排流程图,我们编排一个视频处理的图,可以删除不需要的http收发单元:
在Generic列表下将虚拟输入单元input和我们刚刚创建的三个功能单元拖入画布:
在Image列表下将模型推理需要用到的预处理单元resize拖入画布,因为面部检测模型与面部关键点模型都resize处理,把两个resize单元拖入:
值得注意的是,resize单元需要适配模型参数,需要点击该单元进行配置:
在Input列表下拖入输入解析单元data_source_parser作为视频流的输入源
在Video列表下拖入视频处理需要的单元video_demuxer、video_decoder、video_out:
最后,在Inference列表下拖入我们创建的两个推理单元:
编排
将功能单元按照处理逻辑进行连接:
点击上个流单元并拖动箭头可以连接下一个流单元
虚拟输入input连接输入解析data_source_parser,解析后送入视频解包video_demuxer与解码单元video_decoder:
输出送入预处理后可直接进行推理,面部检测输出连接后处理模块,用于提取坐标输入到感兴趣区域,若没检测到面部则跳过面部关键点检测与疲劳驾驶判断: