共计 11130 个字符,预计需要花费 28 分钟才能阅读完成。
作者:忻怡、周楼、谦言、临在
导言
指标检测(object detection)旨在定位并辨认出图像中的指标物体,始终以来都是计算机视觉畛域钻研的热点问题,也是主动驾驶、指标追踪等工作的根底。近年来,优良的指标检测算法不断涌现,其中单阶段的 YOLO 系列以其高效、简洁的劣势,始终是指标检测算法畛域的一个重要分支。2021 年,旷视提出 YOLOX[1]算法,在速度和精度上构建了新的基线,组件灵便可部署,深受工业界的青睐。本文基于阿里云 PAI-EasyCV 框架复现 YOLOX 算法,探索用以理论晋升 YOLOX 精度的实用技巧,并进一步联合阿里巴巴计算平台 PAI 自研的 PAI-Blade 推理减速框架优化模型性能。通过咱们对社区诸多 YOLOX 改良技巧的复现和摸索,进一步晋升了 YOLOX 的性能,在速度和精度上都比现阶段的 40~50mAP 的 SOTA 的 YOLOv6 更胜一筹。同时,PAI-EasyCV 提供高效简洁的模型部署和端到端推理接口,供社区疾速体验应用 YOLOX-PAI 的性能。
总结一下咱们的工作奉献:
- 咱们提供了一套 Apache License 训练 / 优化 / 推理的代码库以及镜像,能够实现以后社区 40+MAP 量级最快(相比 YOLOV6 +0.4mAP/ 减速 13~20%)的指标检测模型。
- 咱们调研了 YOLOX 相干的改良技术和融化试验,筛选了其中一些绝对有帮忙的改良,补齐了 40/0.7ms(YOLOXS)~47.6/1.5ms(YOLOXM) 之间的模型,并以配置的形式提供进去。
- 咱们对指标检测的端到端推理进行灵便封装及速度优化,在 V100 上的端到端推理为 3.9ms,绝对原版 YOLOX 的 9.8ms,减速靠近 250%,供用户疾速实现指标检测推理工作。
本文,咱们将逐个介绍所摸索的相干改良与融化试验后果,如何基于 PAI-EasyCV 应用 PAI-Blade 优化模型推理过程,及如何应用 PAI-EasyCV 进行模型训练、验证、部署和端到端推理。欢送大家关注和应用 PAI-EasyCV 和 PAI-Blade,进行简略高效的视觉算法开发及部署工作。
PAI-EasyCV 我的项目地址:https://github.com/alibaba/Ea…
PAI-BladeDISC 我的项目地址:https://github.com/alibaba/Bl…
YOLOX-PAI- 算法改良
YOLOX-PAI 是咱们在阿里云机器学习平台 PAI 的开源计算机视觉代码库 EasyCV(https://github.com/alibaba/Ea…)中集成的 YOLOX 算法。若读者不理解 YOLOX 算法,能够自行学习(可参考:链接),本节次要介绍咱们基于 YOLOX 算法的改良。
通过对 YOLOX 算法的剖析,联合检测技术的调研,咱们从以下 4 个方向对原版的 YOLOX 进行优化,
- Backbone : repvgg backbone
- Neck : gsconv / asff
- Head : toods / rtoods
- Loss : siou / giou
在算法改良的根底上,利用 PAI-Blade 对优化后的模型进行推理优化,开发了如下的 PAI-YOLOX 模型。筛选无效改良与现有支流算法的比照后果如下:
(-ASFF 代表应用了 NeckASFF,-TOODN 代表应用 N 个中间层的 TOODHead 取代原有的 YOLOXHead)
Model | Params (M) | Flops (G) | mAPval 0.5:0.95(672) | mAPval 0.5:0.95(640) | SpeedV100 fp16 b32(ms) | Download |
---|---|---|---|---|---|---|
YOLOXs | 9.0 | 26.8 | 40.2 | 40.1 | 0.68 | model – log |
Meituan-YOLOv6-tiny | 15.0 | 36.7 | 41.3 | – | 0.9 | – |
PAI-YOLOXs | 15.9 | 36.8 | 41.5 | 41.4 | 0.7(+23%) | model – log |
Meituan-YOLOv6-s | 17.2 | 44.2 | 43.1 | 42.4 | 1.0 | – |
PAI-YOLOXs-ASFF | 21.3 | 41.0 | 43.3 | 42.8 | 0.87(+13%) | model – log |
PAI-YOLOXs-ASSF-TOOD3 | 23.7 | 49.9 | 44.0 | 43.9(+1.5) | 1.15 | model – log |
YOLOXm | 25.3 | 73.8 | 46.3 | 46.3 | 1.50 | model – log |
从后果中能够看到,相比目前同程度(1ms 以内)SOTA 的 YOLO6 模型,交融上述改良的 YOLOX-PAI 在等同精度 / 速度的条件下有肯定的速度 / 精度劣势。
无关测评须要留神以下几点:
- YOLOV6 release 测试速度不蕴含 decode 和 nms,所以咱们为了偏心比照,也进行了相干测速设置的敞开。(上表所示后果计算了 Blade 优化后的对应模型在 bs32 下均匀一张图像模型前向推理所用工夫,对于端到端推理的工夫(蕴含图像前、后处理的总用时)见 PAI-EasyCV Export 一节)
- YOLOV6 release 的精度是在训练过程中测试的,会呈现局部 shape=672 的状况,然而测速是在导出到 image_size=(640, 640) 的实现,实际上社区也有相干同学补充了 YOLOV6 在 640 下的测试精度,所以上表放了两个测试精度。
- 应用 EasyCV 的 Predictor 接口加载相干模型预测进行从图片输出到后果的预测,因为蕴含了预处理和 NMS 后处理,绝对应的工夫会变慢一些,具体参考端到端优化后果。
上面咱们将具体介绍每一个模块的改良和融化试验。
Backbone
RepConv
近期 YOLO6 [2],PP-YOLOE [3]等算法都改良了 CSPNet[4]的骨干网络,基于 RepVGG[5]的思维设计了可重参数化的骨干网络,让模型在推理上具备更高效的性能。咱们沿用了这一思维,利用 YOLO6 的 EfficientRep 代替 YOLOX 原来的 CSPDarkNet-53 骨干网络。失去的试验后果与 YOLO6 相干模型比照如下(YOLOX-Rep 示意应用了 EfficientRep 作为骨干网络的 YOLOX 模型):
Model | Params (M) | Flops (G) | mAP val 0.5:0.95(672) | mAP val 0.5:0.95(640 | Speed V100 fp16 b32 (ms) |
---|---|---|---|---|---|
YOLOXs | 9.0 | 26.8 | 40.2 | 40.1 | 0.68 |
YOLOv6-tiny | 15.0 | 36.7 | 41.3 | – | 0.9 |
PAI-YOLOXs | 15.9 | 36.8 | 41.5 | 41.4 | 0.7 |
RepVGG 构造的网络设计的确会增大参数量和计算量,但理论推理速度都更有劣势,所以咱们抉择 YOLO6 EfficientRep 作为能够配置的 Backbone。
Neck
在更换了骨干网络的根底上,咱们对 Neck 局部别离进行了两方面的探索。
- ASSF[6]:基于对 PAN 输入特色维度变换后基于 SE-Attention 特色交融的特色加强,大幅晋升参数量和精度,局部升高推理速度。
<!—->
-
- ASSF-Sim:咱们选取了参数量更低的特色交融实现,用较少的参数量(ASFF:5M -> ASFF-Sim:380K)来保留了 84% 的精度精度晋升(+0.98map->+0.85map)。然而,这一改良会让推理速度变慢,将来咱们会针对这个 OP 实现对应的 Plugin 实现推理减速。
<!—->
- GSNeck[7]:基于 DW Conv 对 Neck 信息交融,升高 Neck 参数量,轻微晋升精度,也会会升高推理速度。
ASFF 信息交融
ASFF,通过进行不同 PAN 不同特色图之间的信息交互,利用 attention 机制实现 Neck 局部的信息交融和加强,具体思维如下图。
ASFF-SIM 轻量版
参考 YOLO5[8]中的 Fcous 层的设计,PAI-EasyCV 利用切片操作进行特色通道的减少和特色图的放大。同时,利用求均匀操作进行通道的压缩,基于这种实现的 ASFF,咱们简略辨别为 ASFF-Sim。咱们进行特色图对立的外围操作(通道扩大和通道压缩)如下:
def expand_channel(self, x):
# [b,c,h,w]->[b,c*4,h/2,w/2]
patch_top_left = x[..., ::2, ::2]
patch_top_right = x[..., ::2, 1::2]
patch_bot_left = x[..., 1::2, ::2]
patch_bot_right = x[..., 1::2, 1::2]
x = torch.cat(
(
patch_top_left,
patch_bot_left,
patch_top_right,
patch_bot_right,
),
dim=1,
)
return x
def mean_channel(self, x):
# [b,c,h,w]->[b,c/2,h,w]
x1 = x[:, ::2, :, :]
x2 = x[:, 1::2, :, :]
return (x1 + x2) / 2
针对不同的特色图,其交融机制如下:
Model | Params (M) | Flops (G) | mAPval0.5:0.95 | Speed V100 fp16 b32(ms) |
---|---|---|---|---|
PAI-YOLOXs | 15.9 | 36.8 | 41.4 | 0.70 |
YOLOX-s-ASFF | 21.3 | 41.0 | 42.8 | 0.87 |
YOLOX-s-ASFFSim | 16.3 | 37.1 | 42.6 | 1.13 (need speed up) |
GSConvNeck
采纳 DWConv 升高参数量是一种罕用技巧,在 YOLOX 中,GSconv 设计了一种新型的轻量级的卷积用来缩小模型的参数和计算量。为了解决 Depth-wise Separable Convolution (DSC)在计算时通道信息拆散的弊病,GSConv(如下图所示)采纳 shuffle 的形式将规范卷积(SC)和 DSC 失去的特色图进行交融,使得 SC 的输入齐全交融到 DSC 中。
此外,GSConv 原文指出,如果在整个网络都应用 GSconv,则会大大加深网络的深度,升高模型的推理速度,而仅在通道信息维度最大,空间信息维度最小的 Neck 处应用 GSConv 是一种更优的抉择。咱们在 YOLOX 中利用 GSConv 优化模型,特地的咱们采纳了两种计划别离进行试验(a: 仅将 Neck 的局部用 GSConv,b: Neck 的所有模块均应用 GSConv):
<p align=center><img src=”https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4a88fa8edb0340b9809984c9c4e734ff~tplv-k3u1fbpfcp-watermark.image?” alt=”(a)gsconv_part” /></p>
<p align=center><img src=”https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2fe36ae518b341788bf8b1d0df598ef6~tplv-k3u1fbpfcp-watermark.image?” alt=”image.png” /></p>
所失去的试验后果如下(仅统计 Neck 局部的 Params, Flops)。能够看到 GSConv 对参数量进行了优化,且晋升了模型的性能,升高 3% 的推理速度能够换来 0.3mAP 的晋升。
Model | Params (M) | Flops (G) | mAP val 0.5:0.95 | Speed V100 fp16 b32 (ms) |
---|---|---|---|---|
Yolox-original | 2.83 | 2.67 | 41.35 | 0.70 |
gsconv | 1.22 | 1.33 | 41.58 | 0.78 |
gsconv_part | 2.39 | 2.39 | 41.68 | 0.72 |
Head
TOOD
参考 PPYOLOE,咱们同样思考利用 TOOD[9]算法中的 Task-aligned predictor 中的注意力机制(T-Head)别离对分类和回归特色进行加强。如下图所示,特色先通过解耦头的 stem 层 (1×1) 进行通道压缩,接着由通过重叠卷积层失去两头的特色层,再别离对分类和回归分支利用注意力机制进行特色的加强,来解耦两个工作。
咱们对重叠的中间层个数进行融化试验,每重叠能够进一步晋升肯定的精度,并带来速度上的一些损失。(下表的 Params 和 Flops 只统计了检测头局部。测速及精度基于的基线办法为以 EfficientRep 为 backbone + ASFF 进行特色加强。)
Model | Params (M) | Flops (G) | mAPval0.5:0.95 | Speed V100 fp16 b32 (ms) |
---|---|---|---|---|
stack = 6 | 2.83M | 12.66G | 44.66 | 1.40 |
stack = 5 | 2.68M | 11.42G | 44.41 | 1.32 |
stack = 4 | 2.53M | 10.18G | 44.12 | 1.24 |
stack = 3 | 2.37M | 8.94G | 43.85 | 1.15 |
stack = 2 | 2.22M | 7.71G | 43.45 | 1.09 |
YOLOX Head | 1.92M | 5.23G | 42.78 | 0.87 |
此外,咱们利用 RepVGGBlock 别离优化 inter_conv,cls_conv/reg_conv 层。试验结果表明用 RepVGGBlock 实现 inter_conv 层会带来性能上的降落,而 RepVGGBlock 实现的 cls_conv/reg_conv 层与原始卷积层在 stack 较大时成果相当, 在 stack 比拟小时,RepVGGBlock 能起到优化作用。
Loss function
S/G/D/E/CIou
PAI-EasyCV 实现了社区罕用的集中 IOU 损失函数,用户能够通过 config 自行抉择,特地的,对于最新提出的 SIoU[10],在试验过程中发现原公式中的反三角函数会使得模型训练不稳固,且计算开销绝对较高,咱们对原公式利用三角函数公式化简可得(符号与论文原文统一,详见原论文):
试验结果显示,在 YOLOX 上引入 SIoU 训练模型确实能放慢模型的收敛速度,但在最终精度上应用 GIoU[11]性能达到最优。
综合上述 Backbone/Neck/Head/Loss 方向的改良,咱们能够取得如上的 YOLOX-PAI 模型。进一步,咱们采纳 PAI-Blade 对曾经训练好的模型进行推理优化,实现高性能的端到端推理。
YOLOX-PAI- 推理优化
PAI-EasyCV Predictor
针对应用 PAI-EasyCV 训练的 YoloX-PAI 模型,用户能够应用 EasyCV 自带的导出 (export) 性能失去优化后的模型,并应用 EasyCV Predictor 进行端到端的推理。该导出性能对检测模型进行了如下优化:
- 应用 PAI-Blade 优化模型推理速度,简化对模型的推理减速(TensorRT/ 编译优化)开发流程。
- 反对 EasyCV 配置 TorchScript/PAI-Blade 对 图像前解决、模型推理、图像后处理别离优化,供用户灵便应用
- 反对 Predictor 构造端到端的模型推理优化,简化图片预测过程。
也能够参考[[EasyCV detector.py]](https://github.com/alibaba/Ea…) 自行组织相应的图像前解决 / 后处理过程,或间接应用咱们导出好的模型和接口):咱们这里提供一个曾经导出好的检测模型,用户下载三个模型文件到本地 [preprocess, model, meta]
export_blade/
├── epoch_300_pre_notrt.pt.blade
├── epoch_300_pre_notrt.pt.blade.config.json
└── epoch_300_pre_notrt.pt.preprocess
用户能够间接应用 PAI-EasyCV 提供的 Predictor 接口,通过如下简略的 API 调用,高效的进行图像的检测工作:
from easycv.predictors import TorchYoloXPredictor
from PIL import Image
img = Image.open(img_path = 'demo.jpg')
pred = TorchYoloXPredictor(export_model_name='epoch_300_pre_notrt.pt.blade',
use_trt_efficientnms=False)
res = pred.predict([img])
PAI-EasyCV Export
上面咱们简略介绍如何通过 PAI-EasyCV 的配置文件,导出不同的模型(具体的模型部署流程即相应的配置文件阐明介绍见链接),并展现导出的不同模型进行端到端图像推理的性能。
为导出不同的模型,用户须要对配置文件进行批改,配置文件的阐明如下:
export = dict(export_type='ori', # 导出的模型类型['ori','jit','blade']
preprocess_jit=False, # 是否用 jit 对前解决进行减速
static_opt=True, # 是否应用 static shape 优化,默认 True
batch_size=1, # 动态图的输出 batch_size
blade_config=dict(
enable_fp16=True,
fp16_fallback_op_ratio=0.05 # 所有的 layer 都会针对转 fp16 前后的输入
# 的偏移进行排序,会对数值变动最大的层回退到 fp32,该参数用于管制回退的比例,# 如果呈现模型输入漂移太大,影响相干测试后果,能够手动调整该参数。),
use_trt_efficientnms=False) # 是否应用 trt 优化的 efficientnms
依据不同的模型配置,咱们在单卡 V100 上测试 YOLOX- s 所有配置下模型的端到端推理性能(1000 次推理的平均值):
export_type | preprocess_jit | use_trt_efficientnms | Infer time (end2end) /ms |
---|---|---|---|
raw | – | – | 24.58 |
jit | False | False | 18.30 |
jit | False | True | 18.38 |
jit | True | False | 13.44 |
jit | True | True | 13.04 |
blade | False | False | 8.72 |
blade | False | True | 9.39 |
blade | True | False | 3.93 |
blade | True | True | 4.53 |
下图,咱们展现了由 PAI-EasyCV 中集成的应用 PAI-Blade/JIT 优化的模型端到端推理速度与 YOLOX 官网原版的 不同模型 (s/m/l/x) 的推理速度比照:
能够看到 PAI-EasyCV 导出的模型,极大水平的优化了原模型的端到端推理速度,将来咱们将进一步优化 blade 接入 trt_efficientnms 的速度,晋升端到端性能。
PAI-Blade 推理优化
PAI-Blade 是由阿里云机器学习平台 PAI 开发的模型优化工具,能够针对不同的设施不同模型进行推理减速优化。PAI-Blade 遵循易用性,鲁棒性和高性能为准则,将模型的部署优化进行高度封装,设计了对立简略的 API,在实现 Blade 环境装置后,用户能够在不理解 ONNX、TensorRT、编译优化等技术细节的条件下,通过简略的代码调用不便的实现对模型的高性能部署。更多 PAI-Blade 相干技术介绍能够参考 [[PAI-Blade 介绍]](https://zhuanlan.zhihu.com/p/…)。
PAI-EasyCV 中对 Blade 进行了反对,用户能够通过 PAI-EasyCV 的训练 config 中配置相干 export 参数,从而对训练失去的模型进行导出。
这里咱们提供一个 PAI-Blade + PAI-EasyCV 社区版 V100 对应的镜像(cuda11.1/TensorRT8/cudnn8):用户也能够基于 Blade 每日公布的镜像自行搭建推理环境 [[PAI-Blade 社区镜像公布]](https://github.com/alibaba/Bl…)
registry.cn-shanghai.aliyuncs.com/pai-ai-test/eas-service:blade_cu111_easycv
用户执行如下导出命令即可
cd ${EASYCV_ROOT}
export LD_LIBRARY_PATH=/usr/loca/cuda/lib64/:${LD_LIBRARY_PATH}
export CUDA_VISIBLE_DEVICES=0
export PYTHONPATH='./'
python tools/export.py yolox_pai_trainconfig.py input.pth export.pth
值得注意的是上文所有的模型的推理速度都限定在 V100 BatchSize=32 动态 Shape (end2end=False)的 PAI-Blade 优化设置后果。Blade 中曾经集成了常见 OP 的优化,针对用户自定义的 op 能够参考 PAI-EasyCV 中的 easycv/toolkit/blade/trt_plugin_utils.py 自行实现。
YOLOX-PAI- 训练与复现
咱们在 PAI-EasyCV 框架中复现了原版的 YOLOX,及改良的 YOLOX-PAI,并利用 PAI-Blade 对模型进行推理减速。为了更好的不便用户疾速体验基于 PAI-EasyCV 和 PAI-Blade 的 YOLOX,接下来,咱们提供利用镜像对 YOLOX-PAI 进行模型的训练、测试、及部署工作。更多的对于如何在本地开发环境运行,能够参考该链接装置环境。若应用 PAI-DSW 进行试验则无需装置相干依赖,在 PAI-DSW docker 中已内置相干环境。
拉取镜像
sudo docker pull registry.cn-shanghai.aliyuncs.com/pai-ai-test/eas-service:blade_cu111_easycv
启动容器
sudo nvidia-docker run -it -v path:path --name easycv_yolox_pai --shm-size=10g --network=host registry.cn-shanghai.aliyuncs.com/pai-ai-test/eas-service:blade_cu111_easycv
数据代码筹备
# 数据筹备参考 https://github.com/alibaba/EasyCV/blob/master/docs/source/prepare_data.md
git clone https://github.com/alibaba/EasyCV.git
cd EasyCV
模型训练
export PYTHONPATH=./ && python -m torch.distributed.launch --nproc_per_node=8 --master_port=29500 tools/train.py config.py --work_dir workdir --launcher pytorch
模型测试
python tools/eval.py config.py pretrain_model.pth --eval
模型导出
python tools/export.py config.py pretrain_model.pth export.pth
写在最初
YOLOX-PAI 是 PAI-EasyCV 团队基于旷视 YOLOX 复现并优化的在 V100BS32 的 1000fps 量级下的 SOTA 检测模型。整体工作上集成和比照了很多社区已有的工作:通过对 YOLOX 的替换基于 RepVGG 的高性能 Backbone,在 Neck 中增加基于特色图交融的 ASFF/GSConv 加强,在检测头中退出了工作相干的注意力机制 TOOD 构造。联合 PAI-Blade 编译优化技术,在 V100Batchsize32 1000FPS 的速度下达到了 SOTA 的精度 mAP=43.9,等同精度下比美团 YOLOV6 减速 13%,并提供了配套一系列算法 / 训练 / 推理优化代码和环境。
PAI-EasyCV(https://github.com/alibaba/Ea…)是阿里云机器学习平台深耕一年多的计算机视觉算法框架,已在团体内外多个业务场景获得相干业务落地成绩,次要聚焦在自监督学习 /VisionTransformer 等前沿视觉畛域,并联合 PAI-Blade 等自研技术一直优化。欢送大家参加进来一起提高。
YOLOX-PAI 将来布局:
- 基于 CustomOP(ASFFSim, EfficientNMS (fp16))实现的减速推理
[1] Ge Z, Liu S, Wang F, et al. Yolox: Exceeding yolo series in 2021[J]. arXiv preprint arXiv:2107.08430, 2021.
[2] YOLOv6, https://github.com/meituan/YO….
[3] Xu S, Wang X, Lv W, et al. PP-YOLOE: An evolved version of YOLO[J]. arXiv preprint arXiv:2203.16250, 2022.
[4] Wang C Y, Liao H Y M, Wu Y H, et al. CSPNet: A new backbone that can enhance learning capability of CNN[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition workshops. 2020: 390-391.
[5] Ding X, Zhang X, Ma N, et al. Repvgg: Making vgg-style convnets great again[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2021: 13733-13742.
[6] Liu S, Huang D, Wang Y. Learning spatial fusion for single-shot object detection[J]. arXiv preprint arXiv:1911.09516, 2019.
[7] Li H, Li J, Wei H, et al. Slim-neck by GSConv: A better design paradigm of detector architectures for autonomous vehicles[J]. arXiv preprint arXiv:2206.02424, 2022.
[8] YOLOv5, https://github.com/ultralytic….
[9] Feng C, Zhong Y, Gao Y, et al. Tood: Task-aligned one-stage object detection[C]//2021 IEEE/CVF International Conference on Computer Vision (ICCV). IEEE Computer Society, 2021: 3490-3499.
[10] Gevorgyan Z. SIoU Loss: More Powerful Learning for Bounding Box Regression[J]. arXiv preprint arXiv:2205.12740, 2022.
[11] Rezatofighi H, Tsoi N, Gwak J Y, et al. Generalized intersection over union: A metric and a loss for bounding box regression[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2019: 658-666.