Updated on 2024-05-31 GMT+08:00

Prerequisites

This section provides an example for running Caffe on CCE to classify an image. For more information, see https://github.com/BVLC/caffe/blob/master/examples/00-classification.ipynb.

Pre-configuring OBS Storage Data

Create an OBS bucket and ensure that the following folders have been created and required files have been uploaded to the specified paths using the OBS Browser.

The folder name can be in the format of File path in the bucket/File name. You can search for the file download addresses in the specified paths of the specified project in GitHub, as shown in 1 and 2.

  1. models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel

    https://github.com/BVLC/caffe/tree/master/models/bvlc_reference_caffenet

  1. models/bvlc_reference_caffenet/deploy.prototxt

    https://github.com/BVLC/caffe/tree/master/models/bvlc_reference_caffenet

  2. python/caffe/imagenet/ilsvrc_2012_mean.npy

    https://github.com/BVLC/caffe/tree/master/python/caffe/imagenet

  3. outputimg/

    An empty folder outputimg is created to store output files.

  4. examples/images/cat.jpg

    https://github.com/BVLC/caffe/blob/master/examples/00-classification.ipynb

    Save the picture of the cat in the link.

  5. data/ilsvrc12/*

    https://github.com/BVLC/caffe/tree/master/data/ilsvrc12

    Obtain and execute the get_ilsvrc_aux.sh script. The script downloads a compressed package and decompresses it. After the script is executed, upload all decompressed files to the directory.

  6. caffeEx00.py
    # set up Python environment: numpy for numerical routines, and matplotlib for plotting
    import numpy as np
    import matplotlib as mpl
    mpl.use('Agg')
    import matplotlib.pyplot as plt
    # display plots in this notebook
    #%matplotlib inline
    
    # set display defaults
    plt.rcParams['figure.figsize'] = (10, 10)        # large images
    plt.rcParams['image.interpolation'] = 'nearest'  # don't interpolate: show square pixels
    plt.rcParams['image.cmap'] = 'gray'  # use grayscale output rather than a (potentially misleading) color heatmap
    
    # The caffe module needs to be on the Python path;
    #  we'll add it here explicitly.
    import sys
    caffe_root = '/home/'  # this file should be run from {caffe_root}/examples (otherwise change this line)
    sys.path.insert(0, caffe_root + 'python')
    
    import caffe
    # If you get "No module named _caffe", either you have not built pycaffe or you have the wrong path.
    
    import os
    #if os.path.isfile(caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'):
    #    print 'CaffeNet found.'
    #else:
    #    print 'Downloading pre-trained CaffeNet model...'
    #    !../scripts/download_model_binary.py ../models/bvlc_reference_caffenet
    	
    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,      # defines the structure of the model
                    model_weights,  # contains the trained weights
                    caffe.TEST)     # use test mode (e.g., don't perform dropout)
    
    # load the mean ImageNet image (as distributed with Caffe) for subtraction
    mu = np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy')
    mu = mu.mean(1).mean(1)  # average over pixels to obtain the mean (BGR) pixel values
    print 'mean-subtracted values:', zip('BGR', mu)
    
    # create transformer for the input called 'data'
    transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
    
    transformer.set_transpose('data', (2,0,1))  # move image channels to outermost dimension
    transformer.set_mean('data', mu)            # subtract the dataset-mean value in each channel
    transformer.set_raw_scale('data', 255)      # rescale from [0, 1] to [0, 255]
    transformer.set_channel_swap('data', (2,1,0))  # swap channels from RGB to BGR
    
    # set the size of the input (we can skip this if we're happy
    #  with the default; we can also change it later, e.g., for different batch sizes)
    net.blobs['data'].reshape(50,        # batch size
                              3,         # 3-channel (BGR) images
                              227, 227)  # image size is 227x227
    						
    image = caffe.io.load_image(caffe_root + 'examples/images/cat.jpg')
    transformed_image = transformer.preprocess('data', image)
    plt.imshow(image)
    plt.savefig(caffe_root + 'outputimg/img1.png')
    
    # copy the image data into the memory allocated for the net
    net.blobs['data'].data[...] = transformed_image
    
    ### perform classification
    output = net.forward()
    
    output_prob = output['prob'][0]  # the output probability vector for the first image in the batch
    
    print 'predicted class is:', output_prob.argmax()
    
    # load ImageNet labels
    labels_file = caffe_root + 'data/ilsvrc12/synset_words.txt'
    #if not os.path.exists(labels_file):
    #    !../data/ilsvrc12/get_ilsvrc_aux.sh
    
    labels = np.loadtxt(labels_file, str, delimiter='\t')
    
    print 'output label:', labels[output_prob.argmax()]
    
    # sort top five predictions from softmax output
    top_inds = output_prob.argsort()[::-1][:5]  # reverse sort and take five largest items
    
    print 'probabilities and labels:'
    zip(output_prob[top_inds], labels[top_inds])