轮廓检测论文解读 | 整体嵌套边缘检测HED | CVPR | 2015
主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, greenwillow, v-green, vue-pro, healer-readable
贡献主题:https://github.com/xitu/juejin-markdown-themes
theme: juejin
highlight:
0 轮廓检测
轮廓检测,对我这样的初学者而言,与语义分割类似。分割任务是什么我就不再赘述了,轮廓检测则是完成这样的一个任务:
了解传统图像处理或者opencv的朋友应该都不难看出(想到),“Canny”轮廓提取算子,这个算子简单的说就是对图像的像素值的变化(梯度)进行检测,然后梯度变化大的地方认定为轮廓(上图就是用Canny算子提取的效果)。当然,最近也是用深度学习的方法来做这种轮廓提取,本问介绍的HED就是这样的一个深度学习提取边框的办法,下图是HED提取小狗轮廓的结果图。
1 论文概述
- 相关论文:《Holistically-Nested Edge Detection》
- 论文链接:https://arxiv.org/abs/1504.06375
- 论文年份:2015
今天解读一篇论文,网上已经有一些的解读了,不过讲解的并不细致,让我难以理解,直到看了官方代码才理理顺,所以这篇文章部分搬运,再加上个人补充。
整体来说,这个HED边缘检测模型,与Unet分割模型类似,再加上年份较老,所以复现价值不大,大家当扩展知识看看就得了。
Unet我们直接已经讲解过了,用简单的文字来简单的回顾一下:字母U的左半边,是不断卷积池化层进行特征抽取,然后得到不同尺度的特征图,然后U的右半边,通过转置卷积进行上采样,然后与下采样过程中的同尺度拼接做特征融合,然后最终模型输出一个与输入图像相同大小的预测结果。
HED,Holistically-Nested Edge Detection这个模型,其中的亮点在我看来,是对Deep supervision的一种应用。Deep supervision这个概念相比读者应该不陌生,在上上上一篇文章《Unet++》那个文章中我已经提到了,简单的说就是一个模型有多个输出的结构。
2 HED结构
来看下论文中给出的HED的结构图:
这个图可能比较抽象,我来大概讲解一下:
- 可以看到的是整个过程只有一个卷积+池化的过程,Unet还有上采样的过程,这是不同点;
- 图中的有5个马的图片,从大到小,从浅到深,纹理越来越少,这分别是经过了maxpool和卷积得到的不同尺寸的输出。从图中可以看到,这些输出叫做side-output 1到side-output 5。
- 图中这五个特征图经过虚线,得到了一个Y,这个Y是经过“weighted-fusion”得到了,简单的说就是,五个图经过一个可以训练的权重参数,融合成了最终的输出
结构不难理解,但是到这里读者肯定心中仍有疑惑,看完下面的损失函数的构成就通透了。
3 损失函数
这个损失函数算是deep supervision比较常见的损失函数了,就是每一个side-output输出都是损失函数的一部分。
整体来说,这个损失函数是有两个部分:
- side-output:这个就是上图中五个不同尺度的预测结果,通过上采样成原图大小,然后和mask做交叉熵。因为有5个图,所以损失是五个的和;
- fusion:五个图fusion出得Y,这个Y与ground truth的交叉熵;
所以论文中有这样的损失函数:
我也没注意W,w,h的含义,但是看起来确实是side和fusion两部分损失函数。
这里的Dist其实使用的就是交叉熵
这个side中,除去这个\(\beta\)不管,剩下的内容就是二值交叉熵,也许和你常见的那种形式不太一样,但是是一样的。给个提示:看这里的\(\Sigma\)的下标
现在我们对损失函数应该有了一个大致的感觉了,但是仍然有两个疑问:
- \(loss_{side}\)中的\(\beta\)是什么?怎么算?
- \(loss_{fuse}\)中的\(\hat{Y}_{fuse}\)怎么得到,换言之,如何融合5个side-output?
对于第一个问题,\(\beta\)是一个平衡系数,
\]
其中\(|Y|\)表示图像的像素的数量,也就是widthxheight;\(|Y^-|\)表示这个图片中,ground truth的像素的数量,类似与解决预测像素不平衡的一个手段。
假设一张图片中ground truth的像素量少,那么意味着,\(\beta\)的值小,那么公式(2)中的第一项的权重轻,而第一项的sigma的下标是\(Y^+\),说明这个是计算非目标,也就是groud truth=0的损失,也就是背景的损失,数量很多,所以权重轻损失少。 这一点实在不好讲明白,希望大家没理解的多读两遍。
对于第二个问题,论文中给出了公式:
这个h应该是一个可以训练的参数,然后加和之后用sigma归一化。
4 损失函数 TF
现在万事俱备,官方提供了代码,来看一下这个损失函数的TF版本:
def class_balance_sigmoid_cross_entropy(logits,label,name='cross_entropy_loss'):
y = tf.cast(label,tf.float32)
count_neg = tf.reduce_sum(1.-y)
count_pos = tf.reduce_sum(y)
beta = count_neg/(count_neg+count_pos)
pos_weight = beta/(1-beta)
cost = tf.nn.weighted_cross_entropy_with_logits(logits,y,pos_weight)
cost = tf.reduce_mean(cost*(1-beta),name=name)
return cost
cost = class_balanced_sigmoid_cross_entropy(dsn_fuse, annotation_tensor) + \
class_balanced_sigmoid_cross_entropy(dsn1, annotation_tensor) + \
class_balanced_sigmoid_cross_entropy(dsn2, annotation_tensor) + \
class_balanced_sigmoid_cross_entropy(dsn3, annotation_tensor) + \
class_balanced_sigmoid_cross_entropy(dsn4, annotation_tensor) + \
class_balanced_sigmoid_cross_entropy(dsn5, annotation_tensor)
可能有的朋友看不懂TF的写法,不过大概能看懂把,细节不懂但是英文单词总是没问题的,整体来看,跟我们上面讲解的差不多把。
5 总结
这里谈一谈我看了这个2015年的老前辈模型的收获把:
- HED是一个边缘检测模型,但是使用的和Unet的框架有些类似。HED使用了deep supervision的方法,而Unet并没有,这里我突然想到Unet++ 的结构,Unet++的思想完全可以沿着Unet+HED这条线路诞生。
- 我们学到了一个deep supervision的损失函数的写法;
- 我们学到了一个单词Holistically-nested。holistically 整体地,nest 嵌套。
参考文章:
- https://zhuanlan.zhihu.com/p/35694372
- https://zhuanlan.zhihu.com/p/36660932
- https://www.zhihu.com/question/31864895
- https://arxiv.org/abs/1504.06375
- https://blog.csdn.net/u014779538/article/details/92765963
轮廓检测论文解读 | 整体嵌套边缘检测HED | CVPR | 2015的更多相关文章
- 轮廓检测论文解读 | Richer Convolutional Features for Edge Detection | CVPR | 2017
有什么问题可以加作者微信讨论,cyx645016617 上千人的粉丝群已经成立,氛围超好.为大家提供一个遇到问题有可能得到答案的平台. 0 概述 论文名称:"Richer Convoluti ...
- AAAI2019 | 基于区域分解集成的目标检测 论文解读
Object Detection based on Region Decomposition and Assembly AAAI2019 | 基于区域分解集成的目标检测 论文解读 作者 | 文永亮 学 ...
- CVPR 2019|PoolNet:基于池化技术的显著性检测 论文解读
作者 | 文永亮 研究方向 | 目标检测.GAN 研究动机 这是一篇发表于CVPR2019的关于显著性目标检测的paper,在U型结构的特征网络中,高层富含语义特征捕获的位置信息在自底向上的传播过 ...
- 目标检测论文解读13——FPN
引言 对于小目标通常需要用到多尺度检测,作者提出的FPN是一种快速且效果好的多尺度检测方法. 方法 a,b,c是之前的方法,其中a,c用到了多尺度检测的思想,但他们都存在明显的缺点. a方法:把每图片 ...
- 目标检测论文解读12——RetinaNet
引言 这篇论文深刻分析了one-stage的模型精度比two-stage更差的原因,并提出Focal Loss提高精度. 思路 在论文中,作者指出,造成one-stage模型精度差的原因主要是:正负样 ...
- 目标检测论文解读9——R-FCN
背景 基于ResNet 101的Faster RCNN速度很慢,本文通过提出Position-sensitive score maps(位置敏感分值图)来给模型加速. 方法 首先分析一下,为什么基于R ...
- 目标检测论文解读5——YOLO v1
背景 之前热门的目标检测方法都是two stage的,即分为region proposal和classification两个阶段,本文是对one stage方法的初次探索. 方法 首先看一下模型的网络 ...
- 目标检测论文解读4——Faster R-CNN
背景 Fast R-CNN中的region proposal阶段所采用的SS算法成为了检测网络的速度瓶颈,本文是在Fast R-CNN基础上采用RPN(Region Proposal Networks ...
- 目标检测论文解读1——Rich feature hierarchies for accurate object detection and semantic segmentation
背景 在2012 Imagenet LSVRC比赛中,Alexnet以15.3%的top-5 错误率轻松拔得头筹(第二名top-5错误率为26.2%).由此,ConvNet的潜力受到广泛认可,一炮而红 ...
随机推荐
- 2. Hive常见操作命令整理
该笔记主要整理了<Hive编程指南>中一些常见的操作命令,大致如下(持续补充中): 1. 查看/设置/修改变量2. 执行命令3. 搜索相关内容4. 查看库表信息5. 创建表6. 分区7. ...
- [MIT6.006] 16. Dijkstra
先回顾下上节课的内容: 下面来看一个定理:对于所有的点来说,放松操作总是满足 d[v] ≥ δ(s, v).即点s到点v的最短路径总是小于或等于当前点d的路径权重.证明如下: 在正是进入复杂的图前,先 ...
- day90:luffy:路飞项目前端部署
目录 1.域名备案 2.域名解析 3.设置安全组 4.部署架构图 5.一些准备工作 6.docker 7.把前端项目通过nginx容器来运行 1.域名备案 腾讯云先要进行域名实名认证,实名认证三天后才 ...
- 用 Cloud Performance Test怎么录制测试脚本
Cloud Performance Test 云压力测试平台(以下简称:CPT)可以提供一站式全链路云压力测试服务,通过分布式压力负载机,快速搭建系统高并发运行场景,按需模拟千万级用户实时访问,并结合 ...
- ceph-deploy 部署加密osd异常的问题
问题解析 问题 journal encryption with dmcrypt (Reno Rainz) 问题原文: I'm trying to setup a cluster with encryp ...
- BeanFactory and FactoryBean
BeanFactory,这是Spring容器的基础实现类,它负责生产和管理Bean的一个工厂.当然BeanFactory只是一个接口,它的常用实现有XmlBeanFactory.DefaultList ...
- python-网络安全编程第一天(requests模块)
前言 感觉现在做好多CTF题都需要python去写工具,正好期末考试放假利用空余时间来学学. requests简介 Requests是用python语言基于urllib编写的,采用的是Apache2 ...
- webug第十二关:我系统密码忘记了!
第十二关:我系统密码忘记了! 文件上传 直接上传php一句话, 菜刀链接
- 看看吧!月薪20K以上的程序员才能全部掌握RabbitMq知识,你掌握了多少
一.RabbitMq基础知识 0.概述 消息队列的作用就是接收消息生产者的消息,然后将消息发送到消费者 1.信道channel 我的理解是生产者/消费者和rabbitmq交互的一个通道,负责交换机.队 ...
- 快来,Boom 3D广播功能还能这样用
Boom 3D不仅为用户提供了包括3D立体音效.古典音乐音效在内的多种音效增强功能,而且还为用户提供了广播功能.该广播功能不仅涵盖了国内广播节目,而且还涵盖了国际广播节目. Boom 3D的广播功能还 ...