im2col

  • ์ด๋ฏธ์ง€๋ฅผ columns์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

im2col_get_pixel

float im2col_get_pixel(float *im, int height, int width, int channels,
                        int row, int col, int channel, int pad)
{
    row -= pad;
    col -= pad;

    if (row < 0 || col < 0 ||
        row >= height || col >= width) return 0;
    return im[col + width*(row + height*channel)];
}

ํ•จ์ˆ˜ ์ด๋ฆ„: im2col_get_pixel

์ž…๋ ฅ:

  • im: ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ(float *)

  • height: ์ด๋ฏธ์ง€ ๋†’์ด(int)

  • width: ์ด๋ฏธ์ง€ ๋„ˆ๋น„(int)

  • channels: ์ด๋ฏธ์ง€ ์ฑ„๋„ ์ˆ˜(int)

  • row: ํ”ฝ์…€์˜ ์„ธ๋กœ ์œ„์น˜(int)

  • col: ํ”ฝ์…€์˜ ๊ฐ€๋กœ ์œ„์น˜(int)

  • channel: ํ”ฝ์…€์ด ์œ„์น˜ํ•œ ์ฑ„๋„(int)

  • pad: ํŒจ๋”ฉ ํฌ๊ธฐ(int)

๋™์ž‘:

  • ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์œ„์น˜(row, col, channel)์— ํ•ด๋‹นํ•˜๋Š” ํ”ฝ์…€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ๋‹จ, ํŒจ๋”ฉ(pad)์ด ์ ์šฉ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, ํŒจ๋”ฉ ํฌ๊ธฐ๋งŒํผ ์œ„์น˜๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

  • ๋งŒ์•ฝ ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ์ง€์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ, 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์„ค๋ช…:

  • ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” im2col ์—ฐ์‚ฐ์—์„œ, ์ฃผ์–ด์ง„ ์œ„์น˜์— ๋Œ€์‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

  • ์ด ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ์œ„์น˜(row, col, channel)์—์„œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  • ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋Š” 1์ฐจ์› ๋ฐฐ์—ด๋กœ ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, row, col, channel ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

  • ๋‹จ, ํŒจ๋”ฉ์ด ์ ์šฉ๋œ ๊ฒฝ์šฐ, row์™€ col์—์„œ ํŒจ๋”ฉ์˜ ํฌ๊ธฐ(pad)๋ฅผ ๋บ€ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

im2col_cpu

//From Berkeley Vision's Caffe!
//https://github.com/BVLC/caffe/blob/master/LICENSE
void im2col_cpu(float* data_im,
     int channels,  int height,  int width,
     int ksize,  int stride, int pad, float* data_col)
{
    int c,h,w;
    int height_col = (height + 2*pad - ksize) / stride + 1;
    int width_col = (width + 2*pad - ksize) / stride + 1;

    int channels_col = channels * ksize * ksize;
    for (c = 0; c < channels_col; ++c) {
        int w_offset = c % ksize;
        int h_offset = (c / ksize) % ksize;
        int c_im = c / ksize / ksize;
        for (h = 0; h < height_col; ++h) {
            for (w = 0; w < width_col; ++w) {
                int im_row = h_offset + h * stride;
                int im_col = w_offset + w * stride;
                int col_index = (c * height_col + h) * width_col + w;
                data_col[col_index] = im2col_get_pixel(data_im, height, width, channels,
                        im_row, im_col, c_im, pad);
            }
        }
    }
}

ํ•จ์ˆ˜ ์ด๋ฆ„: im2col_cpu

์ž…๋ ฅ:

  • data_im: float ํฌ์ธํ„ฐ, ์ž…๋ ฅ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ํฌ์ธํ„ฐ

  • channels: int, ์ž…๋ ฅ ์ด๋ฏธ์ง€ ์ฑ„๋„ ์ˆ˜

  • height: int, ์ž…๋ ฅ ์ด๋ฏธ์ง€ ๋†’์ด

  • width: int, ์ž…๋ ฅ ์ด๋ฏธ์ง€ ๋„ˆ๋น„

  • ksize: int, ํ•„ํ„ฐ(์ปค๋„) ํฌ๊ธฐ

  • stride: int, ์ŠคํŠธ๋ผ์ด๋“œ ํฌ๊ธฐ

  • pad: int, ํŒจ๋”ฉ ํฌ๊ธฐ

  • data_col: float ํฌ์ธํ„ฐ, ๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ํฌ์ธํ„ฐ

