评估示例
概述
本项目展示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 张图片)
项目结构
├── src/ # 测试验证代码
│ ├── val_pnna.py # yolov5s相关板卡的推理代码
│ ├── validator.py # yolov8s相关板卡的推理代码
│ ├── client.py # jsonrpc_server相关代码
├── docs/
│ ├── yolov5s_evaluation.md # yolov5s性能批量评估示例
│ ├── yolov8s_evaluation.md # yolov8s性能批量评估示例
├── resource/ # 测试验证代码
│ ├── yolov5s # yolov5s权重文件和量化后文件
│ ├── yolov8s # yolov8s权重文件和量化后文件
├── README.md # 项目说明文档
环境要求及配置
硬件要求
NPU 板卡 :FT78E_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
评估结果如下
1 Class Images Instances P R mAP50 mAP50-95: 2 all 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 2 method_model = "detection" 3 pnna_device = Client("ws://192.168.23.100:8000/websocket") 4 5 # 添加新模型到板卡 6 ret_add = pnna_device.add_model('./evaluation/resource/yolov5s/wksp/dynamic_fixed_point-16/network_binary.nb', method_model) 7 8 # pnna 推理 9 yolov5s_image_rgb = im.numpy().transpose(0, 2, 3, 1).astype(np.uint8) 10 infer_data, infer_time = pnna_device.infer(method_model, yolov5s_image_rgb) 11 12 # 结果转化为tensor 13 preds = torch.frombuffer(infer_data[0], dtype=torch.float32).reshape(1, 25200, 85) 14 15 pnna_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"]) 4
源码替换为板卡推理的代码如下
1 # 初始化client 2 method_model = "yolov8s_detection" 3 pnna_device = Client("ws://192.168.23.100:8000/websocket") 4 5 # 添加新模型到板卡 6 ret_add = pnna_device.add_model('ultralytics/evaluation/yolov8s/wksp/dynamic_fixed_point-16/network_binary.nb', method_model) 7 8 # pnna 推理 9 yolov8s_image_rgb = batch["img"].numpy().transpose(0, 2, 3, 1).astype(np.uint8) 10 infer_data, infer_time = pnna_device.infer(method_model, yolov8s_image_rgb) 11 12 # 结果转化为tensor 13 preds = torch.frombuffer(infer_data[0], dtype=torch.float32).reshape(1, 84, 8400) 14 15 pnna_device.close()
作者 @ogl ougaoliang@hngwg.com