【深度学习HED边缘检测网络】

article/2025/10/20 9:54:49

源码:

这个版本的代码是最简洁易懂的,https://github.com/senliuy/Keras_HED_with_model

数据集:

链接:https://pan.baidu.com/s/13qStI9DP1mbt9JallQFpPg 
提取码:wbfi

HED(Holistically-Nested Edge Detection) 网络

首先先看一下HED网络结构:搬运https://blog.csdn.net/sinat_26917383/article/details/73087831

HED 网络模型是在 VGG16 网络结构的基础上设计出来的,所以有必要先看看 VGG16。 
这里写图片描述
 

HED 网络在 VGG 网络的基础上去除了后5层,vgg的后面的全连接层与 softmax 层主要用于分类,HED 网络只需要提取图片的特征,保留了前面的卷积层和池化层(注意:去掉最后一层池化层)。并将特征图合并然后1*1卷积,最后采用sigmoid激活,下面是 HED 网络的示意图:

特征图去除深度:

      分别提取出 VGG 网络的 conv1_2, conv2_2, conv3_3, conv4_3, conv5_3 层,这些输出层的大小分别为 [224, 224, 64],[112, 112, 128],[56, 56, 256],[28, 28, 512],[14, 14, 512],由于需要将这些层的数据和成一张图片,首先需要将深度降维到1,然后再按比例放大 1,2,4,8,16 倍使得每一层的数据大小都为 [224, 224],最终相加就可以得到尺寸为 [224, 224] 的输出图片了。去深度使用输出深度为 1,卷积核为 1*1 的卷积操作,得到深度为 1 的输出,1*1 的卷积主要作用就是多通道融合。

      在每个side-output layer,我们将每个输出都resize到原始尺寸和ground truth对比,在高层输出,由于经过了较大的stride,此时只剩下一些大的边缘,而精细的边缘已经检测不出来;

损失函数:

      因为边界像素数目远小于其他数目,正负样本分布不均衡,所以不能采用普通的交叉熵损失,这里采用的是 pos_weight交叉熵。

模型输出图:

参考链接:

https://pqpo.me/2019/08/02/machine-learning-hed-smartcropper/

https://blog.csdn.net/qq_36187544/article/details/91447065

测试程序:opencv4.2 模型下载链接:https://download.csdn.net/download/qq_35054151/12275865

#include <iostream>  
#include <opencv2/opencv.hpp> 
#include<opencv2\dnn.hpp>
using namespace cv;
using namespace std;
void edgeDetection(cv::Mat &src, cv::Mat &dst, double threshold)
{//CV_DNN_REGISTER_LAYER_CLASS(Crop, CropLayer);cv::Mat img = src.clone();cv::Size reso(500, 500);cv::Mat blob = cv::dnn::blobFromImage(img, threshold, reso, cv::Scalar(104.00698793, 116.66876762, 122.67891434), false, false);cv::dnn::Net net = cv::dnn::readNet("deploy.prototxt", "hed_pretrained_bsds.caffemodel");net.setInput(blob);cv::Mat out = net.forward();cv::resize(out.reshape(1, reso.height), out, img.size());cv::Mat out2;out.convertTo(dst, CV_8UC3, 255);
}int main(void)
{cv::Mat src = cv::imread("1.jpg");cv::namedWindow("原图", 0);cv::imshow("原图", src);resize(src, src, cv::Size(500, 500));cv::Mat dst;edgeDetection(src, dst, 2.2);cv::namedWindow("HED", 0);cv::imshow("HED", dst);cv::waitKey(0);return 0;
}

 

