2022-08-03 11:14阅读: 386评论: 0推荐: 0

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
  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]

    strip: 丢空格

    classes: 把种类的内容取出来

  3. 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的封装

  4. 图像路径

    imagePaths = sorted(list(utils_paths.list_images("images/")))
  5. 图像数据预处理

    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维的数组

  6. 得到预测结果

    net.setInput(blob)
    preds = net.forward()
    • 设置网络的输入数据net.setInput(blob)

    • 执行网络推断Mat prob = net.forward()

    • print(preds) preds相当于一个数组,就是我们将图片input网络后,网络吐出了一个记录了1000多个种类得分的数组

  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)
    • cv2.putText()

      将文本信息添加到图片上,参数分别是,图片,文本,呈现位置,字体,大小,颜色,颜色厚度

  8. Batch数据制作

    数据是一组一组的

    1. 方法一样,数据是一个batch

      for p in imagePaths[1:]:
      image = cv2.imread(p)
      image = cv2.resize(image, (224, 224))
      images.append(image)
    2. blobFromImages函数

      blob = cv2.dnn.blobFromImages(images, 1, (224, 224), (104, 117, 123))
      print("Second Blob: {}".format(blob.shape))

      cv2.dnn.blobFromImages比上面多了s,处理一组数据

    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)

      网络输入——前向传播——for循环

bvlc_googlenet.prototxt
  • googlenet 网络模型架构
  • layer

本文作者:Hecto

本文链接:https://www.cnblogs.com/tow1/p/16546396.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Hecto  阅读(386)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