2017-11-06 16 views
0

모양 배열 (28 * 28)을 0으로 패딩하려고합니다. 이 배열은 PIL 라이브러리를 사용하여 이미지를 배열로 변환 한 결과입니다. OpenCL을 사용하여 커널을 작성했습니다. 이 프로그램은 무작위 numpy 배열에 대해서는 정상적으로 작동하지만 이미지에서 변환 된 배열에서는 제대로 작동하지 않습니다. 그러나, 이미지는 어레이로 적절하게 변환되고, 즉, 원하는 픽셀 값을 출력한다. 문제가 커널 내부의 데이터 유형과 비슷한 상황에서 발생했습니다 (float를 double로 변경해야 함). 나는이 코드 조각을 실행할 때opencl - 패딩이 다른 출력을 생성합니다.

import numpy 
from PIL import Image 
from numpy import array 
import pyopencl as cl 

def pad(x, order): 
    kernelsource = """ 
    __kernel void pad(
    __global double* A, 
    __global double* B, 
    const unsigned int M) 
    { 
     int i = get_global_id(0); 
     int j = get_global_id(1); 

     if((i<M) && (j<M)) 
     { 

      if((j == 0) || (j == M-1) || (i == 0) || (i == M-1)) 
      { 
       B[i*M + j] = 0; 
      }else{ 
       B[i*M + j] = A[(i-1)*(M-2) + j-1]; 
      }   
     } 
    } 
    """ 
    context = cl.create_some_context() 
    queue = cl.CommandQueue(context) 
    program = cl.Program(context, kernelsource).build() 

    out_order = order + 2 

    h_a = x 
    d_a = cl.Buffer(context, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=h_a) 

    h_b = numpy.empty((out_order,out_order)) 
    d_b = cl.Buffer(context, cl.mem_flags.WRITE_ONLY, h_b.nbytes) 

    pad = program.pad 
    pad.set_scalar_arg_dtypes([None, None, numpy.uint32]) 

    pad(queue, h_b.shape, None, d_a, d_b, out_order) 
    queue.finish() 
    cl.enqueue_copy(queue, h_b, d_b) 

    return h_b 

:이를 실행하는 동안,

[[ 0.   0.   0.   0.   0.  ] 
[ 0.   0.75495661 0.58017939 0.61390089 0.  ] 
[ 0.   0.33017635 0.98233609 0.77542593 0.  ] 
[ 0.   0.94607981 0.6020772 0.14673336 0.  ] 
[ 0.   0.   0.   0.   0.  ]] 

:하지만

arr = numpy.random.rand(3,3) 
print pad(arr,3) 

을 내가 올바른 결과를 얻을

image = Image.open('1.jpg') 

data = array(image) 

print pad(data,data.shape[0]) 

내가 얻을 this :

[[ 0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000] 
[ 0.00000000e+000 -4.73788662e+226 -5.14319684e+303 -1.27732501e+294 
-1.27733779e+294 -1.27701620e+294 -8.36396791e+298    nan 
-1.96381395e+289 -1.68533731e+308    nan 3.62029008e-217 
       nan -1.79768197e+308    nan 5.97554844e-311 
-7.58630869e+298 2.78134240e-309 2.17953307e-289    nan 
    7.74667808e-304    nan 3.19854370e-308    nan 
    5.77663315e-275 7.29111854e-304 8.34430283e-309 1.09916879e-311 
-7.22416349e+221 0.00000000e+000] 

... 
... 
[ 0.00000000e+000 5.43230923e-311 7.38794055e-310 5.43230922e-312 
    6.51877107e-311 8.47440239e-310 5.43230922e-312 1.08646185e-310 
    9.56086424e-310 5.43230922e-312 1.19510803e-310 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    6.36598737e-314 1.58101007e-322 0.00000000e+000 3.16202013e-322 
    2.47032823e-322 0.00000000e+000 4.94065646e-324 0.00000000e+000 
    6.36598738e-314 0.00000000e+000] 
[ 0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000 
    0.00000000e+000 0.00000000e+000]] 

무엇이 잘못 되었나요? 데이터 유형에 문제가 있습니까?

답변

1

앞서 언급했듯이 데이터 유형이 일치하지 않습니다. 그래서, 입력 배열은 dtype double로 변환되어야했습니다. 코드 :

image = Image.open('1.jpg') 

data = array(image,dtype="double") 

print pad(data,data.shape[0])