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