Richer Convolutional Features for Edge Detection

Yun Liu1      Ming-Ming Cheng1      Xiaowei Hu1      Kai Wang1      Xiang Bai2

1Nankai University     2HUST

Abstract

In this paper, we propose an accurate edge detector using richer convolutional features (RCF). Since objects in natural images possess various scales and aspect ratios, learning the rich hierarchical representations is very critical for edge detection. CNNs have been proved to be effective for this task. In addition, the convolutional features in CNNs gradually become coarser with the increase of the receptive fields. According to these observations, we attempt to adopt richer convolutional features in such a challenging vision task. The proposed network fully exploits multiscale and multilevel information of objects to perform the image-to-image prediction by combining all the meaningful convolutional features in a holistic manner. Using VGG16 network, we achieve state-of-the-art performance on several available datasets. When evaluating on the well-known BSDS500 benchmark, we achieve ODS F-measure of 0.811 while retaining a fast speed (8 FPS). Besides, our fast version of RCF achieves ODS F-measure of 0.806 with 30 FPS.

Papers

Motivation

 

 

 

We build a simple network based on VGG16 to produce side outputs of conv3_1, conv3_2, conv3_3, conv4_1, conv4_2 and conv4_3. One can clearly see that convolutional features become coarser gradually, and the intermediate layers conv3_1, conv3_2, conv4_1, and conv4_2 contain lots of useful fine details that do not appear in other layers.

 

 

 

Method

Our RCF network architecture. The input is an image with arbitrary sizes, and our network outputs an edge possibility map in the same size. We combine hierarchical features from all the conv layers into a holistic framework, in which all of the parameters are learned automatically. Since receptive field sizes of conv layers in VGG16 are different from each other, our network can learn multiscale, including low-level and objectlevel, information that is helpful to edge detection.

The pipeline of our multiscale algorithm. The original image is resized to construct an image pyramid. And these multiscale images are input to RCF network for a forward pass. Then, we use bilinear interpolation to restore resulting edge response maps to original sizes. A simple average of these edge maps will output high-quality edges.

Evaluation on BSDS500 dataset

The evaluation results on standard BSDS500 dataset. Both single-scale and multiscale versions of RCF achieve better performance than humans.

 

The comparison with some competitors on BSDS500 dataset. The top three results are highlighted in red, green and blue respectively.
(Visited 3,644 times, 16 visits today)

说点什么

37 评论 在 "Richer Convolutional Features for Edge Detection"

提醒
avatar
Alex
游客
Alex

您好,上面那个问题已经解决啦。。。但是在运行nms文件时遇到找不到edgesNms这个函数,,在toolbox里面也确实没有该文件。。。其他的我也都照着tutorial做了。。。不知道为什么还是报这样的错误。
In edge_nms (line 10)
未定义函数或变量 ‘edgesNms’。

谢谢

Yun Liu
Editor
Yun Liu

在Piotr’s Structured Forest matlab toolbox的private文件夹下有一个edgesNmsMex函数,edgesNms只是edgesNmsMex的一个wrapper,你定义个edgesNms函数调用下edgesNmsMex就可以了

Alex
游客
Alex

您好,感谢您的回复,,,可是我用nms处理后得到边界还是跟之前一样是粗的,,想请问一下这是什么原因呢,谢谢

Yun Liu
Editor
Yun Liu

正常情况下,NMS之后的边缘应该变细很多的

Alex
游客
Alex

