【CV论文阅读】 Fast RCNN + SGD笔记

本文详细介绍了Fast R-CNN的结构原理,包括输入、深度网络处理过程、ROI pooling层的功能及其反向传播机制、mini-batch设置、损失函数构成及尺度不变性的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fast RCNN的结构:

 

先从这幅图解释FAST RCNN的结构。首先,FAST RCNN的输入是包含两部分,image以及region proposal(在论文中叫做region of interest,ROI)。Image经过深度网络(deep network)之后得到feature map,然后可以从feature map中找到ROI在其中的投射projection得到每个patch,但论文没有提及怎么在map中寻找对应的patch,估计可以通过位置关系找到(猜想,因为deep ConvNet 之后相对的位置是不变的)。

把每个patch经过ROI pooling layer,再经过一系列的full connected layer后,分别完成了两个任务的预估:一是类别的预测softmax,一个是bounding box的预测。

在softmax的预测输出是类别的概率分布,而bounding box 预测为每个类别都输出预测回归方程计算的四个参数(如上篇总结《Rich feature hierarchies for accurate object detection and semantic segmentation》中学习的四个参数,但论文中好像直接就是代表中心坐标以及长宽)。

 

ROI pooling layer:

ROI pooling layer其实是一个max pooling layer。假设有两个超参数H、W,把输入的patch划分成H*W个小方格,假设投影的每个ROI的patch为h*w,则每个小子方格的大小没h/H*w/W,而在每个方格中,执行的是max pooling layer 的操作。

在这里有必要继续的讨论一下在这个ROI pooling layer怎样反向误差传播。

首先要明白的是,BP算法其实应用的就是导数的链式法则,很巧妙地解决了误差的传播问题。如下公式:

 

其中aj代表卷积层的输入,而如果经过一个激活函数之后,得到zj=h(aj),其实zj才是下一层的输入,而对k求和代表所有包含zj作为输入的神经元。因此,可以得到公式而就是误差。

对应到pooling层,假设输入层的元素值xi,对应卷积层的i位置,对应的是第r个ROI的layer,它经过ROI pooling层后在对应输出到j位置。而xi是子窗口中的最大值。把一般的求误差的公式对应到ROI pooling中,

 

其中i*(r,j)表示第r个ROI从第i的输入(如果是子窗口中的最大像素值)对应到输出的第j的位置。而sigma(r)是因为某个像素可能落在多个ROI中。

 

Mini-batch:

当使用pre-trained网络的参数去初始化Fast RCNN网络时,需要三个改变。第一,把最后一层的max pooling使用ROI pooling层去替代;第二、最后一层fc层以及softmax层用softmax层和bounding box预测层替代;第三,输入包含两种数据:image以及ROI。

batch就是完成一次训练的数据集,这里对参数进行tune,就是有监督训练对参数进行微调(使用的是SGD,随机梯度下降法)。mini batch是通过随机采样得到的,首先随机选择N张图片,然后每张图片随机采样R/N个ROI。论文采用R=128,N=2。

今天想明白了一个batch是怎么完成一次训练。我开始以为是一次输入一个batch的数据集,其实不是的,一次处理的依然是一张的图片,而在最后输出层计算这张图片的产生的loss,把batch里的图片全部输入到网络里,就产生了loss的和LOSS,这时可以使用这个LOSS去执行BP算法,微调网络中的参数。

同样的,当IOU至少是0.5的才有可能是带有类别标志的,而0.1到0.5的认为是背景,而低于0.1的act as a heuristic for hard example mining(这里我也想不明白)。

 

损失函数:

损失函数由两部分组成,分别是类别误差函数以及定位误差:

 

(@2016/8/17   : 训练时每个ROI输入时应该都是有label的,这取决于它与label的IOU,如上小节所述。估计训练时的样本只会有一个bounding box)

其中类别误差取类别概率的负对数作为误差函数。而第二项定位误差,在真实类别u>=1时才有意义,u=0时表示背景。Bounding box的目标为v,如上文提到,它有四个参数,于是定位误差为:

 

