在执行macOS Sierra (10.12.4)下Caffe通过Python接口加载binaryproto格式的均值文件的时候,最后报告错误:
		
		
			
			
			
			
				
					
				| 
					
				 | 
						Traceback (most recent call last):   File "analysis_memnet.py", line 29, in <module>     detector = caffe.Detector(model_def, pretrained_model, mean=means)   File "/Users/Source/caffe/distribute/python/caffe/detector.py", line 46, in __init__     self.transformer.set_mean(in_, mean)   File "/Users/Source/caffe/distribute/python/caffe/io.py", line 259, in set_mean     raise ValueError('Mean shape incompatible with input shape.') ValueError: Mean shape incompatible with input shape.  | 
					
				
			 
		 
这个错误发生的原因是由于memnet提供的均值文件是256*256的,但是提供的配置文件却是227*227的,导致在io.py里面的代码在进行判断的时候发生异常。调整源代码中的python/caffe/io.py里面的代码:
		
		
			
			
			
			
				
					
				
					1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25  
				 | 
						    def set_mean(self, in_, mean):         """         Set the mean to subtract for centering the data.           Parameters         ----------         in_ : which input to assign this mean.         mean : mean ndarray (input dimensional or broadcastable)         """         self.__check_input(in_)         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')             if ms != self.inputs[in_][1:]:                 raise ValueError('Mean shape incompatible with input shape.')         self.mean[in_] = mean  | 
					
				
			 
		 
调整为:
		
		
			
			
			
			
				
					
				
					1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29  
				 | 
						    def set_mean(self, in_, mean):         """         Set the mean to subtract for centering the data.           Parameters         ----------         in_ : which input to assign this mean.         mean : mean ndarray (input dimensional or broadcastable)         """         self.__check_input(in_)         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')             if ms != self.inputs[in_][1:]:                 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.')         self.mean[in_] = mean  | 
					
				
			 
		 
调整完成后,需要重新编译Caffe:
		
		
			
			
			
			
				
					
				| 
					
				 | 
						$ make clean $ make $ make pycaffe $ make distribute  | 
					
				
			 
		 
参考链接