機器學習實戰:用SVD壓縮影象
阿新 • • 發佈:2022-04-17
前文我們瞭解了奇異值分解(SVD)的原理,今天就實戰一下,用矩陣的奇異值分解對圖片進行壓縮.
Learn by doing
我做了一個線上的影象壓縮應用,大家可以感受一下。
https://huggingface.co/spaces/beihai/Image-Compression-with-SVD
功能很簡單,上傳需要壓縮的圖片,選擇壓縮比,提交即可。
下面咱們就一起看看實現過程
用SVD壓縮影象
原理很簡單:
將圖片分解為RGB三顏色矩陣,將每個顏色矩陣進行奇異值分解,然後選擇指定數量的特徵對矩陣進行壓縮。
核心程式碼
完整程式碼大家可以clone我的huggingface
https://huggingface.co/spaces/beihai/Image-Compression-with-SVD
核心程式碼1:
p表示奇異值的百分比,根據指定的清晰度提取奇異值清晰度越高,壓縮比越低,提取的奇異值的個數也就越多,圖片也就越不會失真)
def rebuild_img(u, sigma, v, percent): m = len(u) n = len(v) a = np.zeros((m, n)) count = (int)(sum(sigma)) curSum = 0 k = 0 while curSum <= count * percent: uk = u[:, k].reshape(m, 1) vk = v[k].reshape(1, n) a += sigma[k] * np.dot(uk, vk) curSum += sigma[k] k += 1 a[a < 0] = 0 a[a > 255] = 255
核心程式碼2:
主要就是定義inderence函式和gradio前端的實現
import os os.system("pip install --upgrade pip") os.system("pip install opencv-python-headless") import cv2 import numpy as np import gradio as gr from func import rebuild_img def inference(img,k): input_img = cv2.imread(img, cv2.IMREAD_COLOR) u, sigma, v = np.linalg.svd(input_img[:, :, 0]) R = rebuild_img(u, sigma, v, k) u, sigma, v = np.linalg.svd(input_img[:, :, 1]) G = rebuild_img(u, sigma, v, k) u, sigma, v = np.linalg.svd(input_img[:, :, 2]) B = rebuild_img(u, sigma, v, k) restored_img = np.stack((R, G, B), 2) return Image.fromarray(restored_img[:, :, ::-1]) gr.Interface( inference, [ gr.inputs.Image(type="filepath", label="Input"),gr.inputs.Slider(0, 1, 0.1,default=0.6,label= 'Compression ratio')], gr.outputs.Image(type="pil", label="Output"), title=title, description=description, article=article ).launch(enable_queue=True,cache_examples=True,share=True)
上線
Gradio + Huggingface 上線機器學習應用(純免費)我已經介紹過很多遍了,這裡就不贅述了,還不太熟悉的同學請移步我這篇文章:騰訊的這個演算法,我搬到了網上,隨便玩!
這裡就提一下遇到的小問題及解決方法吧。
由於用了cv2,所以要安裝opencv-python,但是執行中報錯如下:
File "/home/user/.local/lib/python3.8/site-packages/cv2/__init__.py", line 8, in <module>
from .cv2 import *
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
針對這個錯誤,網上有以下方法:
1 yum安裝:
yum install libglvnd-glx
2 重新安裝opencv包:
pip uninstall opencv-python
pip install opencv-python-headless
第一種方法需要root許可權,建議直接第二種方法吧,省事。