您好,我运行测试代码遇到如下错误:
F1228 15:16:32.198122 20695 layer_factory.cpp:69] Layer conv1_1 has unknown engine.
*** Check failure stack trace: ***
[I 15:17:54.551 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports
WARNING:root:kernel 988b18e8-175a-48c0-a26c-9cd06c83a5e0 restarted

还请帮忙看一下,谢谢

Yun Liu
Editor
Yun Liu

恩,应该是engine: CUDNN的锅

Jiaxin Zuo
游客
Jiaxin Zuo

您好,看了您的论文和代码后对于loss function有几个问题,
1 您文章中说忽略(0,阈值)中的点,我看了源码中的loss function是只有在target==1或者0时才计算的loss,那请问此时的阈值是不是就是1呢,还是说我对这个阈值的理解有问题?
2 target数组是不是就是论文中所说的average所有标注者的标注后的数组呢?如果是的话我想请问从label图片是如何转换成这个数组的呢?
刚刚入门图像处理,比较小白,请您指教!

Yun Liu
Editor
Yun Liu

阈值不是1,论文中有说明;请结合data layer (image_labelmap_data_layer.cpp) 和data transform (data_transformer.cpp) 相关的函数,以及loss function查看

曹以隽
游客
曹以隽

您好,看了您的论文有几个问题。
1、VOC2012和NYUD-V2的 训练label是怎么生成的?具体方法是啥?
2、训练的label和测试的label是用SegmentationClass 还是SegmentationObject 生成的还是两者都用?
3、我看到有些论文还用了非极大值抑制做后续处理,不过模型跑出来是没有方向图的,这点很让人困惑。另外,您的RCF用了后续处理吗,如果用了是什么呢?
非常感谢~

Yun Liu
Editor
Yun Liu

1. 我没用VOC12,我用的是PASCAL Context, PASCAL Context和NYUD-V2的label我用的是管HED的作者要的数据;你可以用BSDS500 benchmark里的seg2bdry.m函数从segmentation转换成boundary
2. 我用的是PASCAL Context,不是VOC12;PASCAL Context标记了四百多类,图片划分的很详细,所以可以用来做edge的训练数据;PASCAL Context不分SegmentationClass 还是SegmentationObject
3. 一般的edge算法都是用了非极大值抑制的,RCF也用了,论文里有说明;非极大值抑制时,edge的方向是可以根据edge的概率图估算的,具体估算方式你可以参考Piotr’s Structured Forest matlab toolbox里的相关代码。

曹以隽
游客
曹以隽

非常感谢~

Ang LI
游客
Ang LI

您好,请问solve.py中如果使用了solver.restore之后每一次迭代的Loss都是-nan,但是下面的每一小部分输出dsn1_loss,fuse_loss这几个都是正确的呢?请问是哪个地方出现了问题呢

Yun Liu
Editor
Yun Liu

loss出现了-nan,如果配置没出问题的话,一般再试几次就好了。因为edge刚开始训练的时候,loss的波动比较大,所以容易出现这个问题;但是多试几次就会正常了。

Ang LI
游客
Ang LI

非常感谢,我多试了几次果然好了

洪昭立
游客
洪昭立

你好,我在用你们的网络进行训练时,没迭代20次需要30秒左右,也就是说按照.Prototext里的超参数设置需要迭代100W次,那需要训练一个月。请问是这个时间长度,还是我的程序没真正调用cuda加速。

Yun Liu
Editor
Yun Liu

控制训练迭代次数的代码是solve.py中的solver.step(40000),迭代了4w次,需要一天多。

洪昭立
游客
洪昭立

谢谢你的回复。但是昨天我将solve.py中的solver.step(40000)改成solver.step(100000),但是今天早上已经训练到了100260了还没停止,这是为什么。然后我用rcf_bsds_iter_100000.caffemodel来测试数据集,发现效果不是很好。这个时候应该怎么办?

Yun Liu
Editor
Yun Liu

将solve.py中的solver.step(40000)改成solver.step(100000)后,运行python solve.py或者./train.sh进行训练,迭代100000次后会终止。

Bob
游客
Bob

为什么要忽略边缘概率低于阈值的点呢?

Yun Liu
Editor
Yun Liu

在之前HED的论文里,是把边缘概率低于阈值的点作为负样本来处理的,我们认为这样做是不合理的,所以在训练时忽略了这些点。

张明琦
游客
张明琦

你好,我也在做边缘检测这方面的工作,有些问题不太明白,能给个邮箱请教一下吗,谢谢了。

湛家明
游客
湛家明

您好!我使用RCF-singlescale.ipynb 在BSDS500上进行了简单的测试,速度只有12fps,测试代码中也没有生成F-measure性能指标的代码,这个性能指标是怎么得到的?谢谢!

Yun Liu
Editor
Yun Liu

我也不清楚您为什么测的速度只有12fps,可能是显卡或机器不同吧。RCF-singlescale.ipynb可以生成Edge的图像,然后您运行edge_nms.m进行NMS,edge_nms.m依赖于Piotr Dollar的Matlab toobox (https://github.com/pdollar/toolbox)。最后,请您用标准的BSDS500 Benchmark进行评测 (https://www2.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/resources.html),生成F-measure等性能指标。

湛家明
游客
湛家明

嗯,谢谢您的指导!

张松龙
游客
张松龙

程明明老师,您好,我跑您rcf代码时出现这样的错误,是什么原因导致的呢?F1027 13:05:30.217037 5997 net.cpp:775] Cannot copy param 0 weights from layer ‘score-dsn2’; shape mismatch. Source param shape is 1 128 1 1 (128); target param shape is 1 21 1 1 (21). To learn this layer’s parameters from scratch rather than copying from a saved net, rename the layer.

Yun Liu
Editor
Yun Liu

您好,你的初始化权重的模型和网络不对应,我们score-dsn2层的param shape不是1 128 1 1,所以你用的网络肯定不是我们的。请从https://github.com/yun-liu/rcf上下载相应的代码和训练好的模型。

王洲涛
游客
王洲涛

程明明老师,您好,请教您一个问题。如果想用自己标记的数据去训练RCF,请问是否有快速准确的标记方法或者软件可以推荐。谢谢~

周文璋
游客
周文璋

我有个问题想请您指导下,我下了你们的代码,在windows10平台基于vs2015进行caffe编译,报有std::tuple 系列错误,我想问下,你们编译caffe的具体环境有哪些

hhh
游客
hhh

您好,哪里可以下载其他算法的评价指标呢?

Yun Liu
Editor
Yun Liu

您好,您可以到其他算法的主页上下载;或者跑一下它们的代码,再用BSDS500 Benchmark里的code生成

miao
游客
miao

程明明老师:

您好,您的RCF工作非常好!请问在每个level卷积时为何1×1的kernel要设置为21种?

Yun Liu
Editor
Yun Liu

您好,每个level的卷积设置为大约几十对结果是没什么影响的,设置为21并没什么特殊的含义