深度挖掘论文:《Semantic Soft Segmentation》(语义软分割)

版权声明:转载请通过公众号《湾区人工智能》联系我授权,谢谢 https://blog.csdn.net/BTUJACK/article/details/83989984

最近花了一段时间研究英语论文Semantic Soft Segmentation,把自己收集的知识点分享下。

###内容目录

###论文摘要

深度挖掘论文:《Semantic Soft Segmentation》(语义软分割)

他们在coco-stuff dataset 数据集上训练神经网络,从而得到模型,

原理

SSS:利用深度神经网路ResNet-101生成图像的语义特征128维度的特征向量,然后利用拉普拉斯的矩阵分解自动生成软分割。http://www.aiuai.cn/aifarm366.html
特征向量是Python编程,拉普拉斯矩阵是MATLAB编程。
语义分割其实是对不同的像素就行分类的过程。     
软分割:即表示语义上有意义的区域以及它们之间软过渡的层,
SSS:把图像中语义上有意义的区域用准确的软过度分隔开不同的层。所以,软就是指软过度。
拉普拉斯的矩阵决定每个像素属于哪个语义。论文第三页

深度残差网络ResNet

分别有50,101,152,200层
(The depth residual network ResNet, respectively, has 50101152200 layers)
ResNet中解决深层网络梯度消失的问题的核心结构是残差网络:
残差网络增加了一个identity mapping(恒等映射),把当前输出直接传输给下一层网络(全部是1:1传输,不增加额外的参数),相当于走了一个捷径,跳过了本层运算,这个直接连接命名为“skip connection”,同时在后向传播过程中,也是将下一层网络的梯度直接传递给上一层网络,这样就解决了深层网络的梯度消失问题。
残差网络使得前馈式/反向传播算法非常顺利进行,在极大程度上,残差网络使得优化较深层模型更为简单 

使用的训练集:
cocostuff10k 9000张训练集,1000张训练集
COCO Dataset
– Object segmentation
– Recognition in Context
– Multiple objects per image
– More than 300,000 images
– More than 2 Million instances
– 80 object categories
– 5 captions per image
– Keypoints on 100,000 people, 17 个关键点.

机器之心观点:

语义软分割——一组与图像中语义有意义的区域相对应的层,它们在不同对象之间有准确的软过渡。
软分割是通过精心构建的拉普拉斯矩阵的特征分解完全自动生成的
通过将高层次和低层次的图像特征融合在一个图结构中来自动生成软分割
对于输入图像,我们生成像素级的超维语义特征向量,并利用纹理和语义信息定义一张图。
构建该图的目的是使对应的拉普拉斯矩阵及其特征向量能够揭示语义对象和对象之间的软过渡(soft transition)。
我们的方法使用了与光谱抠图相同的形式,也就是将软分割任务形式化为特征值估计问题 [Levin et al. 2008b]。该方法的核心是构建拉普拉斯矩阵 L 来表征图像中每对像素属于同一个分割的可能性。尽管光谱抠图仅使用了低级局部颜色信息来构建矩阵,我们描述了如何通过非局部线索和高级语义信息来增强这一方法。
原始的方法也描述了如何利用稀疏化来从 L 的特征值来创建层,我们的研究表明,该原始技术的放宽限制的版本可以获得更佳的结果。

使用的工具:
Windows 10
TensorFlow 1.4
MATLAB 2016
Python 3.5
Pycharm
sublime text 3
GPU:英伟达 1050 ti (这里不能使用GPU版本的TF哈)

###测试demo的步骤:

语义分割代码

https://github.com/yaksoy/SemanticSoftSegmentation
运行SemanticSoftSegmentation-master文件夹里的文件demo.m

具体实现过程
按照论文测试自己的png格式图片的步骤:
下载png格式图片’docia_one.png’

特征提取代码:

https://github.com/iyah4888/SIGGRAPH18SSS
按照提示下载模型。把模型文件夹model放入SIGGRAPH18SSS-master下
然后把自己想测试的png格式图片(可以是很多张)'docia_one.png'放进SIGGRAPH18SSS-master\Samples文件夹下
运行文件夹SIGGRAPH18SSS-master里文件main_hyper.py
产生一个Feat文件夹,里面有对应的'docia_one.mat'文件:128维度图片
把这个'docia_one.mat'文件放进SemanticSoftSegmentation-master文件夹下

对128维度mat文件降维

分析preprocessFeatures.m 得到:
%function simp = preprocessFeatures(features, image) %features是对128维度图片,image是原图
%simp就是生成的3维度图片特征
preprocessFeatures.m  文件里面最后添加代码保存特征图片:imwrite(simp,features.png)  %保存三维度的特征图片features.png,结果是640x640x3 double
命令行窗口输入: 
tmp = load('docia_one.mat');  %这一步能够看到生成了变量:embedmap;docia_one.mat 128维度 
features = tmp.embedmap;  %When load() by matlab, the 128-dim feature is a field (embedmap) of a structure. It needs to be unpacked.
image= imread('docia_one.png'); %原图
运行:运行SemanticSoftSegmentation-master文件夹里的文件preprocessFeatures.m得到特征图片features.png

