点击上方↑↑↑“OpenCV学堂”关注我

OpenCV4 DNN 模块,自定义层解析!

觉得不错,请点【在看】支持!

HED算法介绍

图像边缘检测是图像处理与计算机视觉领域最基础也是最重要的任务之一,早期的Canny边缘检测到现在还在使用,但是Canny边缘检测过于依赖人工阈值的设定,无法在通用场景下工作,如何找到一个在自然场景下可以正确工作的边缘检测器,答案是使用CNN。2015年的时候有人提出了基于卷积神经网络的边缘检测算法HED全称为《Holistically-Nested Edge Detection》, 先看一下HED与Canny的效果对比:

作者提出HED算法是受到了全卷积网络与深度监督网络的启发与影响,作者以VGGNet与FCN作为基础网络进行改进,对VGG网络进行conv1_2, conv2_2, conv3_3, conv4_3, conv5_3多个特征层的输出,借助FCN全卷积网络的设计,通过权重融合层实现各个层相连接,去掉了VGG网络的后半部分,大大减少了网络浮点数计算次数,网络架构示意图如下:

代码演示

OpenCV DNN本身是不支持该网络直接加载与执行的,必须通过OpenCV4中支持的自定义层方法,首先解析HED网络的自定义多层输出,然后重载它的forward方法之后,才可以正确执行。

自定义层解析的代码如下:

# 自定义层class CropLayer(object):    def __init__(self, params, blobs):        self.xstart = 0        self.xend = 0        self.ystart = 0        self.yend = 0

    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]) // 2        self.yend = self.ystart + height        self.xend = self.xstart + width        return [[batchSize, numChannels, height, width]]

    def forward(self, inputs):        return [inputs[0][:,:,self.ystart:self.yend,self.xstart:self.xend]]

加载网络,进行多全层次的边缘检测:

# 自定义层# 注册自定义层cv.dnn_registerLayer('Crop', CropLayer)

# Load the model.net = cv.dnn.readNet("D:/projects/models/hed/deploy.prototxt", "D:/projects/models/hed/hed_pretrained_bsds.caffemodel")

kWinName = 'Holistically-Nested Edge Detection'cv.namedWindow('Input', cv.WINDOW_AUTOSIZE)cv.namedWindow(kWinName, cv.WINDOW_AUTOSIZE)

cap = cv.VideoCapture(0)while cv.waitKey(1) 0:    hasFrame, frame = cap.read()    frame = cv.flip(frame, 1)    if not hasFrame:        cv.waitKey()        break    cv.imshow('Input', frame)

    inp = cv.dnn.blobFromImage(frame, scalefactor=1.0, size=(500, 500),                               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)

运行效果

图像测试

视频测试

论文与源码

源码与预训练模型
https://github.com/s9xie/hed
论文地址:
https://arxiv.org/abs/1504.06375

往期精选

  • OpenCV3.3深度学习模块(DNN)应用-图像分类

  • OpenVINO开发系列文章汇总

  • OpenCV4系统化学习路线图与教程

  • OpenCV4.0实现人脸识别

  • OpenCV实现年龄与性别预测

关注【OpenCV学堂】

长按或者扫码即可关注

canny边缘检测算法_OpenCV4中调用HED边缘检测算法相关推荐

  1. 在python中调用双模拟退火算法dual_annealing

    原理 模拟退火算法(CSA)中最重要的概念就是Metrospolis准则,表示的是接收新解的概率,一般表示为 p=e−f(x2)−f(x3)Tp=e^{-\frac{f(x_2)-f(x_3)}{T} ...

  2. 算法导论中C语言代码,算法导论-学习笔记与进度

    算法导论 阅读进度 第一部分 基础知识 第一章 计算中算法的角色 Done 1.1 算法 输入与输出 算法可以解决哪些问题 数据结构 技术 一些比较难的问题 1.2 作为一种技术的算法 效率 算法和其 ...

  3. 在R中调用关联规则——Apriori算法

    library(arules)  #加载arules程序包 data(Groceries)  #调用数据文件 frequentsets=eclat(Groceries,parameter=list(s ...

  4. php经典排序算法,PHP中四大经典排序算法

    1.冒泡排序 在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. ...

  5. 用python解决数据结构与算法_python中各种数据结构与算法的解决技巧

    四.如何统计序列中元素的频度1.某随机序列[12,5,6,4,6,5,5,7]中,找到出现次数最高的3个元素,它们出现次数是多少? 解决方案1:将序列转换为字典{元素:频度},根据字典中的值排序> ...

  6. python素数算法,Python中的AKS素数算法

    是的,去看看rosettacode.org上的AKS test for primes页面def expand_x_1(p): ex = [1] for i in range(p): ex.append ...

  7. 数字图像处理:图像分割 人工智能算法在图像处理中的应用

    人工智能算法在图像处理中的应用 人工智能算法包括遗传算法.蚁群算法.模拟退火算法和粒子群算法等,在图像边缘检测.图像分割.图像识别.图像匹配.图像分类等领域有广泛应用.本文首先介绍常用人工智能算法的的 ...

  8. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)

    基于最大公约数欧几里得扩展算法求解算法导论中模线性方程解.具体要结合算法导论中的有关数论算法章节理解,具体代码如下: package cn.ansj;/*假设方程ax=b(mod n)有解,且x0是方 ...

  9. 算法竞赛中的输入输出框架

    算法竞赛中的输入输出框架 算法竞赛中的输入输出框架 标准输入输出 重定向 fopen 标准输入输出 #include <stdio.h> #define INF 10000000 /**输 ...

最新文章

  1. 2020年AI如何走?Jeff Dean和其他四位“大神”已做预测!
  2. ElasticSearch优化系列一:集群节点规划
  3. SQL自定义函数split分隔字符串
  4. scss怎么引入到html,Sass 导入指令
  5. 54. Spiral Matrix (Matrix)
  6. 计算机丢失d3dcompiler,win7系统提示缺少D3DCompiler_47.dll文件怎么办
  7. 都2021年了,c/c++开发竟然还能继续吃香??
  8. 操作系统中的死锁问题
  9. mba学什么书_MBA的完整形式是什么?
  10. 数据自治开放应用平台设计与实践
  11. Syzmlw 让子弹飞迅雷下载
  12. java jnlp 签名_JAVA JNLP组件数字签名制作步骤
  13. linux安装gcc-c++
  14. 【python】Python学到什么程度可以面试工作(解答一)
  15. PNG图片背景透明-简单方法
  16. “AI复活了我的妻子,但我决定跟她说再见了”
  17. 慕课网C#开发轻松入门 6-1练习题目
  18. 安卓MediaCodec编码aac
  19. 奈奎斯特与香农定理_大神带你理解奈奎斯特定理和香农定理
  20. 工作中少说这“五句话”(必读)

热门文章

  1. 用户扫描二维码进入公众号后自动发送指定消息_wetool的封杀、企业微信的崛起,我们要怎么利用企业微信进行用户增长?...
  2. swoft php怎么样,[原创]Swoole和Swoft的那些事 (Http/Rpc服务篇)
  3. 函数作为参数传递至函数内部进行调用
  4. redhat 6安装mysql5.7_RedHat6.5/CentOS6.5安装Mysql5.7.20的教程详解
  5. (十七)spring cloud微服务分布式云架构-eureka 基础
  6. Python yaml模块
  7. Hyper-V故障转移群集搭建(1)
  8. 9.9递归和动态规划(十二)——小鸡吃米
  9. Maven自动压缩脚本 和 样式文件配置
  10. 【转】python常用工具代码