Cómo clasificar imágenes usando Spark y Caffe
Estoy usando Caffe para hacer la clasificación de imágenes, ¿puedo usar MAC OS X, Pyhton?
En este momento sé cómo clasificar una lista de imágenes usando Caffe con Spark python, pero si quiero hacerlo más rápido, quiero usar Spark.
Por lo tanto, traté de aplicar la clasificación de imágenes en cada elemento de un RDD, el RDD creado a partir de una lista de image_path. Sin embargo, Spark no me permite hacerlo.
Aquí está mi código:
Este es el código para la clasificación de imágenes:
# display image name, class number, predicted label
def classify_image(image_path, transformer, net):
image = caffe.io.load_image(image_path)
transformed_image = transformer.preprocess('data', image)
net.blobs['data'].data[...] = transformed_image
output = net.forward()
output_prob = output['prob'][0]
pred = output_prob.argmax()
labels_file = caffe_root + 'data/ilsvrc12/synset_words.txt'
labels = np.loadtxt(labels_file, str, delimiter='\t')
lb = labels[pred]
image_name = image_path.split(images_folder_path)[1]
result_str = 'image: '+image_name+' prediction: '+str(pred)+' label: '+lb
return result_str
Este es el código que genera los parámetros de Caffe y aplica el método classify_image en cada elemento del RDD:
def main():
sys.path.insert(0, caffe_root + 'python')
caffe.set_mode_cpu()
model_def = caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt'
model_weights = caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'
net = caffe.Net(model_def,
model_weights,
caffe.TEST)
mu = np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy')
mu = mu.mean(1).mean(1)
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))
transformer.set_mean('data', mu)
transformer.set_raw_scale('data', 255)
transformer.set_channel_swap('data', (2,1,0))
net.blobs['data'].reshape(50,
3,
227, 227)
image_list= []
for image_path in glob.glob(images_folder_path+'*.jpg'):
image_list.append(image_path)
images_rdd = sc.parallelize(image_list)
transformer_bc = sc.broadcast(transformer)
net_bc = sc.broadcast(net)
image_predictions = images_rdd.map(lambda image_path: classify_image(image_path, transformer_bc, net_bc))
print image_predictions
if __name__ == '__main__':
main()
Como puede ver, aquí intenté transmitir los parámetros de caffe,transformer_bc = sc.broadcast(transformer)
, net_bc = sc.broadcast(net)
El error es:
RuntimeError: el pickling de instancias "caffe._caffe.Net" no está habilitado
Antes de hacer la transmisión, el error fue:
Driver stacktrace .... Causado por: org.apache.spark.api.python.PythonException: Traceback (última llamada más reciente): ....
Entonces, ¿sabes? ¿Hay alguna forma de clasificar imágenes usando Caffe y Spark, pero también aprovechar Spark?