2019畢業設計總結——基於稀疏表示的人臉圖像超分辨率重構

1 畢業感言:

       三年高中遠遠不及大學四年,時間彷彿具有加速度,我就已經畢業了。

       都說“畢業快樂”、“前程無限”,身處其中,感受着這些羈絆漸漸化絲化弦,只能說快樂個雞毛撣子啊。送走了周圍的一個又一個同學,看着他們的臉龐,知道其中的很多面孔以後都不容易再見到了。時間就像河流,而我們就像其中的沙石,隨着水流從最開始的不曾相知到相遇,再被裹挾着散佈到各地各處,說是身不由己,又是滿腔情願吶。

       畢業的這兩天暴雨重重,不論是領到學士服以後,還是畢業晚會、畢業典禮、畢業聚餐,天空彷彿就是一場演奏會,在離別的日子裏,奏響的卻不是歡樂的曲子,以雨水和風爲我們唱出一首《送別》啊。

       臨近“再見”,才發現不僅僅是那些熟絡而親近的朋友,即使是那些平時吐槽的,平時膈應的,時而翻騰欲大怒除之後快的朋友也是依依不捨啊。分別之後,願大家各自安好,放之四海皆能發光閃耀!我也不能停下腳步,拼搏下去!


 

2 本文目的:

      由於我在做畢業設計的時候非常痛苦,網上的相關資源整合非常亂,根本沒有一個系統的講解啊。對於一個沒有相關課題經驗的小白而言是“講什麼不懂什麼”、“用到什麼谷歌什麼“,所以在畢業設計3月到4月底完成,5月份進行了簡單的完善以後,有一定的文獻閱讀的今日,於此博客進行畢業設計科研過程的一個簡單總結;

      對中間出現的問題進行記錄以及原因分析;

      對課題的研究學習過程中的文獻進行特點的簡要總結;

      對課題學習過程中對各種新概念及名詞學習時,找到的好博客進行記錄;

      之後因時間以及個人問題,沒能實現論文發表而表示遺憾。

      希望本篇博客能夠對日後稀疏表示的圖像重構技術的同學們有很大幫助!(深度學習這裏沒整理噢~)

       P.S. 由於本博客的意義是記錄以及個人感受,所以儘量採用通俗的方法進行扯淡。

      以此紀念我過去的大學四年。


 

3 課題概述

       這裏簡要的講解一下課題的名稱、意義、內容、和路線,在下一章進行課題中使用的各個方法的具體理解。

3.1 課題名稱:基於稀疏表示的超分辨率人臉圖像重構

3.2 課題的意義:

      我的理解是——狹義的來講,由於高分辨率很重要,但是獲取更高的分辨率圖像會有很多限制;廣義的來講,很多時候圖像不清晰很模糊,希望能夠圖像質量更好——用“超分辨率重構技術“(Super-Resolution, SR),放心呵護放心愛,夜光照亮你的美,使勁拍照,我們來幫你更清晰~

       因爲低分辨率的圖像由於像素數有限,肯定是沒辦法表達出非常多的細節信息的,所以如果能獲取高分辨的圖像,那我們肯定是喜聞樂見,圖片就可以放大放大放大!而超分辨圖像重構就是能將一張原來是低分辨率的圖像,用算法提升它的分辨率,這不是從軟件的角度上解決了硬件的問題嗎,流批!(這個是廣義的理解,把低分辨率變高分辨率)

      比如之前的華爲手機拍月亮,拍的月亮雖然不一定清楚,但是內置的超分辨算法可以實現對拍出來的模糊的月亮進行細節提升,把糊糊的照片變得清晰可見!(這個是狹義的說法,將糊糊的圖像變清晰)

       (應用領域有很多,這個就不贅述啦~)

 

