📜  使用 OpenCV 和深度学习进行整体嵌套边缘检测

📅  最后修改于: 2022-05-13 01:55:08.667000             🧑  作者: Mango

使用 OpenCV 和深度学习进行整体嵌套边缘检测

整体嵌套边缘检测 (HED) 是一种深度学习模型,它使用完全卷积神经网络和深度监督网络来进行图像到图像的预测。 HED 自动开发丰富的层次表示(由对侧面回复的深度监督指导),这对于解决边缘和对象边界检测中的歧义至关重要。

模型架构

该模型是 VGGNet,几乎没有修改-

  1. 侧输出层连接到每个阶段的最后一个卷积层,分别为conv1_2、conv2_2、conv3_3、conv4_3、conv5_3。每个卷积层的感受野大小与相应的侧输出层相同。
  2. 删除了 VGGNet 的最后阶段,包括第 5 个池化层和所有全连接层。

最终的 HED 网络架构有 5 个阶段,步幅分别为 1、2、4、8 和 16,并且具有不同的感受野大小,都嵌套在 VGGNet 中。

为什么选择海德?

提出的整体嵌套边缘检测器(HED)解决了两个关键问题:

  1. 整体图像训练和预测,灵感来自用于图像到图像分类的全卷积神经网络(系统将图像作为输入,并直接生成边缘图图像作为输出)
  2. 嵌套多尺度特征学习,受深度监督网络的启发,该网络执行深层监督以“引导”早期分类结果。

实施步骤

  • 导入所有需要的库。
  • 阅读图像。
  • 创建 blob
  • 加载预训练的 Caffe 模型
    • 该框架建立在 FCN 和 DSN 的公开可用实现之上,并使用公开可用的 Caffe 库实现。从使用预训练的 VGG-16 网络模型的初始化开始,我们的 HED 系统中的整个网络都进行了微调。
    • 这个 Caffe 模型被编码成两个文件
      1. 一个 prototxt 文件:一个文本 Caffe JSON 文件,其中包括模型定义(部署)(即层、预期输入……)
      2. 预训练的 Caffe 模型:神经网络权重。
  • 将图像的 blob 传递给模型并找到输出。
  • 以正确的格式格式化数据以显示(如果需要)
  • 显示输出

示例 1

输入 :

Python3
import cv2
img = cv2.imread("input.webp")
(H, W) = img.shape[:2]
blob = cv2.dnn.blobFromImage(img, scalefactor=1.0, size=(W, H),
    swapRB=False, crop=False)
net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "hed_pretrained_bsds.caffemodel")
net.setInput(blob)
hed = net.forward()
hed = cv2.resize(hed[0, 0], (W, H))
hed = (255 * hed).astype("uint8")
cv2.imshow("Input", img)
cv2.imshow("HED", hed)
cv2.waitKey(0)


Python3
import cv2
img = cv2.imread("pexels-ylanite-koppens-2343170(1).jpg")
(H, W) = img.shape[:2]
blob = cv2.dnn.blobFromImage(img, scalefactor=1.0, size=(W, H),
    swapRB=False, crop=False)
net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "hed_pretrained_bsds.caffemodel")
net.setInput(blob)
hed = net.forward()
hed = cv2.resize(hed[0, 0], (W, H))
hed = (255 * hed).astype("uint8")
cv2.imshow("Input", img)
cv2.imshow("HED", hed)
cv2.waitKey(0)


输出:

输出

示例 2。

输入

Python3

import cv2
img = cv2.imread("pexels-ylanite-koppens-2343170(1).jpg")
(H, W) = img.shape[:2]
blob = cv2.dnn.blobFromImage(img, scalefactor=1.0, size=(W, H),
    swapRB=False, crop=False)
net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "hed_pretrained_bsds.caffemodel")
net.setInput(blob)
hed = net.forward()
hed = cv2.resize(hed[0, 0], (W, H))
hed = (255 * hed).astype("uint8")
cv2.imshow("Input", img)
cv2.imshow("HED", hed)
cv2.waitKey(0)

输出

输出