使用したライブラリ
Q.7. 平均プーリング
ここでは画像をグリッド分割(ある固定長の領域に分ける)し、かく領域内(セル)の平均値でその領域内の値を埋める。 このようにグリッド分割し、その領域内の代表値を求める操作はPooling(プーリング) と呼ばれる。 これらプーリング操作はCNN(Convolutional Neural Network) において重要な役割を持つ。
これは次式で定義される。
v = 1/|R| * Sum_{i in R} v_i
ここではimori.jpgは128x128なので、8x8にグリッド分割し、平均プーリングせよ。
これも簡単ね。
struct RGB
{
RGB(int r, int g, int b)
{
this->r = r;
this->g = g;
this->b = b;
}
int r, g, b;
};
int main()
{
PPM ppm("imori.pnm");
int width = ppm.Get_width();
int height = ppm.Get_height();
PPM ppm2(width, height);
int N = 16;//分割数
int P = width / N;
auto grid_val = [&](int n, int m)//n,m:grid number
{
double r = 0, g = 0, b = 0;
int i0 = P * n;
int i1 = P * (n + 1);
int j0 = P * m;
int j1 = P * (m + 1);
for(int j=j0; j<j1; j++)
for (int i = i0; i < i1; i++)
{
r += ppm(i, j, 'r')/(double)(P*P);
g += ppm(i, j, 'g') / (double)(P * P);
b += ppm(i, j, 'b') / (double)(P * P);
}
return RGB(r, g, b);
};
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
int n = i / P;
int m = j / P;
RGB rgb = grid_val(n, m);
ppm2(i, j, 'r') = rgb.r;
ppm2(i, j, 'g') = rgb.g;
ppm2(i, j, 'b') = rgb.b;
}
ppm2.Flush("out.ppm");
return 0;
}