超分辨路重建:字典學習

問題描述

假設已有N張稀疏的圖像,大小爲800*800。請問如何通過稀疏表達的方式對原有圖像數據進行壓縮,同時保證圖像儘量不失真。y向量代表原有的圖像(640000維),A是字典矩陣(K*640000),x是稀疏表示向量(K維),因爲K遠遠小於N,我們認爲,稀疏表示後的數據獲得了大幅的壓縮。求A的過程通常稱爲字典學習。已知A,求x的過程稱爲稀疏表示。通常這兩者可以等同。在實際訓練的過程中,爲了減少計算量,通常將圖像切割爲小的patch(8*8或16*16),然後針對這些patch進行訓練獲得patch字典。另外,值得一提的是,還有一個很火的概念叫壓縮感知,和稀疏表示有些關聯,但主要是關注在如何減少採樣點上。

模型建立

可以將該問題看成一個優化問題,第一項是確保A和xi能夠很好地重構yi(失真少),第二項是確保xi儘量稀疏(字典構建耦合性小)。正則項本該用L0範數(非零項的個數),但因爲比較難求解,這裏用L1範數代替,L1範數代表的是絕對值的和。

模型求解

輸入是yi,需要求解的是A和xi。剛開始的時候,A是一個由部分yi構成的初始矩陣,然後求解xi,xi確定後,可以再求優化後的A,如此反覆迭代獲得最優的結果。這種求解方式稱爲KSVD,速度比較快。這是兩步求解的算法:先固定A,求x,再固定x更新A,交替進行。K-SVD和K-means方法本質上都屬於一種壓縮的思想,都主要包含以下兩個步驟:(1)稀疏編碼;(2)字典更新。K-SVD中,稀疏編碼可使用OMP方法,然後字典更新使用SVD奇異值分解,細節可參考以下鏈接的內容:(http://blog.csdn.net/hjimce/article/details/50810129https://wenku.baidu.com/view/f31e3f82e43a580216fc700abb68a98271feac56.html

在K-means方法中,K-means 先隨機選擇K個初始點作爲字典,K個初始點就代表K類。然後通過K-means聚類,聚出K個類(稀疏編碼階段),每個聚類中心(均值)做爲新的字典(字典更新)。K-means的編碼矩陣X是一個高度稀疏的矩陣,X的每一列就只有一個非零的元素,對應聚類中心。而K-SVD的編碼矩陣的每一列可以有多個非零元素。

K-SVD方法的求解步驟如下:

  • 基本定義

Y是一個矩陣,是參與訓練的樣本yi的集合,樣本數量爲n,假設樣本的維度是m。

A是一個矩陣,是字典,該矩陣是k*m,其中k是字典中原子的數量,m是原子的維度(和樣本維度一致)

X是一個矩陣,是稀疏代碼xi的集合,xi的維度是m

  • 初始化

從樣本集Y中隨機挑選k個樣本,作爲A的初始值;並且初始化X爲0

  • 求解xi

爲了簡單起見,我們抽出一個樣本進行討論,假定樣本爲y向量,稀疏代碼爲x向量。現在y和A算是已知的,求解x,同時滿足x儘量的稀疏,也就是非零元素儘量的少。假設A爲[a1,a2,a3,a4,a5],其中有5個原子。首先求出離y距離最近的原子,假設是a3。那麼我們就可以求出一個初步的x爲[0,0,c3,0,0],c3是一個未知係數,代表原子的權重。假定y=c3*a3。可求得c3的值。接着我們用求出的c3求殘差向量y'=y-c3*α3,y'是一個預設的閾值向量,當y'小於閾值的話,則停止計算,如果不小於的話,轉到下一步。

計算剩餘的原子a1,a2,a4,a5中與殘差向量y'距離最近的,假設是a1,那麼更新x爲[c1,0,c3,0,0],假設y=c1*a1+c3*a3,求解出c1,然後更新殘差向量y'=y-c1*a1-c3*α3。判斷是否小於閾值,如果不滿足,再繼續求下一個最近的原子的係數。求解原子係數的數量也可以指定爲一個常量,例如3,那就代表迭代3次。

  • 更新字典

通過上一個步驟可以求出所有的xi,接着就可以更新字典A了。K-SVD的方法是逐個地更新字典的原子以及編碼。

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