YOLOV3模型-推理指导
概述
YOLOv3是一种端到端的one-stage目标检测模型。相比与YOLOv2,YOLOv3采用了一个新的backbnone——Darknet-53来进行特征提取工作,这个新网络比Darknet-19更加强大也比ResNet-101或者ResNet-152更加高效。同时,对于一张输入图片,YOLOv3可以在3个不同的尺度上预测物体框,每个尺度预测三种大小的边界框。通过这种多尺度联合预测的方式有效提升了小目标的检测精度。
参考论文:Redmon, Joseph, and Ali Farhadi. "Yolov3: An incremental improvement. arXiv 2018." arXiv preprint arXiv:1804.02767 (2018): 1-6.
- 参考实现:
url=https://github.com/ultralytics/yolov3.git
branch=master
commit_id=166a4d590f08b55cadfebc57a11a52ff2fc2b7d3
model_name=yolov3
通过Git获取对应commit_id的代码方法如下:
git clone {repository_url} # 克隆仓库的代码
cd {repository_name} # 切换到模型的代码仓目录
git checkout {branch/tag} # 切换到对应分支
git reset --hard {commit_id} # 代码设置到对应的commit_id(可选)
cd {code_path} # 切换到模型代码所在路径,若仓库下只有该模型,则无需切换
输入输出数据
-
输入数据
输入数据 数据类型 大小 数据排布格式 images RGB_FP32 batchsize x 3 x 416 x 416 NCHW -
输出数据
输出数据 大小 数据类型 数据排布格式 Reshape_216 3x85x13x13 FLOAT32 NCHW Reshape_203 3x85x26x26 FLOAT32 NCHW Reshape_187 3x85x52x52 FLOAT32 NCHW
推理环境准备[所有版本]
-
该模型需要以下插件与驱动
表 1 版本配套表
| 配套 | 版本 | 环境准备指导 |
|---|---|---|
| 固件与驱动 | 1.0.15 | Pytorch框架推理环境准备 |
| CANN | 5.1.RC2 | - |
| Python | 3.7.5 | - |
| PyTorch | 1.6.0 | - |
| 说明:Atlas 300I Duo 推理卡请以CANN版本选择实际固件与驱动版本。 | \ | \ |
快速上手
获取源码
-
获取源码。
git clone https://github.com/ultralytics/yolov3.git cd yolov3 git reset --hard 166a4d590f08b55cadfebc57a11a52ff2fc2b7d3 -
安装依赖。
pip3 install -r requirements.txt
准备数据集
-
获取原始数据集。 本模型支持coco2014验证集。 用户需自行获取数据集,将instances_val2014.json文件和val2014文件夹解压并上传数据集到源码包路径下。 coco2014验证集所需文件目录参考(只列出该模型需要的目录)。数据集下载链接(http://images.cocodataset.org/zips/val2014.zip)
数据集目录结构如下:
|-- coco2014 // 验证数据集 |-- instances_val2014.json //验证集标注信息 |-- val2014 // 验证集文件夹 -
数据预处理。
a.生成coco_2014.info数据集信息文件,使用parse_json.py脚本解析coco数据集中的json文件。 创建ground-truth-split目录并执行parse_json.py脚本。
mkdir ground-truth-split python3.7 parse_json.py执行成功后,在当前目录下生成coco2014.names和coco_2014.info文件以及标签文件夹ground-truth-split。
说明:需要用户创建ground-truth-split文件夹。
b.数据预处理将原始数据(.jpg)转化为模型输入的二进制文件(.bin)。 执行preprocess_yolov3_pytorch.py脚本。
python3.7 preprocess_yolov3_pytorch.py coco_2014.info yolov3_bin参数说明:
coco_2014.info:数据集信息。
yolov3_bin:生成的二进制文件路径。 -
生成数据集info文件。
二进制输入info文件生成。 使用get_coco_info.py脚本,输入已经得到的二进制文件,输出生成二进制数据集的info文件。
运行get_coco_info.py脚本。
python3.7 get_coco_info.py yolov3_bin ./coco_2014.info ./yolov3.infoyolov3_bin:生成的数据集bin文件夹路径。
coco_2014.info:数据集图片info文件。
yolov3.info:生成的数据集二进制info文件。
模型推理
-
模型转换
使用PyTorch将模型权重文件.pth转换为.onnx文件,再使用ATC工具将.onnx文件转为离线推理模型文件.om文件。
a. 获取权重文件。
从源码包中获取训练后的权重文件yolov3.pt。
源码包下载链接()
b. 导出onnx文件。
将模型权重文件.pt转换为.onnx文件。
1). 将代码仓上传至服务器任意路径下如(如:/home/HwHiAiUser)。
2). 进入代码仓目录并将yolov3.pt移到当前目录下。
3). 修改models/export.py脚本,将转化的onnx算子版本设置为11。
torch.onnx.export(model, img, f, verbose=True,
opset_version=11,
input_names=['images'],
do_constant_folding=True,
output_names=['classes', 'boxes'] if y is None else ['output'])
##原代码verbose=False修改为True,
opset_version=12修改为11,
添加参数do_constant_folding=True。
4). 运行脚本:
cd yolov3/
python3.7 models/export.py --weights ./yolov3.pt --img 416 --batch n
mv yolov3.onnx yolov3_bsn.onnx
参数介绍:
--weights:权重模型文件。
--img:图片大小。
--batch:batchsize大小。
--n:batchsize取值(1,4,8,16,32,64)
运行成功后,在当前目录生成yolov3_bsn.onnx模型文件。
说明:models/export.py为yolov3官方github代码仓提供。
c.使用ATC工具将ONNX模型转OM模型。
1). 配置环境变量。
source /usr/local/Ascend/ascend-toolkit/set_env.sh
说明:该脚本中环境变量仅供参考,请以实际安装环境配置环境变量。
详细介绍请参见《[CANN 开发辅助工具指南 \(推理\)](https://support.huawei.com/enterprise/zh/ascend-computing/cann-pid-251168373?category=developer-documents&subcategory=auxiliary-development-tools)》。
2). 执行命令查看芯片名称型号($\{chip\_name\})。
npu-smi info
#该设备芯片名(${chip_name}=Ascend310P3)
回显如下:
+--------------------------------------------------------------------------------------------+
| npu-smi 22.0.0 Version: 22.0.2 |
+-------------------+-----------------+------------------------------------------------------+
| NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page) |
| Chip Device | Bus-Id | AICore(%) Memory-Usage(MB) |
+===================+=================+======================================================+
| 0 310P3 | OK | 16.5 55 0 / 0 |
| 0 0 | 0000:5E:00.0 | 0 931 / 21534 |
+===================+=================+======================================================+
3). 执行ATC命令。
atc --model=yolov3_bsn.onnx
--framework=5
--output=yolov3_bsn
--input_format=NCHW
--log=info
--soc_version=${chip_name}
--input_shape="images:n,3,416,416"
--out_nodes="Reshape_219:0;Reshape_203:0;Reshape_187:0"
说明:out_nodes为onnx模型输出节点,可能会因为pytorch版本的不同和github源码的改动导致变化,需要使用者参考本模型压缩包中提供的onnx模型和上述atc命令做一定修改,保证输出节点的位置和顺序正确。
参数说明:
--model:为ONNX模型文件。
--framework:5代表ONNX模型。
--output:输出的OM模型。
--input_format:输入数据的格式。
--log:日志等级。
--soc_version:部署芯片类型。
--input_shape:输入数据的shape。
--out_nodes:输出节点名称。
运行成功后生成yolov3_bsn.om文件。
-
开始推理验证
a. 安装ais_bench推理工具。
请访问ais_bench推理工具代码仓,根据readme文档进行工具安装。
b. 执行推理。
mkdir ais_infer_result source /usr/local/Ascend/ascend-toolkit/set_env.sh python3 -m ais_bench --model yolov3_bsn.om --input yolov3_bin --batchsize=n --output ais_infer_result推理后的输出默认在当前目录result下。
c. 模型后处理。
解析输出特征图。 解析ais_infer输出文件,经过阈值过滤,nms,坐标转换等输出坐标信息和类别信息txt文件。
python3.7 bin_to_predict_yolo_pytorch.py --bin_data_path ais_infer_result/${ais_infer输出的结果}/ --det_results_path detection-results/ --origin_jpg_path val2014/ --coco_class_names coco2014.names --model_type yolov3 --net_input_size 416参数说明:
--bin_data_path:benchmark的输出路径。
--det_results_path:解析后的txt文件路径,若不存在则创建。
--origin_jpg_path:原始图片路径。
--coco_class_name:coco数据集类型信息。
--model_type:默认为yolov5,这里选择yolov3。
--net_input_size 416:网络输入大小,默认为640。d.精度验证。
YOLOv3指标采用mAP0.5值,执行命令获取精度。
python3 map_calculate.py --label_path ./ground-truth-split --npu_txt_path ./detection-results -na -np参数说明:
--label_path:coco数据集标签。
--npu_txt_path:上一步解析的txt文件路径。
模型推理性能&精度
调用ACL接口推理计算,性能参考下列数据。
精度:
| Precesion | mAP |
|---|---|
| 300I PRO精度 | 59.28% |
此处精度为bs1精度,bs1和最优bs精度无差别
性能:
| 300I PRO | T4 | 300I PRO/T4 | |
|---|---|---|---|
| bs1 | 500.315 | 201.344 | 2.484 |
| bs4 | 637.604 | 265.009 | 2.405 |
| bs8 | 614.271 | 275.387 | 2.230 |
| bs16 | 599.561 | 272.156 | 2.202 |
| bs32 | 613.160 | 278.352 | 2.202 |
| bs64 | 568.949 | 289.333 | 2.203 |
| 最优bs | 637.604 | 289.333 | 2.203 |
公网地址说明
代码涉及公网地址参考 public_address_statement.md