目录
本文使用OpenCV加载深度学习模型,实现了对传入的单张图像或多张图像进行预测。
步骤:
- 首先读入Caffe框架训练好的模型,然后对输入图像进行预处理操作,并将其传入已构建的网络模型,最后对得到的预测结果进行排序,找到概率最大的,通过标签文件得到最终预测的结果并进行输出展示。
1.单张图像
(1)构建网络模型
# 标签文件处理,网络模型最后得到的是一个概率值,需将概率值转换成标签值,这里使用ImageNet训练好的一千分类的网络
rows = open("synset_words.txt").read().strip().split("\n")
classes = [r[r.find(" ") + 1:].split(",")[0] for r in rows]
# Caffe所需配置文件,读入Caffe框架训练好的模型,从bvlc_googlenet.prototxt网络配置文件读入网络结构
net = cv2.dnn.readNetFromCaffe("bvlc_googlenet.prototxt",
"bvlc_googlenet.caffemodel")#训练好的模型
(2)图像预处理
# 图像路径,读入测试图像
imagePaths = sorted(list(utils_paths.list_images("images/")))
# 图像数据预处理
image = cv2.imread(imagePaths[0])
resized = cv2.resize(image, (224, 224))
# image:传入图像; scalefactor:进不进行变换,1不变; size; mean; swapRB
blob = cv2.dnn.blobFromImage(resized, 1, (224, 224), (104, 117, 123))#准备好输入数据,blobFromImage一张图像
#(104, 117, 123)分别表示RGB通道上的均值,每个像素点都需要减去均值,可以剔除掉光照的影响
print("First Blob: {}".format(blob.shape))#4维、结果:First Blob: (1, 3, 224, 224)表示1张图,3颜色通道,图片大小
(3)预测结果
# 得到预测结果
net.setInput(blob)#把数据放入网络
preds = net.forward()#forward前向传播,preds前向传播的结果
# 排序,取分类可能性最大的(找到概率最大的)
idx = np.argsort(preds[0])[::-1][0]
text = "Label: {}, {:.2f}%".format(classes[idx],
preds[0][idx] * 100)
cv2.putText(image, text, (5, 25), cv2.FONT_HERSHEY_SIMPLEX,#写入图像
0.7, (0, 0, 255), 2)
# 显示
cv2.imshow("Image", image)
cv2.waitKey(0)
![](/i/l/?n=23&i=blog/2105678/202304/2105678-20230430155951279-1549662213.png)
2.多张图像
- 构建网络模型与图像预处理操作与单张图像一样,第三步不同,如下:
# Batch数据制作
images = []
# 方法一样,数据是一个batch,读取并加入多张图像
for p in imagePaths[1:]:
image = cv2.imread(p)
image = cv2.resize(image, (224, 224))
images.append(image)
# blobFromImages函数,注意有s,批处理
blob = cv2.dnn.blobFromImages(images, 1, (224, 224), (104, 117, 123))
print("Second Blob: {}".format(blob.shape))#结果:Second Blob: (4, 3, 224, 224)表示4张图,3颜色通道,图片大小
# 获取预测结果
net.setInput(blob)
preds = net.forward()
for (i, p) in enumerate(imagePaths[1:]):
image = cv2.imread(p)
idx = np.argsort(preds[i])[::-1][0]
text = "Label: {}, {:.2f}%".format(classes[idx],
preds[i][idx] * 100)
cv2.putText(image, text, (5, 25), cv2.FONT_HERSHEY_SIMPLEX,
0.7, (0, 0, 255), 2)
cv2.imshow("Image", image)
cv2.waitKey(0)
![](/i/l/?n=23&i=blog/2105678/202304/2105678-20230430160121868-471750237.png)
![](/i/l/?n=23&i=blog/2105678/202304/2105678-20230430160129702-1088656564.png)
![](/i/l/?n=23&i=blog/2105678/202304/2105678-20230430160137563-1723881155.png)
![](/i/l/?n=23&i=blog/2105678/202304/2105678-20230430160145098-467798430.png)