[NAS-Det]NAS-FPN

论文链接:NAS-FPN: Learning Scalable Feature Pyramid Architecture for Object Detection


跨尺度连接,允许模型将高层具有丰富语义信息等特征和底层具有高分辨率的特征结合起来

本文基于retinanet,使用强化学习的方法来采样不同的融合策略,搜索出最好的fpn


搜索空间结构

强化学习
       训练一个控制器,在给定的搜索空间中使用增强学习的方法选择最好的模型结构 。控制器利用 搜索空间中子模型的准确率最为奖励信息来更新参数。

基本空间

  • 搜索的基本单位cell (NASnet 也是提出两个cell)

  • 一个FPN包含N个不同的merging cell,每个cell来对任何两个输入特征层进行操作,并输出操作后的新特征。

  • 一个merging cell中 所有的特征层都有相同的数量的filters

  • 使用backbone的输出作为输入{C3,C4,C5,C6,C7},stride of {8,16,32,64,128} 。C6,C7通过对C5应用stride 2 和 stride 4 的最大池化获得

  • 金字符网络 输出{P3,P4,P5,P6,P7}

在这里插入图片描述

merging cell

在这里插入图片描述
controller RNN 来构建merging cell 。
controller RNN选择两个候选的特征层和一个二值操作,来通过操作结合两个特征生成新的特征层。这些特征层可能有不同的分辨率。
每个merging cell 有4 个预测步骤:

1、从候选特征里面选择一个特征层hi
2、无重复的选择另一个特征层hj
3、选择输出特征的分辨率
4、选择二值操作,结合hi和hj,生成输出特征层
新生成的特征层放入候选list中

  • 设计了两个二值操作。sum 和global pooling
    在这里插入图片描述

  • 在二值操作之前,输入层需要通过最近邻插值或者最大池化法来到达和输出层一样的分辨率。merged feature layers 后面跟着一个relu,一个3x3的卷积层和一个BN层(R-C-B)

  • 为了减少在搜索网络结构中的计算量,我们在第三步的时候 避免选择stride 8的特征。输出{P3, P4, P5, P6, P7}

  • 每个输出层通过重复1、2、4步来生成

merging cell 代码

class SumCell(MergingCell):

    def _binary_op(self, x1, x2):
        return x1 + x2

class GPCell(MergingCell):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.global_pool = nn.AdaptiveAvgPool2d((1, 1))

    def _binary_op(self, x1, x2):
        x2_att = self.global_pool(x2).sigmoid()
        return x2 + x2_att * x1

细节
  • 基于retinanet框架,TPUs 64images in a batch,multi scale 训练,随机尺寸比例[0.8,1.2]的输出图片尺寸,BN层应用在所有的卷积层之后

  • 设置focal loss 超参 α = 0.25 α = 0.25 α=0.25 γ = 1.5 γ = 1.5 γ=1.5

  • weight decay of 0.0001
    momentum of 0.9.
    50个epoch

  • 初始学习率0.08 ,稳定在前30个epochs,30-40epochs 衰减率0.1

  • 在COCO2017 数据集上进行训练

  • Proxy task。为了加速RNN controller,需要Proxy task。Proxy task 需要很短的训练时间,并且与真实任务相关。在训练期间,Proxy task 能确定一个好的FPN结构。训练Proxy task 仅需要10个epochs ,而不是训练retinanet的50个epochs为了进一步加速Proxy task的训练速度,使用更小的resnet10 ,图片输入512*512。Proxy task重复3次 pyramid networks
    学习率 0.08 前8个epoch,之后衰减率0.1,从cocotrain 2017中随机选择7392张图片 设置为验证集,来获得奖励信息。

  • Controller 是RNN,采用PPO优化算法。Controller 采样多个不同网络结构的子网络。这些网络结构被训练于Proxy task,使用 a pool of works


Result

实验包含了100个 TPUs
验证集的AP 被用于reward信息来更新Controller
叠加普通的FPN,性能没有改变。但是叠加NAS-FPN性能会提升
在这里插入图片描述

搜索到的结果
在这里插入图片描述

结构代码
来自mmdetection

# add NAS FPN connections
self.fpn_stages = nn.ModuleList()
for _ in range(self.stack_times):
	stage = nn.ModuleDict()
	# gp(p6, p4) -> p4_1
	stage['gp_64_4'] = GPCell(out_channels, norm_cfg=norm_cfg)
          # sum
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
若想使用 YOLOv5 训练 NEU-DET 数据集,可以按照以下步骤进行操作: 1. 下载 NEU-DET 数据集: 首先,从数据集提供的来源下载 NEU-DET 数据集。确保你拥有训练图像和相应的标签文件。 2. 准备数据集: - 将训练图像放在一个文件夹中(如 `data/images/train/`)。 - 将与每个图像对应的标签文件放在另一个文件夹中(如 `data/labels/train/`),标签文件的格式应与 YOLOv5 要求的格式相匹配。 3. 创建数据集配置文件: 在 `data/` 目录下创建一个新的 `.yaml` 文件(如 `neu-det.yaml`),并按照以下格式填写文件内容: ```yaml train: path/to/train.txt val: path/to/val.txt nc: 6 # 类别数目 names: [crazing, inclusion, patches, pitted_surface, rolled-in_scale, scratches] # 类别名称 ``` - 将 `path/to/train.txt` 替换为包含训练图像路径的文本文件的路径。 - 将 `path/to/val.txt` 替换为包含验证图像路径的文本文件的路径。 - 将 `nc` 设置为数据集中的类别数目(在 NEU-DET 中为 6)。 - 将 `names` 设置为数据集中每个类别的名称列表。 4. 开始训练: 运行以下命令来启动训练过程: ```shell python train.py --img 640 --batch 16 --epochs 50 --data path/to/neu-det.yaml --weights yolov5s.pt ``` - `--img` 设置输入图像的大小(推荐使用 640 或 1280)。 - `--batch` 设置批量大小。 - `--epochs` 设置训练的轮数。 - `--data` 指定数据集配置文件的路径。 - `--weights` 指定预训练权重文件的路径,可以使用预训练的 YOLOv5 权重(如 `yolov5s.pt`)或者之前训练的权重文件。 5. 监控训练过程: 训练过程中会显示损失和其他指标,同时会在 `runs/train/` 目录下保存模型权重文件和训练日志。 这样,你就可以使用 YOLOv5 训练 NEU-DET 数据集了。记得替换命令中的路径参数为你自己的路径和设置适合你的训练参数。如果有其他问题,欢迎继续提问!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值