汪群超 Chun-Chao Wang

Dept. of Statistics, National Taipei University, Taiwan

SML/Lesson 6: 淺度機器學習:PCA 、SVD 及其在影像處理的應用


影像處理專用圖像(取自網路公用影像)


下載講義內使用的手寫數字圖像檔案:下載 minst_784 數字影像檔案,資料來源:https://www.kaggle.com/datasets/avnishnish/mnist-original/versions/1?resource=download
解壓縮後的檔案為 mnist-original.mat,取得圖像矩陣 X 與標籤 y 的程式碼為:

from scipy.io import loadmat

mnist = loadmat("mnist-original.mat")
X = mnist["data"]
y = mnist["label"][0]

請注意:

  1. 這組手寫圖像資料矩陣按照 0-9 的順序依序排列,譬如最前面的 6903 行都是數字 0。

  2. 上述程式碼取得的 X 與 y 是 ndarray 的型態,與講義中的 pandas 型態不同。講義中相關的程式碼必須修訂。譬如要調出所有的數字 3 的圖像,程式碼如下:(y 所存的標籤是數字,非文字)

digit_to_show = 3
Digit = X[:, y == digit_to_show]

習題 1:將一張圖像 X 利用 SVD 的 “Rank q approximation”,能達到壓縮的目的並保持圖像的品質。比較下列幾種對於圖像矩陣 X 的重組安排,並進行 “Rank q approximation”,在同樣的壓縮比之下,觀察還原後的圖像品質哪個最好?能說出理由嗎?

  1. X 不變

  2. 將 X 以 8\times 8 小圖(patch)進行切割,再將每個小圖拉成 64\times 1 的向量,最後重組這些向量並排成新的 64\times N 矩陣。

  3. 同上,小圖大小為 16\times 16/per patch。

  4. 同上,但分割成 32\times 32/per patch。

  5. 其他天馬行空的想法。可行不可行?試試看便知道~

如何呈現最後的比較結果,請自行決定,譬如,將圖像並列比較。圖像可以選 Lenna, 也可以自行決定。影像不同也可能導致結果不同。


習題 2:處理大量影像前,有必要觀看影像圖,以確定能掌握將要處理的影像及其資料型態。以 70000 張手寫圖像為例,每個數字約 7000 字,需要寫一段程式碼來觀察這些手寫數字的影像與品質,且每次執行都能隨機觀看到不同的影像,如下圖左(共兩排含 0~9 的數字各 50 個)與圖右的影像是兩次執行的結果。請靜下心來仔細寫這段程式碼,可以按下圖的方式呈現,或用自己的方式都歡迎。類似像這樣的程式基本功事非常重要且必要的。

請注意:隨機從某個數字抽取一定數量的影像,可以採「取後不放回」的方式,譬如 np.random.choice(np.arange(N), replace=False, size=n) 從 0 ~ N 的整數中隨機取 n 個。


習題 3:在程式寫作上, “Rank q approximation” 可以透過現成的 PCA 或 SVD 套件實現。本題以數字圖像為例,挑選某一個數字的所有圖像進行 “Rank q approximation”,以取得同樣大小與張數的近似圖像。為觀察 q 值大小對圖像的影響,令 q 值為 1,3, 5,…,29,並分別列印出 20 張經過 “Rank q approximation” 後的近似後的圖像,如下圖(也是講義範例 3 的圖 9)第一列是原圖,第二列 q 值為 1,最後一列 q 值為 29 。請分別使用 PCA 與 SVD 套件做出相同的結果。

本題的目的為以下幾項:

  1. 假設 X=[\;\underline{x}_1\;\underline{x}_2\;\cdots\;\underline{x}_N\;] 代表 N 張數字影像矩陣,其中 \underline{x}_k 代表第 k 張數字影像。每張影像的 “Rank q approximation” 可以表達為 \underline{\tilde{x}}_k=U_qU_q^T\underline{x}_k,其中 U_q=[\;\underline{u}_1\;\underline{u}_2\;\cdots\;\underline{u}_q\;], \underline{u}_i 為原資料的共變異矩陣的特徵向量,可以直接使用 PCA 套件取得。換句話說,以整體影像,則為 X_q=U_qU_q^TX

  2. X=[\;\underline{x}_1\;\underline{x}_2\;\cdots\;\underline{x}_N\;] 進行 SVD 分解,得到 X=U\Sigma V^T。若取其 “Rank q approximation”,則為 X_q=U_q\Sigma_q V^T_q,其中 U_q,\Sigma_q,  V^T_q 代表 U, \Sigma, V 的前 q 項。

  3. 以上兩者取得的近似圖像 X_q 方式不同,使用的套件亦不同,十分考驗對套件的使用是否得宜,最好能先仔細看過使用細則,方能正確使用。另一方面也驗證了 PCA 與 SVD 之關係,強化理論方面的理解。再則,兩個套件的執行效率也不同,尤其當矩陣愈大時,更是明顯。因此能用不同的方式處理相同問題,也是程式設計者必須具備的能力。(其實 sklearn 的 PCA 套件使用了 scipy 的 svd 套件)

  4. 再則,將 X_q 拿出若干張來畫圖,常常因使用不同套件而產生不同的效果,這往往牽涉到套件本身做了哪些處理,譬如,透過 PCA 處理後的 X_q 必須再加回平均數(pca.mean_[:, np.newaxis])方能顯示如下圖的樣子,理由是 PCA 會先將資料「置中」(減去平均數)。但不管如何,總是做過一遍,方才明白每個套件的使用方式與結果。


    習題 4:每張大小 28×28 的手寫數字圖像 70000 張,不經壓縮前的儲存空間為 54.88 M Bytes。若進行 SVD 的 “Rank q approximation”,則壓縮倍數由 q 決定。寫一支程式,當調整 q 值時,可以算出壓縮的倍數,並同時顯示原圖與壓縮後還原的圖各 100 張做為比較(任選 100 張)。另外 q 的選擇可以根據 \sigma_1, \sigma_2, \cdots,  \sigma_r 的「能量配置」來決定,或說決定 q 之後,可以計算所採用的主成分的能量佔比,本題也可以順便列印出這個佔比。


商學院  7F16
ccw@gm.ntpu.edu.tw
(02)8674-1111 
ext 66777

部落格統計

  • 211,043 點擊次數