训练除 yolo

训练除 yolo,第1张

YOLOX 的模型及训练配置模板文件位于./yolox/exp/yolox_base.py,对于VOC格式的数据可以仿照./exps/example/yolox_voc/yolox_voc_s.py进行修改 1. 更换yolox_m、yolox_l、yolox_x及其他模型

相应的预训练权重如下:

ModelsizemAPval 0.5:0.95mAPtest 0.5:0.95Speed V100 (ms)Params (M)FLOPs (G)weights
YOLOX-s64040.540.59.89.026.8github
YOLOX-m64046.947.212.325.373.8github
YOLOX-l64049.750.114.554.2155.6github
YOLOX-x64051.151.517.399.1281.9github
YOLOX-Darknet5364047.748.011.163.7185.3github
from yolox.exp import Exp as MyExp

# 如果其余参数不需要修改的话可以只改以下两行参数
# yolox_m
class Exp(MyExp):
  def __init__(self):
      super(Exp, self).__init__()
      self.num_classes = 7
      self.depth = 0.67  # 修改这个参数
      self.width = 0.75  # 修改这个参数

# yolox_m
class Exp(MyExp):
  def __init__(self):
      super(Exp, self).__init__()
      self.num_classes = 7
      self.depth = 1  # 修改这个参数
      self.width = 1  # 修改这个参数
      
# yolox_x
class Exp(MyExp):
  def __init__(self):
      super(Exp, self).__init__()
      self.num_classes = 7
      self.depth = 1.33  # 修改这个参数
      self.width = 1.25  # 修改这个参数

yolox-Darknet53 还需要重写 get_model 函数 详见github

import os
import torch.nn as nn
from yolox.exp import Exp as MyExp

class Exp(MyExp):
    def __init__(self):
        super(Exp, self).__init__()
        self.depth = 1.0
        self.width = 1.0
        self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]

    def get_model(self, sublinear=False):
        def init_yolo(M):
            for m in M.modules():
                if isinstance(m, nn.BatchNorm2d):
                    m.eps = 1e-3
                    m.momentum = 0.03
        if "model" not in self.__dict__:
            from yolox.models import YOLOX, YOLOFPN, YOLOXHead
            backbone = YOLOFPN()
            head = YOLOXHead(self.num_classes, self.width, in_channels=[128, 256, 512], act="lrelu")
            self.model = YOLOX(backbone, head)
        self.model.apply(init_yolo)
        self.model.head.initialize_biases(1e-2)
    
        return self.model
2. 更改其他训练参数

不建议直接修改./yolox/exp/yolox_base.py,建议仿照./exps/example/yolox_voc/yolox_voc_s.py进行相应修改

from yolox.exp import Exp as MyExp

class Exp(MyExp):
    def __init__(self):
        super(Exp, self).__init__()
        # ---------------- model config ---------------- #
        self.num_classes = 7  # 数据中的类别
        self.depth = 1.33  # 模型的深度
        self.width = 1.25  # 模型的宽度
        self.act = "silu"  # 模型的激活函数(relu、silu等)
        
        # ---------------- dataloader config ---------------- #
        self.data_num_workers = 4  # 如果训练过程占用内存太多,可以减少该值
        self.input_size = (640, 640)  # (高、宽)
        self.multiscale_range = 5  # 实际多尺度训练中图片范围为[640 - 5 * 32, 640 + 5 * 32],如果需要取消则设定为0
        # self.random_size = (14, 26)  # 取消注释这行来具体设定尺度范围
        self.data_dir = None  # 数据集图片的位置,如果为None则使用“dataset”文件的路径
        self.train_ann = "instances_train2017.json"  # name of annotation file for training
        self.val_ann = "instances_val2017.json"  # name of annotation file for evaluation
        self.test_ann = "instances_test2017.json"  # name of annotation file for testing
        
        # --------------- transform config ----------------- #
        self.mosaic_prob = 1.0  # 应用 mosaic aug 的概率
        self.mixup_prob = 1.0  # 应用 mixup aug 的概率
        self.hsv_prob = 1.0  # 应用 hsv aug 的概率
        self.flip_prob = 0.5  # 应用 flip aug 的概率
        self.degrees = 10.0  # 旋转角度区间 这里是 (-10,10)
        self.translate = 0.1  # 转换区间 这里是 (-0.1, 0.1)
        self.mosaic_scale = (0.1, 2)  # 马赛克尺度
        self.enable_mixup = True  # 是否应用 mixup aug
        self.mixup_scale = (0.5, 1.5)  # mixup aug 尺度
        self.shear = 2.0  # shear angle 区间,这里是 (-2, 2)

        # --------------  training config --------------------- #
        
        self.warmup_epochs = 5  # warmup epoch 数
        self.max_epoch = 300  # 最大训练 epoch
        self.warmup_lr = 0  # warmup 期间最小的 learning rate
        self.min_lr_ratio = 0.05  # 最小的 learning rate
        self.basic_lr_per_img = 0.01 / 64.0  # learning rate for one image. During training, lr will multiply batchsize.
        self.scheduler = "yoloxwarmcos"  # LRScheduler 名字
        self.no_aug_epochs = 15  # 最后 n 轮不使用 augmention like mosaic
        self.ema = True  # 在训练中采用 EMA 

        self.weight_decay = 5e-4  # 优化器的 weight_decay
        self.momentum = 0.9  # 优化器的 momentum
        self.print_interval = 10  # 迭代中输出日志的频率,如果设定为1则每次都输出log
        self.eval_interval = 10  # 训练过程中评估的 epoch 频率,这里每10个 epoch 会评估一次
        self.save_history_ckpt = True  # 是否保留训练历史的 checkpoint,如果是 False 则只有 latest and best ckpt
        self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]  # 实验名字

        # -----------------  testing config ------------------ #
        self.test_size = (640, 640)  # evaluation/test 期间的图片大小
        self.test_conf = 0.01  # evaluation/test 的输出阈值,可能性大于该阈值的预测结果才会被输出
        self.nmsthre = 0.65 # nms 阈值
        

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/737510.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存