合并图像

原图'docia_one.png'和降维后的特征图片'features.png':
%personal defined file

image = imread('docia_one.png');  %原图
features = imread('features.png');
com_image = [image, features];
% imshow(com_image) %展示拼接的图片
imwrite(com_image,'new_docia.png');  %保存拼接的图片

运行demo.m

https://github.com/yaksoy/SemanticSoftSegmentation
运行SemanticSoftSegmentation-master文件夹里的文件demo.m
并且把%image = im2double(imread('docia.png'));中的docia.png图片替换成自己的图片'new_docia.png',左边是原图,右边是特征图
生成的第一张图片中右边第三个是分割后的结果。

注意
最后也可以尝试测试自己的很多图片,降维后的特征图会有很多种,每个特征图生成的语义分割图也是有很多种。所以可能需要自己编写for循环,进行多次生成语义分割图片。

###收藏部分
一些网址:

论文和附属论文地址:
http://people.inf.ethz.ch/aksoyy/sss/
网友总结:
http://www.aiuai.cn/aifarm366.html 博主人特别好,值得结交朋友。
主要MATLAB代码:
https://github.com/yaksoy/SemanticSoftSegmentation
特征提取代码:
https://github.com/iyah4888/SIGGRAPH18SSS

光谱抠图:
http://www.vision.huji.ac.il/SpectralMatting/

自问自答:

1
论文使用了什么深度神经网络?语义软分割中的软是什么意思?硬分割中的硬是什么意思
The base network of our feature extractor is based on 
DeepLab-ResNet-101
One of the major shortcomings of semantic hard segmentation
is its inaccuracy around object boundaries
说明硬分割就是语义边缘不准确的分割,软分割就是语义边沿效果很好的分割了。

软分割就是不同语义边缘软过度
硬分割:PSPNet:三元图d,(Mask R-CNN):三元图e

2
这几张图分别代表什么意思呢?
为什么会有128张图片呢?
preprocessFeatures.m
% Filter out super high numbers due to some instability in the network网络不稳定导致产生高维度特征
128张图片是由深度神经网络生成的语义特征,经过PCA降维后供光谱分割使用
为什么会有两份不同的代码?代码之间有什么联系吗?spectral segmentation approach代码用到semantic feature (128-D) generation 产生的mat文件了吗?
这个论文包含了两种方法:深度神经网络和光谱抠图,所以会有两种代码。光谱分割用到了语义特征


3
每次运行MATLAB代码产生的图片颜色不同的原因
就在MATLAB代码的demo部分,写得很清楚,我自己总认为自己不懂MATLAB代码,一直没有细心去看。:有两个阶段在初始化和分类时候使用了K均值算法,k均值算法属于无监督学习,每次结果会得到局部最优解,局部最优解不一定会是全局最优解,所以图片颜色会有差异。
The results may vary a bit from run to run, as there are 2 stages that use k-means for intialization & grouping.

4
最终结果为啥会有matting component这个图像出现。
因为论文中提到把语义软分割和光谱分割进行比较,所以这样画图进行了比较,没有啥特殊意义。
你可以用语义特征采用光谱抠图来对软分割进行分类,就像我们在论文中所做的比较一样。(来自MATLAB代码部分的注释)
You can group the soft segments from Spectral Matting using semantic features, the way we presented our comparisons in the paper.
论文第三页这句话也是这个意思:Our approach uses the same formalism as spectral matting in formulating the soft segmentation task as an eigenvector estimation 
problem [Levin et al . 2008b]. The core component of this approach is the creation of a Laplacian matrix L that represents how likely
 each pair of pixels in the image is to belong to the same segment. While spectral matting builds this matrix using only low-level local color distributions, 
 we describe how to augment this approach with nonlocal cues and high-level semantic information. The original approach also describes how to create the layers from the eigenvec- tors of L using sparsification. We show how a relaxed version of this original technique actually yields better results. Figure 2 shows an overview of our approach.
我们的方法将软分割的任务转化为特征向量估计的问题,这点和光谱抠图是一样的。这种方法的核心是创建一个代表图像中每一对像素属于同一个语义可能性的拉普拉斯矩阵。然而光谱抠图仅仅使用了
低层的局部颜色分布,我们用非局部线索和高维的语义信息方法增强了这种方法。原始的方法也描述了怎样使用L维度的特征向量通过稀疏化创建不同的层。
附属论文也提到:We show our results together with that of Zhao et al. [2017] (PSPNet), He et al. [2017] (Mask R-CNN), and spectral matting [Levin et al . 2008]

5
在demo.m文件中为啥只使用了SSS有限的脚本文件,还有大量没有在主程序中被使用的作用是什么?
因为demo中的自定义函数使用了没有出现在demo文件中的自定义函数

