杰瑞科技汇

Python Caffe部署步骤是怎样的?

Of course! Deploying a Caffe model in Python is a common task, but it's important to understand the two primary methods because they are used for different purposes.

Python Caffe部署步骤是怎样的?-图1
(图片来源网络,侵删)
  1. caffe.Net (The "Classic" Python API): Used for inference (running a trained model on new data). This is what you'll use for deployment.
  2. caffe.Classifier: A higher-level convenience wrapper built on top of caffe.Net. It's great for quick prototyping but offers less control for a robust deployment pipeline.

Let's break down both, focusing on the recommended approach for deployment.


Prerequisites

Before you start, make sure you have Caffe installed with Python bindings. If you haven't, follow the official Caffe installation guide. The key step is running make pycaffe in your Caffe directory.

# Make sure you are in your caffe directory
cd /path/to/caffe
make pycaffe

Method 1: The caffe.Net Class (Recommended for Deployment)

This method gives you full control over the data flow, which is essential for building a clean and efficient deployment pipeline.

Key Concepts:

  • deploy.prototxt: This is the model architecture file used only for inference. It's different from the train_val.prototxt used for training. The main difference is that the deploy.prototxt does not have data layers (Data, Data, etc.) or loss layers. It's just the "body" of the network, ending with the output layer (e.g., prob).
  • .caffemodel: This file contains the trained weights of your network.
  • caffe.Net: The Python object that loads the model architecture and weights. You then pass input data to it and get the output.

Step-by-Step Example: Deploying a Simple Classifier

Let's assume you have a trained model for classifying images.

Python Caffe部署步骤是怎样的?-图2
(图片来源网络,侵删)

Prepare Your Files

You need three files:

  • deploy.prototxt: The inference model architecture.
  • your_model.caffemodel: The trained weights.
  • mean_image.binaryproto: (Optional but common) The mean image that was subtracted during training. This is crucial for getting correct results.

Example deploy.prototxt (for a simple AlexNet-like model):

name: "CaffeNet"
layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  convolution_param {
    num_output: 96
    kernel_size: 11
    stride: 4
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}
// ... more layers (fc7, prob) ...
layer {
  name: "prob"
  type: "Softmax"
  bottom: "fc7"
  top: "prob"
}

Key Points:

Python Caffe部署步骤是怎样的?-图3
(图片来源网络,侵删)
  • The data layer is now an Input layer. Its shape defines the batch size and dimensions of the input data you will provide. Here, dim: 10 means it can process a batch of 10 images at once.
  • The final layer is prob, which will be our output.

Write the Python Deployment Script

This script will load the model, preprocess an image, run it through the network, and get the prediction.

import numpy as np
import caffe
import os
# --- 1. Setup ---
# Define paths to your model files
MODEL_FILE = 'path/to/your/deploy.prototxt'
PRETRAINED_FILE = 'path/to/your/your_model.caffemodel'
# Mean image file (optional but recommended)
MEAN_FILE = 'path/to/your/mean_image.binaryproto'
# --- 2. Load the Caffe model ---
# Initialize the Caffe network. This loads the architecture and weights.
# The 'test' phase is used for inference.
net = caffe.Net(MODEL_FILE, PRETRAINED_FILE, caffe.TEST)
# --- 3. Data Preprocessing ---
# Caffe expects input in a specific format: N x C x H x W (channels first)
# and often with mean subtraction.
# Load the mean image (if you have one)
# blob = caffe.proto.caffe_pb2.BlobProto()
# blob.ParseFromString(open(MEAN_FILE, 'rb').read())
# mean_array = np.array(blob.data).reshape(blob.shape[0], blob.shape[1], blob.shape[2])
# mean_array = mean_array.mean(1).mean(1) # Mean over height and width
# mean_array = mean_array[:, np.newaxis, np.newaxis]
# For this example, let's just create a dummy input array
# Let's say our input is a batch of 2 images, 3 channels, 227x227
input_data = np.random.rand(2, 3, 227, 227).astype(np.float32)
# If you had a real image, you would do something like this:
# from skimage import io, transform
# image = io.imread('path/to/your/image.jpg')
# image = transform.resize(image, (227, 227)) # Resize
# image = image.transpose((2, 0, 1)) # HWC to CHW
# image = image[np.newaxis, :, :, :] # Add batch dimension
# image = image.astype(np.float32)
# Subtract mean (if you loaded it)
# input_data -= mean_array
# --- 4. Run Inference ---
# Set the input data to the network's 'data' layer
net.blobs['data'].data[...] = input_data
# Run the forward pass to get predictions
output = net.forward()
# --- 5. Get and Interpret the Output ---
# The output is stored in the top layer of the network, which is 'prob'
# The shape will be (batch_size, num_classes)
predictions = net.blobs['prob'].data
print("Shape of output:", predictions.shape)
print("Predictions for the first image in the batch:", predictions[0])
# To get the class with the highest probability:
predicted_class_index = np.argmax(predictions[0])
print(f"Predicted class index: {predicted_class_index}")
# If you have a label map file, you can get the human-readable name
# LABEL_FILE = 'path/to/your/synset_words.txt'
# with open(LABEL_FILE) as f:
#     labels = [line.strip() for line in f.readlines()]
# print(f"Predicted label: {labels[predicted_class_index]}")

