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가 되버려서 문제가 된 것이다.
'통계 & 머신러닝 & 딥러닝' 카테고리의 다른 글
| 구글 vision API 인식테스트 (0) | 2016.04.06 |
|---|---|
| Deeplearning 에 대한 수학 강의 (0) | 2016.04.02 |
| Caffe - Layer 들 ( Pooling, LRN, ReLU 등 ) (0) | 2016.03.16 |
| Caffe - Fine Tuning (0) | 2016.03.15 |
| Caffe 에서 이미 제공하는 모델 ( Model Zoo ) 정리 (0) | 2016.03.13 |