6
我在MATLAB代码中感觉没有用到神经网络产生的语义特征?
用其他png图片进行了测试,发现没有报错,也会产生想要的效果,发现MC图片正常,但是SSS图片感觉缺少了一张图片,只有2张,按理应该有3张图片

我用同样的代码测试了docia.png图片,发现就可以产生三张图片了。因为docia图片自带语义特征,

说明神经网络提取的特征还是被利用了。


7
为什么最后要生成128维度的特征向量?
因为The 128-dimensional feature vectors f p have enough capacity to
represent a large diversity of real-world semantic categories.附属论文这样提到128维度特征向量就够了,代表全部语义种类。

8 不能  
哪些问题你觉得非常难?(针对将来可能的面试,提前做好准备)
最开始对生成的128维度mat文件进行破解,看看里面有什么东西,看看里面的图像是怎样的。
同事帮我破解了文件,用MATLAB看到了图片。后来我自己继续研究,用Python也打开了(注意百度搜索,关键字不同,结果不同,把我坑死,浪费好多时间)

第二个问题是对三维数组640*640*128降维到640*640*3,折腾了3个星期搞不出来。最后是怎样解决的呢?
请教了2个同事,感觉他们都很忙,说手头有工作,抽不出时间,没有能力帮助。其实他们也不了解我这个问题,主要是没有这个方向的经验,虽然他们MATLAB用的很好,
但里面库的方向不同,需要查函数表搞定。如果要帮我,就要从头开始研究,别人没有那个义务。认识一个网友,他也研究过这个论文,但也不好意思请教他这么幼稚的问题
最后还是靠自己啦,这次没人帮忙,我折腾了两个星期,看了几百个网页搞定的,主要问题是,我的数据是3维度的,Python和MATLAB都是对二维数组降维。
最终看到一个网页说可以用reshape把三维数组转为二维数组,然后降维,最后再reshape转为自己想要的三维效果。感动天,感动地之前先把自己感动了,这就是喜欢编程的理由吧,觉得特有成就感。
(大家不要嘲笑哈,每个人基础不同,或许别人在大学读计算机视觉的时候可以请教老师,同学,早就掌握这个知识点了,到了工作后换行,没人帮你,只有靠自己拼)

后来在测试过程中又碰到了新问题,有些图片没有问题,有些总是报错,都是png图片,甚至无法生成特征图像。
自己在研究了一个星期,看了源代码,依旧没有搞明白,无法解决报错问题。后来国庆节来了后,坐那里突然想起来了是不是原图和mat文件产生的特征向量不匹配呀。赶紧推倒从来,搞定了。

总结:针对陌生领域的问题:
先思考几种可能的方案,列个清单,然后下定决心,不搞定他不睡觉。
按照清单上的方法,一个个尝试,每个方法留出半天时间吧。
禁忌:
查找方案10分钟,感觉不可能搞定,然后转去搞手里的其他工作,过了会,又想起这个问题,又开始把思维拉回来,重新研究。
结果就是老板问你,为啥那个问题一个星期都没有搞定,怀疑你的能力,其实就是工作方法出问题了,也就是工作能力问题。

有时候碰到问题,需要从完全不同的思路考虑下,不能钻牛角尖。


9
为啥要把128维度降维到3维度?
 in order to make
the graph construction (described in the main paper) more tractable
and less prone to parameter-tuning, we reduce the dimensionality
of the feature vectors to three using per-image principle component
analysis.

10
'preprocessFeatures.m' file的function simp = preprocessFeatures(features, image) 输入输出是什么
demo.m中有这么一段话:
To use the features generated using our network implementation,
% just feed them as the 'features' variable to the function. It will do
% the prepocessing described in the paper and give the processed
% features as an output.
说明输入features就是神经网络产生的高维特征,image就是原始的png格式图片。输出就是3维度的图片特征,和原图合并后就可以送给MATLAB语义分割程序


11
运行速度慢怎么办?每张图片都要5分钟
论文方法:多层解决方案multi-scale solvers
网友方案:
使用 mini-batches (小批量)来减少计算时间,
与其他降低 k-means 收敛时间的算法相反,mini-batch k-means 产生的结果通常只比标准算法略差

While we are able to generate accurate soft segmentations of images,
in our prototype implementation our solvers are not optimized for
speed. As a result, our runtime for a 640 × 480 image lies between
3 and 4 minutes. The efficiency of our method can be optimized
in several ways, such as multi-scale solvers, but an efficient implementation
of linear solvers and eigendecomposition lies beyond the
scope of our paper.


12 
SSS方法可以对同一个语义进行再次分割吗?
不行,因为特殊的特征向量
Our method does not generate separate layers for different instances
of the same class of objects. This is due to our feature vectors,
which does not provide instance-aware semantic information.

13 
SSS缺点:
当物体颜色相近或者语义特征向量在大量迁移区域的不可靠导致效果不好
As Figure 15
demonstrates, our method may fail at the initial constrained sparsification
step when the object colors are very similar, or the grouping
of soft segments may fail due to unreliable semantic feature vectors
around large transition regions.