3.3 課題內容:

      輸入一張低分辨率(Low-Resolution, LR)的圖像,經過模型算法吭哧吭哧輸出一張高分辨率(High-Resolution, HR)的圖像,這張分辨率要更高,放大圖片的不會非常模糊啊或者是細節很不對勁啊什麼的。

      課題的核心問題:按照上面的這個思路,超分辨率重構的思想就是,將一張信息不夠多的圖像變成一張富含更多信息的圖像~那容易出現一個問題就是,如果你沒搞好這個“無中生有“的過程和思路,就會從”提升性能“走向”瞎扯造假“了。如果你”無中生有“出來的圖像信息是符合現實依據,是有的,那你就是好算法,提升了性能;如果你“無中生有”出來的圖像信息是現實中沒有的東西,結果你的算法把它給重構出來了,那不是扯淡嗎(╯°Д°)╯︵ ┻━┻

      前沿技術:現在都是深度學習的時代了,高重構效果的方法技術大多是深度學習。。。像基於稀疏表示方法的重構是非常傳統的了,CVPR近年的超分辨率重構文章都是基於深度的,PSNR值都能達到40+了,這還是人嗎。。。主要是基於各種網絡:殘餘網絡啦、對抗網絡啦等等。本文只講傳統的稀疏表示模型的重構路線。

 

3.4 課題技術路線:

      樣例算法思路如下~

      預處理:將輸入的低分辨率LR圖像,以及數據庫的高分辨率與低分辨率圖像對,都進行相同的分塊操作;

      字典學習:然後對數據庫圖像對進行一個字典學習過程,得到字典D;

      稀疏優化:對於輸入LR圖像的各個圖像塊,基於剛剛求得到的字典D中的DL部分進行稀疏模型的優化求解,得到稀疏係數矩陣;

      重構過程:利用求得到的稀疏係數矩陣以及字典D中的DH部分就可以重構出對應的各個圖像塊了;然後把這些塊拼起來就得到輸出圖像。


 

4 課題詳談:

4.1 數據庫的獲取:

       人臉數據庫我是按照人臉檢測數據庫取的,一些國外的數據庫還需要發郵件進行申請,這誰頂得住,貼下這個連接,同志們可以使用一下,我使用的ORL數據庫啦。

       各大人臉圖像數據庫獲取鏈接:https://www.jiqizhixin.com/articles/2018-10-23-4

       FDDB人臉圖像數據庫獲取鏈接:http://vis-www.cs.umass.edu/fddb/

 

4.2 分塊重構:

      90%基於稀疏模型的超分辨重構路線都是非常一致的,採用圖片分塊重構。什麼意思呢?如果我要將一張輸入的低分辨率圖像X給超分辨率重構成一張高分辨率圖像Y,總不能一下子直接就復原搞出來了吧。。。最傳統的做法是,把一張圖像分成好多塊,就和切披薩一樣,每一塊披薩,哦不,每一塊圖像塊各自想辦法重構出來。比如說,我有一個人臉,這個人臉圖片糊不拉幾,但是這麼大的圖片也不能直接重構,所以我們把人臉分割成眼睛啊鼻子啊各個塊,然後每個位置想辦法進行重構出來,再拼起來,不就可以完成人臉圖像的重構了嗎?

 

4.3 稀疏模型:

      那對於一個塊而言,怎麼去重構對應的塊呢?用稀疏模型可以解決這個問題。

      什麼是稀疏模型呢?可以參考這個博客:https://www.cnblogs.com/hdu-zsk/p/5954658.html

      大概這麼說吧。所謂的傅里葉變換抑或是泰勒公式,都在告訴我們一個道理,很多數學函數或者表達式都是可以由很多乃至無限的基本“元素“壘起來的!這個物質世界也是如此,小到原子、 分子,大到磚頭、別墅、地球,也是由更小更多但是卻有限的基本”元素“壘起來的!而稀疏模型,作爲信號領域的理論,它的本來意思是,一個信號X,也是可以由某一組有限的基信號(原子)D疊加獲得!怎麼疊加呢?每個信號有自己的係數,這個係數就和多項式的係數一樣,把這些原子各自按照這個係數的倍數,加在一起就可以獲得信號X啦!

      是不是很神奇?不管是什麼學科,反應的哲學思想還都很相像~

      那我們把這個稀疏模型拿到線性代數裏面也是適用的,而且我覺得更好理解了!——一個向量X,必然能夠由某一組有限個數的基向量D表示出來。(這個要是不能理解,那肯定是你的高中正交分解沒學好,嘿嘿嘿)

      敲黑板,上面稀疏模型的重點是“有限個“,泰勒公式纔是”無限個“。

      對吧!那圖像是什麼啊?圖像就是像素集唄!像素集怎麼表示?就是用0到1的浮點數集合或者是0到255的整數集合來表示唄!那如果我把一個圖像變成壓成一列,這個灰度表示的圖像整數列表,不就是一個向量嗎!

      圖像就是向量!所以說,任何一個圖像X,也肯定是可以由某一組有限的基信號(原子)D疊加獲得!說的學術一點,圖像也是可以進行稀疏表示的。

      假設我已經求得到了這個基組D(後面我們把這個基裏面的各個向量叫原子,整個基叫做字典),如何求向量X在這個D上的表示係數呢?這就是稀疏優化模型要解決的問題,怎麼去求稀疏表示係數矩陣。方法有很多種,後面再講。總結一下,這個“可線性疊加“,就是稀疏表示;這個模型思想,是稀疏模型;這個係數求解方法,叫稀疏優化算法

 

