首页
/ 深入解析py-faster-rcnn中的ZF测试网络结构

深入解析py-faster-rcnn中的ZF测试网络结构

2025-07-07 02:13:24作者:凌朦慧Richard

概述

本文将详细解析py-faster-rcnn项目中使用的ZF(Zeiler and Fergus)网络在测试阶段的网络结构定义文件(test.prototxt)。这个文件定义了目标检测模型在推理阶段的数据流向和层结构,是理解Faster R-CNN实现细节的重要切入点。

网络输入部分

input: "data"
input_shape {
  dim: 1
  dim: 3
  dim: 224
  dim: 224
}

input: "rois"
input_shape {
  dim: 1 # to be changed on-the-fly to num ROIs
  dim: 5 # [batch ind, x1, y1, x2, y2] zero-based indexing
}

网络定义了两个输入层:

  1. data输入:处理原始图像数据,形状为1×3×224×224,表示批大小为1、3通道、224×224分辨率的图像
  2. rois输入:接收区域建议(Region of Interest),形状为1×5,其中5维表示[批次索引, x1, y1, x2, y2],使用零基坐标

值得注意的是,rois的第一个维度会在运行时根据实际ROI数量动态调整。

卷积特征提取部分(conv1-conv5)

ZF网络的前五层卷积构成了特征提取器,这部分结构如下:

conv1层

  • 7×7卷积核,输出96个特征图
  • 步长为2,padding为3
  • 后接ReLU激活和LRN(Local Response Normalization)归一化
  • 最大池化层(3×3核,步长2)
layer {
	name: "conv1"
	type: "Convolution"
	bottom: "data"
	top: "conv1"
	convolution_param {
		num_output: 96
		kernel_size: 7
		pad: 3
		stride: 2
	}
}

conv2层

  • 5×5卷积核,输出256个特征图
  • 步长为2,padding为2
  • 同样后接ReLU、LRN和最大池化

conv3-conv5层

  • 采用更小的3×3卷积核
  • conv3输出384个特征图
  • conv4输出384个特征图
  • conv5输出256个特征图
  • 这些层都使用步长1和padding 1,保持空间分辨率不变

这种设计遵循了经典的卷积神经网络架构,随着网络深度增加,特征图数量增多而空间分辨率降低。

RCNN部分(区域分类与回归)

这部分实现了Faster R-CNN的核心创新之一:区域建议网络(RPN)生成候选区域后,对每个区域进行分类和边界框回归。

ROI Pooling层

layer {
  name: "roi_pool_conv5"
  type: "ROIPooling"
  bottom: "conv5"
  bottom: "rois"
  top: "roi_pool_conv5"
  roi_pooling_param {
    pooled_w: 6
    pooled_h: 6
    spatial_scale: 0.0625 # 1/16
  }
}
  • 将不同大小的ROI区域池化为固定大小(6×6)
  • spatial_scale=0.0625(1/16)表示相对于输入图像,特征图缩小了16倍

全连接层

  • fc6和fc7都是4096维的全连接层
  • 每层后接ReLU激活和Dropout(测试时Dropout实际不生效)
layer {
  name: "fc6"
  type: "InnerProduct"
  bottom: "roi_pool_conv5"
  top: "fc6"
  inner_product_param {
    num_output: 4096
  }
}

输出层

  1. cls_score:21维全连接层,对应PASCAL VOC的20类+背景类
  2. bbox_pred:84维全连接层,为每个类别预测边界框偏移量(4×21)
  3. cls_prob:对cls_score应用Softmax得到类别概率
layer {
  name: "cls_score"
  type: "InnerProduct"
  bottom: "fc7"
  top: "cls_score"
  inner_product_param {
    num_output: 21
  }
}

技术要点解析

  1. 测试与训练的区别:测试网络不包含损失层,Dropout层在测试时不起作用(scale_train: false)

  2. 多任务输出:同时输出类别概率和边界框回归值,体现了Faster R-CNN的多任务学习特性

  3. 特征共享:整个网络共享卷积特征提取器,RCNN部分处理的是共享特征图上提取的ROI

  4. 尺度处理:通过spatial_scale参数将原始图像坐标映射到特征图坐标

总结

py-faster-rcnn中的ZF测试网络结构展示了Faster R-CNN模型在推理阶段的工作流程:首先通过卷积网络提取图像特征,然后对RPN生成的候选区域进行ROI Pooling,最后通过全连接网络完成分类和回归。这种设计实现了端到端的目标检测,同时保持了较高的效率和准确性。理解这一结构对于深入掌握Faster R-CNN算法原理和实现细节至关重要。