14 
图像分割后有几种语义?为啥有些语义还会被分割成好几层?
被分割为5层,比如会看到头部经常好几部分,但是不会影响他们方法的使用。
In the constrained sparsification step, we generate around 15-25
segments, which are then grouped using the feature vectors into 5.
The number of layers was set via empirical observations, and in
some cases, an object may be divided into several layers. While this
does not affect the applicability of our method as combining those
layers in editing is trivial, more sophisticated ways of grouping the
layers such as through recognition and classification can be devised.

15
文章是否提到了每个语义分割部分具体是什么语义信息?
没有提到
In this paper, we introduce
semantic soft segmentation, a fully automatic decomposition of an
input image into a set of layers that cover scene objects, separated
by soft transitions.

16
最终为啥会分为5层?
k均值赋值为5,所以为5层。而且5层满足大部分的场合
. We generate
40 layers with this approach and in practice, several of them are
all zeros, leaving 15 to 25 nontrivial layers. We further reduce the
number of layers by running the k -means algorithm with k = 5 on
these nontrivial layers represented by their average feature vector.

We
have set the number of segments to 5 without loss of generalization;
while this number could be set by the user depending on the scene
structure, we have observed that it is a reasonable number for most
images. 

17
对产生的 640*640*128 docia.mat文件分别用Python和MATLAB代码进行降维,为啥Python无法对降维后的结果画图,MATLAB可以对结果画图。两种方法降维后结果一样吗?
回答:Python和MATLAB代码每次降维结果不同,但是有办法让Python降维结果相同。

18 
程序运行时间过长,比如,一张图片跑下来要3分钟,工业界是不允许这样的情况,所以如何降低时间?
修改后的结果:

11:37 >> for_begin(20, 1, 1) 11:42  缩短到1分钟
initialSegmCnt = 5;
sparsityParam = 0.8;
iterCnt = 5;
maxIter = 5;
highLevelIters = 5;
compCnt = 5;

以下是分析过程:
耗时地方:

SemanticSoftSegmentation.m
 34行   

     initialSegmCnt = 40;
    sparsityParam = 0.8;
    iterCnt = 40;  
    initialSegmCnt,iterCnt都会被调入函数softSegmentsFromEigs.m
    但是在softSegmentsFromEigs.m中initialSegmCnt,iterCnt被替换为compCnt, maxIter
initSoftSegments = softSegmentsFromEigs(eigenvectors, eigenvalues, Laplacian, ...
                                            h, w, features, initialSegmCnt, iterCnt, sparsityParam, [], []);

softSegmentsFromEigs.m 迭代40轮,由SemanticSoftSegmentation.m决定的initialSegmCnt = 40;
    % Compute matting component with sparsity prior
    for iter = 1 : maxIter
        %%
        if rem(iter, 10) == 0                                            
            disp(['               Iteration ' int2str(iter) ' of ' int2str(maxIter)]);  
        end

8行修改迭代次数

    if (~exist('maxIter','var') || isempty(maxIter))
      maxIter = 20;
    if (~exist('compCnt','var') || isempty(compCnt))
        compCnt = 10;

startK = 5;  修改初次的k的种类,也就是语义分割的种类
  startK = min(K,startK);
  maxIters = 100;  % Defualt of matlab is 100    修改最大迭代次数,排除警报

 148行           [tmp_idx, tmp_C, ~, tmp_D]=kmeans(clX,2,'EmptyAction','singleton','Start','cluster', 'Maxiter', maxIters);
83行 k = compCnt;
118 行K赋值到这里了 function [idx, C, sumd, D]=fastKmeans(X,K)

112 行k个质心的位置   % c - the K cluster centroid locations in a K-by-P matrix.

sparsifySegments.m  迭代20轮   
for iter = 1 : highLevelIters
        if rem(iter, 5) == 0
            disp(['               Iteration ' int2str(iter) ' of ' int2str(highLevelIters)]);
        end

修改24行 highLevelIters = 20;可以降低迭代次数

19 
测试100个128维度的特征,但是下载很多图片无法使用,怎么回事?
报错:
错误使用 imguidedfilter>parse_inputs/validateInputImages (line 177)
Number of rows and columns in A must be the same as that in G .
解决方案:
首先保证图片是png格式,用Python生成的mat文件要和原图一一对应,也就是不要随便替换,重命名已经下载好的原始图片,和生成的128维度图片特征,和3维度图片。这样就可以避免这个问题。

20
光谱抠图spectral matting和SSS区别:
都创建了一个代表图像中每一对像素属于同一个语义可能性的拉普拉斯矩阵,描述了怎样使用L维度的特征向量通过稀疏化创建不同的层。
然而光谱抠图仅仅使用了低层的局部颜色分布,我们用非局部线索和高维的语义信息方法增强了这种方法
两者相同点:
创建一个代表图像中每一对像素属于同一个语义可能性的拉普拉斯矩阵
两者不同点:
SSS使用了非局部线索和高维的语义信息,高维度的语义信息就是靠着深度学习神经网络构造的,属于Python代码。他们共同的拉普拉斯矩阵特征分解属于MATLAB代码
光谱分割仅仅使用了低层的局部颜色分布

