1. 程式人生 > >深度挖掘論文:《Semantic Soft Segmentation》(語義軟分割)

深度挖掘論文:《Semantic Soft Segmentation》(語義軟分割)

最近花了一段時間研究英語論文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