class RoIRingPoolFunction(Function):
def __init__(ctx, pooled_height, pooled_width, spatial_scale, scale_inner, scale_outer):
ctx.pooled_height = pooled_height
ctx.pooled_width = pooled_width
ctx.spatial_scale = spatial_scale
ctx.scale_inner = scale_inner
ctx.scale_outer = scale_outer
ctx.feature_size = None
def forward(ctx, features, rois):
ctx.feature_size = features.size()
batch_size, num_channels, data_height, data_width = ctx.feature_size
num_rois = rois.size(0)
output = features.new(num_rois, num_channels, ctx.pooled_height, ctx.pooled_width).zero_()
ctx.argmax = features.new(num_rois, num_channels, ctx.pooled_height, ctx.pooled_width).zero_().int()
ctx.rois = rois
ctx.processed_rois = features.new(rois.size(0), 9).zero_()
def backward(ctx, grad_output):
assert(ctx.feature_size is not None and grad_output.is_cuda)
batch_size, num_channels, data_height, data_width = ctx.feature_size
grad_input = grad_output.new(batch_size, num_channels, data_height, data_width).zero_()
roi_ring_pooling.roi_ring_pooling_backward_cuda(ctx.pooled_height, ctx.pooled_width, ctx.spatial_scale,
grad_output, ctx.processed_rois, grad_input, ctx.argmax)
return grad_input, None
RoIRingPoolFunction(cfg.POOLING_SIZE, cfg.POOLING_SIZE, 1. / 16., scale_inner, scale_outer)(bottom, rois)