4.4 字典學習:

       上面的稀疏模型的核心思想是:如果我有一個向量X,那肯定是可以在某個字典D上進行線性表示的,可以用稀疏優化算法去求;那問題來了——你怎麼知道這個D是啥呢?你沒說這個D咋求啊!如果我單單的給你一個向量,然後說好了你可以開始稀疏表示了,你肯定是一臉“???“,因爲沒給你D啊。所以這個D我們肯定是要想辦法獲取滴,獲取這個D的過程就是”字典學習“過程。有很多解決這個問題的算法,例如KSVD算法,大概是利用奇異值分解實現 balabalabala 的稀疏係數與字典D的交替迭代求解,得到一個局部最優值,雖然方法比較老了,但是還湊活吧~

      我們用線性代數的向量來表示的話,就是一個N維的向量如果要想辦法用一組基來表示,那肯定至少需要N個原子構成基對吧,也就是要滿秩才行呢!

      比如說,我有一個二維向量,我們平時建立的表示二維向量的直角座標系是兩個基向量吧——橫座標方向的單位向量i和一個表示縱座標的單位向量j,你不可能給我一個原子作爲基,就去表示一個二維向量吧?

      再比如三維的向量,我們平時的表示方法,也是建立一個直角座標系,這個直角座標系也是由三個基向量的呀,i、j、k,但是一定是三個原子就一定能表示一個三維向量嗎?那當然又不對了!肯定是要三個不共線的原子啊!比如說我有100個三維空間的原子,一個是i,第二個是2*i,第三個是3*i,…,一直到第100個是100*i,那這個100個原子中的99個原子都是混子啊!都是來濫竽充數的廢物啊!搞了半天就是1個有效的基唄,其他的就是放大了唄,那有個球有個錘子用哦!所以我們說,要有幾個原子隨便你,一定要有秩爲3的原子庫就OJBK了。這個秩就是有效的、不共線的、同時不能被其他原子表示的原子的個數。

      如果我還幫你了搞明白了線性代數的秩的理解,請給我點贊,哈哈哈哈哈。

      哦對了,我講了上面這個基的要求有什麼意義來着——就是說我們一般情況下要獲得的字典,肯定是冗餘字典。首先我們所有的原子都是按照列向量來表示的,每個列向量如果是N維(行數),這個字典中原子的個數是M個(列數),我們肯定是要求這個M大於N的。道理呢就是我上面講的。要是N都達不到,還表示個P啊,這個字典已經可以宣佈效果一般了。

 

