Opencv之调用DNN模块

opencv中有dnn模块可以用来直接调用深度学习的配置文件。
下面,举一个物体识别的例子。

举例

1、导入工具包

import utils_paths
import numpy as np
import cv2

2、标签文件处理

rows = open("synset_words.txt").read().strip().split("\n")
classes = [r[r.find(" ") + 1:].split(",")[0] for r in rows]

3、Caffe所需配置文件

net = cv2.dnn.readNetFromCaffe("bvlc_googlenet.prototxt",
    "bvlc_googlenet.caffemodel")

4、图像路径

imagePaths = sorted(list(utils_paths.list_images("images/")))

5、图像数据预处理

函数说明:
blob = cv2.dnn.blobFromImage(image, scalefactor=1.0, size, mean, swapRB=True,crop=False,ddepth = CV_32F )

输入:

  • image:需要进行处理的图像。

  • scalefactor:执行完减均值后,需要缩放图像,默认是1。

  • size:输出图像的空间尺寸,如size=(200,300)表示高h=300,宽w=200。

  • mean:要减去的均值,可以是R,G,B均值三元组,或者是一个值,每个通道都减这值。如果执行减均值,通道顺序是R、G、B。 如果,输入图像通道顺序是B、G、R,那么请确保swapRB = True,交换通道。

  • swapRB:OpenCV认为图像通道顺序是B、G、R,而减均值时顺序是R、G、B,为了解决这个矛盾,设置swapRB=True即可。

  • crop:图像裁剪,默认为False.当值为True时,先按比例缩放,然后从中心裁剪成size尺寸。

  • ddepth:输出blob的深度,可选CV_32F or CV_8U。

返回值:

  • 返回一个4通道的blob(blob可以简单理解为一个N维的数组,用于神经网络的输入)
image = cv2.imread(imagePaths[0])
resized = cv2.resize(image, (224, 224))
# image scalefactor size mean swapRB
# (104, 117, 123)是均值
blob = cv2.dnn.blobFromImage(resized, 1, (224, 224), (104, 117, 123))
print("First Blob: {}".format(blob.shape))

在这里,由于我们训练使用的数据尺寸都是 224 × 224 224\times 224 224×224,所以在测试的时候也要是 224 × 224 224\times 224 224×224。在ImageNet训练集中,三通道的均值分别为:R = 103.93 , G = 116.77, B = 123.68。

6、得到预测结果

net.setInput(blob)
preds = net.forward()

7、排序,取分类可能性最大的

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)

8、展示结果

cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

PS:如果想要一次识别多张图片,可使用以下代码。

# 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)
    cv2.destroyAllWindows()
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cofisher

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值