FasterRCNN 继承基类 GeneralizedRCNN(GeneralizedRCNN代码-CSDN博客)
class FasterRCNN(GeneralizedRCNN):
def __init__(self, backbone, num_classes=None,
# transform parameters
min_size=800, max_size=1333,
image_mean=None, image_std=None,
):
"""
初始化函数,定义了 GeneralizedRCNN 类的属性和转换参数
参数:
backbone: 主干网络,用于从输入图像中提取特征
num_classes: 目标类别的数量
min_size: 输入图像的最小尺寸,用于图像变换
max_size: 输入图像的最大尺寸,用于图像变换
image_mean: 输入图像的均值,用于图像标准化
image_std: 输入图像的标准差,用于图像标准化
"""
# RPN parameters
rpn_anchor_generator=None, # RPN 锚框生成器
rpn_head=None, # RPN 头部
rpn_pre_nms_top_n_train=2000, # 训练时 RPN 预 NMS 的 top N
rpn_pre_nms_top_n_test=1000, # 测试时 RPN 预 NMS 的 top N
rpn_post_nms_top_n_train=2000, # 训练时 RPN 后 NMS 的 top N
rpn_post_nms_top_n_test=1000, # 测试时 RPN 后 NMS 的 top N
rpn_nms_thresh=0.7, # RPN NMS 阈值
rpn_fg_iou_thresh=0.7, # RPN 前景 IOU 阈值
rpn_bg_iou_thresh=0.3, # RPN 背景 IOU 阈值
rpn_batch_size_per_image=256, # 每张图像 RPN 的正负样本数量
rpn_positive_fraction=0.5, # RPN 正样本比例
# Box parameters
box_roi_pool=None, # RoI Pooling 操作,用于提取感兴趣区域的特征
box_head=None, # 感兴趣区域头部,用于对感兴趣区域进行分类和定位
box_predictor=None, # 预测器,用于预测感兴趣区域的类别和边界框
box_score_thresh=0.05, # 边界框得分阈值,用于过滤低置信度的边界框
box_nms_thresh=0.5, # 边界框 NMS 阈值,用于合并重叠边界框
box_detections_per_img=100, # 每张图像的最大检测数
box_fg_iou_thresh=0.5, # 感兴趣区域头部前景 IOU 阈值
box_bg_iou_thresh=0.5, # 感兴趣区域头部背景 IOU 阈值
box_batch_size_per_image=512, # 每张图像感兴趣区域头部的正负样本数量
box_positive_fraction=0.25, # 感兴趣区域头部正样本比例
bbox_reg_weights=None, # 边界框回归权重
out_channels = backbone.out_channels
if rpn_anchor_generator is None:
# 如果未提供锚框生成器,则设置默认的锚框尺寸和宽高比
anchor_sizes = ((32,), (64,), (128,), (256,), (512,))
aspect_ratios = ((0.5, 1.0, 2.0),) * len(anchor_sizes)
# 创建一个 AnchorGenerator 对象作为默认的锚框生成器
rpn_anchor_generator = AnchorGenerator(
anchor_sizes, aspect_ratios
if rpn_head is None:
# 如果未提供 RPN 头部,则创建一个默认的 RPN 头部
# 使用输出通道数和锚框生成器的锚框数量来初始化 RPN 头部
rpn_head = RPNHead(
out_channels, rpn_anchor_generator.num_anchors_per_location()[0]
)
# 将 RPN 预 NMS 和后 NMS 的 top N 数量封装为字典
rpn_pre_nms_top_n = dict(training=rpn_pre_nms_top_n_train, testing=rpn_pre_nms_top_n_test)
rpn_post_nms_top_n = dict(training=rpn_post_nms_top_n_train, testing=rpn_post_nms_top_n_test)
# 创建区域建议网络(RPN)
rpn = RegionProposalNetwork(
rpn_anchor_generator, # 锚框生成器
rpn_head, # RPN 头部
rpn_fg_iou_thresh, # RPN 前景 IOU 阈值
rpn_bg_iou_thresh, # RPN 背景 IOU 阈值
rpn_batch_size_per_image, # 每张图像 RPN 的正负样本数量
rpn_positive_fraction, # RPN 正样本比例
rpn_pre_nms_top_n, # RPN 预 NMS 的 top N 数量
rpn_post_nms_top_n, # RPN 后 NMS 的 top N 数量
rpn_nms_thresh # RPN NMS 阈值
)
if box_roi_pool is None:
# 如果未提供感兴趣区域的 ROI 池化操作,则创建一个默认的 MultiScaleRoIAlign 对象
# 使用指定的特征图名称、输出大小和采样比率来初始化
box_roi_pool = MultiScaleRoIAlign(
featmap_names=['0', '1', '2', '3'], # 使用的特征图名称
output_size=7, # 输出大小
sampling_ratio=2 # 采样比率 )
if box_head is None:
# 如果未提供感兴趣区域的头部,则创建一个默认的 TwoMLPHead 对象
# 使用指定的输入特征维度和表示维度来初始化
resolution = box_roi_pool.output_size[0] # ROI 池化输出的分辨率
representation_size = 1024 # 表示维度
# 计算输入特征的维度
input_size = out_channels * resolution ** 2
# 创建 TwoMLPHead 对象
box_head = TwoMLPHead(
input_size, # 输入特征的维度
representation_size # 表示维度
)
if box_predictor is None:
# 如果未提供感兴趣区域的预测器,则创建一个默认的 FastRCNNPredictor 对象
# 使用指定的表示维度和类别数量来初始化
representation_size = 1024 # 表示维度
# 创建 FastRCNNPredictor 对象
box_predictor = FastRCNNPredictor(
representation_size, # 表示维度
num_classes # 类别数量
)
# 创建感兴趣区域头部(RoIHeads)
roi_heads = RoIHeads(
# Box
box_roi_pool, # 感兴趣区域的 ROI 池化操作
box_head, # 感兴趣区域的头部
box_predictor, # 感兴趣区域的预测器
box_fg_iou_thresh, # 感兴趣区域头部前景 IOU 阈值
box_bg_iou_thresh, # 感兴趣区域头部背景 IOU 阈值
box_batch_size_per_image, # 每张图像感兴趣区域头部的正负样本数量
box_positive_fraction, # 感兴趣区域头部正样本比例
bbox_reg_weights, # 边界框回归权重
box_score_thresh, # 边界框得分阈值
box_nms_thresh, # 边界框 NMS 阈值
box_detections_per_img # 每张图像的最大检测数
)
if image_mean is None:
# 如果未提供图像均值,则使用默认的图像均值
image_mean = [0.485, 0.456, 0.406]
if image_std is None:
# 如果未提供图像标准差,则使用默认的图像标准差
image_std = [0.229, 0.224, 0.225]
# 创建图像转换对象
transform = GeneralizedRCNNTransform(min_size, max_size, image_mean, image_std)
# 调用父类初始化方法
super(FasterRCNN, self).__init__(backbone, rpn, roi_heads, transform)