Reputation: 3854
I am using caffe in python to classify. I get code from here. In here, I just use simple code such as
plt.rcParams['figure.figsize'] = (10, 10)
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
mean_filename='./mean.binaryproto'
proto_data = open(mean_filename, "rb").read()
a = caffe.io.caffe_pb2.BlobProto.FromString(proto_data)
mean = caffe.io.blobproto_to_array(a)[0]
age_net_pretrained='./age_net.caffemodel'
age_net_model_file='./deploy_age.prototxt'
age_net = caffe.Classifier(age_net_model_file, age_net_pretrained,
mean=mean,
channel_swap=(2,1,0),
raw_scale=255,
image_dims=(256, 256))
However, I got error such as
Traceback (most recent call last):
File "cnn_age_gender_demo.py", line 25, in
image_dims=(256, 256))
File "/home/john/Downloads/caffe/python/caffe/classifier.py", line 34, in init
self.transformer.set_mean(in_, mean)
File "/home/john/Downloads/caffe/python/caffe/io.py", line 255, in set_mean
raise ValueError('Mean shape incompatible with input shape.')
ValueError: Mean shape incompatible with input shape.
Could you help me to reslove it? Thanks
Upvotes: 6
Views: 7064
Reputation: 81
Edit deploy_gender.prototxt and set: input_dim: 256 input_dim: 256
Don't know why it was written wrong...
Upvotes: 0
Reputation: 2422
I am pretty scared to rebuild the code as caffe installation did not come easy for me. But to fix, the solution to resize mean require in_shape (user8264's response), which is set internally in caffe/classifier.py
Anyway, I debugged and found the value for in_shape = (3, 227, 227) for age_net.caffemodel
So the model used for age and gender prediction would the following change:
age_net_pretrained='./age_net.caffemodel'
age_net_model_file='./deploy_age.prototxt'
age_net = caffe.Classifier(age_net_model_file, age_net_pretrained,
mean=mean,
channel_swap=(2,1,0),
raw_scale=255,
image_dims=(227, 227))
But mean needs to be modified first:
m_min, m_max = mean.min(), mean.max()
normal_mean = (mean - m_min) / (m_max - m_min)
in_shape=(227, 227)
mean = caffe.io.resize_image(normal_mean.transpose((1,2,0)),in_shape)
.transpose((2,0,1)) * (m_max - m_min) + m_min
This will get rid of "ValueError: Mean shape incompatible with input shape". But I am not sure about the accuracy though. Apparently, for me skipping mean parameter gave better age prediction :)
Upvotes: 0
Reputation: 11
I was having the same problem, based in the imagenet web demo I modified the script using this way to load the mean file in line 95
mean = np.load(args.mean_file).mean(1).mean(1)
Upvotes: 1
Reputation: 3070
Let go to line 253-254 in caffe/python/caffe/io.py Replace
if ms != self.inputs[in_][1:]:
raise ValueError('Mean shape incompatible with input shape.')
By
if ms != self.inputs[in_][1:]:
print(self.inputs[in_])
in_shape = self.inputs[in_][1:]
m_min, m_max = mean.min(), mean.max()
normal_mean = (mean - m_min) / (m_max - m_min)
mean = resize_image(normal_mean.transpose((1,2,0)),in_shape[1:]).transpose((2,0,1)) * (m_max - m_min) + m_min
#raise ValueError('Mean shape incompatible with input shape.')
Rebuild. Hope it help
Upvotes: 16