import cv2 as cv
import argparseparser = argparse.ArgumentParser(description='This sample shows how to define custom OpenCV deep learning layers in Python. ''Holistically-Nested Edge Detection (https://arxiv.org/abs/1504.06375) neural network ''is used as an example model. Find a pre-trained model at https://github.com/s9xie/hed.')
parser.add_argument('--input', help='Path to image or video. Skip to capture frames from camera', default='1.jpg')
parser.add_argument('--prototxt', help='Path to deploy.prototxt', default='deploy.prototxt')
parser.add_argument('--caffemodel', help='Path to hed_pretrained_bsds.caffemodel', default='hed_pretrained_bsds.caffemodel')
parser.add_argument('--width', help='Resize input image to a specific width', default=500, type=int)
parser.add_argument('--height', help='Resize input image to a specific height', default=500, type=int)
args = parser.parse_args()#! [CropLayenr]
class CropLayer(object):def __init__(self, params, blobs):self.xstart = 0self.xend = 0self.ystart = 0self.yend = 0# Our layer receives two inputs. We need to crop the first input blob# to match a shape of the second one (keeping batch size and number of channels)def getMemoryShapes(self, inputs):inputShape, targetShape = inputs[0], inputs[1]batchSize, numChannels = inputShape[0], inputShape[1]height, width = targetShape[2], targetShape[3]#self.ystart = (inputShape[2] - targetShape[2]) / 2#self.xstart = (inputShape[3] - targetShape[3]) / 2self.ystart = int((inputShape[2] - targetShape[2]) / 2)self.xstart = int((inputShape[3] - targetShape[3]) / 2)self.yend = self.ystart + heightself.xend = self.xstart + widthreturn [[batchSize, numChannels, height, width]]def forward(self, inputs):return [inputs[0][:,:,self.ystart:self.yend,self.xstart:self.xend]]
#! [CropLayer]#! [Register]
cv.dnn_registerLayer('Crop', CropLayer)
#! [Register]# Load the model.
net = cv.dnn.readNet(cv.samples.findFile(args.prototxt), cv.samples.findFile(args.caffemodel))kWinName = 'Holistically-Nested Edge Detection'
cv.namedWindow('Input', cv.WINDOW_NORMAL)
cv.namedWindow(kWinName, cv.WINDOW_NORMAL)frame=cv.imread('1.jpg')cv.imshow('Input', frame)
#cv.waitKey(0)inp = cv.dnn.blobFromImage(frame, scalefactor=1.0, size=(args.width, args.height),mean=(104.00698793, 116.66876762, 122.67891434),swapRB=False, crop=False)
net.setInput(inp)out = net.forward()
out = out[0, 0]
out = cv.resize(out, (frame.shape[1], frame.shape[0]))
cv.imshow(kWinName, out)
cv.imwrite('result.png',out)
cv.waitKey(0)

 

测试图像:

 

openvino部署测试

opencino2020.4

python mo.py --input_model hed.pb --input_shape=[1,480,480,3]  --data_type FP32   --model_name hed


http://chatgpt.dhexx.cn/article/RltNcfEh.shtml

相关文章

深度学习边缘检测 HED 训练自己的数据

深度学习边缘检测 HED 训练自己的数据 数据集制作 使用labelme标注&#xff0c;选择lineStrip&#xff08;线条束&#xff09;标注 生成json文件。 之后使用批量处理脚本将json文件转为边缘数据集。具体过程如下&#xff1a; 首先将所有的json文件放入一个文件夹内&#xff0c…

《HED:Holistically-Nested Edge Detection》原文翻译

注&#xff1a;本人水平有限&#xff0c;如有错误&#xff0c;恳请指正&#xff0c;谢谢 源代码和预训练模型获取地址&#xff1a; https://github.com/s9xie/hed 论文地址&#xff1a;https://arxiv.org/abs/1504.06375 Holistically-Nested Edge Detection 摘要 本文研究了…

边缘检测-HED-RCF

(HED)Holistically-Nested Edge Detection 解决问题 ICCV2015的文章。主要解决两个问题&#xff1a; &#xff08;1&#xff09;基于整个图像的训练和预测&#xff1b; &#xff08;2&#xff09;多尺度和多水平(多层次)的特征学习。该算法通过深度学习模型&#xff0c;完成了…

论文笔记 HED:Holistically-Nested Edge Detection

同组小伙伴推荐的文章&#xff0c;一篇看似做边缘检测&#xff0c;实际做出了语义分割的文章&#xff0c;ICCV2015的文章。主要解决两个问题&#xff1a;&#xff08;1&#xff09;基于整个图像的训练和预测&#xff1b;&#xff08;2&#xff09;多尺度和多水平的特征学习。该…

HED边缘检测:Holistically-nested Edge Detection 解读

Holistically-nested Edge Detection &#xff08;以下简称HED&#xff09; HED通过深度学习网络实现边缘检测&#xff0c;网络主要有以下两个特点 Holistically&#xff1a;指端到端&#xff08;end-to-end 或者image-to-image&#xff09;的学习方式&#xff0c;也就是说&a…

HED 和 RCF 图像边缘检测

HED 和 RCF 图像边缘检测 引言 虽然传统边缘检测算法在不断发展的过程中也取得了很大的进步&#xff0c;但仍然无法做到精细的边缘检测处理。随着近年来深度学习的快速发展&#xff0c;计算机视觉领域因此获益颇丰&#xff0c;当下最先进的计算机视觉应用几乎都离不开深度学习…

hed

一、编译caffe cd进入hed-master文件夹目里下 &#xff08;1&#xff09; cp Makefile.config.example Makefile.config &#xff08;2&#xff09; make all 出现错误a 解决&#xff1a; 打开Makefile.config文件 将 INCLUDE_DIRS : $(PYTHON_INCLUDE) /usr/local/incl…

边缘检测之HED

出自论文&#xff0c;Holistically-Nested Edge Detection &#xff0c;ICCV2015,Marr奖提名&#xff0c;非常值得看的一篇。 边缘检测的工作分为以下3个研究方向&#xff1a; (1)传统的检测算子&#xff1a;Sobel ,Canny (2)基于信息理论设计的手工特征&#xff1a;Statisti…

