前文我们了解了奇异值分解(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权限,建议直接第二种方法吧,省事。

机器学习实战:用SVD压缩图像的更多相关文章

  1. 机器学习实战(Machine Learning in Action)学习笔记————10.奇异值分解(SVD)原理、基于协同过滤的推荐引擎、数据降维

    关键字:SVD.奇异值分解.降维.基于协同过滤的推荐引擎作者:米仓山下时间:2018-11-3机器学习实战(Machine Learning in Action,@author: Peter Harr ...

  2. 机器学习实战 - 读书笔记(14) - 利用SVD简化数据

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第14章 - 利用SVD简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. 基 ...

  3. 《机器学习实战》学习笔记第十四章 —— 利用SVD简化数据

    相关博客: 吴恩达机器学习笔记(八) —— 降维与主成分分析法(PCA) <机器学习实战>学习笔记第十三章 —— 利用PCA来简化数据 奇异值分解(SVD)原理与在降维中的应用 机器学习( ...

  4. 机器学习Python实现 SVD 分解

    这篇文章主要是结合机器学习实战将推荐算法和SVD进行对应的结合 不论什么一个矩阵都能够分解为SVD的形式 事实上SVD意义就是利用特征空间的转换进行数据的映射,后面将专门介绍SVD的基础概念.先给出p ...

  5. [机器学习笔记]奇异值分解SVD简介及其在推荐系统中的简单应用

    本文先从几何意义上对奇异值分解SVD进行简单介绍,然后分析了特征值分解与奇异值分解的区别与联系,最后用python实现将SVD应用于推荐系统. 1.SVD详解 SVD(singular value d ...

  6. 《机器学习实战》 in python3.x

    机器学习实战这本书是在python2.x的环境下写的,而python3.x中好多函数和2.x中的名称或使用方法都不一样了,因此对原书中的内容需要校正,下面简单的记录一下学习过程中fix的部分 1.pr ...

  7. 机器学习实战 [Machine learning in action]

    内容简介 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或模式,成为各行业求生存.谋发展的决定性手段,这使得这一过去为分析师和数学家所专属 ...

  8. Python 机器学习实战 —— 监督学习(上)

    前言 近年来AI人工智能成为社会发展趋势,在IT行业引起一波热潮,有关机器学习.深度学习.神经网络等文章多不胜数.从智能家居.自动驾驶.无人机.智能机器人到人造卫星.安防军备,无论是国家级军事设备还是 ...

  9. Python 机器学习实战 —— 无监督学习(上)

    前言 在上篇<Python 机器学习实战 -- 监督学习>介绍了 支持向量机.k近邻.朴素贝叶斯分类 .决策树.决策树集成等多种模型,这篇文章将为大家介绍一下无监督学习的使用.无监督学习顾 ...

随机推荐

  1. Java的浅克隆和深克隆

    如何实现对象的克隆 (1)实现 Cloneable 接口并重写 Object 类中的 clone() 方法: (2)实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真 ...

  2. corn计划周期任务

                                                                             corn计划任务 1.计划任务有四种方式   cron ...

  3. rabbitmq有哪些重要角色和组件?

    rabbitmq有哪些重要角色? 生产者:消息的创建者,负责创建和推送数据到消息服务器 消费者:消息的接收方,用于处理数据和确认消息 代理:就是RabbitMQ本身,用于扮演快递的角色,本身并不生产消 ...

  4. 比较一下 Java 和 JavaSciprt?

    JavaScript 与 Java 是两个公司开发的不同的两个产品.Java 是原 Sun Microsystems 公司推出的面向对象的程序设计语言,特别适合于互联网应用程序 开发:而 JavaSc ...

  5. 学习 Haproxy (六)

    HAProxy HAProxy是免费 高效 可靠的高可用及负载均衡解决方案,该软件非常适合于处理高负载站点的七层数据请求,HAProxy的工作模式使其可以非常容易且安全地集成到我们现有的站点架构中.使 ...

  6. css技术之用最高和最宽的限制“max-height和max-width”做图片同比例缩放,达到图片不变形目的,做出批量打印图片功能,页面打印“window.print()”

    一.简介 他们是为流而生的,像width/height这种定死的砖头式布局,min-width/max-width就没有存在的意义 ,min-width/max-width一定是自适应布局或流体布局中 ...

  7. SVN在拉取(更新)代码的时候出现Error:svn: E155037: Previous operation has not finished; run 'cleanup' if it was interrupted问题 ---window版

    简易方法1 今天朋友看到朋友报错这个错误,偷偷学习了下他的方法并做记录以防忘记 简易方法2 今天使用svn时报了一个这个错,网上搜索时都说是要使用sqllite来删除svn队列. 其实可以直接使用id ...

  8. (stm32f103学习总结)—stm32外部中断

    一.外部中断介绍 1.1 EXTI简介 EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个用于产生事 件/中断请求的边沿检测器.EXTI的每根输入线都可单独进行配置,以 ...

  9. 15_伯德图,为什么是20logM?分贝又是什么?_Bode Plot_Part1

  10. 付费漫画下载、付费韩漫下载、漫画VIP下载、VIP韩漫下载哪里下

    需要的 来qq:6686496 最近迷上了韩漫(你懂的),主要为了打发时间上班摸鱼,,找了好多网站都是要收费的,就想着试着用爬虫做一个破解. 最简单的第一步,通过url分析出漫画ID.(直接看url就 ...