4.5 聯合字典學習:

       那看完上面的人可能有一個疑惑?那如果要填滿整個向量空間的基,來能夠表示出某個向量X的話,那爲什麼不直接選用直角座標系的向量基作爲字典D呢,比如三維空間就直接選i、j、k不就好了?肯定能表示出向量X啊!

       嘿嘿,如果你這麼想,那你就被我帶偏了。

       我們這個課題是怎麼求這個向量表示嗎?NO!

       我們要解決的問題是重構圖片!重構圖片啊!

      我們求稀疏表示模型的時候,用到的字典和重構圖像的時候用到的字典某種角度來說,其實不是同一個字典吶!

      舉個例子,我要復原出輸入的低分辨率圖像LR一個人臉的鼻子,這個鼻子很糊,怎麼樣才能重構出一個精緻又逼真,和現實中這個人鼻子一樣的前提下,更清晰的鼻子呢?讓這個鼻子擁有更清晰的鼻孔和鼻毛,還有鼻子上的黑頭和汗水、油位呢?

      那我要首先採集其他N個人的鼻子照片,假設是100個人好了。這個鼻子圖像建立的數據庫肯定是高清的大鼻子咯(HR),然後我將這個HR鼻子人工變成和我輸入的LR圖像一個清晰度級別的LR字典DL。然後我們在這個DL中選擇距離待復原的人的鼻子最像的幾個鼻子,求出稀疏表示係數之後,我們要用對應的這幾個DL的鼻子,的高清的圖像字典DH的來複原。——即,用低分辨率LR字典DL進行係數求解,用高分辨率DH字典進行稀疏重構。如此一來,就不會產生,爲什麼不用座標系的基進行稀疏表示的疑問了吧~因爲它們沒有對應的HR向量了呀!

      而爲了保證這個字典的LR與HR原子對的關係,我們在訓練字典的時候就把HR原子和LR原子捆綁在一起,一起學習,美其名曰:聯合字典學習咯~

       上述講的這個字典一定是要冗餘,冗餘的話呢這個字典的重構效果就會更好!啊?爲什麼用這個字典進行重構效果就會好?拿到重構領域來說,因爲我們是將圖像分塊,每個塊進行重構,所以就是每個圖像塊就是原子向量。這個字典冗餘、大,就代表這個塊多,就會包羅萬象。還是拿上面這個例子,我要復原出低分辨率圖像LR一個人臉的鼻子,那我採集了其他5個人的鼻子,選擇距離待復原的人的鼻子最像的幾個鼻子來複原;和我採集了1W個其他人的鼻子,選擇距離待復原的人的鼻子最像的幾個鼻子來複原,哪個效果好嘞?不言而喻了吧~但是我不能說,我直接用直角座標系的基來進行復原吧~這樣一來,我們用這個字典進行重構的效果就會好!

 

4.6 特徵提取:

       那還有一個問題。我們就算是要復原一個人的鼻子,那這個鼻子的圖像上肯定有很多幹擾對不對~比如說,我要重構一個人的鼻子,我肯定是要使得它的鼻子更清晰,鼻毛看的更清楚,鼻孔更加深邃,黑頭更加有規則,結果到時候重構出來,把圖像中原來的顏色灰度更加細膩了有個球用。也就是說,要對圖像上的關鍵信息進行提取,能夠獲得更好的重構效果啊。

       不同的Paper使用了不同的特偵提取策略,這個我們後面再聊,於此是爲了講解此步驟的意義所在。

       簡單的看過此博客,講解不同的特徵算子:https://blog.csdn.net/chengjunda22/article/details/68943632


 

5 核心算法學習

5.1 稀疏表示優化算法

5.1.1 OMP算法原理(效果中上,快)

       所有的博客在講解OMP算法的原理都是從MP算法進行引入的。但實際上確實是這樣。

       MP算法(匹配追蹤)思想就是,在一個字典D上如何去“分解“待求向量X。而這個分解的思想其實和高中物理中受力分析的”正交分解“差不多的,只不過高中物理的”正交分解“是分解成兩個正交向量,而此處的字典D並不是正交的向量集,所以採用的分解思路是採用”向量投影“實現分解。

       順着這個思路,去理解OMP算法就會方便很多吧(我是這樣)。這裏有個博客是採用繪圖的形式,能夠更好的理解這個過程:https://blog.csdn.net/pi9nc/article/details/18655239

       還有三篇更加細緻、學術的論述博客,寫的都很好:

       https://blog.csdn.net/scucj/article/details/7467955

       https://blog.csdn.net/wwf_lightning/article/details/70142985

       從給一個具體的例子進行解釋的博客有:https://www.cnblogs.com/theonegis/p/7653425.html

       還提供了源碼的博客(但我沒有用過):https://www.cnblogs.com/yangnk/p/6725329.html

       以上幾篇博客是我在學習過程中,覺得最好的也是最容易理解的博客啦。講道理,OMP思想就和普通其他的貪心算法一樣比較簡單,但是也能有這麼多學問,真的很了不起!在學習OMP過程中可以借鑑我的軌跡進行學習~

