Я использую Caffe для классификации изображений, могу ли я использовать MAC OS X, Pyhton.Как классифицировать изображения с помощью Spark и Caffe
Прямо сейчас я знаю, как классифицировать список изображений с помощью Caffe с Spark python, но если я хочу сделать это быстрее, я хочу использовать Spark.
Поэтому я попытался применить классификацию изображений для каждого элемента RDD, RDD, созданного из списка image_path. Однако Спарк не позволяет мне это делать.
Вот мой код:
Это код для классификации изображений:
# 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
Это этот код генерирует параметры Caffe и применить метод classify_image на каждом элементе ДРР:
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()
Как вы можете видеть, здесь я попытался транслировать параметры кофе, transformer_bc = sc.broadcast(transformer)
, net_bc = sc.broadcast(net)
Ошибка:
RuntimeError: Pickling of "caffe._caffe.Net" instances is not enabled
Прежде чем я делаю радиопередачу, ошибка:
Driver stacktrace.... Caused by: org.apache.spark.api.python.PythonException: Traceback (most recent call last):....
Итак, вы знаете, есть ли способ я могу классифицировать изображения с помощью Caffe и Искру, но и воспользоваться Spark?