๋™์ž‘:

  • ์ž…๋ ฅ ์ด๋ฏธ์ง€๋ฅผ ํ•„ํ„ฐ ํฌ๊ธฐ, ์ŠคํŠธ๋ผ์ด๋“œ, ํŒจ๋”ฉ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ im2col ๋ฐฉ์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ data_col์— ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

  • Caffe๋ผ๋Š” ๋จธ์‹ ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ๋กœ, ์ž…๋ ฅ ์ด๋ฏธ์ง€์˜ ๊ฐ ์ฑ„๋„์—์„œ ํ•„ํ„ฐ์˜ ํฌ๊ธฐ๋งŒํผ ์›€์ง์—ฌ๊ฐ€๋ฉฐ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ค๊ณ , ์œˆ๋„์šฐ ๋‚ด์˜ ๊ฐ’์„ ์ผ๋ ฌ๋กœ ๋Š˜์–ด๋†“์€ ๋‹ค์Œ, data_col์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์„ค๋ช…:

  • height_col: int, im2col ๋ณ€ํ™˜ ํ›„ ์ถœ๋ ฅ ์ด๋ฏธ์ง€ ๋†’์ด

  • width_col: int, im2col ๋ณ€ํ™˜ ํ›„ ์ถœ๋ ฅ ์ด๋ฏธ์ง€ ๋„ˆ๋น„

  • channels_col: int, im2col ๋ณ€ํ™˜ ํ›„ ์ถœ๋ ฅ ์ด๋ฏธ์ง€ ์ฑ„๋„ ์ˆ˜

  • c: int, channels_col ๋‚ด ํ˜„์žฌ ์ฑ„๋„ ์ธ๋ฑ์Šค

  • w_offset: int, ํ˜„์žฌ ์ฑ„๋„์—์„œ ํ•„ํ„ฐ์˜ ๋„ˆ๋น„ ์˜คํ”„์…‹

  • h_offset: int, ํ˜„์žฌ ์ฑ„๋„์—์„œ ํ•„ํ„ฐ์˜ ๋†’์ด ์˜คํ”„์…‹

  • c_im: int, ํ˜„์žฌ ์ฑ„๋„์—์„œ ์ž…๋ ฅ ์ด๋ฏธ์ง€ ์ฑ„๋„ ์ธ๋ฑ์Šค

  • h: int, ์ถœ๋ ฅ ์ด๋ฏธ์ง€์˜ ํ˜„์žฌ ๋†’์ด ์ธ๋ฑ์Šค

  • w: int, ์ถœ๋ ฅ ์ด๋ฏธ์ง€์˜ ํ˜„์žฌ ๋„ˆ๋น„ ์ธ๋ฑ์Šค

  • im_row: int, ์ž…๋ ฅ ์ด๋ฏธ์ง€ ๋‚ด ํ˜„์žฌ ์œ„์น˜์˜ ๋†’์ด ์ธ๋ฑ์Šค

  • im_col: int, ์ž…๋ ฅ ์ด๋ฏธ์ง€ ๋‚ด ํ˜„์žฌ ์œ„์น˜์˜ ๋„ˆ๋น„ ์ธ๋ฑ์Šค

  • col_index: int, ์ถœ๋ ฅ ์ด๋ฏธ์ง€ ๋‚ด ํ˜„์žฌ ์œ„์น˜์˜ ์ธ๋ฑ์Šค

  • im2col_get_pixel: im2col ๋ณ€ํ™˜์‹œ ํ˜„์žฌ ์œ„์น˜์—์„œ์˜ ํ”ฝ์…€ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜

Last updated

Was this helpful?