5.1.2 OMP算法源碼

       雖然上述博客給出了源碼,但是同一個算法,不同的人寫出來的效果差的實在是很多,我沒有對各大不同同志們寫的OMP進行一個性能分析,一是因爲懶,二沒有那麼多時間,三是我並沒有那麼強的理解能力。一個算法好的撰寫需要對程序語言以及算法本身具有很好的理解,才能寫出好看工整甚至是快速高效的代碼。

       我是用的平臺是Matlab2018b,思量之後,採用的是PUDN上的OMP代碼,作爲稀疏表示的初學者其實夠用,但是效率一般啊,着實比不上Paper裏的效果,在後續項目優化的過程中進行了更換。

 

function [X]=OMP(D,Y,L); %返回稀疏係數,大小是50*1500
%=============================================
% Sparse coding of a group of signals based on a given 
% dictionary and specified number of atoms to use. 
% input arguments: 
%       D - the dictionary (its columns MUST be normalized).歸一化的字典
%       Y - the signals to represent     待表達的信號
%       L - the max. number of coefficients for each signal.  每個信號的係數的最大個數
% output arguments: 
%       X - sparse coefficient matrix.稀疏係數矩陣
%=============================================
[n,P]=size(Y);%信號大小20*1500
[n,K]=size(D);%字典大小20*50
for k=1:1:P,%1到1500次循環,間隔是1
    a=[];
    x=Y(:,k);%信號的第k列(即第k個信號)賦給向量x,向量x是第k個信號向量
    residual=x;
    indx=zeros(L,1);%索引是三維列向量
    for j=1:1:L,    %1到3次循環,間隔是1
        proj=D'*residual;%得到50*1,第k個信號的係數向量,D的轉置就是D的逆,因爲D是正交的
        [maxVal,pos]=max(abs(proj));%找到這個係數當中絕對值最大的數值及位置下標
        pos=pos(1);
        indx(j)=pos; %把最大數值的下標賦給索引的第j個分量
        a=pinv(D(:,indx(1:j)))*x; %D的部分列的僞逆矩陣再乘以x,意思只取算出來的係數中最大的j個分量對應的字典原子的違逆乘以信號得到一個係數
        residual=x-D(:,indx(1:j))*a;%用信號減去上面的係數乘以對應字典的列得到初始信號與稀疏表示的信號的誤差
        if sum(residual.^2) < 1e-6  %判斷誤差是否在限制範圍內
            break;%在,結束for循環
        end     %否則繼續循環
    end;
    temp=zeros(K,1);%K=50維向量
    temp(indx(1:j))=a;%a是有最大的j列個元素的係數,最後所求的最多有三個分量的第k個稀疏係數50*1,
    X(:,k)=sparse(temp);%生成稀疏矩陣的k列
end;
return;

      

5.1.3 OMP算法存在的問題(我還沒去解決)

       第一,MP的稀疏優化算法在所有方法中可以算是最快的了,但是稀疏效果一般。OMP的稀疏度需要自己確定,一般採用0.15到0.20左右,稀疏性有一定保證,但整個稀疏表示一般吧,在整個算法框架中會成爲一個制掣,導致效果上不去。經過我的推測,不採用OMP算法後,整個項目效果上升了一個檔次。

       其次,有很多Paper的稀疏優化算法採用OMP或者是OMP的優化版本(Batch-OMP等),並且程序能夠得到很好的效果。但我不行,經過一個月的調試,我確定OMP的稀疏求解誤差還是比較大的,並不能成爲一個高效理想的稀疏模型求解工具。但是這個問題到底是爲什麼呢?都是OMP算法,這種基於貪心的算法在撰寫上應該不會存在特別大的差異才對,至今我沒有對衆人的OMP算法進行對比。但是看着很多碩士、博士、Paper的基於OMP的超分辨率重構效果上升,我是不能理解憑什麼?也許是他們各自的OMP算法都有一些小優化吧,有些開源有些沒開源以至於我也無法論證;也有可能是他們的程序中有加入一些沒有在論文中多說或提及的小Trick,不得而知,沒有進行相關調研,待日後有機會我再更。