21
论文中的深度神经网络有啥特色?
The base network of our feature extractor is based on DeepLab-ResNet-101 [Chen etal . 2017],
but it is trained with a metric learning approach [Hoffer and Ailon 2015] to maximize the L2 distance be-
tween the features of different objects.
我们的特征提取器的基础网络是基于 DeepLab ResNet-101 [Chen etal]。但它添加了度量学习方法来[Hoffer和Ailon 2015]最大化不同物体特征间的L2距离。

###计算机视觉相关概念整理:

Guided Filter导向滤波降噪算法 
图像深度:是指存储每个像素所用的位数,也用于量度图像的色彩分辨率。确定彩色图像的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能有的灰度级数。它决定了彩色图像中可出现的最多颜色数,或灰度图像中的最大灰度等级
深度图像 = 普通的RGB三通道彩色图像 + Depth Map
深度图:按照图片中景物远近关系给图片分为白色和黑色;一般越远的图像就是黑色,越近的图像是白色,黑白之间效果要明显,接触边缘要干脆,不能模糊不清。有了深度图,就可以合成3D图
深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,可以用以测量、三维重建、以及虚拟视点的合成等
拍摄双目图片进行立体匹配获取深度图,进行三维重建
深度图:像的像素值反映场景中物体到相机的距离,获取深度图像的方法=被动测距传感+主动深度传感。
灰度图:Gray Scale Image 或是Grey Scale Image,又称灰阶图。把白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为256阶。
位深度:“位”( bit )是计算机存储器里的最小单元,它用来记录每一个像素颜色的值。图像的色彩越丰富,“位”就越多。每一个像素在计算机中所使用的这种位数就是“位深度”。
位深度平均分给R, G, B和Alpha,而只有RGB可以相互组合成颜色。所以4位颜色的图,它的位深度是4,只有2的4次幂种颜色,即16种颜色或16种灰度等级 
阿尔法通道(Alpha Channel)是指一张图片的透明和半透明度。alpha值取0~1之间。 通道分为三种通道。也就是有三个作用。
透明度值:每一层的各个像素由一个透明度值alpha表示. alpha=0 表示完全不透明(fully opaque),alpha=1 表示完全透明(fully transparent),alpha 值在 0-1 之间,则表示部分不透明度.
彩色深度标准通常有以下几种:8位色,每个像素所能显示的彩色数为2的8次方,即256种颜色。16,24,32位色,以此类推,位数越大,显示效果越好,图像越丰富。
通道类别:主通道,专色通道,普通通道
图像目标检测:检测给出的是对图片前景和背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述,针对单一图片不同物体
图像分割:分割(Segmentation)。分割包括语义分割(semantic segmentation)和实例分割(instance segmentation)
语义分割(semantic segmentation):对前背景分离的拓展,要求分离开具有不同语义的图像部分。
实例分割(instance segmentation):就是切图,从图片中获取我们想要的部分。检测任务的拓展,要求描述出目标的轮廓(相比检测框更为精细)。分割是对图像的像素级描述,它赋予每个像素类别(实例)意义,适用于理解要求较高的场景,如无人驾驶中对道路和非道路的分割。
图像分类:图片中的人物,动物分类,指出哪些是人,哪些是狗。在应用领域,人脸、场景的识别等都可以归为分类任务。
测试数据集Middlebury Stereo Dataset属于被动测距传感;被动测距传感=两个相隔一定距离的相机获得两幅图像+立体匹配+三角原理计算视差(disparity)
双目立体视觉:该方法通过两个相隔一定距离的摄像机同时获取同一场景的两幅图像,通过立体匹配算法找到两幅图像中对应的像素点,随后根据三角原理计算出时差信息,而视差信息通过转换可用于表征场景中物体的深度信息。
被动测距传感:被动测距传感中最常用的方法是双目立体视觉
主动测距传感:设备本身需要发射能量来完成深度信息的采集
TOF相机获取深度图像
图像掩膜:盖住图像中不需要的部分,例如,抠图,把人从背景中挖出来。用于覆盖的特定图像或物体称为掩模或模板
掩码(英语:Mask)在计算机学科及数字逻辑中指的是一串二进制数字,通过与目标数字的按位操作,达到屏蔽指定位而实现需求
Pix2Pix框架:基于对抗神经网络实现图像之间的转换称/图像翻译,比如:比如灰度图、彩色图、梯度图
图像语义分割:从头开始训练deeplab v2系列之四【NYU v2数据集】
NYU-Depth数据集:有标签的:视频数据的一个子集,伴随着密集多标签。此数据也已经被预处理,以填补缺少的深度标签。 原始数据集:利用Kinect测得的原始的RGB、Depth、加速度数据。 工具箱:用于操作数据和标签的有用的工具。 用于评估的训练和测试部分。
帧:就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一格镜头。 一帧就是一副静止的画面,连续的帧就形成动画,如电视图象等。 我们通常说帧数,简单地说,就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。
NUKE:视觉效果软件 当今大型电影绝伦的视效
出屏,入屏:谷远旭教我带上3D眼镜,看到一个视频,视频是用两个摄影机拍摄的,用软件合成一个视频,在特殊的显示器上通过一个按钮就可以让视频变成2个,还可以切换成一个视频,带上眼镜就可以看到3D美女。以屏幕为标准,屏幕前面的就是出屏,相当于从屏幕走出来了,屏幕里面的建筑物就是入屏。
roto:影视人员在实际工作中,主要解决的问题就是把画面中不想要的地方从画面中去除,然后把理想的画面再补上去,使画面播放起来真实自然,通俗的讲,就是抠像再补像!切换背景
DeepLabv3+:语义分割领域的新高峰
GrabCut: is an image segmentation method based on graph cuts
“3D建模”:通俗来讲就是通过三维制作软件通过虚拟三维空间构建出具有三维数据的模型。3D建模大概可分为:NURBS和多边形网格。
GTA:一款游戏作品
OpenCV:是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
colmap应该是目前state-of-art的增量式SFM方案,可以方便的对一系列二维图片进行三维重建
Mean shift: 算法是基于核密度估计的爬山算法,可用于聚类、图像分割、跟踪等,因为最近搞一个项目,涉及到这个算法的图像聚类实现,求解一个向量,使得圆心一直往数据集密度最大的方向移动。说的再简单一点,就是每次迭代的时候,都是找到圆里面点的平均位置作为新的圆心位置。
grabcut in one-cut 一种好用快速的图像分割算法

