0 总体概览
总体目标:
使用昇腾310P,获取到机械臂抓取物体的抓点。本文档提供了一种较典型的分层模型方案部署:YOLO11 + GraspNet。
阅读该文档后,你将能够将YOLO11+GraspNet部署到310P开发板上进行推理,获取物品抓取操作的抓点。
硬件架构:
软件架构
本文档中,后续环境搭建以及模型快速上手部署,都在昇腾310P的Host侧主机(MiniPC)进行。
1 环境搭建
支持操作系统:Ubuntu22.04;OpenEuler
NPU:Ascend 310P
表1 组件安装顺序表
组件安装顺序 | 版本 | 安装指导 |
1. Ubuntu | 22.04 | |
2. Firmware和Driver | 24.RC1 | |
3. CANN | 8.1.RC1 | |
4. Python | 3.10.xx | Ubuntu22.04 自带 |
5. Pytorch & torch_npu | 2.4.0 | |
6. aie_bench | 0.0.2 | |
7. ACL Lite | / |
2 YOLO11+GraspNet模型推理部署
环境搭建完成后,本章节介绍如何将YOLO11和GraspNet部署到Ascend 310P开发板上进行推理,并将两个模块串接起来。
2.1 YOLO
2.1.1 概述
YOLO11 是 Ultralytics YOLO 系列实时目标检测器的最新版本,它在提高特征提取能力和检测精度的同时,实现了更快的处理速度,并且以更少的参数在 COCO 数据集上达到了更高的平均精度均值,能无缝部署在多种环境中,支持目标检测、实例分割、图像分类等多种计算机视觉任务。
参考实现:Ultralytics YOLO11
2.1.2 模型输入输出
输入数据:
输入数据名(name) | 数据类型(dtype) | 数据大小(shape) | 数据排布格式 |
images | float32 | [1, 3, 640, 640] | NCHW |
输出数据:
输入数据名(name) | 数据类型(dtype) | 数据大小(shape) | 数据排布格式 |
output0 | float32 | [1,84, 8400] | ND |
output1 | float32 | [1, 32, 160, 160] | ND |
以上是模型推理的输入和输出。对于一张输入图像,需要经过前处理转换到该输入。对于输出,需要经过后处理,转化为最终需要的boxes和segments。
2.1.3 快速上手
流程图:
以下步骤都在都在昇腾310P的Host侧主机上进行。
步骤一 获取代码和模型文件
- 获取gitcode仓库代码并安装相关依赖:
(gitcode需提前注册,登录密码使用个人访问令牌)
git clone https://gitcode.com/iRoboDevContest/Ascend-YoloGraspnet.git
cd Ascend-YoloGraspnet
pip install -r requirements.txt
- 获取原始模型YOLO11m-seg.pt,获得官方原始模型yolo11m-seg.pt。
若想要选择不同参数量的模型,可以参看实例分割 - Ultralytics YOLO 文档。
步骤二 模型转换得到OM模型文件
- 将yolo11m-seg.pt转换为yolo11m-seg.onnx
python python/export_yolo11_onnx.py
使用ATC工具将yolo11m-seg.onnx转为yolo11m-seg.om
- 执行命令查看芯片名称(${chip_name})
npu-smi info
#该设备芯片名为Ascend310P1 (自行替换)
回显如下:
+-------------------+-----------------+------------------------------------------------------+
| NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page) |
| Chip Device | Bus-Id | AICore(%) Memory-Usage(MB) |
+===================+=================+======================================================+
| 0 310P1 | OK | 15.8 42 0 / 0 |
| 0 0 | 0000:82:00.0 | 0 1074 / 21534 |
+===================+=================+======================================================+
| 1 310P1 | OK | 15.4 43 0 / 0 |
| 0 1 | 0000:89:00.0 | 0 1070 / 21534 |
+===================+=================+======================================================+2. 执行ATC命令将onnx转换为om
# 这里仅以batchsize=1为例进行测试
# ${chip_name}根据芯片名称替换,这里为 Ascend310P1
atc --model=yolo11m-seg.onnx \
--framework=5 \
--output=yolo11m-seg \
--input_format=NCHW \
--input_shape='images:1,3,640,640' \
--log=error \
--soc_version=Ascend${chip_name}
# 参数说明:
# --model:为ONNX模型文件。
# --framework:5代表ONNX模型。
# --output:输出的OM模型。
# --input_format:输入数据的格式。
# --input_shape:输入数据的shape。
# --log:日志级别。
# --soc_version:处理器型号,通过npu-smi info获得。3. 执行成功后获得模型文件<b>yolo11m-seg.om</b>
步骤三 模型推理和验证
- 运行推理:
代码中有输入数据前处理和输出数据后处理,最终得到boxes和masks。
python python/infer_yolo11_om.py --input yolo11_input.png --output yolo11_output.png
- 示例推理:
示例输入:
示例输出可视化后:
可视化了输出的所有boxes和segments,以及labels和scores
筛选了label为bottle后,得到的masks为:
步骤四 性能(推理时间)测试
运行测试代码:
python python/test_yolo11_om.py --input yolo11_input.png --output yolo11_output.png
得到推理时间为20ms左右。
2.2 GraspNet
2.2.1 概述
GraspNet 是聚焦视觉引导机器人抓取的深度学习模型,旨在解决复杂场景中物体精准抓取问题。常采用双 / 多分支架构,提取视觉特征并预测抓取参数,具备场景泛化强、实时性与精度平衡、任务扩展性高的优势,已在工业制造、物流仓储、服务机器人等领域广泛应用,推动机器人抓取智能化。
参考实现:graspnet-baseline
2.2.2 输入输出
输入数据:
输入数据名(name) | 数据类型(dtype) | 数据大小(shape) | 数据排布格式 |
rgb_image | float32 | [1, 720, 1280, 3] | ND |
depth | uint16 | [1, 720, 1280] | ND |
mask | uint8 | [1, 720, 1280] | ND |
intrinsic | float32 | [3, 3] | D |
输入数据名(name) | 数据类型(dtype) | 数据大小(shape) | 数据排布格式 |
end_points | float32 | [1,20000, 3] | ND |
输出数据:
输入数据名(name) | 数据类型(dtype) | 数据大小(shape) | 数据排布格式 |
GraspPoints | float32 | [N, 4, 4] | ND |
Confidences | float32 | [N, 1] | ND |
Width | float32 | [N, 1] | ND |
Height | float32 | [N, 1] | ND |
2.2.3 快速上手
流程图:
步骤一 获取代码和原始模型文件
- 获取仓库代码并安装相关依赖:
git clone https://gitcode.com/iRoboDevContest/Ascend-YoloGraspnet.gitcd Ascend-YoloGraspnet
pip install -r requirements.txt
cd graspnetAPI
pip install .
步骤二 转换原始模型pt文件为om模型文件
- 将原始pt文件加载后,得到各模块pt文件
python export_pt_models.py
- 将部分pt文件转换为onnx
python export_onnx_models.py
- 将部分onnx模型文件转换为om模型文件
python export_om_models.py
步骤三 使用310P进行模型推理
- 运行推理程序
python infer_graspnet_om.py
- 示例推理
示例输入:
rgb输入
mask输入:
示例输出:
步骤四 验证测试
- 运行推理测试代码:
python test_infer_graspnet_om.py
得到推理运行时间。当前在1.8-2.0s 左右,符合性能预期。
2.3 YOLO + GraspeNet联合推理
2.3.1 概述
使用YOLO目标检测指定目标,得到masks,作为输入传递给GraspNet。GraspNet可获得指定目标的抓点。
2.3.2 程序输入输出
输入数据:
输入数据名(name) | 数据类型(dtype) | 数据大小(shape) | 数据排布格式 |
rgb_image | float32 | [1, 720, 1280, 3] | ND |
depth | uint16 | [1, 720, 1280] | ND |
intrinsic | float32 | [3, 3] | ND |
target_obj | string | [N] | ND |
输出数据:
输入数据名(name) | 数据类型(dtype) | 数据大小(shape) | 数据排布格式 |
GraspPoints | float32 | [N, 4, 4] | ND |
Confidences | float32 | [N, 1] | ND |
Width | float32 | [N, 1] | ND |
Height | float32 | [N, 1] | ND |
2.3.3 快速上手
步骤一 完成前置步骤
请完成前置步骤2.1 YOLO推理和2.2 GraspNet推理
步骤二 运行联合推理程序
python infer_yolo_graspnet.py
示例推理
示例输入:
target_obj: 'Nongfu_water'
rgb输入:
mask(中间结果,YOLO的输出):
示例输出:
抓点输出可视化:
此时已经推理得到抓点。