5.1.4 ADMM算法原理(效果良好,慢)

       ADMM算法(交替方向乘子法)是真的讓我又愛又恨。這是我的項目最開始嘗試使用的方法,但是GG了。

       恨是因爲ADMM算法我學習了1個禮拜都沒有太大收穫,網上麼原理一大堆,源碼屁都沒,不懂原理也不知道好不容易找到的源碼真的假的,跑出的結果也是一坨屎,而源碼裏面的參數都看不懂,註釋寥寥幾句都是浮雲毫無意義,mmp看得我真的沮喪不已,最後花了20天到3月底程序框架全部寫完了ADMM算法也沒有啃掉,一怒之下選擇了OMP算法,走向幸福快樂的初步小康生活。

       愛是因爲後期OMP效果有瓶頸了,我又一次回到ADMM的懷抱,這一次從源碼調用的角度,將ADMM成功使用,同時在學長幫助下獲得了更優質的ADMM算法源碼內容,使得項目進入全面小康。。。(笑死)

       有很多博客寫ADMM算法的原理,對於我這樣的鹹魚真的是看着腦殼疼啊。很多名詞都是在學習ADMM算法過程去順便學習的。ADMM算法原理真是又臭又長,不就是一個迭代更新嗎,怎麼能寫的這麼複雜啊。。。

       實不相瞞,ADMM算法我現在也只是懵懵懂懂,完全理解還需要下次去學習。

       我在這裏列一下我在學習ADMM中個人整合的,覺得不錯的博客資源吧~

      

       首先,如果你要理解ADMM的“乘子法“思路,你需要理解什麼是”對偶上升法“;如果你要去理解好什麼是”對偶上升法“,你需要去理解什麼是”梯度上升法“。(是不是又臭又長)

       好的,什麼是”梯度上升法“呢?來來來,看這個博客:https://blog.csdn.net/c406495762/article/details/77723333

       啊,有一點點理解了,那什麼是”對偶上升法“呢?

等一下!要想理解”對偶上升法“呢?那我們需要知道什麼是”對偶問題“,於是我看了這個博客:https://www.cnblogs.com/ooon/p/5723725.html

知道了什麼是”對偶問題“,我們繼續學習什麼是”對偶上升法“,來來來,看這個博客:https://blog.csdn.net/shenxiaolu1984/article/details/78175382  

       噢,我好像懂了一點了。那什麼是ADMM算法呢?

       給你一個超級細膩超級細膩的講解博客,簡直是講解了ADMM的各種方法以及各種原理呀:http://spiritsaway.info/admm.html#022eb3

       什麼,這個博客太複雜了?那你可以看看這個比較隨便的;https://blog.csdn.net/qauchangqingwei/article/details/82112103 ;其實這個博客是轉載自知乎的回答,原帖在這裏; https://www.zhihu.com/question/36566112

       如果你看完上述內容就懂了,那你就是大佬。

       我還參考了一下倆博客纔有所理解來着:

       額外簡潔版本:https://www.cnblogs.com/breezedeus/p/3496819.html

       額外複雜版本:https://blog.csdn.net/angel_yj/article/details/40587543

 

       我再說一遍,ADMM算法原理看得我真的是又臭又長。但是收穫也不小啦,看完ADMM我感覺我愛上了高數,就連一個拉格朗日乘子都這麼神奇~,什麼,你問我什麼是拉格朗日乘子,你也忘記了?來來來,我也是忘記了重新查的(狗頭),看這個博客:https://blog.csdn.net/ccnt_2012/article/details/81326626

       ADMM原理的學習過程大概就是這樣,這些博客可以幫助你很好的去學習ADMM。但是問題來了:源碼在哪裏呢?

5.1.5 ADMM算法源碼

       這個源碼emmm ,老實說效果一般吧,不是我後來使用的改進的ADMM算法啦。是我第一次使用的ADMM版本,諸位可以借鑑一下。後來版本的ADMM引用到不同文件和庫,這裏單獨發是發不下滴。

       隨便用用的話,可以參考下面這些網址啦~

       首先是ADMM算法的源碼:https://web.stanford.edu/~boyd/papers/admm/lasso/lasso.html#5

       當然是MATLAB版本的啦,如果你看懂輸入參數,那就沒有問題~

       這是斯坦福學院提供的工具包,就這我都找了好幾天。。。看來是信息檢索能力不行啊。

       它還提供了使用的樣例教程:https://web.stanford.edu/~boyd/papers/admm/lasso/lasso_example.html

       大家可以使用試試看(壞笑)

       就是太慢了。

