使用 OpenCV 和深度学习进行整体嵌套边缘检测
整体嵌套边缘检测 (HED) 是一种深度学习模型,它使用完全卷积神经网络和深度监督网络来进行图像到图像的预测。 HED 自动开发丰富的层次表示(由对侧面回复的深度监督指导),这对于解决边缘和对象边界检测中的歧义至关重要。
模型架构
该模型是 VGGNet,几乎没有修改-
- 侧输出层连接到每个阶段的最后一个卷积层,分别为conv1_2、conv2_2、conv3_3、conv4_3、conv5_3。每个卷积层的感受野大小与相应的侧输出层相同。
- 删除了 VGGNet 的最后阶段,包括第 5 个池化层和所有全连接层。
最终的 HED 网络架构有 5 个阶段,步幅分别为 1、2、4、8 和 16,并且具有不同的感受野大小,都嵌套在 VGGNet 中。
为什么选择海德?
提出的整体嵌套边缘检测器(HED)解决了两个关键问题:
- 整体图像训练和预测,灵感来自用于图像到图像分类的全卷积神经网络(系统将图像作为输入,并直接生成边缘图图像作为输出)
- 嵌套多尺度特征学习,受深度监督网络的启发,该网络执行深层监督以“引导”早期分类结果。
实施步骤
- 导入所有需要的库。
- 阅读图像。
img = cv2.imread(“path”)
- 创建 blob
blob = cv2.dnn.blobFromImage(img, scalefactor=1.0, size=(W, H),swapRB=False, crop=False)
- 加载预训练的 Caffe 模型
- 该框架建立在 FCN 和 DSN 的公开可用实现之上,并使用公开可用的 Caffe 库实现。从使用预训练的 VGG-16 网络模型的初始化开始,我们的 HED 系统中的整个网络都进行了微调。
- 这个 Caffe 模型被编码成两个文件
- 一个 prototxt 文件:一个文本 Caffe JSON 文件,其中包括模型定义(部署)(即层、预期输入……)
- 预训练的 Caffe 模型:神经网络权重。
net = cv2.dnn.readNetFromCaffe(“path to prototxt file”, “path to model weights file”)
- 将图像的 blob 传递给模型并找到输出。
net.setInput(blob)
hed = net.forward()
- 以正确的格式格式化数据以显示(如果需要)
hed = cv2.resize(hed[0, 0], (W, H))
hed = (255 * hed).astype(“uint8”)
- 显示输出
cv2.imshow(“HED”, hed)
示例 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)
输出