###语义分割方法总结:
1.FCN网络;
2.SegNet网络;
3.空洞卷积(Dilated Convolutions);
4.DeepLab (v1和v2);
5.RefineNet;
6.PSPNet;
7.大内核(Large Kernel Matters);
8.DeepLab v3;

###代码总结:

1

Python打开mat文件的方法:

import scipy.io

data = scipy.io.loadmat('docia.mat') # 
# data类型为dictionary
print(data.keys()) # 即可知道Mat文件中存在数据名,
print(data['embedmap'])

输出
dict_keys(['embedmap', '__globals__', '__version__', '__header__'])

发现embedmap就是我们的键,输出他就行。就是这么简单
[[[-0.7205995   0.8333232  -0.72189605 ... -0.75789064  2.1601856
   -0.4646761 ]
  [-0.72499526  0.83864945 -0.72925204 ... -0.76699305  2.1557071
   -0.46513692]
  [-0.7286616   0.8438846  -0.7373124  ... -0.7758043   2.1494231
   -0.46541342]
  ...
  [ 0.03996204  0.31118816 -1.2356629  ... -0.30607277  1.1900936
   -0.7352833 ]
  [ 0.0376727   0.3171473  -1.2287055  ... -0.30724403  1.1896443
   -0.73130345]
  [ 0.03685823  0.321951   -1.2262206  ... -0.30844393  1.18386
   -0.7298531 ]]
   ]

2

MATLAB打开3维度mat图片文件的方法
我的文件是docia.mat,里面有128张灰度图,MATLAB打开方式如下
加载128张图片里面一张图的方法,在命令行窗口输入

>> load('docia.mat')  %加载文件
>> whos   %显示变量,发现只有一个变量,embedmap
  Name            Size                     Bytes  Class     Attributes

  embedmap      640x640x128            209715200  single              

>> imshow(embedmap)  %看看变量里有啥,没反应啊,因为有128个维度,打不开
>> imshow(embedmap(:,:,1))  %打开第一张图,第二张图imshow(embedmap(:,:,2)),以此类推得到任意图片


我的下一个文件是coast_art1130.mat, 里面有一张灰度图,打开方式:
加载一张灰度图方法
>> load('coast_art1130.mat')
>> whos  %看来S就是那个灰度图了
  Name            Size              Bytes  Class     Attributes

  S             256x256            524288  double              
  metaData        1x1                 184  struct              
  names           1x3                 378  cell                

>> imshow(S)  %直接展示出来

3

下载特定版本的Python库的方法,比如我要下载TF,目前用pip自动下载到1.10版本,我要1.4版本怎么办。
pip install tensorflow==1.4.0

4
使用MATLAB自带代码对128维度docia.mat文件进行降维:

原函数:function simp = preprocessFeatures(features, image)有个独立的文件名字preprocessFeatures.m 
分析函数的输入和输出是什么,然后
在MATLAB命令行窗口中输入:
tem = load('docia.mat');
features = tem.embedmap
image= imread('docia_one.png');
preprocessFeatures(features, image)
回车,就可以看到相应的运算结果

