ROIPool就是:
根据rois,在featrues上对每个roi(兴趣区域,目标框)maxpool出一个7*7的池化结果。
![bf89ce8ce0c7672c2f479f2e50c56349.png](https://i-blog.csdnimg.cn/blog_migrate/7ce7f9bded9a8e24dad762734d1ee409.jpeg)
主控函数:
ROIPool_cuda.cu(来源: https://github.com/facebookresearch/maskrcnn-benchmark)
std::tuple<at::Tensor, at::Tensor> ROIPool_forward_cuda(const at::Tensor& input,
const at::Tensor& rois,
const float spatial_scale,
const int pooled_height,
const int pooled_width) {
AT_ASSERTM(input.type().is_cuda(), "input must be a CUDA tensor");
AT_ASSERTM(rois.type().is_cuda(), "rois must be a CUDA tensor");
//input:从骨干网出来的featrues,典型的shape为(1,512,37,50)这样子,batch=1,
//支持batch>1的源码不多,如果骨干网用的是vgg16的话,channel=512,长宽被输入图片决定,一般都在40~50这样子
//rois:rpn提议的目标框,一般是128(也有取256的),1/4为正样本(32个),3/4为负样本
//spatial_scale=1/16=0.0625(骨干网用vgg16的话)
//pooled_height,pooled_width=7池化后的长宽
auto num_rois = rois.size(0);//num_rois=128(或256),1/4的正样本,3/4的负样本
auto channels = input.size(1);//channels =512(vgg16)或1024
auto height = input.size(2);
auto width = input.size(3);
//height 、width 大概在40~50那个样子
auto output = at::empty({
num_rois, channels, pooled_height, pooled_width}, input.options());
//存放池化结果
//num_rois目标框的个数不变,channels不变,需要的是7*7结果
auto output_size = num_rois * pooled_height * pooled_width * cha