#coding:utf-8
import cv2 as cv
import time
import numpy as np
def predict(image_path):
prototxt = 'datas/models/caffe/bvlc_googlenet.prototxt'
caffemodel = 'datas/models/caffe/bvlc_googlenet.caffemodel'
synsetwords = 'datas/models/caffe/bvlc_googlenet_synset_words.txt'
image = cv.imread(image_path)
image = cv.resize(image,(256,256))
# 加载分类
rows = open(synsetwords).read().strip().split("\n")
classes = [r[r.find(" ") + 1:].split(",")[0] for r in rows]
# 根据 Deploy 的 Prototxt, 得知训练后的 CNN model 需要输入数据的维度为
# (1, 3, 224, 224)
# 透过训练时的 Prototxt, 可以得知训练集的 Pixel RGB 平均值为 (104, 117, 123)
# https://github.com/BVLC/caffe/blob/master/models/bvlc_googlenet/train_val.prototxt
# 做 Mean subtraction 的目的 : 改善对抗光线改变造成的影响
blob = cv.dnn.blobFromImage(image, 1, (224, 224), (104, 117, 123))
# 载入网络
net = cv.dnn.readNetFromCaffe(prototxt, caffemodel)
# 将 blob 输入到网络, 进行 forward-pass, 作分类
net.setInput(blob)
start = time.time()
predicteds = net.forward()
print("Cassification took {:.4} seconds".format(time.time() - start))
# 找出预测結果中概率最大的前 3 名的索引
# np.argsort 結果为升冪(ascending)排列
indices = np.argsort(predicteds[0])[::-1][:3]
# 显示前三名
for (i, idx) in enumerate(indices):
cls_name = classes[idx]
prob = predicteds[0][idx]
if i == 0:
text = "Label:{}, Probability: {:.4f}%".format(cls_name, prob * 100)
cv.putText(image, text, (5, 15), cv.FONT_HERSHEY_DUPLEX, 0.5, (255, 0, 0), 1)
print("[{}] Label: {:10}, Probability: {:.4f}".format(i + 1, cls_name, prob * 100))
cv.imshow("Image", image)
cv.waitKey(0)
predict('datas/images/tiger.jpg')
运行结果: