评估示例
概述
开发版预置了精度评估jsonrpc服务,上位机通过将评估模型精度的推理逻辑替换为下位机推理调用,来实现模型量化部署的端到端评估。
系统组件图
时序图
下述示例展示yolov5s和yolov8s通过netrans量化后的性能评估:
在 yolo 的代码框架内实现批量推理和评估性能
通过 client 接口与板卡建立通信,将yolo源码中的模型推理替换为板卡的推理
快速测试量化后的精度损失,确保结果可重复性
评估指标
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()
作者 @ogl ougaoliang@hngwg.com