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

评估示例

概述

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

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

时序图

下述示例展示yolov5s和yolov8s通过netrans量化后的性能评估:

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

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

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

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

评估指标

  • mAP50为IoU阈值为0.5时的平均检测精度,综合衡量P和R,值越高模型整体性能越好

  • 基准参考:PC 端运行 yolov5s 的 mAP50 为 0.71(COCO128 数据集,128 张图片)

  • 基准参考:PC 端运行 yolov8s 的 mAP50 为 0.773(COCO128 数据集,128 张图片)

项目结构

 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评估示例

python环境搭建

  • 下载 yolov5 到 ~/wsp,安装yolov5所需的包

1cd ~/wsp
2git clone https://github.com/ultralytics/yolov5.git
3cd ~/wsp/yolov5
4mamba activate netrans
5pip install -r requirements.txt
  • 下载 evaluation 到 ~/wsp/yolov5,安装依赖包

1git clone https://gitlink.org.cn/nudt_dsp/evaluation.git
2pip install websockets jsonrpcclient
  • 将val_pnna.py移动到~/wsp/yolov5目录下

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

yolov5s评估验证

  • 执行val_pnna.py,脚本会自动下载coco128数据集并解压到'~/wsp'目录下

  • 执行完成后结果保存在~/wsp/yolov5/val目录下

1cd ~/wsp/yolov5 
2python val_pnna.py
  • 评估结果如下

1Class     Images  Instances     P          R      mAP50   mAP50-95:
2all        128        929      0.678      0.651   0.709    0.474
  • P为精确率,R为召回率

  • mAP50为IoU阈值为0.5时的平均检测精度,综合衡量P和R,值越高模型整体性能越好

  • mAP50-95为模型在不同严格程度(IoU阈值越高,要求定位越精准)下的综合性能

精度评估流程

val_pnna.py将val.py代码的推理部分替换为下位机推理,将下位机推理结果接入yolov5的后处理,实现模型精度的快速评估,如下为下位机推理流程

  • yolov5s的推理源码

1# Inference
2with dt[1]:
3    preds, train_out = model(im) if compute_loss else (model(im, augment=augment), None)
  • 源码替换为板卡推理的代码如下

 1# 初始化client
 2method_model = "detection"
 3pnna_device = Client("ws://192.168.23.100:8000/websocket")
 4
 5# 添加新模型到板卡
 6ret_add = pnna_device.add_model('./evaluation/resource/yolov5s/wksp/dynamic_fixed_point-16/network_binary.nb', method_model)
 7
 8# pnna 推理
 9yolov5s_image_rgb = im.numpy().transpose(0, 2, 3, 1).astype(np.uint8)
10infer_data, infer_time = pnna_device.infer(method_model, yolov5s_image_rgb)
11
12# 结果转化为tensor
13preds = torch.frombuffer(infer_data[0], dtype=torch.float32).reshape(1, 25200, 85)
14
15pnna_device.close()

yolov8s评估示例

环境搭建

  • 下载 yolov8 到 ~/wsp,安装yolov8所需的包

1cd ~/wsp
2mamba activate netrans
3git clone https://github.com/ultralytics/ultralytics.git
4pip install ultralytics
  • 下载 evaluation 到 ~/wsp/ultralytics,安装依赖包

1cd ~/wsp/ultralytics/ultralytics
2git clone https://gitlink.org.cn/nudt_dsp/evaluation.git
3pip install websockets jsonrpcclient
  • 将validator.py移动到~/wsp/ultralytics/ultralytics/engine目录下

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

yolov8s评估验证

  • 执行 pip install . ,将修改后的源码安装到Ultralytics包中

1pip install .
  • 执行如下,脚本会自动下载coco128数据集并解压到'~/wsp'目录下

1cd ~/wsp/ultralytics 
2yolo val detect data=ultralytics/cfg/datasets/coco128.yaml model=ultralytics/evaluation/resource/yolov8s/yolov8s.onnx
  • 执行完成后结果保存在~/wsp/ultralytics/runs/detect目录下

  • 评估结果如下

1    Class     Images  Instances      P          R      mAP50    mAP50-95
2    all        128        929      0.718       0.51    0.651     0.477
  • P为精确率,R为召回率

  • mAP50为IoU阈值为0.5时的平均检测精度,综合衡量P和R,值越高模型整体性能越好

  • mAP50-95为模型在不同严格程度(IoU阈值越高,要求定位越精准)下的综合性能

精度评估流程

validator.py将源码中validator.py代码的推理部分替换为下位机推理,将下位机推理结果接入yolov8的后处理,实现模型精度的快速评估,如下为下位机推理流程

  • yolov8s的推理源码

1# inference
2with dt[1]:
3    preds = model(batch["img"])
  • 源码替换为板卡推理的代码如下

 1# 初始化client
 2method_model = "yolov8s_detection"
 3pnna_device = Client("ws://192.168.23.100:8000/websocket")
 4
 5# 添加新模型到板卡
 6ret_add = pnna_device.add_model('ultralytics/evaluation/yolov8s/wksp/dynamic_fixed_point-16/network_binary.nb', method_model)
 7
 8# pnna 推理
 9yolov8s_image_rgb = batch["img"].numpy().transpose(0, 2, 3, 1).astype(np.uint8)
10infer_data, infer_time = pnna_device.infer(method_model, yolov8s_image_rgb)
11
12# 结果转化为tensor
13preds = torch.frombuffer(infer_data[0], dtype=torch.float32).reshape(1, 84, 8400)
14
15pnna_device.close()