관리 메뉴

HAMA 블로그

Caffe - binaryproto 형식의 mean 을 npy 로 바꾸기 본문

통계 & 머신러닝 & 딥러닝

Caffe - binaryproto 형식의 mean 을 npy 로 바꾸기

[하마] 이승현 (wowlsh93@gmail.com) 2016. 3. 17. 11:00

binaryproto -> npy 변경 함수 예시 

 
#!/usr/bin/env python
import caffe
import numpy as np
import sys


## proto / datum / ndarray conversion
def blobproto_to_array(blob, return_diff=False):
    """
    Convert a blob proto to an array. In default, we will just return the data,
    unless return_diff is True, in which case we will return the diff.
    """
    # Read the data into an array
    if return_diff:
        data = np.array(blob.diff)
    else:
        data = np.array(blob.data)

    # Reshape the array
    if blob.HasField('num') or blob.HasField('channels') or blob.HasField('height') or blob.HasField('width'):
        # Use legacy 4D shape
        return data.reshape(blob.num, blob.channels, blob.height, blob.width)  // bug ??
    else:
        return data.reshape(blob.shape.dim)



blob = caffe.proto.caffe_pb2.BlobProto()
data = open( './company_mean.binaryproto' , 'rb' ).read()
blob.ParseFromString(data)
arr = blobproto_to_array(blob)
np.save('./company_mean.npy', arr)


문제 발생 !!!

위의 함수는 python/caffe 안의 io.py 에 있는 blobproto_to_array 를 활용한것인데, 이렇게 npy 로 바꾼 
mean 파일가지고 caffe 를 실행하면 raise ValueError('Mean shape invalid') 예외가 뜨더라. 
에러메세지를 살펴보니 set_mean 함수 내부에서 나온 예외인데 

 def set_mean(self, in_, mean):

     

        ms = mean.shape

        if mean.ndim == 1:

            # broadcast channels

            if ms[0] != self.inputs[in_][1]:

                raise ValueError('Mean channels incompatible with input.')

            mean = mean[:, np.newaxis, np.newaxis]

        else:

            # elementwise mean

            if len(ms) == 2:

                ms = (1,) + ms

            if len(ms) != 3:

                raise ValueError('Mean shape invalid')

            

보다시피 ms 의 크기가 3이 아니라서 나온것이다.  
저 ms 의 크기는 첫번째 예제 소스의  data.reshape(blob.num, blob.channels, blob.height, 
blob.width) 에서 만들어지는데 첫번째 인자인 blob.num 를  제외하니깐 예외는 없어졌다.
즉 원래 이미지와 mean 이미지를 조합할때 channels, height,width 만 필요한데, num 가 들어가서 
길이가 4가 되버려서 문제가 된 이다.


Comments