Преглед на файлове

rename YOLOvx to RTMDet-v1

yjh0410 преди 2 години
родител
ревизия
92faf28ffd

+ 21 - 21
config/__init__.py

@@ -33,12 +33,12 @@ from .data_config.transform_config import (
     # SSD-Style
     ssd_trans_config,
     # YOLOvx-Style
-    yolovx_pico_trans_config,
-    yolovx_nano_trans_config,
-    yolovx_small_trans_config,
-    yolovx_medium_trans_config,
-    yolovx_large_trans_config,
-    yolovx_huge_trans_config,
+    rtmdet_v1_pico_trans_config,
+    rtmdet_v1_nano_trans_config,
+    rtmdet_v1_small_trans_config,
+    rtmdet_v1_medium_trans_config,
+    rtmdet_v1_large_trans_config,
+    rtmdet_v1_huge_trans_config,
 )
 
 def build_trans_config(trans_config='ssd'):
@@ -78,18 +78,18 @@ def build_trans_config(trans_config='ssd'):
         cfg = yolox_huge_trans_config
 
     # YOLOvx-style transform 
-    elif trans_config == 'yolovx_pico':
-        cfg = yolovx_pico_trans_config
-    elif trans_config == 'yolovx_nano':
-        cfg = yolovx_nano_trans_config
-    elif trans_config == 'yolovx_small':
-        cfg = yolovx_small_trans_config
-    elif trans_config == 'yolovx_medium':
-        cfg = yolovx_medium_trans_config
-    elif trans_config == 'yolovx_large':
-        cfg = yolovx_large_trans_config
-    elif trans_config == 'yolovx_huge':
-        cfg = yolovx_huge_trans_config
+    elif trans_config == 'rtmdet_v1_pico':
+        cfg = rtmdet_v1_pico_trans_config
+    elif trans_config == 'rtmdet_v1_nano':
+        cfg = rtmdet_v1_nano_trans_config
+    elif trans_config == 'rtmdet_v1_small':
+        cfg = rtmdet_v1_small_trans_config
+    elif trans_config == 'rtmdet_v1_medium':
+        cfg = rtmdet_v1_medium_trans_config
+    elif trans_config == 'rtmdet_v1_large':
+        cfg = rtmdet_v1_large_trans_config
+    elif trans_config == 'rtmdet_v1_huge':
+        cfg = rtmdet_v1_huge_trans_config
 
     print('Transform Config: {} \n'.format(cfg))
 
@@ -104,8 +104,8 @@ from .model_config.yolov3_config import yolov3_cfg
 from .model_config.yolov4_config import yolov4_cfg
 from .model_config.yolov5_config import yolov5_cfg
 from .model_config.yolov7_config import yolov7_cfg
-from .model_config.yolovx_config import yolovx_cfg
 from .model_config.yolox_config import yolox_cfg
+from .model_config.rtmdet_v1_config import rtmdet_v1_cfg
 
 
 def build_model_config(args):
@@ -133,8 +133,8 @@ def build_model_config(args):
     elif args.model in ['yolox_n', 'yolox_s', 'yolox_m', 'yolox_l', 'yolox_x']:
         cfg = yolox_cfg[args.model]
     # YOLOvx
-    elif args.model in ['yolovx_n', 'yolovx_t', 'yolovx_s', 'yolovx_m', 'yolovx_l', 'yolovx_x']:
-        cfg = yolovx_cfg[args.model]
+    elif args.model in ['rtmdet_v1_n', 'rtmdet_v1_t', 'rtmdet_v1_s', 'rtmdet_v1_m', 'rtmdet_v1_l', 'rtmdet_v1_x']:
+        cfg = rtmdet_v1_cfg[args.model]
 
     return cfg
 

+ 12 - 8
config/data_config/transform_config.py

