1. 程式人生 > 其它 >機器學習實戰:用SVD壓縮影象

機器學習實戰:用SVD壓縮影象

前文我們瞭解了奇異值分解(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許可權,建議直接第二種方法吧,省事。