python调用caffe训练好的cifar10_quick_iter_4000.caffemodel模型检测单帧图片
python直接调用caffe训练好的模型,进行单帧图片检测,并显示检测结果。caffe自带的classify.py文件检测结果直接保存到了foo文件,不能直观显示,这里加入几行显示的代码,方便直接测试查看结果,运行OK,笔记mark。
#!/usr/bin/env python
"""
classify.py is an out-of-the-box image classifer callable from the command line.
By default it configures and runs the Caffe reference ImageNet model.
"""
import numpy as np
import os
import sys
import argparse
import glob
import time
import caffe
def main(argv):
pycaffe_dir = os.path.dirname(__file__)
parser = argparse.ArgumentParser()
# Required arguments: input and output files.
parser.add_argument(
"input_file",
help="Input image, directory, or npy."
)
parser.add_argument(
"output_file",
help="Output npy filename."
)
# Optional arguments.
parser.add_argument(
"--model_def",
default=os.path.join(pycaffe_dir,
"../models/bvlc_reference_caffenet/deploy.prototxt"),
help="Model definition file."
)
parser.add_argument(
"--pretrained_model",
default=os.path.join(pycaffe_dir,
"../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel"),
help="Trained model weights file."
)
#新增显示部分
parser.add_argument(
"--labels_file",
default=os.path.join("../python/classify_words.txt"),
help="cifar result words file")
parser.add_argument(
"--force_grayscale",
action='store_true',
help="Convert RGB images down to single-channel grayscale versions," +
"usefull for single-channel networks like MNIST.")
parser.add_argument(
"--print_results",
action='store_true',
help="write output text to stdout rather than serializing to a file.")
#新增显示部分
parser.add_argument(
"--gpu",
action='store_true',
help="Switch for gpu computation."
)
parser.add_argument(
"--center_only",
action='store_true',
help="Switch for prediction from center crop alone instead of " +
"averaging predictions across crops (default)."
)
parser.add_argument(
"--images_dim",
default='256,256',
help="Canonical 'height,width' dimensions of input images."
)
parser.add_argument(
"--mean_file",
default=os.path.join(pycaffe_dir,
'caffe/imagenet/ilsvrc_2012_mean.npy'),
help="Data set image mean of [Channels x Height x Width] dimensions " +
"(numpy array). Set to '' for no mean subtraction."
)
parser.add_argument(
"--input_scale",
type=float,
help="Multiply input features by this scale to finish preprocessing."
)
parser.add_argument(
"--raw_scale",
type=float,
default=255.0,
help="Multiply raw input by this scale before preprocessing."
)
parser.add_argument(
"--channel_swap",
default='2,1,0',
help="Order to permute input channels. The default converts " +
"RGB -> BGR since BGR is the Caffe default by way of OpenCV."
)
parser.add_argument(
"--ext",
default='jpg',
help="Image file extension to take as input when a directory " +
"is given as the input file."
)
args = parser.parse_args()
image_dims = [int(s) for s in args.images_dim.split(',')]
mean, channel_swap = None, None
if args.mean_file:
mean = np.load(args.mean_file)
mean = mean.mean(1).mean(1)
if args.channel_swap:
channel_swap = [int(s) for s in args.channel_swap.split(',')]
if args.gpu:
caffe.set_mode_gpu()
print("GPU mode")
else:
caffe.set_mode_cpu()
print("CPU mode")
# Make classifier.
classifier = caffe.Classifier(args.model_def, args.pretrained_model,
image_dims=image_dims, mean=mean,
input_scale=args.input_scale, raw_scale=args.raw_scale,
channel_swap=channel_swap)
# Load numpy array (.npy), directory glob (*.jpg), or image file.
args.input_file = os.path.expanduser(args.input_file)
if args.input_file.endswith('npy'):
print("Loading file: %s" % args.input_file)
inputs = np.load(args.input_file)
elif os.path.isdir(args.input_file):
print("Loading folder: %s" % args.input_file)
inputs =[caffe.io.load_image(im_f)
for im_f in glob.glob(args.input_file + '/*.' + args.ext)]
else:
print("Loading file: %s" % args.input_file)
inputs = [caffe.io.load_image(args.input_file)]
print("Classifying %d inputs." % len(inputs))
# Classify.
start = time.time()
predictions = classifier.predict(inputs, not args.center_only)
print("Done in %.2f s." % (time.time() - start))
print("Predictions: %s" % predictions)
#新增显示部分
if args.print_results:
scores = predictions.flatten()
with open(args.labels_file) as f:
labels_df = pd.DataFrame([
{
'synset_id': l.strip().split(' ')[0],
'name': ' '.jion(l.strip().split(' ')[1:]).split(',')[0]
}
for l in f.readlines()])
labels = labels_df.sort('synset_id')['name'].values
indices = (-scores).argsort()[:5]
ps = labels[indices]
meta = [(p, '%.5f' % scores[i])
for i, p in zip(indices, ps)]
print meta
#新增显示部分
# Save
print("Saving results into %s" % args.output_file)
np.save(args.output_file, predictions)
if __name__ == '__main__':
main(sys.argv)
调用cifar10_quick_iter_4000.caffemodel 模型进行检测
cd ~/caffe/python
ppython classify02.py --model_def ~/caffe/examples/cifar10/cifar10_quick.prototxt --pretrained_model ~/caffe/examples/cifar10/cifar10_quick_iter_4000.caffemodel --labels_file ~/caffe/data/cifar10/cifar10_words.txt --center_only ~/caffe/examples/images/fish-bike.jpg foo
直接用caffe默认用的ImageNet的模型进行检测
cd ~/caffe/python
python python/classify.py ~/caffe/examples/images/cat.jpg foo