【multi_scale】多尺度训练——目标检测训练trick

1 多尺度训练的介绍

  • 多尺度训练对全卷积网络有效,在训练时,每隔一定的 iterations,在一定尺寸范围内,随机选取一种 img_size 进行训练。
  • 通过对不同尺度的图像进行训练,在一定程度上提高检测模型对物体大小的鲁棒性。
  • 使用尺度小的图片测试速度快些,但准确度低,用尺度大的图片测试速度慢,但准确度高。

2 代码解析

可以根据代码注释以及最下方的YOLOv3 spp的网络结构图进行理解。

  • 获取一些基础信息:
    # ----------------------------------------------------------------------------------#
    # accumulate n times before optimizer update (bs 64)
    # 每训练64张图片更新一次权重,当batchsize较小时,比如batchsize为4时,每迭代16步更新一次权重
    # ----------------------------------------------------------------------------------#
    accumulate = max(round(64 / batch_size), 1)  
    # ----------------------------------------------------------------------------------#
    # Image sizes
    # 输入图像经过yolo spp网络生成的最小特征图尺寸会变为原来的 1/32,因此图像尺寸要设置成32的倍数
    # ----------------------------------------------------------------------------------#
    gs = 32  # (pixels) grid size
    # math.fmod(a,b):返回给定数字a,b的余数
    assert math.fmod(imgsz_test, gs) == 0, "--img-size %g must be a %g-multiple" % (imgsz_test, gs)
    grid_min, grid_max = imgsz_test // gs, imgsz_test // gs
    # --------------------------------------# 
    #   多尺度训练
    # --------------------------------------#
    if multi_scale:
        imgsz_min = opt.img_size // 1.5		# 这儿的1.5和0.667是自己设置的,表示尺度范围
        imgsz_max = opt.img_size // 0.667

        # 将给定的最大,最小输入尺寸向下调整到32的整数倍
        grid_min, grid_max = imgsz_min // gs, imgsz_max // gs
        imgsz_min, imgsz_max = int(grid_min * gs), int(grid_max * gs)
        imgsz_train = imgsz_max  # initialize with max size
        print("Using multi_scale training, image range[{}, {}]".format(imgsz_min, imgsz_max))
  • 在把图片送入模型训练前进行尺度变换:
    # imgs: [batch_size, 3, img_size, img_size]
    # targets: [num_obj, 6] , that number 6 means -> (img_index, obj_index, x, y, w, h)
    # paths: list of img path
    for i, (imgs, targets, paths, _, _) in enumerate(metric_logger.log_every(data_loader, print_freq, header)):
        # ni 统计从epoch0开始的所有batch数
        ni = i + nb * epoch  # number integrated batches (since train start)
        imgs = imgs.to(device).float() / 255.0  # uint8 to float32, 0 - 255 to 0.0 - 1.0
        targets = targets.to(device)

        # Multi-Scale
        if multi_scale:
            # 每训练64张图片,就随机修改一次输入图片大小,
            # 由于label已转为相对坐标,故缩放图片不影响label的值
            #	结合accumulate,每次更新权重时,换一个img_size
            if ni % accumulate == 0:  # adjust img_size (67% - 150%) every 1 batch
                # 在给定最大最小输入尺寸范围内随机选取一个size(size为32的整数倍)
                img_size = random.randrange(grid_min, grid_max + 1) * gs
            sf = img_size / max(imgs.shape[2:])  # scale factor

            # 如果图片最大边长不等于img_size, 则缩放图片,并将长和宽调整到32的整数倍
            if sf != 1:
                # gs: (pixels) grid size
                # new shape (stretched to 32-multiple)
                # math.ceil(x)返回大于等于参数x的最小整数,即对浮点数向上取整.
                ns = [math.ceil(x * sf / gs) * gs for x in imgs.shape[2:]]  
                # 利用插值方法,对输入imgs进行上\下采样操作,也就是合理改变img尺寸大小
                imgs = F.interpolate(imgs, size=ns, mode='bilinear', align_corners=False)

注:图来自 太阳花的小绿豆
在这里插入图片描述

3 感谢链接

https://www.bilibili.com/video/BV1t54y1C7ra/?spm_id_from=trigger_reload
https://blog.csdn.net/qq_37541097?type=blog
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: YOLO的Mosaic数据增强方法是在训练过程中使用的一种数据增强技术,它可以增加模型训练数据的多样性,提高模型的鲁棒性,防止过拟合的发生。\[2\]Mosaic数据增强是将四张不同的图片随机拼接成一张大图,然后将大图分割成四个小图,每个小图与其对应的标签一起作为训练样本。这种数据增强方法可以增加模型对不同场景的适应能力。YOLO的Mosaic数据增强方法在训练过程中是自带的,可以通过相应的代码实现。\[3\] #### 引用[.reference_title] - *1* [[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测](https://blog.csdn.net/HiWangWenBing/article/details/122150460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [训练数据不够怎么造?yolo5 最有用的trick 之数据增强详解](https://blog.csdn.net/OpenDataLab/article/details/127788561)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [YOLO自带的图像数据增强方法](https://blog.csdn.net/weixin_41194129/article/details/119882715)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值