【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
<think>好的,我现在需要解决用户安装mmcv时遇到的错误:“No matching distribution found for mmcv.ops.multi_scale_deform_attn”。首先,我得理解这个错误的原因。用户可能在安装时直接尝试了类似pip install mmcv.ops.multi_scale_deform_attn的命令,但正确的做法应该是安装完整的mmcv包,而不是单独的子模块。 根据引用[1]提到的模块缺失问题,用户可能没有正确安装mmcv-full,因为multi_scale_deform_attn属于mmcv的扩展模块,需要从源码编译或者使用预编译版本。接下来,我需要确认用户是否使用了正确的安装命令。通常,直接pip install mmcv可能不够,应该使用针对不同CUDA版本的预编译包,例如使用pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.10.0/index.html这样的命令,其中cu113和torch版本需要根据用户的环境调整。 另外,引用[2]提到编译失败的问题,可能需要用户安装必要的编译工具,如ninja,或者确保CUDA和PyTorch版本兼容。用户可能需要先安装ninja,再尝试重新编译mmcv-full。此外,检查系统是否安装了正确的构建依赖项,如gcc、g++等,也是必要的步骤。 引用[3]中的修改代码可能不适用于当前问题,但可以提醒用户在安装mmcv时可能需要根据他们的项目需求调整某些配置文件,但主要问题还是安装命令是否正确。因此,用户应该优先确保使用正确的安装源和命令,而不是修改现有代码。 总结解决步骤:首先确认用户是否正确安装了mmcv-full而非直接安装子模块;其次,检查PyTorch和CUDA版本,使用对应的预编译命令;如果必须从源码编译,确保系统依赖项和编译工具已安装;最后,验证安装是否成功。</think>安装mmcv时出现`No matching distribution found for mmcv.ops.multi_scale_deform_attn`错误,通常是因为直接尝试安装子模块而非完整包,或环境配置不匹配。以下是逐步解决方案: --- ### **解决方法** 1. **安装完整包而非子模块** `mmcv.ops.multi_scale_deform_attn`是mmcv的扩展模块,需通过安装`mmcv-full`获取。直接运行: ```bash pip install mmcv-full ``` 如果仍报错,需指定预编译版本(见下一步)。 2. **指定兼容的预编译版本** 根据你的PyTorch和CUDA版本,从OpenMMLab官方镜像选择对应命令。例如: ```bash pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.10.0/index.html ``` 替换`cu113`(CUDA 11.3)和`torch1.10.0`为你的实际版本[^1]。 3. **从源码编译(备用方案)** 若预编译包不兼容,需手动编译: ```bash git clone https://github.com/open-mmlab/mmcv.git cd mmcv MMCV_WITH_OPS=1 pip install -e . ``` 需提前安装`ninja`编译工具(`pip install ninja`)和CUDA开发环境[^2]。 4. **验证安装** 运行Python检查是否成功导入: ```python import mmcv from mmcv.ops import MultiScaleDeformableAttention ``` --- ### **常见问题排查** - **PyTorch/CUDA版本冲突** 确保`mmcv-full`版本与PyTorch、CUDA严格匹配。例如,PyTorch 1.9需对应CUDA 11.1。 - **网络问题导致下载失败** 使用国内镜像源(如阿里云、清华源)加速下载: ```bash pip install mmcv-full -i https://mirrors.aliyun.com/pypi/simple ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值