2

Caffe を使用して画像分類を行っていますが、MAC OS X、Pyhton を使用できますか。

現在、Spark python で Caffe を使用して画像のリストを分類する方法はわかっていますが、より高速にしたい場合は、Spark を使用したいと考えています。

したがって、image_path のリストから作成された RDD である RDD の各要素に画像分類を適用しようとしました。しかし、Spark ではそうすることができません。

これが私のコードです:

これは、画像分類のコードです。

# 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 パラメーターを生成し、RDD の各要素に 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:「caffe._caffe.Net」インスタンスのピクルが有効になっていません

ブロードキャストを行う前に、エラーは次のとおりでした:

ドライバーのスタックトレース.... 原因: org.apache.spark.api.python.PythonException: トレースバック (最新の呼び出しが最後):....

では、Caffe と Spark を使用して画像を分類し、さらに Spark を利用する方法はありますか?

4

1 に答える 1

2

複雑な非ネイティブ オブジェクトを扱う場合、初期化はシングルトン モジュールなどのワーカーに直接移動する必要があります。

net_builder.py:

import cafe 

net = None

def build_net(*args, **kwargs):
     ...  # Initialize net here
     return net       

def get_net(*args, **kwargs):
    global net
    if net is None:
        net = build_net(*args, **kwargs)
    return net

main.py:

import net_builder

sc.addPyFile("net_builder.py")

def classify_image(image_path, transformer, *args, **kwargs):
    net = net_builder.get_net(*args, **kwargs)

これは、必要なすべてのファイルも配布する必要があることを意味します。手動またはメカニズムを使用して実行できます。SparkFiles

余談ですが、SparkNetパッケージを見てください。

于 2016-03-02T19:13:40.380 に答える