5.1.6 其他方法(效果優,快)

       後來我使用的就是其他方法啦。

       什麼意思呢?

       就是去查看各經典文獻Paper的源碼,有些開源有些沒有開源,然後將其中的代碼剖析出來,得到我需要的稀疏優化算法的部分。比如後面我會提到的Yang的【Image super-resolution via parse representation】經典之作,是開源的,歡迎前去膜拜,對我受益匪淺!

     扒代碼考驗你對整個框架的理解,以及對作者論文拜讀的熟悉程度,以及個人的編碼能力。看完代碼你會發現有很多新的收穫。

       大牛寫的的代碼,敢開源都不會差的。很多時候,看完他們的代碼,我會感嘆事情可以被這麼簡單的解決;或者是感嘆原來這個思想是這樣的啊

       論文只能反映建模思路,代碼能反映更深刻的問題解決過程

5.2 字典學習KSVD算法

5.2.1 KSVD算法原理(慢的一匹)

       寫到這裏寫的都有點累了。

       KSVD算法是用來解決什麼問題的呢?就是給你一大堆圖像塊,如何訓練出一個優秀的字典D!

       簡單的講一下KSVD算法我的理解,就是先固定住字典D,然後去求稀疏優化係數(比如用前面提到的OMP);得到這個係數以後,欸,我固定這個係數,修改這個D使得這個D能夠更好的適應這個係數;不斷的切換切換,使得最後的D能夠穩定下來。

       當然啦,這樣講是沒有KSVD算法靈魂的。

       學習KSVD算法,首先最好去學習K-Mean聚類算法的實現邏輯。噹噹噹當,可以看這個博客(這個博客我其實忘記了,這是重新找的,這個聚類過程的圖還不錯):https://www.cnblogs.com/jerrylead/archive/2011/04/06/2006910.html

       所以說,KSVD算法中的K是要訓練出K個原子,而SVD是因爲這個算法核心需要用到“奇異值分解“(SVD)的思想。學習KSVD過程中我沒有特別印象深刻的博客,就記得這個了。。。:https://www.cnblogs.com/endlesscoding/p/10090866.html

5.2.2 KSVD算法源碼

       KSVD算法源碼我還是在用,但是揪心的地方是:太慢了!

       迭代次數設置爲20,訓練集爲6000個塊,學習1024個字典,我記得都要12個小時。。。

       KSVD引以爲傲的速度是快,但也不過如此。。。真是讓人沮喪啊

       參考網址:http://www.pudn.com/Download/item/id/1438085.html

       同樣的道理,可以使用扒別人源碼的方式獲得更優質的輪子,或者捨棄字典學習的過程。在此不贅述。


 

6 建模過程

       嘖。寫不動了。反正都是一些Paper裏寫爛的公式,我也懶得再截圖了,此處日後再補吧~

       要注意的地方就是,拉格朗日乘子、規格化、L1/2正則化理解與掌握,爲什麼要採用這些東西改變式子,要好好理解,我先懶得寫了。


 

7途中出現的BUG與思考歷程記錄

7.1 本人工作內容

       完成了對整個項目的完全獨立實現。但是後來由於效果的侷限,採用了Yang的L1稀疏優化算法(一個.m文件)和網上的KSVD算法(也是一個.m文件),其他部分無搬運工作,實現實驗的復現優化,基於Yang的Paper的論文,加了局部約束、全局約束,並加入個人的迭代約束,實現PSNR值的性能提升,比雙三次插值PSNR值高3左右。

