转自:https://www.cnblogs.com/wind-chaser/p/11355002.html
了解一下roi_pooling/src/roi_pooling.c中C代码:
1.关于头文件TH/TH.h
#include<TH/TH.h>包括了 pytorch C 代码数据结构和函数的声明,这是pytorch底层接口。
2.roi_pooling_forward的参数
1 int roi_pooling_forward(int pooled_height, int pooled_width, float spatial_scale,
2 THFloatTensor * features, THFloatTensor * rois, THFloatTensor * output)
pooled_height pooling后的高;
pooled_width pooling后的宽;
spatial_scale 空间尺度,输入图片与feature map之前的比值,这个feature map指roi pooling层的输入;
features 第一个网络卷积后的特征图;
rois 所有感兴趣区域;
output 指的是pooling后的结果?
3.函数里面的变量
1 // Grab the input tensor
2 float * data_flat = THFloatTensor_data(features);
3 float * rois_flat = THFloatTensor_data(rois);
4
5 float * output_flat = THFloatTensor_data(output);
把这几个参数值提取出来。在C里面就是开辟一块连续的内存来存储这些数据。
THFloatTensor_data作用就是提取值吧。
1 // Number of ROIs
2 int num_rois = THFloatTensor_size(rois, 0);
3 int size_rois = THFloatTensor_size(rois, 1);
根据上面代码rois信息包括num_rois和size_rois,即感兴趣区域的数量和大小(这里的大小指的是roi的大小,准确的说是占据的内存区域)。
1 // batch size
2 int batch_size = THFloatTensor_size(features, 0);
3 if(batch_size != 1)
4 {
5 return 0;
6 }
7 // data height
8 int data_height = THFloatTensor_size(features, 1);
9 // data width
10 int data_width = THFloatTensor_size(features, 2);
11 // Number of channels
12 int num_channels = THFloatTensor_size(features, 3);
features信息包括batch_size,data_height,data_width,num_channels即批尺寸,特征数据高度,特征数据宽度,特征的通道数。
1 // Set all element of the output tensor to -inf.
2 THFloatStorage_fill(THFloatTensor_storage(output), -1);
开始是把所有输出张量的元素设置为负无穷。
接下来就要对每个ROI进行max pool了。
// For each ROI R = [batch_index x1 y1 x2 y2]: max pool over R
int index_roi = 0;
int index_output = 0;
int n;
for (n = 0; n < num_rois; ++n)
初始化roi索引是0;初始化输出索引是0。然后开始遍历所有的感兴趣区域。
1 int roi_batch_ind = rois_flat[index_roi + 0];
2 int roi_start_w = round(rois_flat[index_roi + 1] * spatial_scale);
3 int roi_start_h = round(