1 介绍
论文链接:YOLOX: Exceeding YOLO Series in 2021
2 译读笔记
摘要
在这篇报告中,作者将会展示关于提升YOLO系列模型精度的一些经验,从而构成一个高性能检测器——YOLOX。作者将YOLO检测器转换为anchor-free的形式,并采用了其他的检测技术,例如:解耦head和标签分配策略SimOTA,在一系列模型上实现了SOTA结果:对于YOLONano,参数量仅为0.91M,FLOPs=1.08G,此模型在COCO上获得了25.3%-mAP,超过NanoDet模型1.8%+AP;对于YOLOv3模型,产业界使用最为广泛的模型之一,我们将其在COCO数据集上提升至47.3%-mAP,超过了当前最好实现3.0%AP+;对于YOLOX-L,此模型与YOLOv4-CSP和YOLOv5-L参数量相当,我们在COCO上实现了50.0%mAP,其速度为68.9FPS,显卡为Tesla-V100,超过YOLOv5-L模型1.8%+AP。不仅如此,我们在 Streaming Perception Challenge(Workshop on Autonomous Driving at CVPR 2021)比赛上使用YOLOX-L模型(单模)获得了第一名。我们希望此次报告可以为开发者和研究者在实际场景的应用中提供有益的经验,我们也提供了此模型的部署版本,支持ONNX、TensorRT、NCNN和Openvino平台。源代码位于https://github.com/Megvii-BaseDetection/YOLOX。
2.1 引言
随着目标检测的发展,YOLO系列【23_YOLOv1, 24_YOLO9000, 25_YOLOv3, 1_YOLOv4, 7_YOLOv5】一直在追求实时应用中最佳的速度与精度的均衡。他们提取当前最先进的检测技术(例如:YOLOv2【24_YOLO9000】中的锚点【26_Faster_RCNN】和YOLOv3【25_YOLOv3】中的残差网络【9_ResNet】),并对实现进行优化从而获得最佳的实践效果。当前,YOLOV5【7_YOLOv5】以48.2%的mAP在COCO上保持了最佳的均衡性能,推理时间为13.7ms(FPS=73)。
3 模型设计
3.0 超参数选择
激活函数:SiLU (yolox/exp/yolox_base.py#L23)
3.2 Loss函数
损失函数 = 分类 + IoU-Loss
分类损失:BCE Loss (nn.BCEWithLogitsLoss
,
请参考YOLOX/yolox/models/yolo_head.py—self.bcewithlog_loss)
3 实现
3.1 Good Techniques
AMP训练——加快训练速度
if self.amp_training:
with amp.scale_loss(loss, self.optimizer) as scaled_loss:
scaled_loss.backward()
3.2 模型配置——YOLOX/yolox/exp/yolox_base.py
源代码请参考YOLOX/yolox/exp/yolox_base.py
模型配置在Exp
类中声明,请参考Exp
类说明;
3.3 项目安装
此repo安装方法请参考《YOLOX – Quick Start》
Step1. 安装YOLOX.
# 新建conda环境
conda create --name conda-yolox python=3.8
# 在PyCharm中配置conda环境
# 配置完成后,继续安装
# 安装项目的python包
pip3 install -U pip && pip3 install -r requirements.txt
3.3 代码说明
Exp
: experiment, 实验类
def __init__(self)
: 初始化函数;定义了模型的基本配置
def __init__(self):
super().__init__()
# ---------------- model config ---------------- #
self.num_classes = 80
self.depth = 1.00
self.width = 1.00
# ---------------- dataloader config ---------------- #
# set worker to 4 for shorter dataloader init time
self.data_num_workers = 4
self.input_size = (640, 640)
self.random_size = (14, 26)
self.train_ann = "instances_train2017.json"
self.val_ann = "instances_val2017.json"
# --------------- transform config ----------------- #
self.degrees = 10.0
self.translate = 0.1
self.scale = (0.1, 2)
self.mscale = (0.8, 1.6)
self.shear = 2.0
self.perspective = 0.0
self.enable_mixup = True
# -------------- training config --------------------- #
# 预热epochs
self.warmup_epochs = 5
self.max_epoch = 300
self.warmup_lr = 0
self.basic_lr_per_img = 0.01 / 64.0
# 学习率调度器
self.scheduler = "yoloxwarmcos"
self.no_aug_epochs = 15
self.min_lr_ratio = 0.05
self.ema = True
self.weight_decay = 5e-4
self.momentum = 0.9
self.print_interval = 10
self.eval_interval = 10
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
# ----------------- testing config ------------------ #
self.test_size = (640, 640)
self.test_conf = 0.01
self.nmsthre = 0.65