7.2 出現的BUG

       笑死。在項目初期(3月份)的時候,出現了太多的問題。在這裏貼幾個,笑掉大牙了,左邊是期望輸出的原始HR圖像,中間是輸入LR圖像,右側是實際輸出。

  • 主要是由於數據集太小,字典不夠冗餘;以及OMP算法掌握不熟練,未加入約束 ,以及向量的規格化操作未考慮周當,出現的重構效果(木乃伊了 哈哈哈哈):

  • 加入鄰域約束,結合是否規格化數據得到的不同結果:

  • 使用版本一的ADMM算法,但是沒有規格化好,把係數倍數搞爛了,變成了下面這樣:

 

       總結爲什麼會出現上述的這些情況呢?

       首先,我當時重構的思路是各塊重構時採取不同圖像的對應位置快作爲字典D進行重構。但是一共才使用了40張人臉圖像作爲字典,而且還是不同人臉,這40張圖像採取到的40個原子個數實在是小的可憐,而且差異化巨大,難以重構出原始人臉。後來我退而求其次,使用整體統一的字典D,由6W個數據塊訓練出1024個字典,性能直接上來了。

       其次,我的編碼有一定問題,參數設置有一定問題,OMP本身具有很多侷限難以精確,而最重要的是整個稀疏模型中的“規格化”步驟沒有搞清楚。

       論文只能反映出你是如何實現如何思考大方向的,但是課題研究和項目需要拿出優秀的表現,在很多的小細節上會產生決定性的作用,但是這些論文裏面往往都不會進去。

       每一次思考錯誤原因和DEBUG都讓我欲仙欲死,這和思考代碼問題不同,我要去思考我的整個模型方案錯在了哪裏等等,非常有趣!

7.3 部分思考歷程

這部分純當記錄哈哈哈哈,說實話,這做畢設的感覺纔是我想象的科研感覺呀(雖然很初級)。之前做了3次不同的科研工作,獨屬本次科研令我大有裨益而意猶未盡。

7.4 程序實現小Trick

       要想程序的效果獲得更好的提升,不說什麼重構方案上的優化,只談一些小細節能夠顯著的提升PSNR值的,我結合我的經驗給出以下建議:

  • 加入全局約束(後處理),可看Yang文獻內容。
  • 基於殘值重構。(我還沒應用殘值重構呢,就已經效果顯著了)
  • 恰當的特徵提取方式比字典從1024到10240或者是是否特意加入字典學習過程更重要!
  • 全局約束>局部約束。全局約束可以提升客觀的PSNR;局部約束實現主觀效果鄰域塊間更平滑,但是會降PSNR。
  • 迭代效果會提升0.23到提升0.02程度衰減,輔助手段而已。
  • 稀疏優化算法很重要,效果上:Yang的>學長的L1>我的ADMM>OMP

 

8 最終實現效果

       下采樣因子取的是2,塊大小採取5×5.

  • Lena圖像——比較大看不出來

 

 

  • 基本人臉圖像

 


 

9 未來工作計劃

       有幾個想法,但由於時間以及因素,無法將方案實時並發表我的學術論文(如果有機會,畢竟俺是無碩士可讀的廢物來着,噗哈哈哈)


 

10 部分參考文獻

       畢設結題前的基本稀疏表示模型的部分參考文獻(可以用來打基礎)

       [1]李文文. 基於稀疏表示的單幅圖像超分辨率重建算法研究[D]. 蘭州理工大學, 2017.

       [2] 浦劍, 張軍平, 黃華.超分辨率算法研究綜述[[J].山東大學學報(工學版), 2009, 39(1): 27 一 32.

       [3] 練秋生, 張偉.基於圖像塊分類稀疏表示的超分辨率重建算法[[J].電子學報, 2012, 40(5): 920-925.8

       [4]李欣. 基於稀疏表示的圖像超分辨率重建研究[D]. [出版地不詳]: 南京郵電大學, 2016.

       [5] 李珅. 基於稀疏表示的圖像去噪和超分辨率重建研究[D]. [出版地不詳]: 中國科學院研究生院(西安光學精密機械研究所) , 2014

 

       核心論文:

       【2010稀疏代表性】【核心Paper】Yang的Image  super-resolution  via  sparse representation——核心經典

       【2011遙感景物】Single Remote Sensing Image Super-Resolution and Denoising via Sparse Representation——用KSVD和Batch-OMP,其他同Yang,應用於遙感景物。

       【2012字典分類】Sparse representation and position prior based face hallucination upon classified over-complete dictionaries——實際上就是對應patch進行重構罷了,美其名曰分類。無字典學習無特徵提取無約束,是OMP

       【2014翻譯】Face super-resolution via multilayer locality-constrained iterative neighbor embedding and intermediatedictionary learning——多層迭代重構

       【2017學長基本】Noise Robust Face Image Super-resolution Through Smooth Sparse Representation. Junjun Jinag——增加一個稀疏係數的平滑約束

 

       其他的懶得補充了。基於深度模型的我就不添加了,還有後續規劃的參考資料待論文能發表時再更吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章