作者:忻怡、周楼、谦言、临在
导言
指标检测(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 xdef 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层(1x1)进行通道压缩,接着由通过重叠卷积层失去两头的特色层,再别离对分类和回归分支利用注意力机制进行特色的加强,来解耦两个工作。
咱们对重叠的中间层个数进行融化试验,每重叠能够进一步晋升肯定的精度,并带来速度上的一些损失。(下表的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 TorchYoloXPredictorfrom PIL import Imageimg = 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=0export 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.mdgit clone https://github.com/alibaba/EasyCV.gitcd 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.