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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta