faster rcnn

本文深入解析Faster R-CNN目标检测网络,包括其整体结构、Backbone层的卷积与池化、RPN层的锚点处理、RoI Pooling的作用以及分类和回归过程。训练过程涉及RPN和Fast R-CNN的交替训练,以优化提案生成和目标识别。此外,介绍了损失函数,包括分类损失和回归损失,以及训练时的步骤和细节。

(参考:一文读懂Faster RCNN

1.faster rcnn整体网络结构

在这里插入图片描述

2.backbone层

在这里插入图片描述
卷积层包含:卷积、池化,激活。

  • 所有的conv层都是:kernel_size=3,pad=1,stride=1
  • 所有的pooling层都是:kernel_size=2,pad=0,stride=2

卷积前,对原图扩边,M*N变为(m+2)*(n+2),经过卷积后变为M*N,不改变原图大小。卷积后,M*N变为(M/2)*(N/2)。

3.rpn层

在这里插入图片描述
上面的那条线,是通过softmax获取前景和背景。

下面那条线,是计算对于anchors的bounding box regression偏移量,以获取精确的proposal。

最后的proposal层负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。

4.roi pooling

在这里插入图片描述
RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。

Rol pooling层有2个输入:

  • 原始的feature maps
  • RPN输出的proposal boxes(大小各不相同)

RoI Pooling layer forward过程:

  • 由于proposal是对应MxN尺度的,所以首先使用spatial_scale参数将其映射回(M/16)x(N/16)大小的feature map尺度;
  • 再将每个proposal对应的feature map区域水平分为 [公式] 的网格;
  • 对网格的每一份都进行max pooling处理。

这样处理后,即使大小不同的proposal输出结果都是 [公式] 固定大小,实现了固定长度输出。

5.classification

在这里插入图片描述
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。

从RoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:

  • 通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了
  • 再次对proposals进行bounding box regression,获取更高精度的rect box

这里来看看全连接层InnerProduct layers,简单的示意图如下:
在这里插入图片描述
其计算公式如下:
在这里插入图片描述
其中W和bias B都是预先训练好的,即大小是固定的,当然输入X和输出Y也就是固定大小。所以,这也就印证了之前Roi Pooling的必要性。

6.faster rcnn训练过程

在这里插入图片描述
在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为6个步骤:

  • 在已经训练好的model上,训练RPN网络
  • 利用步骤1中训练好的RPN网络,收集proposals
  • 第一次训练Fast RCNN网络
  • 第二训练RPN网络
  • 再次利用步骤4中训练好的RPN网络,收集proposals
  • 第二次训练Fast RCNN网络

可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次。至于只循环了2次的原因是应为作者提到:“A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循环更多次没有提升了。

RPN训练时,loss包含:

  • cls loss,即rpn_cls_loss层计算的softmax loss,用于分类anchors为positive与negative的网络训练
  • reg loss,即rpn_loss_bbox层计算的soomth L1 loss,用于bounding box regression网络训练。

fast rcnn训练时:

  • 将提取的proposals作为rois传入网络
  • 计算bbox_inside_weights+bbox_outside_weights,作用与RPN一样,传入soomth_L1_loss layer
Faster R-CNN 是 R-CNN 和 Fast R-CNN 的进一步改进算法,采用全卷积网络(Fully Convolutional Network, FCN)思想,通过将目标检测任务分为区域提议和区域检测两个子任务,实现了速度和准确性之间的平衡[^1][^2]。 ### 原理 Faster R-CNN 的核心在于引入了区域提议网络(Region Proposal Network, RPN)来生成候选区域,取代了传统的外部算法(如 R-CNN)或 Selective Search(如 Fast R-CNN),从而大幅提高了检测速度。其工作流程如下: 1. **特征提取**:使用预训练的卷积神经网络(如 ResNet、VGG 等)对输入图像进行特征提取,得到特征图。 2. **区域提议网络(RPN)**:在特征图上滑动一个小窗口,对每个窗口位置生成多个不同尺度和长宽比的锚框(Anchors)。RPN 对每个锚框进行二分类(前景或背景)和边界框回归,筛选出可能包含目标的候选区域。 3. **感兴趣区域池化(RoI Pooling)**:将 RPN 生成的候选区域投影到特征图上,并进行池化操作,将不同大小的候选区域转换为固定大小的特征向量。 4. **分类与回归**:使用全连接层对 RoI Pooling 输出的特征向量进行分类和边界框回归,确定每个候选区域的具体类别和精确位置。 ### 使用方法 使用 Faster R-CNN 通常需要以下步骤: 1. **数据准备**:收集和标注包含目标的图像数据集,将图像和对应的标签(类别和边界框坐标)整理成合适的格式。 2. **模型训练**:使用准备好的数据集对 Faster R-CNN 模型进行训练。训练过程包括训练 RPN 网络和整个 Faster R-CNN 网络,通常需要调整超参数以获得最佳性能。 3. **模型评估**:使用测试数据集对训练好的模型进行评估,计算准确率、召回率等指标,评估模型的性能。 4. **模型部署**:将训练好的模型部署到实际应用中,对新的图像进行目标检测。 ### 应用场景 Faster R-CNN 在许多领域都有广泛的应用,包括但不限于: 1. **安防监控**:在监控视频中实时检测和识别人员、车辆、物体等目标,实现异常行为预警和安全监控。 2. **自动驾驶**:检测道路上的交通标志、车辆、行人等目标,为自动驾驶决策提供重要信息。 3. **智能交通**:对交通流量进行监测和分析,实现交通拥堵预警和智能交通管理。 4. **工业检测**:在工业生产线上检测产品的缺陷、尺寸等信息,提高产品质量和生产效率。 5. **医学影像分析**:在医学影像中检测和识别病变区域,辅助医生进行疾病诊断。 ### 代码示例 以下是一个使用 PyTorch 实现 Faster R-CNN 目标检测的简单示例: ```python import torch import torchvision from torchvision.models.detection import fasterrcnn_resnet50_fpn from torchvision.transforms import functional as F # 加载预训练的 Faster R-CNN 模型 model = fasterrcnn_resnet50_fpn(pretrained=True) model.eval() # 加载图像 image = torchvision.io.read_image('path/to/your/image.jpg') image = F.convert_image_dtype(image, torch.float) image = image.unsqueeze(0) # 进行目标检测 with torch.no_grad(): predictions = model(image) # 输出检测结果 boxes = predictions[0]['boxes'] labels = predictions[0]['labels'] scores = predictions[0]['scores'] # 筛选出置信度大于 0.5 的检测结果 threshold = 0.5 keep = scores > threshold boxes = boxes[keep] labels = labels[keep] scores = scores[keep] print(f"检测到 {len(boxes)} 个目标:") for i in range(len(boxes)): print(f"目标 {i+1}:类别 {labels[i]},置信度 {scores[i]},边界框 {boxes[i]}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值