目标检测经典之作-Fast RCNN论文解读

Fast R-CNN是一种高效的目标检测算法,它通过one-stage训练流程和multi-task loss实现了比R-CNN更快的训练和测试速度,同时保持了更高的检测精度。文章详细介绍了Fast R-CNN的创新点、难点及其实现细节,包括RoI pooling layer、从预训练网络初始化、fine-tuning for detection等关键步骤。

视频链接:https://www.bilibili.com/video/BV1n54y1S71L/

 

 

1、看abstract时候的问题(看其他部分时候的回答)

1.1.Two-stage算法的主要难点?

第一是如何去生成proposals;第二是前面生成的propasal都是粗略的,因此对这些proposal进行调整。

 

1.2.为什么Fast RCNN的论文里用r和c代表top和left?

 

 

1.3.文中说网络的input是一张完整的图片和region of interest(RoIs),那么输入的这些RoIs又是怎么来的呢?

 

 

1.4.在Fast R-CNN训练时,用SGD在进行optimize的时候,进行了分层采样,先采样N张图片,在采样每张图片中的R/N个RoIs。为什么这样的效果就会比较好?

 

 

2、创新点

2.1.训练过程是one-stage的(SPPNet、R-CNN的训练过程都是multi-stage pipeline的),使用了multi-task的loss,不需要额外占用硬盘空间。

3、做了什么

提出了一个目标检测算法,在training和testing的过程中都做了很多的创新,训练比RCNN快9倍,test比RCNN快213倍(这可能就是写论文的技巧吧,一定要找好对比的对象,如果跟SPPNet比的话,也就加速了3倍左右,并没有这么惊人),并且精度更高。

此外,本文的conclution的最后也提出了,如果能够在提出:在region proposal过程中,如果能发现一种比sparse proposals更高效的方法,那么能够大大加速目标检测的算法,这也为后面Faster RCNN的提出奠定了基础。

4、难点

5、怎么做

总体流程

 

如图所示,网络的input是一张完整的图片和region of interest(RoIs);

首先对image进行进行特征提取生成feature map;

然后对feature map上RoI的区域,先进行池化到fixed size;

然后将这些fixed size的feature map通过fully connected layers映射成一维的vector;

这些一维的向量再通过2个全连接层,输出两个信息:一是当前RoI中包含的物体是每个类别的概率(长度为K+1,因为有一个类别是背景),二是每个类别bounding box的偏移量(长度为4K)——K代表数据集中的类别数量。

 

5.1. The RoI pooling layer

输入的RoIs的大小为w x h,经过ROI polling之后,RoIs的大小就会变成W x H(其中W、H为超参数,由用户设定)

具体的过程的话,就是用一个w/W x h/H的sliding window,在RoI上做max pooling。

 

5.2. Initializing from pre-trained networks

用了ImageNet pretrained model去初始化Fast R-CNN,主要有以下三个变化:

第一:把原来网络中最后一层的max pooling换成了ROI pooling,来生成fixed size的feature map

第二:把原来网络中的全连接层换成了两个sibling layers(一个用来生类别的概率,一个用来生成坐标信息)

第三:把模型的输入改成了2个,一个是image的list,另一个image对应的RoI的list

 

5.3. Fine-tuning for detection

为了解决以前的方法训练效率低的问题,在Fast R-CNN训练时,用SGD在进行optimize的时候,进行了分层采样,先采样N张图片,在采样每张图片中的R/N个RoIs。(不知道为啥这样效果就比较好)

通过一个fine-tuning stage,来共同optimize分类器(对物体分类)和回归器(回归坐标),就可以把整个过程给串起来,让整个training过程是一个one-stage的过程,不需要像R-CNN那样将softmax classifier, SVMs 和 regressors分开训练。

5.3.1 Multi-task loss

 

其中

p=(p0,...,pK),是predict box里包含每个物体的概率,u是类别的编号

v是GT box的坐标,tu是第u个类的predicted box的坐标信息;[u ≥ 1]只有在u ≥ 1才是1,否则为0,因为u=0的话,就代表是背景,如果是背景,就没必要去计算坐标回归的loss;λ是一个超参数,来控制分类和回归loss占总体loss的比重,如果更注重分类损失,那么λ<1,否则就λ>1。

