gluoncv.nn¶
神经网络组件。
提示
此处列出的并非所有组件都是 HybridBlock,这意味着其中一些是不可混合化的。但是,我们正尽最大努力确保推理期间所需的组件是可混合化的,以便整个网络可以导出并在其他语言中运行。
例如,编码器通常不可混合化,但仅在训练期间需要。相比之下,解码器大多是 HybridBlock
。
编码器和解码器¶
编码器用于在应用损失函数之前对训练目标进行编码。解码器用于通过反转编码器中的操作来恢复预测值。它们通常成对出现以确保结果一致。
使用归一化的中心偏移量对边界框训练目标进行编码。 |
|
使用归一化的中心偏移量对边界框训练目标进行解码。 |
|
根据匹配结果对分类训练目标进行编码。 |
|
解码分类结果。 |
|
解码分类结果。 |
|
为 SigmoidCrossEntropy 损失编码类别预测标签。 |
采样器¶
采样器常用于匹配层之后,用于确定正样本/负样本/忽略样本。
例如,NaiveSampler 简单地将所有匹配的样本作为正样本返回,所有未匹配的样本作为负样本返回。
这种行为有时容易出现问题,因为训练目标是不平衡的。有关更高级的采样策略,请参阅 OHEMSampler 和 QuotaSampler。
一个简单的采样器,采用所有现有的匹配结果。 |
|
一个实现在线难例挖掘 (Online Hard-negative mining) 的采样器。 |
|
处理正样本和负样本有限配额的采样器。 |
API 参考¶
边界框操作符
-
class
gluoncv.nn.bbox.
BBoxArea
(axis=- 1, fmt='corner', **kwargs)[source]¶ 计算边界框的面积。
- 参数
- 返回值
- 返回类型
BxNx1 NDArray
-
class
gluoncv.nn.bbox.
BBoxBatchIOU
(axis=- 1, fmt='corner', offset=0, eps=1e-15, **kwargs)[source]¶ 批量边界框 IOU。
- 参数
-
class
gluoncv.nn.bbox.
BBoxCenterToCorner
(axis=- 1, split=False)[source]¶ 将中心框转换为角点框。角点框编码为 (xmin, ymin, xmax, ymax) 中心框编码为 (center_x, center_y, width, height)
- 参数
- 返回值
- 返回类型
如果 split 为 False,则返回 BxNx4 NDArray,如果 split 为 True,则返回 4 个 BxNx1 NDArray。
-
class
gluoncv.nn.bbox.
BBoxClipToImage
(**kwargs)[source]¶ 将边界框坐标裁剪到图像边界。如果提供并填充了多张图像,则必须有表示精确图像形状的额外输入。
-
class
gluoncv.nn.bbox.
BBoxCornerToCenter
(axis=- 1, split=False)[source]¶ 将角点框转换为中心框。角点框编码为 (xmin, ymin, xmax, ymax) 中心框编码为 (center_x, center_y, width, height)
- 参数
- 返回值
- 返回类型
如果 split 为 False,则返回 BxNx4 NDArray,如果 split 为 True,则返回 4 个 BxNx1 NDArray
-
class
gluoncv.nn.bbox.
BBoxSplit
(axis, squeeze_axis=False, **kwargs)[source]¶ 将边界框分割成 4 列。
- 参数
axis (int, 默认为 -1) – 分割边界框所在的轴。默认为 -1 (最后一个维度)。
squeeze_axis (布尔值, 默认为 False) – 如果为 True,则从输出数组的形状中移除长度为 1 的轴。注意,将 squeeze_axis 设置为
true
仅在分割所在的 axis 上移除长度为 1 的轴。此外,只有当input.shape[axis] == num_outputs
时才能将 squeeze_axis 设置为true
。
-
class
gluoncv.nn.bbox.
NumPyBBoxCornerToCenter
(axis=- 1, split=False)[source]¶ 使用 numpy 将角点框转换为中心框。角点框编码为 (xmin, ymin, xmax, ymax) 中心框编码为 (center_x, center_y, width, height)
编码器和解码器函数。编码器在训练期间使用,用于分配训练目标。解码器在测试/验证期间使用,用于将预测结果转换回正常框等。
-
class
gluoncv.nn.coder.
MultiClassDecoder
(axis=- 1, thresh=0.01)[source]¶ 解码分类结果。
此解码器必须与 MultiClassEncoder 配合使用才能重构有效的标签。解码器期望的结果是 logits 之后的结果,例如 Softmax。
- 参数
-
class
gluoncv.nn.coder.
MultiClassEncoder
(ignore_label=- 1)[source]¶ 根据匹配结果对分类训练目标进行编码。
此编码器将匹配的边界框的训练目标分配为真实框标签 + 1,负样本分配为标签 0。忽略的样本将分配 ignore_label,默认值为 -1。
- 参数
ignore_label (float) – 分配给未匹配的样本,它们在训练期间既不是正样本也不是负样本,应在损失函数中排除。默认为 -1。
-
class
gluoncv.nn.coder.
MultiPerClassDecoder
(num_class, axis=- 1, thresh=0.01)[source]¶ 解码分类结果。
此解码器必须与 MultiClassEncoder 配合使用才能重构有效的标签。解码器期望的结果是 logits 之后的结果,例如 Softmax。此版本与
gluoncv.nn.coder.MultiClassDecoder
的区别如下:对于每个位置(锚框),每个前景类别都可以有自己的结果,而不是强制只能有一个最佳结果。例如,对于一个包含背景的 5 类别预测(总共 6 个类别),比如 (0.5, 0.1, 0.2, 0.1, 0.05, 0.05) 分别代表 (bg, apple, orange, peach, grape, melon),MultiClassDecoder 只会产生一个类别 id 和分数,即 (orange-0.2)。MultiPerClassDecoder 会单独产生 5 个结果:(apple-0.1, orange-0.2, peach-0.1, grape-0.05, melon-0.05)。
- 参数
-
class
gluoncv.nn.coder.
NormalizedBoxCenterDecoder
(stds=(0.1, 0.1, 0.2, 0.2), convert_anchor=False, clip=None, minimal_opset=False)[source]¶ 使用归一化的中心偏移量对边界框训练目标进行解码。此解码器必须与具有相同 stds 的 NormalizedBoxCenterEncoder 配合使用,才能获得正确重构的边界框。
返回的边界框使用角点类型:x_{min}, y_{min}, x_{max}, y_{max}。
- 参数
-
class
gluoncv.nn.coder.
NormalizedBoxCenterEncoder
(stds=(0.1, 0.1, 0.2, 0.2), means=(0.0, 0.0, 0.0, 0.0), **kwargs)[source]¶ 使用归一化的中心偏移量对边界框训练目标进行编码。
输入边界框使用角点类型:x_{min}, y_{min}, x_{max}, y_{max}。
- 参数
stds (大小为 4 的类似数组) – 用于除以编码值的标准差值,默认为 (0.1, 0.1, 0.2, 0.2)。
means (大小为 4 的类似数组) – 从编码值中减去的均值,默认为 (0., 0., 0., 0.)。
-
hybrid_forward
(F, samples, matches, anchors, refs)[source]¶ 由于使用了 matches.shape,不是 HybridBlock
- 参数
samples ((B, N) 值 +1 (正样本), -1 (负样本), 0 (忽略)) –
matches ((B, N) 值范围 [0, M)) –
anchors ((B, N, 4) 以角点编码) –
refs ((B, M, 4) 以角点编码) –
- 返回值
targets ((B, N, 4) 根据匹配结果将锚框转换为选定的 refs)
masks ((B, N, 4) 只有正样本锚框有目标)
-
class
gluoncv.nn.coder.
NormalizedPerClassBoxCenterEncoder
(num_class, max_pos=128, per_device_batch_size=1, stds=(0.1, 0.1, 0.2, 0.2), means=(0.0, 0.0, 0.0, 0.0))[source]¶ 使用归一化的中心偏移量对边界框训练目标进行编码。
输入边界框使用角点类型:x_{min}, y_{min}, x_{max}, y_{max}。
- 参数
-
hybrid_forward
(F, samples, matches, anchors, labels, refs, means=None, stds=None)[source]¶ 按类别编码 BBox (每个类别一个条目)
- 参数
samples ((B, N) 值 +1 (正样本), -1 (负样本), 0 (忽略)) –
matches ((B, N) 值范围 [0, M)) –
anchors ((B, N, 4) 以角点编码) –
labels ((B, N) 值范围 [0, self._num_class), 不包含背景) –
refs ((B, M, 4) 以角点编码) –
- 返回值
targets ((B, N_pos, C, 4) 根据匹配结果将锚框转换为选定的 refs)
masks ((B, N_pos, C, 4) 只有正确类别的正样本锚框有目标)
indices ((B, N_pos) 正样本索引)
-
class
gluoncv.nn.coder.
NumPyNormalizedBoxCenterEncoder
(stds=(0.1, 0.1, 0.2, 0.2), means=(0.0, 0.0, 0.0, 0.0))[source]¶ 使用 numpy 通过归一化中心偏移量对边界框训练目标进行编码。
输入边界框使用角点类型:x_{min}, y_{min}, x_{max}, y_{max}。
- 参数
stds (大小为 4 的类似数组) – 用于除以编码值的标准差值,默认为 (0.1, 0.1, 0.2, 0.2)。
means (大小为 4 的类似数组) – 从编码值中减去的均值,默认为 (0., 0., 0., 0.)。
特征提取块。特征或多特征提取是目标检测中的关键组件。类别预测器/框预测器通常应用于特征层。良好的特征提取机制对性能至关重要。
-
class
gluoncv.nn.feature.
FPNFeatureExpander
(network, outputs, num_filters, use_1x1=True, use_upsample=True, use_elewadd=True, use_p6=False, p6_conv=True, no_bias=True, pretrained=False, norm_layer=None, norm_kwargs=None, ctx=cpu(0), inputs=('data'))[source]¶ 带有附加层的特征提取器。这是专门为实现自上而下通路和横向连接的目标检测特征金字塔网络指定的。
- 参数
network (str 或 HybridBlock 或 Symbol) – 逻辑链:如果 network 是字符串,则从 gluon.model_zoo.vision 加载。如果 network 是 HybridBlock,则转换为 Symbol。
outputs (str 或 str 列表) – 要提取为特征的层的名称
num_filters (int 列表 e.g. [256, 256, 256, 256]) – 要附加的滤波器数量。
use_1x1 (bool) – 是否使用 1x1 卷积
use_upsample (bool) – 是否使用上采样
use_elewadd (float) – 是否使用逐元素相加操作
use_p6 (bool) – 是否使用 P6 阶段,这用于原始论文中的 RPN 实验
p6_conv (bool) – 如果启用 P6 阶段,是否使用卷积,或者仅使用最大池化。
no_bias (bool) – 卷积操作是否使用偏置。
norm_layer (HybridBlock 或 SymbolBlock) – 归一化层类型。
norm_kwargs (dict) – 归一化层的参数。
pretrained (bool) – 如果为 True,则使用 gluon.model_zoo 中的预训练参数。
ctx (Context) – 上下文,例如 mxnet.cpu(), mxnet.gpu(0)。
inputs (str 列表) – 网络输入变量的名称。
-
class
gluoncv.nn.feature.
FeatureExpander
(network, outputs, num_filters, use_1x1_transition=True, use_bn=True, reduce_ratio=1.0, min_depth=128, global_pool=False, pretrained=False, ctx=cpu(0), inputs=('data'), **kwargs)[source]¶ 带有附加层的特征提取器。这在视觉网络中非常常见,其中额外的分支连接到骨干网络。
- 参数
network (str 或 HybridBlock 或 Symbol) – 逻辑链:如果 network 是字符串,则从 gluoncv.model_zoo 加载。如果 network 是 HybridBlock,则转换为 Symbol。
outputs (str 或 str 列表) – 要提取为特征的层的名称
num_filters (int 列表) – 要附加的滤波器数量。
use_1x1_transition (bool) – 附加层之间是否使用 1x1 卷积。它可以有效地减小网络大小。
use_bn (bool) – 附加层之间是否使用 BatchNorm。
reduce_ratio (float) – 过渡层的通道缩减比例。
min_depth (int) – 过渡层的最小通道数。
global_pool (bool) – 是否使用全局池化作为最后一层。
pretrained (bool) – 如果为 True,则使用 gluon.model_zoo 中的预训练参数。
ctx (Context) – 上下文,例如 mxnet.cpu(), mxnet.gpu(0)。
inputs (str 列表) – 网络输入变量的名称。
- pretrained (bool) – 如果为 True,则使用 gluon.model_zoo 中的预训练参数。
特征提取器。
用于分类/框预测的预测器。
-
class
gluoncv.nn.predictor.
ConvPredictor
(num_channel, kernel=(3, 3), pad=(1, 1), stride=(1, 1), activation=None, use_bias=True, in_channels=0, **kwargs)[source]¶ 卷积预测器。卷积预测器广泛用于目标检测。它可以用于预测分类分数(每个类别 1 个通道)或框预测器(通常每个框 4 个通道)。输出形状为 (N, num_channel, H, W)。
-
class
gluoncv.nn.predictor.
FCPredictor
(num_output, activation=None, use_bias=True, **kwargs)[source]¶ 全连接预测器。全连接预测器用于忽略空间信息,并将输出固定大小的预测。
- 参数
- activation (str, 可选) – 可选的激活函数,例如 ‘relu’。
重写此方法以构建此 Block 的符号图。
- 参数
x (Symbol 或 NDArray) – 第一个输入张量。
*args (Symbol 列表 或 NDArray 列表) – 额外的输入张量。
use_bias (bool) – 在全连接层中使用偏置。
- xNDArray 或 Symbol
结合多种策略的匹配器。
- 参数
形状为 (N, M) 的 IOU 重叠,支持批量处理。
- matchers (Matcher 列表) – Matcher 是用于匹配两组框的 Block/HybridBlock。
实现最大匹配策略的匹配器。
threshold (float) – 匹配阈值。
-
hybrid_forward
(F, x)[source]¶ 用于选择正样本/负样本/忽略样本的采样器。此模块用于在训练期间选择样本。根据不同的策略,我们希望选择不同数量的样本作为正样本、负样本或忽略(不关心)样本。目的是在某些情况下减轻训练目标不平衡的问题。采样器的输出是与匹配结果形状相同的 NDArray。注意:1 表示正样本,-1 表示负样本,0 表示忽略。
- 一个简单的采样器,采用所有现有的匹配结果。在这种情况下没有忽略的样本。
-
- 参数
class
gluoncv.nn.sampler.
OHEMSampler
(ratio, min_samples=0, thresh=0.5)[source]¶一个实现在线难例挖掘 (Online Hard-negative mining) 的采样器。如论文 https://arxiv.org/abs/1604.03540 所述。
ratio (float) – 负样本与正样本的比例。建议值 >= 1.0。
-
forward
(x, logits, ious)[source]¶ 处理正样本和负样本有限配额的采样器。
- 参数
num_sample (int, 默认值是 128) – RCNN 目标的样本数量。
pos_iou_thresh (float, 默认值是 0.5) – IOU 大于
pos_iou_thresh
的候选框被认为是正样本。neg_iou_thresh_high (float, 默认值是 0.5) – IOU 小于
neg_iou_thresh_high
且大于neg_iou_thresh_low
的候选框被认为是负样本。IOU 在pos_iou_thresh
和neg_iou_thresh
之间的候选框将被忽略。neg_iou_thresh_low (float, 默认值是 0.0) – 参见
neg_iou_thresh_high
。pos_ratio (float, 默认值是 0.25) –
pos_ratio
定义要采样的正样本数量(pos_ratio * num_sample
)。neg_ratio (float 或 None) –
neg_ratio
定义要采样的负样本数量(pos_ratio * num_sample
)。如果提供None
,则等于1 - pos_ratio
。fill_negative (bool) – 如果为
True
,负样本将填充正样本不足造成的空缺。例如,如果num_sample
是 100,pos_ratio
和neg_ratio
都为0.5
。可用的正样本和负样本数量分别是 10 和 10000,这是典型的值。现在,输出的正样本是 10(完整),因为这小于50(100 * 0.5)
,负样本将填充剩余的40
个位置。如果fill_negative == False
,这40
个位置将填充-1
(忽略)。
-
class
gluoncv.nn.sampler.
QuotaSamplerOp
(num_sample, pos_thresh, neg_thresh_high=0.5, neg_thresh_low=- inf, pos_ratio=0.5, neg_ratio=None, fill_negative=True)[source]¶ 处理正样本和负样本有限配额的采样器。
这是一个在 HybridBlock 中使用的自定义操作符。
- 参数
num_sample (int, 默认值是 128) – RCNN 目标的样本数量。
pos_iou_thresh (float, 默认值是 0.5) – IOU 大于
pos_iou_thresh
的候选框被认为是正样本。neg_iou_thresh_high (float, 默认值是 0.5) – IOU 小于
neg_iou_thresh_high
且大于neg_iou_thresh_low
的候选框被认为是负样本。IOU 在pos_iou_thresh
和neg_iou_thresh
之间的候选框将被忽略。neg_iou_thresh_low (float, 默认值是 0.0) – 参见
neg_iou_thresh_high
。pos_ratio (float, 默认值是 0.25) –
pos_ratio
定义要采样的正样本数量(pos_ratio * num_sample
)。neg_ratio (float 或 None) –
neg_ratio
定义要采样的负样本数量(pos_ratio * num_sample
)。如果提供None
,则等于1 - pos_ratio
。fill_negative (bool) – 如果为
True
,负样本将填充正样本不足造成的空缺。例如,如果num_sample
是 100,pos_ratio
和neg_ratio
都为0.5
。可用的正样本和负样本数量分别是 10 和 10000,这是典型的值。现在,输出的正样本是 10(完整),因为这小于50(100 * 0.5)
,负样本将填充剩余的40
个位置。如果fill_negative == False
,这40
个位置将填充-1
(忽略)。
-
backward
(req, out_grad, in_data, out_data, in_grad, aux)[source]¶ 反向传播接口。创建新操作符时可以覆盖此方法。
- 参数
req (str 列表) – 如何赋值给 in_grad。可以是 ‘null’、‘write’ 或 ‘add’。你可以选择使用 self.assign(dst, req, src) 来处理。
out_grad (NDArray 列表) – 反向传播的输入和输出。参见文档中对应的 Operator::Backward 参数。
in_data (NDArray 列表) – 反向传播的输入和输出。参见文档中对应的 Operator::Backward 参数。
out_data (NDArray 列表) – 反向传播的输入和输出。参见文档中对应的 Operator::Backward 参数。
in_grad (NDArray 列表) – 反向传播的输入和输出。参见文档中对应的 Operator::Backward 参数。
aux (NDArray 列表) – 反向传播的输入和输出。参见文档中对应的 Operator::Backward 参数。
-
class
gluoncv.nn.sampler.
QuotaSamplerProp
(num_sample, pos_thresh, neg_thresh_high=0.5, neg_thresh_low=0.0, pos_ratio=0.5, neg_ratio=None, fill_negative=True)[source]¶ QuotaSampleOp 的属性。
- 参数
num_sample (int, 默认值是 128) – RCNN 目标的样本数量。
pos_iou_thresh (float, 默认值是 0.5) – IOU 大于
pos_iou_thresh
的候选框被认为是正样本。neg_iou_thresh_high (float, 默认值是 0.5) – IOU 小于
neg_iou_thresh_high
且大于neg_iou_thresh_low
的候选框被认为是负样本。IOU 在pos_iou_thresh
和neg_iou_thresh
之间的候选框将被忽略。neg_iou_thresh_low (float, 默认值是 0.0) – 参见
neg_iou_thresh_high
。pos_ratio (float, 默认值是 0.25) –
pos_ratio
定义要采样的正样本数量(pos_ratio * num_sample
)。neg_ratio (float 或 None) –
neg_ratio
定义要采样的负样本数量(pos_ratio * num_sample
)。如果提供None
,则等于1 - pos_ratio
。fill_negative (bool) – 如果为
True
,负样本将填充正样本不足造成的空缺。例如,如果num_sample
是 100,pos_ratio
和neg_ratio
都为0.5
。可用的正样本和负样本数量分别是 10 和 10000,这是典型的值。现在,输出的正样本是 10(完整),因为这小于50(100 * 0.5)
,负样本将填充剩余的40
个位置。如果fill_negative == False
,这40
个位置将填充-1
(忽略)。
-
infer_shape
(in_shape)[source]¶ infer_shape 接口。创建新操作符时可以覆盖此方法。
- 参数
in_shape (列表) – 按 list_arguments 中声明的相同顺序排列的参数形状列表。
- 返回值
in_shape (列表) – 参数形状列表。可以从 in_shape 修改。
out_shape (列表) – 根据 in_shape 计算出的输出形状列表,按 list_outputs 中声明的相同顺序排列。
aux_shape (可选, 列表) – 根据 in_shape 计算出的 aux 形状列表,按 list_auxiliary_states 中声明的相同顺序排列。
-
infer_type
(in_type)[source]¶ infer_type 接口。覆盖此方法以创建新操作符
- 参数
in_type (np.dtype 列表) – 按 list_arguments 中声明的相同顺序排列的参数类型列表。
- 返回值
in_type (列表) – 参数类型列表。可以从 in_type 修改。
out_type (列表) – 根据 in_type 计算出的输出类型列表,按 list_outputs 中声明的相同顺序排列。
aux_type (可选, 列表) – 根据 in_type 计算出的 aux 类型列表,按 list_auxiliary_states 中声明的相同顺序排列。