You're reading an pre-release version of this documentation.
For the latest stable release version, please have a look at master.

评估示例

概述

开发版预置了精度评估 JSON-RPC 服务,上位机通过将评估模型精度的推理逻辑替换为下位机推理调用,来实现模型量化部署的端到端评估。

系统架构

graph TD subgraph Lower_Computer [下位机 - 部署环境] Server[JSON-RPC Server] Engine[模型执行引擎] Server -->|调用| add_model Server -->|调用| infer Server -->|调用| delete_model Server -->|调用| rpc.list infer --> Engine end subgraph Upper_Computer [上位机 - 评估环境] Data[测试数据集] --> Pre[源码: 预处理] Pre --> Wrapper{RPC 推理封装} subgraph Original_Code [原模型源码替换区] Wrapper end Post[源码: 后处理] --> Metric[mAP/精度计算] Wrapper -.-> Client[RPC Client] Client -->|JSON-RPC| Server end Wrapper -.->|结果返回| Post

系统组件图

评估流程时序

sequenceDiagram participant PC as 上位机 (PC/Server) participant Edge as 下位机 (Edge Device) Note over PC: 1. 模型准备 PC->>PC: 模型转换 (Netrans) Note over PC: 2. 模型部署 PC->>Edge: JSON-RPC: add_model(model_nbg, model_method) Edge-->>PC: 返回 status Note over PC: 3. 精度评估 (替换推理逻辑) loop 遍历测试数据集 (Dataset) PC->>PC: 数据预处理 (Pre-processing) PC->>Edge: JSON-RPC: infer(model_method, input_data) Edge->>Edge: 执行硬件加速推理 Edge-->>PC: 返回 raw_results (JSON) PC->>PC: 数据后处理 (Post-processing) PC->>PC: 计算精度指标 (如 mAP) end Note over PC: 4. 资源清理 PC->>Edge: JSON-RPC: rpc.list() / delete_model(model_method) Edge-->>PC: 返回 status

时序图

功能特点

  • 在 YOLO 代码框架内实现批量推理和评估性能

  • 通过 client 接口与板卡建立通信,将 YOLO 源码中的模型推理替换为板卡推理

  • 快速测试量化后的精度损失,确保结果可重复性

  • 详情参考:https://gitlink.org.cn/nudt_dsp/evaluation.git


评估指标说明

指标

说明

基准值 (COCO128)

mAP50

IoU 阈值为 0.5 时的平均检测精度,综合衡量 P 和 R

yolov5s: 0.71 / yolov8s: 0.773


项目结构

 1├── src/                                # 测试验证代码
 2│   ├── val_pnna.py                     # yolov5s 相关板卡的推理代码
 3│   ├── validator.py                    # yolov8s 相关板卡的推理代码
 4│   └── client.py                       # jsonrpc_server 相关代码
 5├── docs/
 6│   ├── yolov5s_evaluation.md           # yolov5s 性能批量评估示例
 7│   └── yolov8s_evaluation.md           # yolov8s 性能批量评估示例
 8├── resource/                           # 资源文件
 9│   ├── yolov5s/                        # yolov5s 权重文件和量化后文件
10│   └── yolov8s/                        # yolov8s 权重文件和量化后文件
11└── README.md                           # 项目说明文档

环境要求及配置

硬件要求

项目

要求

NPU 板卡

X78E_DSKC_202311V0 板卡

连接方式

网线连接(自备)

服务状态

板卡已开启 jsonrpc_server 服务


YOLOv5s 评估示例

环境搭建

步骤 1:下载 YOLOv5 并安装依赖

1cd ~/wsp
2git clone https://github.com/ultralytics/yolov5.git
3cd ~/wsp/yolov5
4mamba activate netrans
5pip install -r requirements.txt

步骤 2:下载 evaluation 项目并安装依赖

1git clone https://gitlink.org.cn/nudt_dsp/evaluation.git
2pip install websockets jsonrpcclient

步骤 3:移动推理脚本到工作目录

1mv ~/wsp/yolov5/evaluation/src/val_pnna.py ~/wsp/yolov5/

执行评估

运行评估脚本,自动下载 COCO128 数据集到 ~/wsp 目录:

1cd ~/wsp/yolov5
2python val_pnna.py

结果保存在 ~/wsp/yolov5/val 目录下。

评估结果

1Class     Images  Instances     P          R      mAP50   mAP50-95
2all        128        929      0.678      0.651   0.709    0.474

推理流程替换

val_pnna.py 将原 val.py 的推理部分替换为下位机推理:

原推理代码:

# Inference
with dt[1]:
    preds, train_out = model(im) if compute_loss else (model(im, augment=augment), None)

替换为板卡推理:

# 初始化 client
method_model = "detection"
pnna_device = Client("ws://192.168.23.100:8000/websocket")

# 添加新模型到板卡
ret_add = pnna_device.add_model(
    './evaluation/resource/yolov5s/wksp/dynamic_fixed_point-16/network_binary.nb',
    method_model
)

# PNNA 推理
yolov5s_image_rgb = im.numpy().transpose(0, 2, 3, 1).astype(np.uint8)
infer_data, infer_time = pnna_device.infer(method_model, yolov5s_image_rgb)

# 结果转化为 tensor
preds = torch.frombuffer(infer_data[0], dtype=torch.float32).reshape(1, 25200, 85)

pnna_device.close()

YOLOv8s 评估示例

环境搭建

步骤 1:下载 YOLOv8 并安装依赖

1cd ~/wsp
2mamba activate netrans
3git clone https://github.com/ultralytics/ultralytics.git
4pip install ultralytics

步骤 2:下载 evaluation 项目并安装依赖

1cd ~/wsp/ultralytics/ultralytics
2git clone https://gitlink.org.cn/nudt_dsp/evaluation.git
3pip install websockets jsonrpcclient

步骤 3:移动验证脚本到工作目录

1mv ~/wsp/ultralytics/ultralytics/evaluation/src/validator.py ~/wsp/ultralytics/ultralytics/engine/

执行评估

步骤 1:安装修改后的源码

1pip install .

步骤 2:运行评估

1cd ~/wsp/ultralytics
2yolo val detect data=ultralytics/cfg/datasets/coco128.yaml model=ultralytics/evaluation/resource/yolov8s/yolov8s.onnx

结果保存在 ~/wsp/ultralytics/runs/detect 目录下。

评估结果

1Class     Images  Instances      P          R      mAP50    mAP50-95
2all        128        929      0.718      0.51    0.651     0.477

推理流程替换

validator.py 将原推理部分替换为下位机推理:

原推理代码:

# inference
with dt[1]:
    preds = model(batch["img"])

替换为板卡推理:

# 初始化 client
method_model = "yolov8s_detection"
pnna_device = Client("ws://192.168.23.100:8000/websocket")

# 添加新模型到板卡
ret_add = pnna_device.add_model(
    'ultralytics/evaluation/yolov8s/wksp/dynamic_fixed_point-16/network_binary.nb',
    method_model
)

# PNNA 推理
yolov8s_image_rgb = batch["img"].numpy().transpose(0, 2, 3, 1).astype(np.uint8)
infer_data, infer_time = pnna_device.infer(method_model, yolov8s_image_rgb)

# 结果转化为 tensor
preds = torch.frombuffer(infer_data[0], dtype=torch.float32).reshape(1, 84, 8400)

pnna_device.close()

作者:ougaoliang