@@ -1,4 +1,5 @@
-# transform config
+# Transform config
+
 
 # ----------------------- YOLOv5-Style Transform -----------------------
 yolov5_huge_trans_config = {
@@ -115,6 +116,7 @@ yolov5_pico_trans_config = {
     'mixup_scale': [0.5, 1.5]   # "mixup_scale" is not used for YOLOv5MixUp
 }
 
+
 # ----------------------- YOLOX-Style Transform -----------------------
 yolox_huge_trans_config = {
     'aug_type': 'yolov5',
@@ -230,6 +232,7 @@ yolox_pico_trans_config = {
     'mixup_scale': [0.5, 1.5]   # "mixup_scale" is not used for YOLOv5MixUp
 }
 
+
 # ----------------------- SSD-Style Transform -----------------------
 ssd_trans_config = {
     'aug_type': 'ssd',
@@ -241,8 +244,9 @@ ssd_trans_config = {
     'mixup_scale': [0.5, 1.5]
 }
 
-# ----------------------- YOLOX's Transform without Rotation -----------------------
-yolovx_huge_trans_config = {
+
+# ----------------------- RTMDet-v1's Transform -----------------------
+rtmdet_v1_huge_trans_config = {
     'aug_type': 'yolov5',
     # Basic Augment
     'degrees': 0.0,
@@ -261,7 +265,7 @@ yolovx_huge_trans_config = {
     'mixup_scale': [0.5, 1.5]   # "mixup_scale" is not used for YOLOv5MixUp
 }
 
-yolovx_large_trans_config = {
+rtmdet_v1_large_trans_config = {
     'aug_type': 'yolov5',
     # Basic Augment
     'degrees': 0.0,
@@ -280,7 +284,7 @@ yolovx_large_trans_config = {
     'mixup_scale': [0.5, 1.5]   # "mixup_scale" is not used for YOLOv5MixUp
 }
 
-yolovx_medium_trans_config = {
+rtmdet_v1_medium_trans_config = {
     'aug_type': 'yolov5',
     # Basic Augment
     'degrees': 0.0,
@@ -299,7 +303,7 @@ yolovx_medium_trans_config = {
     'mixup_scale': [0.5, 1.5]   # "mixup_scale" is not used for YOLOv5MixUp
 }
 
-yolovx_small_trans_config = {
+rtmdet_v1_small_trans_config = {
     'aug_type': 'yolov5',
     # Basic Augment
     'degrees': 0.0,
@@ -318,7 +322,7 @@ yolovx_small_trans_config = {
     'mixup_scale': [0.5, 1.5]   # "mixup_scale" is not used for YOLOv5MixUp
 }
 
-yolovx_nano_trans_config = {
+rtmdet_v1_nano_trans_config = {
     'aug_type': 'yolov5',
     # Basic Augment
     'degrees': 0.0,
@@ -337,7 +341,7 @@ yolovx_nano_trans_config = {
     'mixup_scale': [0.5, 1.5]   # "mixup_scale" is not used for YOLOv5MixUp
 }
 
-yolovx_pico_trans_config = {
+rtmdet_v1_pico_trans_config = {
     'aug_type': 'yolov5',
     # Basic Augment
     'degrees': 0.0,

+ 19 - 19
config/model_config/yolovx_config.py → config/model_config/rtmdet_v1_config.py

@@ -1,8 +1,8 @@
 # YOLOvx Config
 
 
-yolovx_cfg = {
-    'yolovx_n':{
+rtmdet_v1_cfg = {
+    'rtmdet_v1_n':{
         # ---------------- Model config ----------------
         ## Backbone
         'backbone': 'elannet',
@@ -22,7 +22,7 @@ yolovx_cfg = {
         'neck_norm': 'BN',
         'neck_depthwise': False,
         ## Neck: PaFPN
-        'fpn': 'yolovx_pafpn',
+        'fpn': 'rtmdet_pafpn',
         'fpn_reduce_layer': 'conv',
         'fpn_downsample_layer': 'conv',
         'fpn_core_block': 'elanblock',
@@ -41,7 +41,7 @@ yolovx_cfg = {
         # ---------------- Train config ----------------
         ## Input
         'multi_scale': [0.5, 1.5],   # 320 -> 960
-        'trans_type': 'yolovx_nano',
+        'trans_type': 'rtmdet_v1_nano',
         # ---------------- Assignment config ----------------
         ## Matcher
         'matcher': {'center_sampling_radius': 2.5,
@@ -56,7 +56,7 @@ yolovx_cfg = {
         'trainer_type': 'rtmdet',
     },
 
-    'yolovx_t':{
+    'rtmdet_v1_t':{
         # ---------------- Model config ----------------
         ## Backbone
         'backbone': 'elannet',
@@ -76,7 +76,7 @@ yolovx_cfg = {
         'neck_norm': 'BN',
         'neck_depthwise': False,
         ## Neck: PaFPN
-        'fpn': 'yolovx_pafpn',
+        'fpn': 'rtmdet_pafpn',
         'fpn_reduce_layer': 'conv',
         'fpn_downsample_layer': 'conv',
         'fpn_core_block': 'elanblock',
@@ -95,7 +95,7 @@ yolovx_cfg = {
         # ---------------- Train config ----------------
         ## Input
         'multi_scale': [0.5, 1.5],   # 320 -> 960
-        'trans_type': 'yolovx_nano',
+        'trans_type': 'rtmdet_v1_nano',
         # ---------------- Assignment config ----------------
         ## Matcher
         'matcher': {'center_sampling_radius': 2.5,
@@ -110,7 +110,7 @@ yolovx_cfg = {
         'trainer_type': 'rtmdet',
     },
 
-    'yolovx_s':{
+    'rtmdet_v1_s':{
         # ---------------- Model config ----------------
         ## Backbone
         'backbone': 'elannet',
@@ -130,7 +130,7 @@ yolovx_cfg = {
         'neck_norm': 'BN',
         'neck_depthwise': False,
         ## Neck: PaFPN
-        'fpn': 'yolovx_pafpn',
+        'fpn': 'rtmdet_pafpn',
         'fpn_reduce_layer': 'conv',
         'fpn_downsample_layer': 'conv',
         'fpn_core_block': 'elanblock',
@@ -149,7 +149,7 @@ yolovx_cfg = {
         # ---------------- Train config ----------------
         ## Input
         'multi_scale': [0.5, 1.5],   # 320 -> 960
-        'trans_type': 'yolovx_small',
+        'trans_type': 'rtmdet_v1_small',
         # ---------------- Assignment config ----------------
         ## Matcher
         'matcher': {'center_sampling_radius': 2.5,
@@ -164,7 +164,7 @@ yolovx_cfg = {
         'trainer_type': 'rtmdet',
     },
 
-    'yolovx_m':{
+    'rtmdet_v1_m':{
         # ---------------- Model config ----------------
         ## Backbone
         'backbone': 'elannet',
@@ -184,7 +184,7 @@ yolovx_cfg = {
         'neck_norm': 'BN',
         'neck_depthwise': False,
         ## Neck: PaFPN
-        'fpn': 'yolovx_pafpn',
+        'fpn': 'rtmdet_pafpn',
         'fpn_reduce_layer': 'conv',
         'fpn_downsample_layer': 'conv',
         'fpn_core_block': 'elanblock',
@@ -203,7 +203,7 @@ yolovx_cfg = {
         # ---------------- Train config ----------------
         ## Input
         'multi_scale': [0.5, 1.5],   # 320 -> 960
-        'trans_type': 'yolovx_medium',
+        'trans_type': 'rtmdet_v1_medium',
         # ---------------- Assignment config ----------------
         ## Matcher
         'matcher': {'center_sampling_radius': 2.5,
@@ -218,7 +218,7 @@ yolovx_cfg = {
         'trainer_type': 'rtmdet',
     },
 
-    'yolovx_l':{
+    'rtmdet_v1_l':{
         # ---------------- Model config ----------------
         ## Backbone
         'backbone': 'elannet',
@@ -238,7 +238,7 @@ yolovx_cfg = {
         'neck_norm': 'BN',
         'neck_depthwise': False,
         ## Neck: PaFPN
-        'fpn': 'yolovx_pafpn',
+        'fpn': 'rtmdet_pafpn',
         'fpn_reduce_layer': 'conv',
         'fpn_downsample_layer': 'conv',
         'fpn_core_block': 'elanblock',
@@ -257,7 +257,7 @@ yolovx_cfg = {
         # ---------------- Train config ----------------
         ## Input
         'multi_scale': [0.5, 1.25],   # 320 -> 800
-        'trans_type': 'yolovx_large',
+        'trans_type': 'rtmdet_v1_large',
         # ---------------- Assignment config ----------------
         ## Matcher
         'matcher': {'center_sampling_radius': 2.5,
@@ -272,7 +272,7 @@ yolovx_cfg = {
         'trainer_type': 'rtmdet',
     },
 
-    'yolovx_x':{
+    'rtmdet_v1_x':{
         # ---------------- Model config ----------------
         ## Backbone
         'backbone': 'elannet',
@@ -292,7 +292,7 @@ yolovx_cfg = {
         'neck_norm': 'BN',
         'neck_depthwise': False,
         ## Neck: PaFPN
-        'fpn': 'yolovx_pafpn',
+        'fpn': 'rtmdet_pafpn',
         'fpn_reduce_layer': 'conv',
         'fpn_downsample_layer': 'conv',
         'fpn_core_block': 'elanblock',
@@ -311,7 +311,7 @@ yolovx_cfg = {
         # ---------------- Train config ----------------
         ## Input
         'multi_scale': [0.5, 1.25],   # 320 -> 800
-        'trans_type': 'yolovx_huge',
+        'trans_type': 'rtmdet_v1_huge',
         # ---------------- Assignment config ----------------
         ## Matcher
         'matcher': {'center_sampling_radius': 2.5,

+ 5 - 6
models/detectors/__init__.py

@@ -9,7 +9,7 @@ from .yolov3.build import build_yolov3
 from .yolov4.build import build_yolov4
 from .yolov5.build import build_yolov5
 from .yolov7.build import build_yolov7
-from .yolovx.build import build_yolovx
+from .rtmdet_v1.build import build_rtmdet_v1
 # My custom YOLO
 from .yolox.build import build_yolox
 
@@ -45,15 +45,14 @@ def build_model(args,
     elif args.model in ['yolov7_tiny', 'yolov7', 'yolov7_x']:
         model, criterion = build_yolov7(
             args, model_cfg, device, num_classes, trainable, deploy)
-    # YOLOvx
-    elif args.model in ['yolovx_n', 'yolovx_t', 'yolovx_s', 'yolovx_m', 'yolovx_l', 'yolovx_x']:
-        model, criterion = build_yolovx(
-            args, model_cfg, device, num_classes, trainable, deploy)
     # YOLOX   
     elif args.model in ['yolox_n', 'yolox_s', 'yolox_m', 'yolox_l', 'yolox_x']:
         model, criterion = build_yolox(
             args, model_cfg, device, num_classes, trainable, deploy)
-
+    # My RTMDet
+    elif args.model in ['rtmdet_v1_n', 'rtmdet_v1_t', 'rtmdet_v1_s', 'rtmdet_v1_m', 'rtmdet_v1_l', 'rtmdet_v1_x']:
+        model, criterion = build_rtmdet_v1(
+            args, model_cfg, device, num_classes, trainable, deploy)
 
     if trainable:
         # Load pretrained weight

+ 16 - 0
models/detectors/rtmdet_v1/README.md

@@ -0,0 +1,16 @@
+# RTMDet-v1: My First Empirical Study of Real-Time General Object Detectors.
+
+|   Model    | Scale | Batch | AP<sup>test<br>0.5:0.95 | AP<sup>test<br>0.5 | AP<sup>val<br>0.5:0.95 | AP<sup>val<br>0.5 | FLOPs<br><sup>(G) | Params<br><sup>(M) | Weight |
+|------------|-------|-------|-------------------------|--------------------|------------------------|-------------------|-------------------|--------------------|--------|
+| RTMDetv1-N |  640  | 8xb16 |                         |                    |                        |                   |      9.1          |        2.4         |  |
+| RTMDetv1-T |  640  | 8xb16 |                         |                    |                        |                   |      19.0         |        5.1         |  |
+| RTMDetv1-S |  640  | 8xb16 |         43.6            |        62.6        |          43.3          |        62.6       |      33.6         |        9.0         | [ckpt](https://github.com/yjh0410/PyTorch_YOLO_Tutorial/releases/download/yolo_tutorial_ckpt/RTMDetv1_s_coco.pth) |
+| RTMDetv1-M |  640  | 8xb16 |         48.3            |        67.0        |          48.1          |        66.9       |      87.4         |        23.6        | [ckpt](https://github.com/yjh0410/PyTorch_YOLO_Tutorial/releases/download/yolo_tutorial_ckpt/RTMDetv1_m_coco.pth) |
+| RTMDetv1-L |  640  | 8xb16 |         50.2            |        68.6        |          50.0          |        68.4       |      176.6        |        47.6        | [ckpt](https://github.com/yjh0410/PyTorch_YOLO_Tutorial/releases/download/yolo_tutorial_ckpt/RTMDetv1_l_coco.pth) |
+| RTMDetv1-X |  640  |       |                         |                    |                        |                   |                   |                    |  |
+
+- For training, we train my RTMDetv1 series series with 300 epochs on COCO.
+- For data augmentation, we use the large scale jitter (LSJ), Mosaic augmentation and Mixup augmentation, following the setting of [YOLOX](https://github.com/ultralytics/yolov5), but we remove the rotation transformation which is used in YOLOX's strong augmentation.
+- For optimizer, we use AdamW with weight decay 0.05 and base per image lr 0.001 / 64.
+- For learning rate scheduler, we use linear decay scheduler.
+- Due to my limited computing resources, I can not train `RTMDetv1-X` with the setting of `batch size=128`.

+ 5 - 5
models/detectors/yolovx/build.py → models/detectors/rtmdet_v1/build.py

@@ -5,16 +5,16 @@ import torch
 import torch.nn as nn
 
 from .loss import build_criterion
-from .yolovx import YOLOvx
+from .rtmdet_v1 import RTMDet
 
 
 # build object detector
-def build_yolovx(args, cfg, device, num_classes=80, trainable=False, deploy=False):
+def build_rtmdet_v1(args, cfg, device, num_classes=80, trainable=False, deploy=False):
     print('==============================')
     print('Build {} ...'.format(args.model.upper()))
         
-    # -------------- Build YOLO --------------
-    model = YOLOvx(
+    # -------------- Build RTMDet --------------
+    model = RTMDet(
         cfg=cfg,
         device=device, 
         num_classes=num_classes,
@@ -25,7 +25,7 @@ def build_yolovx(args, cfg, device, num_classes=80, trainable=False, deploy=Fals
         deploy=deploy
         )
 
-    # -------------- Initialize YOLO --------------
+    # -------------- Initialize RTMDet --------------
     for m in model.modules():
         if isinstance(m, nn.BatchNorm2d):
             m.eps = 1e-3

+ 0 - 0
models/detectors/yolovx/loss.py → models/detectors/rtmdet_v1/loss.py


+ 0 - 0
models/detectors/yolovx/matcher.py → models/detectors/rtmdet_v1/matcher.py


+ 8 - 8
models/detectors/yolovx/yolovx.py → models/detectors/rtmdet_v1/rtmdet_v1.py

@@ -3,18 +3,18 @@ import torch
 import torch.nn as nn
 
 # --------------- Model components ---------------
-from .yolovx_backbone import build_backbone
-from .yolovx_neck import build_neck
-from .yolovx_pafpn import build_fpn
-from .yolovx_head import build_det_head
-from .yolovx_pred import build_pred_layer
+from .rtmdet_v1_backbone import build_backbone
+from .rtmdet_v1_neck import build_neck
+from .rtmdet_v1_pafpn import build_fpn
+from .rtmdet_v1_head import build_det_head
+from .rtmdet_v1_pred import build_pred_layer
 
 # --------------- External components ---------------
 from utils.misc import multiclass_nms
 
 
-# My YOLO
-class YOLOvx(nn.Module):
+# My RTMDet
+class RTMDet(nn.Module):
     def __init__(self, 
                  cfg,
                  device, 
@@ -24,7 +24,7 @@ class YOLOvx(nn.Module):
                  trainable = False, 
                  topk = 1000,
                  deploy = False):
-        super(YOLOvx, self).__init__()
+        super(RTMDet, self).__init__()
         # ---------------------- Basic Parameters ----------------------
         self.cfg = cfg
         self.device = device

+ 2 - 2
models/detectors/yolovx/yolovx_backbone.py → models/detectors/rtmdet_v1/rtmdet_v1_backbone.py

@@ -1,9 +1,9 @@
 import torch
 import torch.nn as nn
 try:
-    from .yolovx_basic import Conv, ELANBlock, DownSample
+    from .rtmdet_v1_basic import Conv, ELANBlock, DownSample
 except:
-    from yolovx_basic import Conv, ELANBlock, DownSample
+    from rtmdet_v1_basic import Conv, ELANBlock, DownSample
 
 
 

+ 0 - 0
models/detectors/yolovx/yolovx_basic.py → models/detectors/rtmdet_v1/rtmdet_v1_basic.py


+ 1 - 1
models/detectors/yolovx/yolovx_head.py → models/detectors/rtmdet_v1/rtmdet_v1_head.py

@@ -1,7 +1,7 @@
 import torch
 import torch.nn as nn
 
-from .yolovx_basic import Conv
+from .rtmdet_v1_basic import Conv
 
 
 # Single-level Head

+ 2 - 1
models/detectors/yolovx/yolovx_neck.py → models/detectors/rtmdet_v1/rtmdet_v1_neck.py

@@ -1,7 +1,7 @@
 import torch
 import torch.nn as nn
 
-from .yolovx_basic import Conv
+from .rtmdet_v1_basic import Conv
 
 
 # Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher
@@ -57,6 +57,7 @@ class SPPFBlockCSP(nn.Module):
         return y
 
 
+# build neck
 def build_neck(cfg, in_dim, out_dim):
     model = cfg['neck']
     print('==============================')

+ 6 - 6
models/detectors/yolovx/yolovx_pafpn.py → models/detectors/rtmdet_v1/rtmdet_v1_pafpn.py

@@ -2,13 +2,13 @@ import torch
 import torch.nn as nn
 import torch.nn.functional as F
 
-from .yolovx_basic import (Conv, build_reduce_layer, build_downsample_layer, build_fpn_block)
+from .rtmdet_v1_basic import (Conv, build_reduce_layer, build_downsample_layer, build_fpn_block)
 
 
-# YOLO-Style PaFPN
-class YolovxPaFPN(nn.Module):
+# RTMDet-Style PaFPN
+class RTMDetPaFPN(nn.Module):
     def __init__(self, cfg, in_dims=[512, 1024, 1024], out_dim=None, input_proj=False):
-        super(YolovxPaFPN, self).__init__()
+        super(RTMDetPaFPN, self).__init__()
         # --------------------------- Basic Parameters ---------------------------
         self.in_dims = in_dims
         if input_proj:
@@ -92,7 +92,7 @@ class YolovxPaFPN(nn.Module):
 def build_fpn(cfg, in_dims, out_dim=None, input_proj=False):
     model = cfg['fpn']
     # build pafpn
-    if model == 'yolovx_pafpn':
-        fpn_net = YolovxPaFPN(cfg, in_dims, out_dim, input_proj)
+    if model == 'rtmdet_pafpn':
+        fpn_net = RTMDetPaFPN(cfg, in_dims, out_dim, input_proj)
 
     return fpn_net

+ 0 - 0
models/detectors/yolovx/yolovx_pred.py → models/detectors/rtmdet_v1/rtmdet_v1_pred.py


+ 0 - 16
models/detectors/yolovx/README.md

@@ -1,16 +0,0 @@
-# YOLOvx:
-
-| Model    | Scale | Batch | AP<sup>test<br>0.5:0.95 | AP<sup>test<br>0.5 | AP<sup>val<br>0.5:0.95 | AP<sup>val<br>0.5 | FLOPs<br><sup>(G) | Params<br><sup>(M) | Weight |
-|----------|-------|-------|-------------------------|--------------------|------------------------|-------------------|-------------------|--------------------|--------|
-| YOLOvx-N |  640  | 8xb16 |                         |                    |                        |                   |      9.1          |        2.4         |  |
-| YOLOvx-T |  640  | 8xb16 |                         |                    |                        |                   |      19.0         |        5.1         |  |
-| YOLOvx-S |  640  | 8xb16 |         43.6            |        62.6        |          43.3          |        62.6       |      33.6         |        9.0         | [ckpt](https://github.com/yjh0410/PyTorch_YOLO_Tutorial/releases/download/yolo_tutorial_ckpt/yolovx_s_coco.pth) |
-| YOLOvx-M |  640  | 8xb16 |         48.3            |        67.0        |          48.1          |        66.9       |      87.4         |        23.6        | [ckpt](https://github.com/yjh0410/PyTorch_YOLO_Tutorial/releases/download/yolo_tutorial_ckpt/yolovx_m_coco.pth) |
-| YOLOvx-L |  640  | 8xb16 |         50.2            |        68.6        |          50.0          |        68.4       |      176.6        |        47.6        | [ckpt](https://github.com/yjh0410/PyTorch_YOLO_Tutorial/releases/download/yolo_tutorial_ckpt/yolovx_l_coco.pth) |
-| YOLOvx-X |  640  |       |                         |                    |                        |                   |                   |                    |  |
-
-- For training, we train my YOLOvx series series with 300 epochs on COCO.
-- For data augmentation, we use the large scale jitter (LSJ), Mosaic augmentation and Mixup augmentation, following the setting of [YOLOX](https://github.com/ultralytics/yolov5), but we remove the rotation transformation which is used in YOLOX's strong augmentation.
-- For optimizer, we use AdamW with weight decay 0.05 and base per image lr 0.001 / 64.
-- For learning rate scheduler, we use linear decay scheduler.
-- Due to my limited computing resources, I can not train `YOLOvx-X` with the setting of `batch size=128`.