评估示例
概述
开发版预置了精度评估 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 源码中的模型推理替换为板卡推理
快速测试量化后的精度损失,确保结果可重复性
评估指标说明
指标 |
说明 |
基准值 (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