opencv实战DNN

先上代码

# 导入工具包
import utils_paths
import numpy as np
import cv2

# 标签文件处理
rows = open("F:/BaiduNetdiskDownload/synset_words.txt").read().strip().split("\n")
classes = [r[r.find(" ") + 1:].split(",")[0] for r in rows]

# Caffe所需配置文件
net = cv2.dnn.readNetFromCaffe("F:/BaiduNetdiskDownload/bvlc_googlenet.prototxt",
	"F:/BaiduNetdiskDownload/bvlc_googlenet.caffemodel")

# 图像路径
imagePaths = sorted(list(utils_paths.list_images("F:/BaiduNetdiskDownload/images/")))

# 图像数据预处理(单个测试)
image = cv2.imread(imagePaths[0])
resized = cv2.resize(image, (224, 224))

# image scalefactor size mean swapRB 
# 创建一组图像blob,也是一个深度学习模型常用的数据格式。
blob = cv2.dnn.blobFromImage(resized, 1, (224, 224), (104, 117, 123))
print("First Blob: {}".format(blob.shape))

# 得到预测结果
net.setInput(blob)
preds = net.forward()

# 排序,取分类可能性最大的(选出最好的)
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)

# 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))

# 获取预测结果
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)

步骤总结

  1. 图像预处理;
  2. 单个图像DNN识别测试;
  3. 创建batch数组,获取多个图像的预测结果;
  4. 将预测结果排序,得到最高预测结果;
  5. 将最高预测结果显示到图片结果中。

其中不明白的知识点总结

batch数据:
batch 字面上是批量的意思,在深度学习中指的是计算一次cost需要的输入数据个数。 在 batch 可以认为上述cost计算公式中的m。 如果数据集比较小,可以将全体数据看做一个 batch ,即把数据集中每个样本都计算loss然后取其平均值当做cost。
——中心函数:
cv2.dnn.blobFromImages是OpenCV库的一个函数,用于从一组图像创建Blob。Blob是深度学习模型常用的数据格式,它是一个多维数组,通常用于表示输入数据。
函数参数的含义如下:
images:输入图像列表,应该是一组相同大小和类型的图像。
scaleFactor:在将图像从0-255缩放到0-1时,需要除以的因子。默认值为1。
width和height:将图像重新调整到的尺寸。默认值是(224, 224)。
mean:图像的均值。默认值是(104, 117, 123),这是在ImageNet数据集上预训练的许多模型的均值。
swapRB:一个布尔值,如果为True,则将图像的B和R通道交换(在彩色图像中)。
crop:一个布尔值,如果为True,则从原始图像中心裁剪出指定尺寸的图像。
所以,你的代码cv2.dnn.blobFromImages(images, 1, (224, 224), (104, 117, 123))的含义是:从输入的图像列表images创建一个Blob,其中每个图像都被缩放(或可能被裁剪)到224x224像素大小,并且像素值从0-255缩放到0-1,同时B和R通道进行了交换(如果swapRB=True的话)。
注意,你需要确保输入的图像列表中的所有图像都有相同的大小(高度、宽度和通道数),并且都是同样的数据类型(例如,都是uint8)。如果不是这样,你可能需要先预处理你的图像,例如使用cv2.resize调整大小,或者使用cv2.cvtColor转换颜色空间。
——net.forward()是PyTorch库中的一个方法,用于前向传播一个神经网络。
在训练神经网络时,您需要将输入数据通过网络进行前向传播,以便计算输出。net.forward()方法允许您执行此操作。它将输入数据作为参数传递,并返回网络的输出。
——np.argsort是NumPy库中的一个函数,它返回一个数组,该数组包含了原始数组中排序后的索引。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值