Faster R-CNN:架构、训练与应用全解析
1. Faster R-CNN架构详解
1.1 区域提议网络(RPN)
生成锚点的目的是覆盖图像中所有可能的物体尺度和大小,而区域提议网络(RPN)的目标则是将生成的边界框数量修剪到更易于管理的规模。
RPN模块简单却强大,有两个输出:
- 前景/背景得分 :RPN模块顶部接收卷积特征图输入,经过一个3×3卷积层学习512个滤波器。这些滤波器并行输入两条路径,第一个输出是一个得分,用于指示RPN认为感兴趣区域(ROI)是前景(值得进一步检查)还是背景(丢弃)。该输出维度为2×K,K是锚点总数,一个输出表示前景概率,另一个表示背景概率。
- 边界框回归 :第二个输出是边界框回归器,用于调整锚点以更好地拟合其周围的物体。通过1×1卷积实现,输出一个4×K的体积,预测四个偏移值:∆x - center、∆y - center、∆width、∆height。
当前景概率足够大时,会进行以下操作:
- 非极大值抑制 :抑制重叠的锚点位置,减少传递到ROI池化模块的位置数量。
- 提议选择 :只选取前N个提议,丢弃其余的。在原始的Faster R - CNN论文中,N = 2000,但使用更小的N(如10、50、100、200)也能获得不错的预测结果。
1.2 RPN训练
训练RPN时,将锚点分为两类:
- 前景 :与真实物体边界框的交并比(IoU)大于等于0.5的所有锚点。
- 背景 :与真实物体的IoU小于0.1的所有锚点。
基于这两类,随机采样以保持背景和前景的比例相等。RPN模块有两个损失函数:
- 分类损失 :使用二元交叉熵,衡量RPN预测前景和背景的准确性。
- 边界框回归损失 :仅对前景锚点起作用,使用Smooth L1损失。由于很难100%准确预测边界框的真实坐标,Smooth L1损失允许与真实边界框“足够接近”的边界框被视为基本正确,从而减少损失的影响。
1.3 感兴趣区域(ROI)池化
ROI池化模块的目标是接收RPN模块的所有N个提议位置,并从卷积特征图中裁剪出特征向量。具体步骤如下:
1. 使用数组切片从特征图中提取相应的补丁。
2. 将其调整为14×14×D的大小,D是特征图的深度。
3. 应用2×2步长的最大池化操作,得到7×7×D的特征向量。
最终的特征向量将输入到基于区域的卷积神经网络(R - CNN)中,以获得每个物体的最终边界框坐标和相应的类别标签。
1.4 基于区域的卷积神经网络(R - CNN)
R - CNN是整个流程的最后阶段,有两个目的:
- 根据ROI池化模块裁剪的特征图,获得每个边界框位置的最终类别标签预测。
- 进一步细化边界框的预测坐标,以提高预测准确性。
实际实现中,R - CNN组件通过两个全连接层实现。输入是ROI池化模块获得的特征向量,经过两个4096维的全连接层后,进入最终的两个全连接层,分别输出类别标签(或背景类别)和边界框的偏移值。
R - CNN也有两个损失函数:
- 分类损失 :使用分类交叉熵,计算每个类别(共N个类别)的概率。
- 边界框回归损失 :使用Smooth L1损失。
最后,对边界框进行按类别非极大值抑制,得到网络的最终预测结果。
1.5 完整训练流程
训练整个Faster R - CNN管道有两种选择:
- 先训练RPN模块,获得满意结果后再训练R - CNN模块。
- 将四个损失函数(RPN模块两个,R - CNN模块两个)通过加权求和组合,然后联合训练。
在几乎所有情况下,通过最小化四个损失函数的加权和来端到端地联合训练整个网络,不仅耗时更短,而且准确性更高。
以下是Faster R - CNN架构的主要组件和流程的mermaid流程图:
graph LR
A[输入图像] --> B[基础网络]
B --> C[RPN模块]
C --> D[非极大值抑制和提议选择]
D --> E[ROI池化模块]
E --> F[R - CNN模块]
F --> G[最终预测结果]
C --> H[RPN训练]
F --> I[R - CNN训练]
H & I --> J[联合训练]
2. 从零开始训练Faster R - CNN
2.1 LISA交通标志数据集
LISA交通标志数据集包含47种不同的美国交通标志类型,如停车标志、人行横道标志等。数据集最初通过视频捕获,包含6610帧和7855个注释。交通标志的分辨率从6×6到167×168像素不等,部分图像是低分辨率(640×480),部分是高分辨率(1024×522),还有一些是灰度图像,一些是彩色图像。
为了更快地训练网络并学习目标检测的基础知识,我们将采样三个交通标志类别:停车标志、人行横道标志和前方信号标志。可以从 这里 下载数据集,下载完成后,使用以下命令解压:
$ mkdir lisa
$ cd lisa
$ mv signDatabasePublicFramesOnly.zip ./
$ unzip signDatabasePublicFramesOnly.zip
2.2 安装TensorFlow对象检测API
由于自定义实现目标检测网络较为复杂且容易出错,我们将使用TensorFlow对象检测API(TFOD API)。它是一个广泛使用的深度学习库,由Google支持,有大量开发者参与,降低了库的脆弱性。
要安装和配置TFOD API,请参考 这个页面 的说明。如果无法访问该页面,请参考相关注册链接获取访问权限。
2.3 训练Faster R - CNN
2.3.1 项目目录结构
训练Faster R - CNN需要了解项目结构,TFOD API和自定义脚本有多个组成部分。以下是我们将使用的TFOD API Python脚本:
- train.py :用于训练基于深度学习的目标检测器。
- eval.py :与train.py同时运行,在训练时对测试集进行评估。
- export_inference_graph.py :模型训练完成后,冻结权重并导出模型,以便导入到自己的应用程序中。
自定义脚本和训练/评估配置的目录结构如下:
| --- ssds_and_rcnn
|
|--- build_lisa_records.py
|
|--- config
|
|
|--- __init__.py
|
|
|--- lisa_config.py
|
|--- lisa/
|
|
|--- allAnnotations.csv
|
|
|--- categories.txt
...
|
|
|--- vid8/
|
|
|--- vid9/
|
|
|--- videoSources.txt
|
|--- predict.py
|
|--- predict_video.py
- lisa_config.py :用于存储配置信息,如图像路径、类别标签等。
- build_lisa_records.py :接受输入图像集,创建训练和测试分割,并创建可用于训练的TensorFlow兼容记录文件。
- predict.py 和 predict_video.py :分别用于将训练好的网络应用于输入图像或视频文件/流。
- setup.sh :包含一个命令,用于在通过命令行执行Python脚本时轻松更新PYTHONPATH以包含TFOD API导入。
以下是训练Faster R - CNN的主要步骤总结表格:
|步骤|说明|
|----|----|
|下载数据集|从指定链接下载LISA交通标志数据集并解压|
|安装TFOD API|按照指定页面的说明安装和配置|
|准备数据|使用build_lisa_records.py脚本将图像和注释转换为TFOD API所需的记录格式|
|训练模型|使用train.py脚本训练Faster R - CNN模型|
|评估模型|使用eval.py脚本在训练过程中评估模型性能|
|导出模型|使用export_inference_graph.py脚本导出训练好的模型|
|应用模型|使用predict.py和predict_video.py脚本将模型应用于图像和视频|
2.3.2 数据准备
TFOD API要求图像和注释采用特定的记录格式。 build_lisa_records.py 脚本的作用就是将图像数据集和相关注释转换为这种格式。具体操作步骤如下:
1. 确保已经下载并解压了LISA交通标志数据集,且项目目录结构正确设置。
2. 运行 build_lisa_records.py 脚本,该脚本会自动完成以下工作:
- 划分训练集和测试集。
- 创建TensorFlow兼容的记录文件,这些文件将用于后续的模型训练。
2.3.3 模型训练
在完成数据准备后,就可以开始训练Faster R - CNN模型了。具体步骤如下:
1. 打开终端,进入项目目录。
2. 运行 train.py 脚本,命令示例如下:
python train.py --logtostderr --train_dir=path/to/train_dir --pipeline_config_path=path/to/pipeline.config
其中, --train_dir 是训练过程中日志和检查点文件的保存路径, --pipeline_config_path 是配置文件的路径,配置文件中包含了模型的各种参数设置。
2.3.4 模型评估
在模型训练过程中,可以同时运行 eval.py 脚本来评估模型在测试集上的性能。具体步骤如下:
1. 打开一个新的终端,进入项目目录。
2. 运行 eval.py 脚本,命令示例如下:
python eval.py --logtostderr --checkpoint_dir=path/to/train_dir --eval_dir=path/to/eval_dir --pipeline_config_path=path/to/pipeline.config
其中, --checkpoint_dir 是训练过程中保存检查点文件的路径, --eval_dir 是评估结果的保存路径。
2.3.5 模型导出
当模型训练完成后,需要将其导出为可以在自己的应用程序中使用的格式。具体步骤如下:
1. 运行 export_inference_graph.py 脚本,命令示例如下:
python export_inference_graph.py --input_type image_tensor --pipeline_config_path path/to/pipeline.config --trained_checkpoint_prefix path/to/model.ckpt-XXXX --output_directory path/to/output_directory
其中, --input_type 指定输入数据的类型, --trained_checkpoint_prefix 是训练好的检查点文件的前缀, --output_directory 是导出模型的保存路径。
2.3.6 模型应用
导出模型后,就可以使用 predict.py 和 predict_video.py 脚本将模型应用于输入图像或视频文件/流。具体步骤如下:
- 应用于图像 :
1. 运行 predict.py 脚本,命令示例如下:
python predict.py --image_path path/to/image.jpg --model_path path/to/saved_model --label_map_path path/to/label_map.pbtxt
其中, --image_path 是输入图像的路径, --model_path 是导出的模型的路径, --label_map_path 是标签映射文件的路径。
- 应用于视频 :
1. 运行 predict_video.py 脚本,命令示例如下:
python predict_video.py --video_path path/to/video.mp4 --model_path path/to/saved_model --label_map_path path/to/label_map.pbtxt
其中, --video_path 是输入视频的路径,其他参数含义与应用于图像时相同。
以下是训练和应用Faster R - CNN模型的详细流程mermaid流程图:
graph LR
A[下载数据集] --> B[安装TFOD API]
B --> C[准备数据]
C --> D[训练模型]
D --> E[评估模型]
E --> F[导出模型]
F --> G[应用于图像]
F --> H[应用于视频]
3. 总结
Faster R - CNN是一种强大的端到端深度学习目标检测架构,它主要由基础网络、区域提议网络(RPN)、感兴趣区域(ROI)池化和基于区域的卷积神经网络(R - CNN)四个主要组件组成。通过RPN生成提议,ROI池化提取特征,R - CNN进行分类和边界框回归,最终实现目标检测。
在实际应用中,由于Faster R - CNN架构的复杂性,不建议手动实现整个架构。使用TensorFlow对象检测API(TFOD API)可以更方便地训练和应用Faster R - CNN模型。通过LISA交通标志数据集的示例,我们详细介绍了从数据集准备、TFOD API安装、模型训练、评估、导出到应用的完整流程。
希望通过本文的介绍,读者能够对Faster R - CNN有更深入的理解,并能够使用TFOD API在自己的数据集上训练和应用Faster R - CNN模型,实现目标检测任务。
超级会员免费看

被折叠的 条评论
为什么被折叠?