Method 2: The caffe.Classifier (Simpler, Less Flexible)

This class is a convenient wrapper that handles many of the preprocessing steps for you automatically. It's great for quick tests but can be less transparent for a production environment.

Key Concepts:

  • It takes a model_file, pretrained_file, and mean_file in its constructor.
  • The model_file is usually the deploy.prototxt.
  • The mean_file can be a .npy file containing the mean pixel values.
  • You call the predict method with a list of images (in HWC format, standard for libraries like scikit-image).

Example Script:

import numpy as np
import caffe
from skimage import io, transform
# --- 1. Setup ---
# Define paths
MODEL_FILE = 'path/to/your/deploy.prototxt'
PRETRAINED_FILE = 'path/to/your/your_model.caffemodel'
# Mean file can be a .npy file for Classifier
MEAN_FILE = 'path/to/your/mean.npy' # This should be a numpy array of mean values
# --- 2. Initialize the Classifier ---
# The image dimensions (width, height) and channel swapping order (RGB -> BGR)
# are specified here.
classifier = caffe.Classifier(MODEL_FILE, PRETRAINED_FILE,
                              mean=MEAN_FILE,
                              channel_swap=(2,1,0), # Convert image from RGB to BGR
                              raw_scale=255)        # Scale pixel values from [0, 255] to [0, 1]
# --- 3. Prepare Input Images ---
# Classifier expects a list of images, where each image is in HWC format.
# Let's load two images.
image1 = io.imread('path/to/image1.jpg')
image2 = io.imread('path/to/image2.jpg')
# Resize images to the expected input size (e.g., 227x227)
image1 = transform.resize(image1, (227, 227))
image2 = transform.resize(image2, (227, 227))
images_to_classify = [image1, image2]
# --- 4. Run Prediction ---
# The predict method returns the softmax probabilities for each image.
# It can also take an `oversample` argument to improve accuracy.
predictions = classifier.predict([image1, image2], oversample=False)
print("Shape of output:", predictions.shape) # (num_images, num_classes)
print("Predictions for the first image:", predictions[0])
# Get the top 5 predictions for the first image
top5_indices = np.argsort(predictions[0])[-5:][::-1]
print(f"Top 5 predicted class indices: {top5_indices}")

Summary: caffe.Net vs. caffe.Classifier

Feature caffe.Net (Recommended for Deployment) caffe.Classifier (Good for Quick Tests)
Control Full control over data loading, preprocessing, and inference. Limited control. Preprocessing is handled internally.
Flexibility High. Can be integrated into any pipeline. Can handle custom input formats. Low. Expects specific formats (list of HWC images).
Data Input You manage the numpy array. Shape is N x C x H x W. You pass a list of images. Shape is N x H x W x C.
Preprocessing You must handle it yourself (resizing, scaling, mean subtraction, channel swap). Handles it automatically based on constructor arguments.
Use Case Production deployment, research, custom inference pipelines. Quick model evaluation, sanity checks, prototyping.

Modern Alternatives for Deployment

While Caffe was a pioneer, most new projects use frameworks with more robust and flexible deployment options:

  • ONNX (Open Neural Network Exchange): You can convert your Caffe model to the ONNX format. ONNX models can then be run by many runtimes (like ONNX Runtime, TensorRT, Apache MXNet) often with better performance than the original Caffe Python bindings.
  • TensorFlow / PyTorch: These frameworks have mature, production-grade serving systems (e.g., TensorFlow Serving, TorchServe) that are designed for high-performance, scalable deployment. If you have the option, retraining your model in one of these is often the best long-term strategy for deployment.
分享:
扫描分享到社交APP
上一篇
下一篇