OpenCV图像处理笔记[12]
[实验] 物体识别dnn_blob
blob——难以名状的一团
dnn模块使用caffe模型
1、通过readNet()函数加载caffe模型
2、读取图像,并将调用blobFromImage,将图像转换为4维的blob,其中mean= cv::Scalar(125, 123, 124)。
3、设置网络的输入数据net.setInput(blob)
4、执行网络推断Mat prob = net.forward()
5、获取推断结果列表中概率最大的索引,得到图像的标签,将标签转换为图像识别结果。对于32x32的rgb图像,在没有GPU的情况下,resnet56推断耗时5ms左右。
————————————————
原文链接
blob_from_images.py
-
导入包
# 导入工具包 import utils_paths import numpy as np import cv2 -
标签文件处理
# 标签文件处理 rows = open("synset_words.txt").read().strip().split("\n") classes = [r[r.find(" ") + 1:].split(",")[0] for r in rows] strip: 丢空格
classes: 把种类的内容取出来
-
Caffe所需配置文件
net = cv2.dnn.readNetFromCaffe("bvlc_googlenet.prototxt", "bvlc_googlenet.caffemodel") -
cv2.dnn.readNetFromCaffe: 使用“读取”方法从磁盘直接加载序列化模型, 即通过readNet()函数加载caffe模型
-
读取模型,一个网络模型文件,一个参数文件
Caffe: Convolution Architecture For Feature Embedding (Extraction) —— 卷积 建筑架构 特征 嵌入 拔出 ——快速特征嵌入的卷积结构
Caffe: Deep Learning 工具箱, C++语言架构,CPU和GPU无缝交换,Python和matlab的封装
-
-
图像路径
imagePaths = sorted(list(utils_paths.list_images("images/"))) -
图像数据预处理
image = cv2.imread(imagePaths[0]) resized = cv2.resize(image, (224, 224)) # image scalefactor size mean swapRB blob = cv2.dnn.blobFromImage(resized, 1, (224, 224), (104, 117, 123)) print("First Blob: {}".format(blob.shape)) -
cv2.dnn.blobFromImag e 用于对输入网络的图像进行预处理,主要是三部分,1.减均值 2.缩放 3.通道变换(可选),对于imageNet训练集而言,三通道均值为(104, 117, 123) -
cv2.dnn.blobFromImage
-
函数原型:cv2.dnn.blobFromImage(image[, scalefactor[, size[, mean[, swapRB[, crop[, ddepth]]]]]])
-
函数作用:对图像进行预处理,包括减均值,比例缩放,裁剪,交换通道等,返回一个4通道的blob(blob可以简单理解为一个N维的数组,用于神经网络的输入)
-
函数参数:
-
image:输入图像(1、3或者4通道)
可选参数 -
scalefactor:图像各通道数值的缩放比例
size:输出图像的空间尺寸,如size=(200,300)表示高h=300,宽w=200 -
mean:用于各通道减去的值,以降低光照的影响(e.g. image为bgr3通道的图像,mean=[104.0, 177.0, 123.0],表示b通道的值-104,g-177,r-123)
-
swapRB:交换RB通道,默认为False.(cv2.imread读取的是彩图是bgr通道)
-
crop:图像裁剪,默认为False.当值为True时,先按比例缩放,然后从中心裁剪成size尺寸
-
ddepth:输出的图像深度,可选CV_32F 或者 CV_8U.
-
-
返回:
4维的数组
-
-
-
得到预测结果
net.setInput(blob) preds = net.forward() -
设置网络的输入数据net.setInput(blob)
-
执行网络推断Mat prob = net.forward()
-
print(preds) preds相当于一个数组,就是我们将图片input网络后,网络吐出了一个记录了1000多个种类得分的数组
-
-
排序
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.putText()
将文本信息添加到图片上,参数分别是,图片,文本,呈现位置,字体,大小,颜色,颜色厚度
-
-
Batch数据制作
数据是一组一组的
-
方法一样,数据是一个batch
for p in imagePaths[1:]: image = cv2.imread(p) image = cv2.resize(image, (224, 224)) images.append(image) -
blobFromImages函数
blob = cv2.dnn.blobFromImages(images, 1, (224, 224), (104, 117, 123)) print("Second Blob: {}".format(blob.shape)) cv2.dnn.blobFromImages比上面多了s,处理一组数据
-
获取预测结果
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) 网络输入——前向传播——for循环
-
bvlc_googlenet.prototxt
- googlenet 网络模型架构
- layer
本文作者:Hecto
本文链接:https://www.cnblogs.com/tow1/p/16546396.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步