HED神经网

本篇论文提出了一种新的网络结构进行边缘检测&#xff0c;论文这种网络结构称为Holistically-nested network。HED能够实现图像到图像的训练&#xff0c;输入一个图像&#xff0c;输出这个图像的边缘检测图。 1.现有的Multi-Scale和Multi-level学习的网络结构 2. (e)图是论文提…

身体证检测与识别(二)——HED边缘检测与矫正

前言 1.关于边缘检测,我这里用了HED这个边缘检测网络&#xff0c;HED创作于2015年&#xff0c;骨干网络是state-of-the-art的VGG-16&#xff0c;并且使用迁移学习初始化了网络权重。关于HED的算法原理与训练模型代码可以转到github。 2.OpenCV也有好几边缘检测算法可用&#x…

mysql otter 数据同步_MySQL数据同步之otter

一、otter介绍 基于日志数据&#xff0c;用于MySQL或者ORACLE之间准实时同步数据。 用途&#xff1a; mysql/oracle互相同步 中间表/行记录同步 二、原理及架构图 otter整体模块 manager (提供web页面进行同步管理) arbitrate (分布式调度&#xff0c;可跨IDC机房) node (同步过…

Otter简介

原文地址&#xff1a;http://m635674608.iteye.com/blog/2314908 Otter它是一个数据同步解决方案,可以解决本地跨网络跨机房跨地域的数据同步问题,并且拥有可观的效率&#xff0c;web管理工具等特点,而且背景也很优秀,据说阿里B2B内部的本地/异地机房的同步需求基本全上了 otte…

Canal和Otter

问题一: 跨公网部署Otter 参考架构图 解析 ​ a. 数据涉及网络传输&#xff0c;S/E/T/L几个阶段会分散在2个或者更多Node节点上&#xff0c;多个Node之间通过zookeeper进行协同工作 (一般是Select和Extract在一个机房的Node&#xff0c;Transform/Load落在另一个机房的Node&a…

otter学习(一)——otter原理

1.otter原理&#xff1a; 基于数据库增量日志解析&#xff0c;准实时同步到本机房或异地机房的mysql/oracle数据库. 一个分布式数据库同步系统 原理描述&#xff1a; 1. 基于Canal开源产品&#xff0c;获取数据库增量日志数据。 2. 典型管理系统架构&#xff0c;manager(web管理…

otter数据同步

一、Otter目前支持了什么 1. 单向同步&#xff0c; mysql/oracle互相同步 2. 双向同步&#xff0c;无冲突变更 3. 文件同步&#xff0c;本地/aranda文件 4. 双A同步&#xff0c;冲突检测&冲突补救 5. 数据迁移&#xff0c;中间表/行记录同步 导历史表还需要程序代码实现吗&…

数据同步 之 Otter

一、Otter 语言&#xff1a;java 定位&#xff1a;基于数据库增量日志解析&#xff0c;准实时同步到本机房或异地机房的mysql/oracle数据库&#xff0c;一个分布式数据库同步系统。 1.工作原理&#xff1a; 2.原理描述 1. 基于Canal开源产品&#xff0c;获取数据库增量日志…

otter:分布式数据库同步系统

一、otter介绍 阿里巴巴B2B公司&#xff0c;因为业务的特性&#xff0c;卖家主要集中在国内&#xff0c;买家主要集中在国外&#xff0c;所以衍生出了杭州和美国异地机房的需求&#xff0c;同时为了提升用户体验&#xff0c;整个机房的架构为双A&#xff0c;两边均可写&#x…

Otter 下载安装

简介 基于数据库增量日志解析&#xff0c;准实时同步到本机房或异地机房的mysql/oracle数据库. 一个分布式数据库同步系统。 原理 1. 基于Canal开源产品&#xff0c;获取数据库增量日志数据。 什么是Canal, 请点击 2. 典型管理系统架构&#xff0c;manager(web管理)node(工…

otter使用手册

目录 1.机器管理 1.1 zookeeper管理 1.2 Node管理 2.配置管理 2.1数据源配置 2.2数据表配置&#xff08;添加数据库表&#xff09; 2.3 Canal配置&#xff08;添加Canal&#xff09; 3.同步管理 3.1 Channel管理 3.2 Pipeline管理 1.机器管理 1.1 zookeeper管理 添加z…

Otter 双向同步mysql

一、Otter目前支持了什么 1. 单向同步&#xff0c; mysql/oracle互相同步 2. 双向同步&#xff0c;无冲突变更 3. 文件同步&#xff0c;本地/aranda文件 4. 双A同步&#xff0c;冲突检测&冲突补救 5. 数据迁移&#xff0c;中间表/行记录同步 实际测试中&#xff0c;otter的…