我正在美國的鹿物種上創建影像分類模型,我目前正在對這些影像執行 PCA,以減少它們的記憶體大小并減少模型的運行時間。
我知道主成分分析應該在不放棄太多方差的情況下減少資料集的維度。所以當我注意到通過我的Deer_PCA函式運行的所有新的 PCA 壓縮影像都比原始影像大時,我有點困惑。原始影像為 128 KB,新的壓縮影像在n_components = 150. 有誰知道為什么會這樣?
這是我在函式中運行的圖片,在運行代碼之前將影像放在一個空檔案夾中:

這是通過Deer_PCA函式運行后的新壓縮影像:

這是我的代碼:
#import some packages
import cv2
import os,sys
from PIL import Image
import pandas as pd
from scipy.stats import stats
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
#Let's write a function to perform PCA on all the images in the folder and output it to a new folder
#inpath = folder containing the image - string value
#outpath = which folder do I want the new compressed image saved to. - string value
#n_comp = number of components - int value
def Deer_PCA(inpath, outpath,n_comp):
for image_path in os.listdir(inpath):
# create the full input path and read the file
input_path = os.path.join(inpath, image_path)
print(input_path)
w_deer = cv2.cvtColor(cv2.imread(input_path), cv2.COLOR_BGR2RGB)
#split image
blue_2,green_2,red_2 = cv2.split(w_deer)
#scale channels
w_blue = blue_2/255
w_green = green_2/255
w_red = red_2/255
#PCA on each channel
pca_b2 = PCA(n_components=n_comp)
pca_b2.fit(w_blue)
trans_pca_b2 = pca_b2.transform(w_blue)
pca_g2 = PCA(n_components=n_comp)
pca_g2.fit(w_green)
trans_pca_g2 = pca_g2.transform(w_green)
pca_r2 = PCA(n_components=n_comp)
pca_r2.fit(w_red)
trans_pca_r2 = pca_r2.transform(w_red)
#merge channels after PCA
b_arr2 = pca_b2.inverse_transform(trans_pca_b2)
g_arr2 = pca_g2.inverse_transform(trans_pca_g2)
r_arr2 = pca_r2.inverse_transform(trans_pca_r2)
img_reduced2 = (cv2.merge((b_arr2, g_arr2, r_arr2)))
print("Merge Successful")
# create the full output path
fullpath = os.path.join(outpath, 'PCA_' image_path)
cv2.imwrite(fullpath, img_reduced2*255)
print("Successfully saved\n")
#Check the image sizes
original_image_path = '/Users/matthew_macwan/Downloads/CIS/I_Class_Deer/mule_deer_doe/mule deer doe_1.jpeg'
PCA_compressed_image_path = '/Users/matthew_macwan/Downloads/CIS/I_Class_Deer/mule_deer_doe/PCA_mule deer doe_1.jpeg'
print('Original Image:',sys.getsizeof(original_image_path))
print('PCA Image:',sys.getsizeof(PCA_compressed_image_path))
uj5u.com熱心網友回復:
這里有一些誤解。當您對這樣的單個影像進行 PCA 時,它會將每一列(或行,不確切知道)作為一個觀察結果。然后它將影像減少到 150 行(或列),確實減少了資料量,并且可能還減少了這些資料中包含的資訊量。
但是隨后您從 PCA 重建原始影像,獲得與原始影像大小相同的陣列,并將其保存為 JPEG。您沒有更少的資料點要存盤。影像整體可能包含較少的資訊,但資訊減少的方式與JPEG減少資訊的方式不同,因此JPEG演算法不太可能受益,不太可能以較少的位元組保存那些資料。
您的輸出 JPEG 明顯大于輸入可能是由于 PCA 更改實際上使 JPEG 演算法變得更加困難,或者由 JPEG 演算法(或兩者的組合)的質量設定引起的。降低 JPEG 壓縮的質量設定是縮小 JPEG 檔案的最佳方法。
如果要使用 PCA 壓縮影像檔案,則必須保存 PCA 基向量和投影到這些向量中的影像。我懷疑這是壓縮影像的有效方法。
壓縮影像的一種完全不同的方法是收集大量影像,通過將其所有樣本值排成一行,然后將 PCA 應用于該集合,從而將每個影像都制成一個向量。PCA 基向量形成一個“字典”,現在每幅影像都由這些基向量的線性組合表示,這意味著您只需要存盤權重,每個基向量一個值。再說一次,不能保證這是有效的,我說這個是為了說明 PCA 的作業原理。您能做的最好的事情是堅持使用眾所周知且經過測驗的影像壓縮方法,例如 JPEG 和 JPEG2000。
當我到達那個點時,減少它們的記憶體大小并減少模型的運行時間。
請注意,檔案大小與模型必須完成的作業量無關。當您將檔案中的影像讀入記憶體時,您會獲得一定數量的像素。該模型必須處理所有這些像素。此時資料在磁盤上占用多少空間無關緊要。如果您想讓模型更快,請減少影像中的像素數,您可以通過二次采樣來實作。但是請確保您仍然可以識別模型在重新采樣后需要識別的任何內容。如果洗掉太多像素,您將無法區分鹿和老鼠!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/332948.html