5

MATLAB读取图片,并且显示图片

%personal file to test
A = imread('docia.png');
whos
image(A)  %要求A必须是整型 查看图片
输出:
% test
%   Name        Size                  Bytes  Class    Attributes
% 
%   A         640x1280x3            2457600  uint8     

%imshow(features)  %显示彩色的特征图像,可以double类型
imshow([image features visualizeSoftSegments(sss)]); %并排展示三个图片,左右合并3个图片,visualizeSoftSegments函数可以显示高维图片
imshowpair(A,Ismooth,'montage');并排展示两个图片 

6
matlab常用知识

查看MATLAB安装路径:path搞定
注释所有代码Ctrl +  R 
取消所有注释Ctrl +  T 

help command    % 在命令窗口中显示指定命令的帮助文档
doc command     % 在帮助窗口中显示指定命令的帮助文档
lookfor command  % 在所有 MATLAB 内置函数的头部注释块的第一行中搜索指定命令
lookfor command -all  % 在所有 MATLAB 内置函数的整个头部注释块中搜索指定命令

新建函数:new, functin 

function [ output_args ] = Untitled3( input_args )
%UNTITLED3 此处显示有关此函数的摘要
%   此处显示详细说明


end

7

对128维度的特征进行降维的MATLAB代码:

load docia.mat  %640x640x128 single
whos  %发现有个变量产生:embedmap:  640x640x128 single;说明我们这个文件docia.mat里面就是这个怪物,下面搞定他
reshaped_features = reshape(embedmap, [409600, 128]); %合并前面两维,640*640=409600,得到整理后的特征向量[409600, 128]
[coeff,score,latent,tsquared] = pca(reshaped_features);  %进行pca降维,
% cumsum(latent)./sum(latent) %计算降维后取多少维度能够达到自己需要的精度,第三列精度为 0.9005,一般来说取到90%以上即可。取前面三列吧
feature_after_PCA=score(:,1:3);  %得到降维后的东西;score是个409600*128的single数组,我们只要前面三列数据;分号:表示取所有行,1:3表示取1,2,3列的内容;逗号左边代表行,右边是列
RES=reshape(feature_after_PCA,640,640,3); %把降维后的东西又转回开始的640*640*3的格式
imshow(RES) %来,看看这个降维后的怪物是什么?和理想中的不一样啊,不管怎样,降维达到了,效果有了,只是不理想

8
Python稳定pca降维结果的方法:

代码前面添加代码:
from numpy.random import seed
seed(1) #必须在其他模块的导入或者其他代码之前,文件的顶端部分通过调用 seed() 函数设置种子点。http://wwwbuild.net/okweiwu/922253.html
from tensorflow import set_random_seed
set_random_seed(1)   #目标是固定随机数的种子,让开始的随机数固定住,不再随便赋初值

Python对128维度mat文件降维方法:

自己发明的pca降维方法:
#想法:把3维度矩阵的第三维度提取出来,然后对他单独降维,然后合并第三个维度和前两个维度。
#https://blog.csdn.net/u012162613/article/details/42192293
#https://blog.csdn.net/puredreammer/article/details/52255025
#每次降维后结果不同呢:属于无监督学习,类似聚类一样;fit()可以说是scikit-learn中通用的方法,每个需要训练的算法都会有fit()方法,它其实就是算法中的“训练”这一步骤。因为PCA是无监督学习算法,此处y自然等于None。
#LDA,有监督学习 in contrast to PCA, is a supervised method, using known class labels.

from sklearn.decomposition import PCA
import numpy as np 
import matplotlib.pyplot as plt 
import scipy.io as sio 

data = sio.loadmat('docia.mat') # docia.mat其实是128个640*640的矩阵的叠加,当只有一个通道的时候就是黑白图片,3个通道是RGB图片,128个通道就是128个图片的叠加

reshaped_data = data['embedmap'].reshape((409600, 128))   #reshape()是数组对象中的方法,用于改变数组的形状。

pca = PCA(n_components=3) #n_components返回所保留的成分个数n。
#pca.fit(reshaped_data)  #fit(X),表示用数据X来训练PCA模型;fit()可以说是scikit-learn中通用的方法,每个需要训练的算法都会有fit()方法,它其实就是算法中的“训练”这一步骤。因为PCA是无监督学习算法,此处y自然等于None。
PCA(copy=True, n_components=3, whiten=True) #whiten=True使得每个特征具有相同的方差。copy=True表示在运行算法时,将原始训练数据复制一份


pcaData=pca.fit_transform(reshaped_data)  #用X来训练PCA模型,同时返回降维后的数据。
res_pcaData = pcaData.reshape((640,640,3))
print(res_pcaData.shape)
print(res_pcaData)   #里面有负值,在-9到5之间

9
测试自己下载的100张图片,每个图片生成3张3维度特征图片,每张图片生成10张分割图像:for_begin(100, 3, 10),得到3000张图片,MATLAB代码如下:

