导读
分析了canny的优劣,并给出了opencv使用深度学习做边缘检测的流程。
在这篇文章中,我们将学习如何在opencv中使用基于深度学习的边缘检测,它比目前流行的canny边缘检测器更精确。边缘检测在许多用例中是有用的,如视觉显著性检测,目标检测,跟踪和运动分析,结构从运动,3d重建,自动驾驶,图像到文本分析等等。
什么是边缘检测?
边缘检测是计算机视觉中一个非常古老的问题,它涉及到检测图像中的边缘来确定目标的边界,从而分离感兴趣的目标。最流行的边缘检测技术之一是canny边缘检测,它已经成为大多数计算机视觉研究人员和实践者的首选方法。让我们快速看一下canny边缘检测。
canny边缘检测算法
1983年,john canny在麻省理工学院发明了canny边缘检测。它将边缘检测视为一个信号处理问题。其核心思想是,如果你观察图像中每个像素的强度变化,它在边缘的时候非常高。
在下面这张简单的图片中,强度变化只发生在边界上。所以,你可以很容易地通过观察像素强度的变化来识别边缘。
现在,看下这张图片。强度不是恒定的,但强度的变化率在边缘处最高。(微积分复习:变化率可以用一阶导数(梯度)来计算。)
canny边缘检测器通过4步来识别边缘:
去噪:因为这种方法依赖于强度的突然变化,如果图像有很多随机噪声,那么会将噪声作为边缘。所以,使用5×5的高斯滤波器平滑你的图像是一个非常好的主意。
梯度计算:下一步,我们计算图像中每个像素的强度的梯度(强度变化率)。我们也计算梯度的方向。
梯度方向垂直于边缘,它被映射到四个方向中的一个(水平、垂直和两个对角线方向)。
非极大值抑制:现在,我们想删除不是边缘的像素(设置它们的值为0)。你可能会说,我们可以简单地选取梯度值最高的像素,这些就是我们的边。然而,在真实的图像中,梯度不是简单地在只一个像素处达到峰值,而是在临近边缘的像素处都非常高。因此我们在梯度方向上取3×3附近的局部最大值。
迟滞阈值化:在下一步中,我们需要决定一个梯度的阈值,低于这个阈值所有的像素都将被抑制(设置为0)。而canny边缘检测器则采用迟滞阈值法。迟滞阈值法是一种非常简单而有效的方法。我们使用两个阈值来代替只用一个阈值:
高阈值 = 选择一个非常高的值,这样任何梯度值高于这个值的像素都肯定是一个边缘。
低阈值 = 选择一个非常低的值,任何梯度值低于该值的像素绝对不是边缘。
在这两个阈值之间有梯度的像素会被检查,如果它们和边缘相连,就会留下,否则就会去掉。
迟滞阈值化
canny 边缘检测的问题:
由于canny边缘检测器只关注局部变化,没有语义(理解图像的内容)理解,精度有限(很多时候是这样)。
canny边缘检测器在这种情况下会失败,因为没有理解图像的上下文
语义理解对于边缘检测是至关重要的,这就是为什么使用机器学习或深度学习的基于学习的检测器比canny边缘检测器产生更好的结果。
opencv中基于深度学习的边缘检测
opencv在其全新的dnn模块中集成了基于深度学习的边缘检测技术。你需要opencv 3.4.3或更高版本。这种技术被称为整体嵌套边缘检测或hed,是一种基于学习的端到端边缘检测系统,使用修剪过的类似vgg的卷积神经网络进行图像到图像的预测任务。
hed利用了中间层的输出。之前的层的输出称为side output,将所有5个卷积层的输出进行融合,生成最终的预测。由于在每一层生成的特征图大小不同,它可以有效地以不同的尺度查看图像。
网络结构:整体嵌套边缘检测
hed方法不仅比其他基于深度学习的方法更准确,而且速度也比其他方法快得多。这就是为什么opencv决定将其集成到新的dnn模块中。以下是这篇论文的结果:
在opencv中训练深度学习边缘检测的代码
opencv使用的预训练模型已经在caffe框架中训练过了,可以这样加载:
sh download_pretrained.sh
网络中有一个crop层,默认是没有实现的,所以我们需要自己实现一下。
class croplayer(object):
def __init__(self, params, blobs):
self.xstart = 0
self.xend = 0
self.ystart = 0
self.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]) // 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)
现在,我们准备构建网络图并加载权重,这可以通过opencv的dnn.readne函数。
net = cv.dnn.readnet(args.prototxt, args.caffemodel)
现在,下一步是批量加载图像,并通过网络运行它们。为此,我们使用cv2.dnn.blobfromimage方法。该方法从输入图像中创建四维blob。
blob = cv.dnn.blobfromimage(image, scalefactor, size, mean, swaprb, crop)
其中:
image:是我们想要发送给神经网络进行推理的输入图像。
scalefactor:图像缩放常数,很多时候我们需要把uint8的图像除以255,这样所有的像素都在0到1之间。默认值是1.0,不缩放。
size:输出图像的空间大小。它将等于后续神经网络作为blobfromimage输出所需的输入大小。
swaprb:布尔值,表示我们是否想在3通道图像中交换第一个和最后一个通道。opencv默认图像为bgr格式,但如果我们想将此顺序转换为rgb,我们可以将此标志设置为true,这也是默认值。
mean:为了进行归一化,有时我们计算训练数据集上的平均像素值,并在训练过程中从每幅图像中减去它。如果我们在训练中做均值减法,那么我们必须在推理中应用它。这个平均值是一个对应于r, g, b通道的元组。例如imagenet数据集的均值是r=103.93, g=116.77, b=123.68。如果我们使用swaprb=false,那么这个顺序将是(b, g, r)。
crop:布尔标志,表示我们是否想居中裁剪图像。如果设置为true,则从中心裁剪输入图像时,较小的尺寸等于相应的尺寸,而其他尺寸等于或大于该尺寸。然而,如果我们将其设置为false,它将保留长宽比,只是将其调整为固定尺寸大小。
在我们这个场景下:
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]))
out = 255 * out
out = out.astype(np.uint8)
out=cv.cvtcolor(out,cv.color_gray2bgr)
con=np.concatenate((frame,out),axis=1)
cv.imshow(kwinname,con)
原文标题:在opencv中基于深度学习的边缘检测
文章出处:【微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。
苹果与Imagination达成多年期授权新协议
机械硬盘的告别:希捷苏州工厂宣布解散
小米隔空充电辐射或高于WiFi路由器625万倍
Arduino怎样连接DS3231实时时钟模块
新增长点兴起 连接器市场未来可期
OpenCV使用深度学习做边缘检测的流程
惠普星系列焕新登场,打造Z世代星动之选
推挽输出和开漏输出的概念及特点
电池包上壳气密性测试仪交付与使用培训
几个经典的立体匹配算法的评价指标和数据集
RFID技术怎样为智能交通助力
国产三大智能音箱对比评测 哪款音箱最值得买
“中国激光雷达第一股”禾赛科技公布财报:2022全年累计交付量破8万 毛利率下降明显
锡膏厂家为您讲解针筒式锡膏的生产工艺
苹果预测NAND/DRAM价格有望走低,第2季度颓势预估将延续至第3季度
rv1126与rk3399参数对比
心水!台湾手机一哥华硕ZenFone 3 Zoom上市:双镜头搭配5000mAh电池
电子电路基础知识-滤波器
自制便携手机充电器,让你旅行无后顾之忧,Portable cell-phone standby power supply
Vishay推陶瓷中功率短波紫外线(UVC)发光二极管