HED算法介绍,HED

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方法之后,才可以正确执行。

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

#自定义层classCropLayer(object):def__init__(self,params,blobs):self.xstart=0self.xend=0self.ystart=0self.yend=0defgetMemoryShapes(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])//2self.xstart=(inputShape[3]-targetShape[3])//2self.yend=self.ystart+heightself.xend=self.xstart+widthreturn[[batchSize,numChannels,height,width]]defforward(self,inputs):return[inputs[0][:,:,self.ystart:self.yend,self.xstart:self.xend]]

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

#自定义层#注册自定义层cv.dnn_registerLayer('Crop',CropLayer)#Loadthemodel.net=cv.dnn.readNet("D:/projects/models/hed/deploy.prototxt","D:/projects/models/hed/hed_pretrained_bsds.caffemodel")kWinName='Holistically-NestedEdgeDetection'cv.namedWindow('Input',cv.WINDOW_AUTOSIZE)cv.namedWindow(kWinName,cv.WINDOW_AUTOSIZE)cap=cv.VideoCapture(0)whilecv.waitKey(1)<0:hasFrame,frame=cap.read()frame=cv.flip(frame,1)ifnothasFrame:cv.waitKey()breakcv.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

审核编辑 :李倩


相关推荐

最新

相关文章