Lcls()是log loss,Lloc是smooth L1 loss,如下图所示

 

 

5.4. Scale invariance

为了实现Scale invariance,本文提出了两个方法:(1)via “brute force” learning、(2)using image pyramids

(1)“brute force” learning:在训练和测试之前,将图片缩放到pre-defined pixel size

(2)using image pyramids:使用image pyramid去初始化每一个proposal的尺度

 

 

6、结果怎么样

三个数据集下效果对比:

 

Fast R- CNN, R-CNN, and SPPnet训练和测试时间对比:

 

Truncated SVD能够减少30%的detection time,主要也是减少全连接层的时间

 

 

Ablation Experiment:固定前面的层,fine tune后面的层,对准确率的影响。

 

 

探究Multi-task training是否有用:

 

 

 

Multi-Scale VS Single-Scale

 

 

 

Faster R-CNN的分类器用softmax和SVM的对比:

 

 

随着proposal的增加,reall和mAP的变化曲线(reall增加,mAP先上升再下降)

 

 

 

 

 

 

7、备注(写自己的问题,感受)

Fast RCNN定位一个bounding box是用r、c、w、h,分别代表top、left、width、height

Faster RCNN定位一个bounding box是用x,y,w,h,分别代表bounding box的中心坐标和width、height

 

 

——————————————————————————————

如果内容有帮助到您,希望大家多多点赞+收藏+关注!!!

经常会在知乎中分享自己的学习笔记,和大家一起学习进步!!!

——————————————————————————————

### 使用 PyTorch 实现 Fast R-CNN 的目标检测 #### 背景介绍 Fast R-CNN 是一种用于目标检测的经典算法,其核心思想在于通过卷积神经网络提取特征并完成区域提议的分类与回归任务。相比之前的 R-CNN 和 SPP-Net 方法,Fast R-CNN 提高了效率并通过共享计算减少了冗余操作。 #### 主要步骤概述 以下是基于 PyTorch 实现 Fast R-CNN 的基本流程: 1. **加载预训练模型** 可以利用 `torchvision` 库中的预定义 Faster R-CNN 或 Fast R-CNN 模型作为起点。这些模型通常已经在 COCO 数据集上进行了预训练。 ```python import torch import torchvision # 加载预训练的 Fast R-CNN 模型 (ResNet-50 FPN 结构) model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True) model.eval() ``` 2. **准备输入数据** 输入图像需要经过标准化处理以便适配模型的要求。可以使用 `torchvision.transforms` 来转换图像格式。 ```python from PIL import Image import torchvision.transforms as transforms transform = transforms.Compose([ transforms.ToTensor(), ]) image_path = 'example.jpg' image = Image.open(image_path).convert('RGB') input_tensor = transform(image) # 将图像转为张量 inputs = [input_tensor] # 创建批量大小为1的数据列表 ``` 3. **执行推理** 利用加载的模型对输入图像进行预测。输出结果是一个字典列表,其中包含边界框、类别标签以及置信度分数。 ```python with torch.no_grad(): predictions = model(inputs) boxes = predictions[0]['boxes'].cpu().numpy() # 边界框坐标 labels = predictions[0]['labels'].cpu().numpy() # 类别标签 scores = predictions[0]['scores'].cpu().numpy() # 置信度得分 ``` 4. **可视化结果** 对于检测到的对象,可以通过绘制矩形框来标注它们的位置。 ```python draw = ImageDraw.Draw(image) font = ImageFont.load_default() for box, label, score in zip(boxes, labels, scores): if score > 0.8: # 设置阈值过滤低分对象 draw.rectangle(box.tolist(), outline='red', width=2) text = f"{label} {score:.2f}" draw.text((box[0], box[1]), text=text, fill="white", font=font) image.show() ``` 以上代码展示了如何使用 PyTorch 中的预训练模型来进行目标检测[^3]。 --- #### 关键点解析 - **模型架构**: Fast R-CNN 基本框架依赖于 CNN 特征图,并结合 ROI Pooling 层实现不同尺寸候选框的空间映射[^2]。 - **性能优化**: 预训练权重能够显著提升初始精度,减少训练时间。 - **自定义调整**: 如果希望针对特定领域微调模型,则需替换最后几层以适应新的类别集合。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值