深度学习(二十五)基于Mutil-Scale CNN的图片语义分割、法向量估计-ICCV 2015
基于Mutil-Scale CNN的图片语义分割、法向量估计
原文地址:http://blog.csdn.net/hjimce/article/details/50443995
作者:hjimce
一、相关理论
2016年的第一篇博文,新的奋斗征程。本篇博文主要讲解2015年ICCV的一篇paper:《Predicting Depth, Surface Normals and Semantic Labels with a Common Multi-Scale Convolutional Architecture》,文献的主页:http://www.cs.nyu.edu/~deigen/dnl/。一开始看到这篇文献的名字,有点被吓到了,我以为作者要采用mutil-task多任务特征学习的方法,用于估计单幅图像的深度、法向量、语义分割三个任务。还以为paper即将采用跟文献《Facial Landmark Detection by Deep Multi-task Learning》一样的思想,进行提高精度,最后仔细通读全文才知道,其实这三个任务是独立的,不是传说中的“多任务特征学习”,终于松了一口气(因为之前看《机器学习及其应用2015》这本书的第一章的时候,讲到了“鲁邦多任务特征学习”,觉得好难,看不懂,所以就对多任务特征学习有点害怕)。这篇paper的思想其实很简单,说白了就是在文献《Depth map prediction from a single image using a multi-scale deep network》的基础上,改一改,精度稍微提高了一点点,就这样。
基于多尺度的语义分割在FCN网络中,早有耳闻,所以如果学过paper:《Fully Convolutional Networks for Semantic Segmentation 》 ,在学习这篇文献的网络架构时会比较轻松。对于三维法向量估计,这个需要懂一点点三维图像学的知识,一般只有搞到三维图像的人才会去在意这篇paper的法向量估计算法,不然二维视觉很少用到,因为我以前曾经搞过三维,所以对于三维的一些知识比较了解。还有另外一个是深度估计,深度估计基本上没变,都是继承了文献《Depth map prediction from a single image using a multi-scale deep network》的方法。所以总得来说我感觉这篇文献的创新点不是很明显,新的知识点很少,我们学起来也会比较轻松。
学习建议:要学习这篇paper,我个人感觉还是先要学《Depth map prediction from a single image using a multi-scale deep network》,学了这篇文献,那么接着就非常容易了。
二、网络架构
网格结构方面与文献《Depth map prediction from a single image using a multi-scale deep network》基本相似,可以说是在这篇paper的基础上做的修改,区别在于:
(1)采用了更深层的网络;
(2)增加了第三个尺度的网络,使得我们的输出是更高分辨率的图片(之前的paper输出大小是55*77,现在最后网络的输出大小是109*147);
(3)与之前的思路有点不同,之前采用的方式是,先训练scale1,训练完成后,以scale 1的输出作为scale 2的输入。现在所采用的方式是:scale 1和scale 2联合训练,最后固定这两个尺度CNN,在训练scale 3。
我们先大体看一下网络的总体架构:
网络分成三个尺度的CNN模型,scale 1的输入是原始图片;scale 2 的输入是原始图片和scale 1的输出;同样,scale 3 的输入是scale 2的输出和原始图片。可能网络的结构,看起来有点庞大,其实不然,这个相比于前面的博文《基于DCNN的人脸特征点定位》简单多了。
1、Scale 1 网络架构
网络的输入:原始图片,输入图片大小为 三通道彩色图片;
网络的输出:19*14大小的图片;
下面是网络第一个尺度的相关参数,这个和文献《Depth map prediction from a single image using a multi-scale deep network》一样,基本上是Alexnet。
本尺度的CNN不在细讲,如果不知道怎么架构,可以好好阅读文献:《Depth map prediction from a single image using a multi-scale deep network》。
2、Scale 2 网络架构
(1)第一层网络
输入:原始图片304*228(输入320*240后,训练的时候,采用random crop到304*208),经过卷积后,得到74*55大小的图片。相关参数如下:
- [conv_s2_1]
- type = conv
- load_key = fine_2
- filter_shape = (96,3,9,9)
- stride = 2
- init_w = lambda shp: 0.001*np.random.randn(*shp)
- init_b = 0.0
- conv_mode = valid
- weight_decay_w = 0.0001
- learning_rate_scale = 0.001
- [pool_s2_1]
- type = maxpool
- poolsize = (3,3)
- poolstride = (2,2)
也就是特征图个数为96,卷积的stride大小为2。池化采用重叠池化,池化stride大小为2。这样卷积步的stride=2,池化步的stride=2,图片的大小就缩小为原来的1/4(具体计算不再详解,因为这些计算是非常基础的东西了)。
(2)第二层网络。输入:除了第一层得到的特征图之外,还有scale 1的输出(把scale1的输出图片由19*14,放大4倍,然后进行边界处理,得到74*55的图片)。
3、Scale 3 网络结构
个人感觉多加了这个尺度的网络,仅仅只是为了获得更高分辨率的输出。
(1)第一层网络。与scale 2一样,第一层网络的输入是原始图片,然后进行卷积池化,因为我们scale 3要得到更大分辨率的结果,于是作者就把池化的stride选择为1,具体代码如下:
- [conv_s3_1]
- type = conv
- load_key = fine_3
- filter_shape = (64,3,9,9)
- stride = 2
- init_w = lambda shp: 0.001*np.random.randn(*shp)
- init_b = 0.0
- conv_mode = valid
- weight_decay_w = 0.0001
- learning_rate_scale = 0.001
- [pool_s3_1]
- type = maxpool
- poolsize = (3,3)
- poolstride = (1,1)
这样经过这一层的操作,我们可以得到147*109的图片。
(2)第二层网络。输入第一层的特征图,还有scale 2的输出图,在进行卷积池化。相关参数如下:
- [depths_conv_s3_2]
- type = conv
- load_key = fine_3
- filter_shape = (64,64,5,5)
- init_w = lambda shp: 0.01*np.random.randn(*shp)
- init_b = 0.0
- conv_mode = same
- weight_decay_w = 0.0001
- learning_rate_scale = 0.01
(3)第三层网络。后面都差不多,大同小异,具体就不在详解了,看一下网络的相关配置参数:
- [depths_conv_s3_3]
- type = conv
- load_key = fine_3
- filter_shape = (64,64,5,5)
- init_w = lambda shp: 0.01*np.random.randn(*shp)
- init_b = 0.0
- conv_mode = same
- weight_decay_w = 0.0001
- learning_rate_scale = 0.01
(4)第四层网络
- [depths_conv_s3_4]
- type = conv
- load_key = fine_3
- filter_shape = (64,1,5,5)
- transpose = True
- init_w = lambda shp: 0.01*np.random.randn(*shp)
- init_b = 0.0
- conv_mode = same
- weight_decay_w = 0.0001
- learning_rate_scale = 0.001
四、损失函数构建
我觉得文献的提出算法,如何构造损失函数也是一大创新点,所以我们还是要好好阅读对于深度、法向量、语义分割这些损失函数是怎么构建的。
(1)深度估计损失函数
这个与之前的那篇paper的构造方法相同,也是采用作者所提出的缩放不变损失函数,同时后面又加了一项elementwise L2:
其中D和D*分别表示网络深度预测值、实际的深度值。然后d=D-D*。
(2)法矢估计损失函数
因为法向量是三维的,因此我们每层scale的输出,就不应该是一个单通道图片了,而应该改为3通道,用于分别预测一个三维向量的(x,y,z)值。同时我们要知道法向量指的是长度为1的归一化向量,因此在输出三维V向量后,我们还需要把它归一化,然后接着才能定义计算损失函数:
因为预测值N和真实值N*向量的模长都为1,所以其实上面的损失函数说白了就是以两个向量的角度差,作为距离度量。
真实的法向量的获取方法:可能是没有训练数据的原因,所以文献法向量训练数据的获取方法,是通过每个像素点的深度值,获得三维空间中每个像素点的位置,也就是相当于点云。然后采用最小二乘平面拟合,拟合出每个点邻域范围内平面,以平面的法向量作为每个像素点的法矢(这个因为我之前搞过三维的重建、点云处理,所以对于三维点云法向量的求取会比较熟悉,如果没有接触过三维图形学的,可以跳过不看,或者可以学一学我的博客: http://blog.csdn.net/hjimce/article/category/5570255 关于三维图形学的知识,可以直接看点云重建)
(3)语义分割损失函数
因为语义分割,就相当于给每个像素点做分类,也就是相当于一个多分类问题,所以自然而然采用softmax,损失函数采用交叉熵:
其中:
这个是softmax的相关知识了,不熟悉的赶紧补一下。不然后面遇到CNN图片分类,就要抓狂了,softmax是基础知识。
五、网络训练
(1)训练流程
训练方法采用的都是随机梯度下降法,首先我们训练把scale 1和scale 2 联合起来训练,也就是说我们在训练scale 2的时候,scale1的参数也是要更新的,这个与另外一篇paper:《Depth Map Prediction from a Single Image using a Multi-Scale Deep Network》的训练方法不同。然后scale 3的训练和前面两个尺度的训练是分开的,我们先训练完了scale 1、scale 2,训练完毕后,固定这两个尺度的参数,然后继续训练scale 3(换一种说法就是训练scale 3的时候,scale 1\2的参数是不更新的)。
(2)训练参数
具体的训练参数,还是参考作者给的代码中的conf网络配置文件,里面可以看到每层的学习率,以及其它的一些相关参数。参数初始化:除了scale 1前面几层卷积层是用了Alexnet训练好的参数,作为初始值。其它的全部采用随机初始化的方法。Batch size大小选择32。
参考文献:
1、《Predicting Depth, Surface Normals and Semantic Labels with a Common Multi-Scale Convolutional Architecture》
2、http://www.cs.nyu.edu/~deigen/dnl/
3、《Depth map prediction from a single image using a multi-scale deep network》
**********************作者:hjimce 时间:2016.1.1 联系QQ:1393852684 地址:http://blog.csdn.net/hjimce 原创文章,版权所有,转载请保留本行信息(不允许删除)
深度学习(二十五)基于Mutil-Scale CNN的图片语义分割、法向量估计-ICCV 2015相关推荐
- 深度学习(二十五)基于Mutil-Scale CNN的图片语义分割、法向量估计
基于Mutil-Scale CNN的图片语义分割.法向量估计 原文地址:http://blog.csdn.net/hjimce/article/details/50443995 作者:hjimce 一 ...
- 知识图谱论文阅读(八)【转】推荐系统遇上深度学习(二十六)--知识图谱与推荐系统结合之DKN模型原理及实现
学习的博客: 推荐系统遇上深度学习(二十六)–知识图谱与推荐系统结合之DKN模型原理及实现 知识图谱特征学习的模型分类汇总 知识图谱嵌入(KGE):方法和应用的综述 论文: Knowledge Gra ...
- 花书+吴恩达深度学习(十五)序列模型之循环神经网络 RNN
目录 0. 前言 1. RNN 计算图 2. RNN 前向传播 3. RNN 反向传播 4. 导师驱动过程(teacher forcing) 5. 不同序列长度的 RNN 如果这篇文章对你有一点小小的 ...
- 花书+吴恩达深度学习(十四)卷积神经网络 CNN 之经典案例(LetNet-5, AlexNet, VGG-16, ResNet, Inception Network)
目录 0. 前言 1. LeNet-5 2. AlexNet 3. VGG-16 4. ResNet 残差网络 5. Inception Network 如果这篇文章对你有一点小小的帮助,请给个关注, ...
- 深度学习(十五)基于级联卷积神经网络的人脸特征点定位
基于级联卷积神经网络的人脸特征点定位 原文地址:http://blog.csdn.net/hjimce/article/details/49955149 作者:hjimce 一.相关理论 本篇博文主要 ...
- 系统学习深度学习(十五)--AlexNet译文
转自:http://www.aichengxu.com/other/2557713.htm http://blog.csdn.net/maweifei/article/details/53117830 ...
- 推荐系统遇上深度学习(二十二):DeepFM升级版XDeepFM模型强势来袭!
今天我们要学习的模型是xDeepFM模型,论文地址为:https://arxiv.org/abs/1803.05170.文中包含我个人的一些理解,如有不对的地方,欢迎大家指正!废话不多说,我们进入正题 ...
- 推荐系统遇上深度学习(二十)--探秘阿里之完整空间多任务模型ESSM
笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据 ...
- 深度学习(十七)基于改进Coarse-to-fine CNN网络的人脸特征点定位
基于改进Coarse-to-fine CNN网络的人脸特征点定位 原文地址:http://blog.csdn.net/hjimce/article/details/50099115 作者:hjimce ...
最新文章
- 常用的python数值处理函数,python常用数值函数总结
- 使用pyjnius和mpxj来读取mpp文件
- tensorflow随笔-读取多个文件
- jQuery里的promise
- java 函数式编程 示例_功能Java示例 第8部分–更多纯函数
- GridView控件RowDataBound事件中获取列字段值的几种途径
- 【XCTF 攻防世界 web 练习详解系列(二)】【get_post的两种解法】
- c mysql maxpoolsize_mysql数据库参数innodb_buffer_pool_size和max_connections
- delphi 发送网络消息_Actor 消息的可靠交付(Akka Typed)
- MySQL — 创建表,插入数据,更新数据,删除数据
- 用网页做触摸屏展示的设计要点
- 在O(1)的时间内删除链表节点
- C#中的委托和事件(转)
- c语言学生管理系统下载,学生管理系统(C语言)
- 为免费吃饭 黑客入侵餐馆管理系统改数据
- pr用什么显卡比较好_用PR软件做后期剪辑,主要需要怎样的主机配置-百度经验...
- CentOS7像外部163邮箱发送邮件
- 3.5 基本属性测试
- 【公告】淘宝 npm 域名即将切换 npmmirror 重构升级
- 错误代码: 1305 PROCEDURE world.insert_data does not exist
热门文章
- 人工智能升格为国家战略 唐小僧积极发展金融科技
- Spring Cloud Alibaba - 26 Gateway-自定义谓词工厂RoutePredicateFactory
- Java8 - 使用CompletableFuture 构建异步应用
- Apache Kafka-CMAK(kafka manager)安装部署使用
- Spring5源码 - 05 invokeBeanFactoryPostProcessors 源码解读_3细说invokeBeanDefinitionRegistryPostProcessors
- 简单计算机病毒黑屏,教大家一个黑屏小程序
- csv python 图片 存_Python|任意网页中的所有网址的保存
- SQLite API
- json html显示中文乱码,后台请求json文件,中文出现乱码
- python 反转链表