機器學習實戰(zhàn):用 SVD 壓縮圖像(已上線)
↓↓↓點擊關(guān)注,回復資料,10個G的驚喜
SVD
前文我們了解了奇異值分解(SVD)的原理,今天就實戰(zhàn)一下,用矩陣的奇異值分解對圖片進行壓縮.
Learn by doing
我做了一個在線的圖像壓縮應用,大家可以感受一下。
功能很簡單,上傳需要壓縮的圖片,選擇壓縮比,提交即可。

下面咱們就一起看看實現(xiàn)過程
用SVD壓縮圖像


原理很簡單:
將圖片分解為RGB三顏色矩陣,將每個顏色矩陣進行奇異值分解,然后選擇指定數(shù)量的特征對矩陣進行壓縮。
核心代碼
完整代碼大家可以clone我的huggingface
https://huggingface.co/spaces/beihai/Image-Compression-with-SVD
核心代碼1:
p表示奇異值的百分比,根據(jù)指定的清晰度提取奇異值清晰度越高,壓縮比越低,提取的奇異值的個數(shù)也就越多,圖片也就越不會失真)
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函數(shù)和gradio前端的實現(xiàn)
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 上線機器學習應用(純免費)我已經(jīng)介紹過很多遍了,這里就不贅述了,還不太熟悉的同學請移步我這篇文章:騰訊的這個算法,我搬到了網(wǎng)上,隨便玩!
這里就提一下遇到的小問題及解決方法吧。
由于用了cv2,所以要安裝opencv-python,但是運行中報錯如下:
??File?"/home/user/.local/lib/python3.8/site-packages/cv2/__init__.py",?line?8,?in?
????from?.cv2?import?*
ImportError:?libGL.so.1:?cannot?open?shared?object?file:?No?such?file?or?directory
針對這個錯誤,網(wǎng)上有以下方法:
1 yum安裝:
yum?install?libglvnd-glx
2 重新安裝opencv包:
pip?uninstall?opencv-python
pip?install?opencv-python-headless
第一種方法需要root權(quán)限,建議直接第二種方法吧,省事。
參考:https://blog.razrlele.com/p/1920 https://blog.csdn.net/qq_42192693/article/details/121392195
