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:
- return np.array(blob.diff).reshape(*blob.shape.dim)
+ data = np.array(blob.diff)
else:
- return np.array(blob.data).reshape(*blob.shape.dim)
+ 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)
+ else:
+ return data.reshape(blob.shape.dim)
def array_to_blobproto(arr, diff=None):
"""Converts a N-dimensional array to blob proto. If diff is given, also
--- /dev/null
+import numpy as np
+import unittest
+
+import caffe
+
+class TestBlobProtoToArray(unittest.TestCase):
+
+ def test_old_format(self):
+ data = np.zeros((10,10))
+ blob = caffe.proto.caffe_pb2.BlobProto()
+ blob.data.extend(list(data.flatten()))
+ shape = (1,1,10,10)
+ blob.num, blob.channels, blob.height, blob.width = shape
+
+ arr = caffe.io.blobproto_to_array(blob)
+ self.assertEqual(arr.shape, shape)
+
+ def test_new_format(self):
+ data = np.zeros((10,10))
+ blob = caffe.proto.caffe_pb2.BlobProto()
+ blob.data.extend(list(data.flatten()))
+ blob.shape.dim.extend(list(data.shape))
+
+ arr = caffe.io.blobproto_to_array(blob)
+ self.assertEqual(arr.shape, data.shape)
+
+ def test_no_shape(self):
+ data = np.zeros((10,10))
+ blob = caffe.proto.caffe_pb2.BlobProto()
+ blob.data.extend(list(data.flatten()))
+
+ with self.assertRaises(ValueError):
+ caffe.io.blobproto_to_array(blob)
+
+ def test_scalar(self):
+ data = np.ones((1)) * 123
+ blob = caffe.proto.caffe_pb2.BlobProto()
+ blob.data.extend(list(data.flatten()))
+
+ arr = caffe.io.blobproto_to_array(blob)
+ self.assertEqual(arr, 123)