图像分割要点梳理,一站式caffe工程实践连载(9)

知识引入
经过前面的系列学习,这一次终于来到了本次分享的最后一篇,我们将在这一次的分享中给大家总结一下整个的项目,包括项目的背景以及项目中使用的一些关键的技术,具体来说将包含以下内容。
任务与技术应用
首先我们将回顾一下我们这个任务以及它的应用背景。我们将回顾其中使用的一些关键的技术,图像分割是我们这个任务中使用的关键技术,图像分割在整个计算机视觉中,它是一个难度比较适中的技术,它广泛应用于美颜直播等领域,同时在自动驾驶以及一些其他的抠背景的一些任务之中,也起到了非常大的作用。
Caffe的使用
第二个是caffe的使用。这一块也是我们非常重要的一个内容,现在有非常多的开源框架可以选择。对于初入行深度学习的人来说,很多人并不会选择caffe这样的一个框架去进行学习,而是选择tensorflow或者pytorch这样一些框架。但是我仍然建议大家从caffe开始学习,因为caffe包含了一套非常优秀的c++代码,方便大家进行阅读。同时caffe的使用,其实对于简单任务来说,相对于Tensorflow,pytorch来说会更加的简便。我们从caffe的环境配置,到caffe的一些关键代码的阅读,一个新的分割数据层的设计,以及caffe的训练和测试都进行完整的阐述。 听完我们这一套分享之后,大家可以提升对于框架的掌握能力。
网络的设计
第三个是网络的设计,分割网络的设计也是我们这个系列分享的核心内容。通过这一系列的分享,我们熟悉了分割网络的基础结构,对分割中的卷积与反卷积进行了比较详细的阐述。同时在设计一个移动端比较优化的模型中,我们介绍了一些简单的优化技巧。
示例演示
图像分割任务在美容美颜直播行业中使用的非常广泛,下面我们看一个实际的例子,给大家呈现一个完整的视觉体验(蜂口小程序观看视频)。
caffe,图像分割技术
这是来自于faceu APP的美妆的应用。我们现在看到的是口红的应用,可以看到,我们可以替换不同的口红颜色,以及对颜色的幅度进行选择。其次看到的是美发的应用,可以看到我们可以对头发的颜色进行更改。在刚才的视频测试中,我们可以看到算法的鲁棒性还是不错的。对于不同的姿态,不同的距离以及在复杂的背景光照下,能够取得比较好的结果。当然图像分割技术不仅仅只是适用于美颜、直播这样的一些应用之中,他还有其他非常非常多非常广泛的应用。我们给大家展示一个比较酷的demo,这个代码中我们可以看到,用图像分割技术,对通用的物体,包括人、动物、交通工具等等进行的分割。一个非常鲁棒的图像分割模型,是视频理解中的一个非常关键的步骤。相信经过我们这次的一个系列的分享,大家会对图像分割任务提升不少的兴趣。
Caffe框架分析
首先,我们来说一下为什么要使用caffe。现在有非常多的开源框架可以选择,从github上面的星的数量来说,caffe已经不是第一,第一是tensorflow。那为什么还要选择caffe,而不是选择tensorflow,在前面的分享我简单地跟大家说过,提过这是我个人的习惯,另外一个是因为他确实有一些优点,包括首先caffe它是一套纯C++代码的框架,它的整个的设计思想以及他的代码都非常的优雅,非常的简洁。 我们推荐大家从这样的一个框架开始学习,可以增进自己的C++的基础。第二个是caffe包含了很多的需要自定义的东西,这些自定义的层都可以强制我们去提升我们真正的一些水平,包括代码的水平以及数学公式的推导水平。最后对一些简单的任务来说,caffe其实更加简单,它将数据网络的配置以及训练和测试过程完整地进行了一个比较好的分离。我们的网络的配置跟数据是通过一个txt的文件进行配置,而模型的训练可以通过不同的接口,非常的灵活,同时多GPU的训练也非常的灵活,这就是我们选择caffe的原因。
使用Caffe注意事项
caffe的使用过程中需要哪些比较注意的地方?
首先:当然是我们要能够正确地使用caffe,我们需要安装它的一系列的编译环境,相对tensorflow等直接使用pip命令进行安装。caffe的安装会稍微的复杂一些,这是我们需要注意的一个地方。
第二、caffe的使用有很多地方都需要我们自己去修改源码。在我们这个任务中,我们只是定义了一个新的分割数据层,但其实假如我们的任务有不同的一个loss,也就是不同地优化目标,这个优化目标,又没有在caffe官方中进行实现,那么我们就必须自己去实现。当我们实现一个新的loss的时候,它就需要进行反向的求导。caffe是不支持反向求导的,所以我们需要自己去推,自己推公式,自己写代码,并且验证我们的梯度反向传导是正确的。 这个是对水平要求比较高的一个地方,也是很多人放弃使用caffe的主要原因。因为tensorflow,pytorch这样的平台都支持自动的求导。那么caffe现在仍然处于一个什么样的地位呢?至少就笔者而言,笔者以前在360AI研究院,现在在深度学习实验室,我们在移动端的模型的部署,仍然使用的是caffe的框架。tensorflow和pytorch并不适用于当前在手机端一个模型的部署,所以caffe的地位不容置疑。基本上一个优秀的工程师必须掌握caffe的框架,那caffe的后续发展如何?现在在github上面,caffe已经不再进行更新,caffe的版本也已经从最初的caffe1到了caffe2,由Facebook官方进行维持,它整个代码已经完整地并入了pytorch中。所以我们如果想继续深入地学习caffe的话,我们可以去看pytorch的源码。
为什么选择mobilenet
mobilelet是由google提出的一个适用于移动端部署的模型,它实际上就是将时空的卷积进行了分离,将空间的卷积进行了分离,它核心的思想就是分组卷积。相比性能几乎相当的vgg系列来说,mobilelet它的计算量大大的下降,模型的大小也大大的下降。同时mobilenet的设计非常的简单,非常的优雅,它就是不断的通过depthwise加pointwise层这样的block进行串联。 所以我们选择这样的一个模型来给大家介绍,这是一个非常简单优雅,但是效率又非常高的一个模型,非常适合大家开始学习。
如何选择一些相关的参数
我们如何选择一些相关的参数?这其中参数就包括我们如何选择我们的网络输入尺寸,如何决定我们的网络深度,如何决定我们的stride的大小?下面我们简单地各自介绍一下网络输入尺寸,也就是我们用于训练的图片的大小。在我们的这个分享之中,我们选择的是160×160。为什么我们要选择160×160这样的一个尺度?为什么不是100×100或者200×200?首先我们是对大量的人脸图片进行了一个统计,发现嘴唇的这个尺度基本上在100×100这样的一个尺度。如果我们使用100×100这样的一个尺度去做训练的话,由于这个尺度比较小,导致我们恢复出来的时候,分割的mask边缘不是非常的精细,所以我们在尽可能的减小这个网络输入尺寸的情况下,去选择一个更大的网络输入尺寸。经过我们不断的尝试,我们发现160这样一个尺度比较好,这就是我们选择这个尺寸的原因,当然你也可以去设计其他的一个尺寸输入。第二个网络深度,网络的深度是决定模型性能的一个因素。网络越浅,一般来说同样的模型网络越浅,它的计算量会越小。
网络的深度也是需要我们去不断的进行实验的探索。第三个是stride。主要就是说我们的分辨率到底会降多少倍?我们从160到最后的feature map的大小,它到底会降多少倍?我们的任务之中是32×32,也就是最后的feature map降为了5×5,为什么不是3×3或者7×7?有两个原因,第一个如果是3×3这样的一个尺度的话,那他太小,这样一个feature map在进行恢复分辨率的过程中,无法恢复到这一个比较好的细节。那为什么不是7×7或者10×10?就是考虑到计算量的因素。当我们从一个比较大的分辨率开始恢复的时候,我们计算量也会比较大。总结一句,这三个参数实际上都是经过实验验证,它不一定是最优的,但目前看来它是一个比较优的参数。第三个如何高效地对网络进行压缩?这其实是一个学科比较大的研究方向。mobilenet的提出就是研究这样一个问题,如果高效的对网络进行压缩,我们前面提到的一个简单的技术也就是互补卷积。当然它还有很多像shufflene的这样的一些优化的技巧,甚至包括量化网络等优化技巧。
结束语
我们在这次的分享之中无法给大家详细的阐述,我推荐大家去阅读我的知乎上面的两篇文章,一个是“如何finetune一个小模型到移动端”, 另一个是“为了压榨CNN模型,这几年大家都干什么?”,大家可以从中获得一些启发。

完整内容及视频解读,请关注蜂口小程序~
参与内测,免费获取蜂口所有内容,请申请内测(1*8*8*1*1*2*1*7*5*9*5),更有其他优惠福利多多,欢迎大家多多参与,尽情挑刺,凡是好的建议,我们都会虚心采纳哒~
蜂口小程序将持续为你带来最新技术的落地方法,欢迎随时关注了解~

猜你喜欢

转载自blog.csdn.net/qq_43019117/article/details/82690768