其中,,而且

 

尺度不变性:

论文中实现尺度不变性是通过把图像固定。

 

随机梯度下降法:

 

@ 2016 /08/21 更新。

现在神经网络里用的SGD都是指min-batch SGD,找了一个例子from http://www.cnblogs.com/maybe2030/p/5089753.html#_label2

转载于:https://www.cnblogs.com/jie-dcai/p/5701435.html

### Fast R-CNN 中 Epoch 的相关概念及其设置 在机器学习领域,Epoch 是指整个训练数据集被模型遍历一次的过程。对于 Fast R-CNN 而言,其训练过程涉及多个阶段以及特定的数据处理方式,因此理解如何定义和设置 Epoch 对于优化模型至关重要。 #### 数据加载与预处理 Fast R-CNN 使用 COCO 或其他目标检测数据集进行训练时,通常会通过 Selective Search 算法生成一系列候选区域(Region Proposals)。这些候选区域会被映射到由卷积神经网络提取的特征图上[^4]。由于每张图片可能包含大量候选区域,Fast R-CNN 提出了 ROI Pooling 技术来减少计算开销,并允许批量处理来自不同大小区域的信息[^1]。 #### Mini-Batch 和 Epoch 定义 Fast R-CNN 的训练采用随机梯度下降 (SGD) 方法,在每次迭代中使用 mini-batch 来更新参数。具体来说: - **Mini-Batch**: 每次从若干张图像中抽取固定数量的 Region of Interest (RoI),形成一个 mini-batch 进行前向传播和反向传播。 - **Epoch**: 当所有训练样本都被用来完成至少一次完整的前向和反向传播后,则认为完成了 1 个 Epoch。 然而需要注意的是,Fast R-CNN 并不严格遵循传统意义上的单张图像对应单一标签的方式构建 mini-batch;相反,它倾向于让同一个 mini-batch 内部尽可能多地包含来自相同几张图像中的 RoI,以此提高 GPU 加速效果并降低内存消耗[^2]。 #### 实际应用中的 Epoch 设置 尽管理论上有明确的定义,但在实际实现过程中,开发者可以根据硬件资源情况灵活调整以下超参以控制有效 Epoch 数量: 1. **Batch Size**: 即每个 mini-batch 所含样本数目,默认情况下可能是 128 个 RoI 来自两张不同的原始输入图像; 2. **Iteration Number per Epoch**: 取决于总的可用训练样例总数除以前述 batch size 值的结果; 3. **Total Iterations or Total Epochs**: 根据实验需求设定总训练步数或者最终达到的目标 epoch 数目。 例如,在 PyTorch 版本复现项目里提到过,“我们只需要更少次数的 SGD iteration 就能获得不错的效果”,这意味着即使减少了整体 epochs 的绝对数值也能够满足预期性能指标的要求。 此外值得注意的一点是关于收敛性的讨论:虽然有人担心如果过多依赖同源图像内的关联性强的 rois 是否会影响收敛速率,但实际上这种担忧并未成为现实障碍。 ```python import torch.optim as optim # Example optimizer setup for training loop in PyTorch implementation. optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) for epoch in range(total_epochs): running_loss = 0.0 for i, data in enumerate(dataloader, 0): inputs, labels = data # Zero the parameter gradients optimizer.zero_grad() # Forward pass outputs = model(inputs) # Compute multi-task loss including classification & regression losses cls_loss, reg_loss = compute_multi_task_loss(outputs, labels) total_loss = cls_loss + reg_loss # Backward propagation and optimize step total_loss.backward() optimizer.step() running_loss += total_loss.item() print(f'[{epoch + 1}] loss: {running_loss / len(dataloader)}') ``` 以上代码片段展示了基于 PyTorch 构建的一个简单训练循环框架,其中包含了典型的 forward-backward 更新逻辑以及打印当前 epoch 下平均损失值的操作。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值