function for_begin( feat, test_feature_3D,test_results  )
%% 生成语义分割图像
%feat:输入128维度mat文件特征个数,这些文件是Python进行特征提取得到的。
%test_feature_3D:每个特征想要生成的3维度特征个数,
%test_results:每个3维度特征想要生成的语义分割图片个数
%我的测试:for_loop_begin(100, 3, 10),对100张128维度特征降维,每个特征生成3张3维度特征图片,每张图片生成10张分割图像,
%总共有3000张图片生成,耗时6天6夜。半小时跑十张图片,每张图片3分钟
%最耗时的地方是文件softSegmentsFromEigs.m里面有k-means的多次迭代
%注意:运行此代码前保证安装了库:'ImageGraphs,
%下载地址:http://www.mathworks.com/matlabcentral/fileexchange/53614-image-graphs
%安装方法:https://blog.csdn.net/BTUJACK/article/details/82183960
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%demo.m文件作出的改动:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%屏蔽行:
% image = im2double(imread('docia.png'));
% addpath(fullfile(fileparts(mfilename('fullpath')), 'ImageGraphs'));
% Visualize
% figure; imshow([image features visualizeSoftSegments(sss)]); %左右合并3个图片,visualizeSoftSegments函数可以显示高维图片
% title('Semantic soft segments');
%There's also an implementation of Spectral Matting included
% sm = SpectralMatting(image);
% % You can group the soft segments from Spectral Matting using
% % semantic features, the way we presented our comparisons in the paper.
% sm_gr = groupSegments(sm, features);
% figure; imshow([image visualizeSoftSegments(sm) visualizeSoftSegments(sm_gr)]);
% title('Matting components');




    %一些目录,看注释,注意从地址栏复制,粘贴后要加上\,要不然会无法在你的文件夹里看到图片
    ObjDir1 = 'G:\ST\Python\Python_program\SSS\Implement-of-Semantic-soft-segmentation\SIGGRAPH18SSS\Feat\'; %128维度mat文件
    ObjDir2 = 'G:\G_picutres\test_png\'; %原图    
    ObjDir3 = 'G:\G_picutres\test_feature_3D\'; %生成的3维度特征图片
    ObjDir4 = 'G:\G_picutres\ima_fea\';  %原图和生成的3维度特征图片合并后的图片
    ObjDir5 = 'G:\G_picutres\test_results\'; %生成的分割图片
    ObjDir6 = 'G:\G_picutres\com_result\';  %原图,3维度特征图像,语义分割图像的合并图像
    
    %% 循环处理原图生成的128维度mat文件,
    for i = 1:feat  %这里可以控制运行哪个特征,比如今天只有半小时,那就跑10张图片,下次再跑十张图片,下次代码就是for i = 10:20
        filename1=[ObjDir1,num2str(i),'.mat']; %128维度mat文件
        filename2=[ObjDir2,num2str(i),'.png']; %原图
        tmp = load(filename1);  %这一步能够看到生成了变量:embedmap
        features = tmp.embedmap;  %128维度mat文件;
        image = imread(filename2); %原图
        
        %% 每个128维度特征图片生成m张3维度特征图片
        for j = 1:test_feature_3D
            simp = preprocessFeatures(features, image);  %640x640x3 double,simp代表输出后的特征向量图片640x640x3,features是128维度特征,image是原图
            filename3=[ObjDir3,num2str(i),'_',num2str(j),'.png']; %3维度特征图片
            imwrite(simp,filename3)  %保存图片,结果是640x640x3 double
            
           %% 每个3维度特征图像生成n张语义分割图片
            for k = 1:test_results
                image = imread(filename2);  %读取原图
                features = imread(filename3); %读取3维度特征图片
                com_image = [image, features]; %合并原图和3维度特征图片
                
                % imshow(com_image) %展示拼接的图片
                filename4=[ObjDir4,num2str(i),'_',num2str(j),'_',num2str(k),'.png']; %原图和生成的3维度特征图片合并后的图片         
                filename5=[ObjDir5,num2str(i),'_',num2str(j),'_',num2str(k),'.png']; %最终语义分割图片
                filename6=[ObjDir6,num2str(i),'_',num2str(j),'_',num2str(k),'.png'];%三个图片的合并效果
                imwrite(com_image,filename4); %保存原图和生成的3维度特征图片合并后的图片
                image = im2double(imread(filename4));
                demo; %执行demo.m文件
                outcome = visualizeSoftSegments(sss);
                combined_pictures = [image, features, outcome];
                imwrite(outcome,filename5); %把最后分割的单张图片放进一个results的文件夹中。
                imwrite(combined_pictures,filename6); %把三个图片合并写入文件夹中
                
            end
        end
        disp(['the ', num2str(i), 'th image is generated']); %每处理一个图片在命令行窗口通知一次
    end
    
end

猜你喜欢

转载自blog.csdn.net/BTUJACK/article/details/83989984