CompressAI:深度学习与传统图像压缩

1、图像压缩算法原理

传统的有损图像压缩方法,如JPEG , JPEG2000 , HEVC或AV1或VVC,在类似的编码方案上进行了迭代改进:将图像划分为像素块,使用变换域通过线性变换(例如:DCT或DWT)去相关空间频率,基于相邻值执行一些预测,量化转换系数最后使用有效的熵编码器(例如:CABAC[11])将量化值和预测侧信息编码成比特流
另一方面,基于人工神经网络的编解码器主要依赖于学习分析和综合非线性变换。像素值通过分析变换映射到潜在表示,然后对潜在进行量化和(无损)熵编码。类似地,解码器由近似逆变换或合成变换组成,然后将潜在表示转换回像素域

CompressAI最重要的特性之一是能够轻松实现端到端的图像压缩深度神经网络。一些领域特定的层、操作和模块已经在PyTorch上实现,比如熵模型、量化操作、颜色变换
在这里插入图片描述
从最先进的学习图像压缩中重新实现的模型目前在CompressAI中可用。完全支持本表中列出的模型的训练、微调、推理和评估。
由于参考模型的设计,需要遵守一些约束:H和W预计至少为64像素长。基于特定模型的跨行卷积和反卷积的数量,用户可能必须将输入张量的H和W填充到适当的维度。

大多数模型的训练或评估模式都有不同的表现。例如,量化操作可以以不同的方式进行:通常在训练期间向潜在张量添加均匀噪声,而在推理阶段使用舍入。用户可以通过model.train()或model.eval()在模式之间切换

在这里插入图片描述
finding the right quality parameter to reach a given PSNR or bit-rate on a target image (see example in listing
找到正确的质量参数以达到目标图像的给定PSNR或比特率(参见清单中的示例)

2、Traditional codecs传统的编解码器

为了便于与传统编解码器进行比较,CompressAI包含了一个简单的python API和命令行接口。支持最常见的图像和视频编解码器,支持的编解码器的完整列表及其各自的实现可在表4中找到
在这里插入图片描述
此时,传统方法和基于人工神经网络的方法之间的运行时效性比较无法准确和公平地报告。测量基于人工神经网络的编解码器的推理效率是一个活跃的研究课题。神经网络被有效地设计为在大规模并行架构上运行,而传统的编解码器通常被设计为在单个CPU核心上运行

注意:CompressAI不附带上述传统编解码器的二进制文件,而是在可执行文件上提供一个通用的Python接口,JPEG和WebP例外,它们默认使用Python Pillow Image库链接

3、CompressAI介绍

CompressAI 构建在 PyTorch 之上,并提供:
(1)基于深度学习的数据压缩的自定义操作、层和模型
(2)官方TensorFlow 压缩库的部分移植
(3)用于学习图像压缩的预训练端到端压缩模型
(4)用于将学习模型与经典图像/视频压缩编解码器进行比较的评估脚本

CompressAI 旨在通过提供资源来研究、实施和评估基于机器学习的压缩编解码器,让更多的研究人员为学习的图像和视频压缩领域做出贡献。
在这里插入图片描述
在这里插入图片描述

构造训练数据集(compressai.datasets)

在这里插入图片描述

ImageFolder
class compressai.datasets.ImageFolder(root, transform=None, split='train')

加载图像文件夹数据库。训练和测试图像样本分别存储在不同的目录中:
在这里插入图片描述
在这里插入图片描述

VideoFolder
class compressai.datasets.VideoFolder(root, rnd_interval=False, rnd_temp_order=False, transform=None, split='train')[source]

加载视频文件夹数据库。训练和测试视频剪辑存储在包含多个子目录的目录中,例如 Vimeo90K 数据集:
在这里插入图片描述
训练和测试(有效)剪辑将从列出相关文件夹的相应输入文件导航的子目录中撤回。
此类返回元组中的一组三个视频帧。如果子文件夹包含超过 6 帧,则可以应用随机间隔。
在这里插入图片描述

Models 模型

在这里插入图片描述

在这里插入图片描述

bmshj2018_factorized
compressai.zoo.bmshj2018_factorized(quality, metric='mse', pretrained=False, progress=True, **kwargs)

在这里插入图片描述

bmshj2018_hyperprior
compressai.zoo.bmshj2018_hyperprior(quality, metric='mse', pretrained=False, progress=True, **kwargs)[source]
mbt2018_mean
compressai.zoo.mbt2018_mean(quality, metric='mse', pretrained=False, progress=True, **kwargs)[source]
mbt2018
compressai.zoo.mbt2018_mean(quality, metric='mse', pretrained=False, progress=True, **kwargs)[source]
cheng2020_anchor
compressai.zoo.cheng2020_anchor(quality, metric='mse', pretrained=False, progress=True, **kwargs)[source]

在这里插入图片描述

cheng2020_attn
compressai.zoo.cheng2020_attn(quality, metric='mse', pretrained=False, progress=True, **kwargs)[source]

在这里插入图片描述
在这里插入图片描述

模型训练

An example training script train.py is provided script in the examples/ folder of the CompressAI source tree.

python3 examples/train.py -m mbt2018-mean -d /path/to/image/dataset \--batch-size 16 -lr 1e-4 --save --cuda

运行train.py-help来列出可用的选项。请参见模型动物园训练部分,以重现预训练模型的性能。
在这里插入图片描述

 python examples/train.py -m bmshj2018-factorized -d  dataset/htht1024 --save --cuda  --seed  4 

在这里插入图片描述

python examples/train.py -m bmshj2018-factorized -d  dataset/htht1024 --batch-size 1 --save --cuda  --seed 4 

在这里插入图片描述
在这里插入图片描述

 python examples/train.py -m bmshj2018-factorized -d  dataset/htht512  --batch-size 4  --save --cuda  --seed 4

在这里插入图片描述
在这里插入图片描述

 python examples/train.py -m bmshj2018-factorized -d  dataset/htht256  --batch-size 4  --save --cuda  --seed 4 --checkpoint checkpoint_best_loss.pth.tar

模型更新Model update

一旦一个模型被训练,你需要运行update_model脚本来更新 entropy bottlenecks的内部参数:

python -m compressai.utils.update_model --architecture ARCH checkpoint_best_loss.pth.tar

这将修改与学习到的执行实际熵编码所需的累积分布函数(CDFs)相关的缓冲区。
您可以运行python -m compressai.utils.update_model --help以获取完整的选项列表。
或者,您可以在保存模型检查点之前在训练脚本末尾调用update() a CompressionModel或EntropyBottleneck 实例的方法。

模型评估Model evaluation

更新模型检查点后,您可以使用eval_model来获取其在图像数据集上的性能

python -m compressai.utils.eval_model checkpoint /path/to/image/dataset \-a ARCH -p path/to/checkpoint-xxxxxxxx.pth.tar
您可以运行python -m compressai.utils.eval_model --help以获取完整的选项列表。

熵编码

默认情况下,CompressAI 使用一系列非对称数字系统 (ANS) 熵编码器。您可以使用compressai.available_entropy_coders()获取已实现的熵编码器的列表,并通过 compressai.set_entropy_coder() 更改默认的熵编码器。

将图像张量压缩为比特流
x = torch.rand(1, 3, 64, 64)
y = net.encode(x)
strings = net.entropy_bottleneck.compress(y)
将比特流解压缩为图像张量
shape = y.size()[2:]
y_hat = net.entropy_bottleneck.decompress(strings, shape)
x_hat = net.decode(y_hat)

训练你自己的模型

在本教程中,我们将使用 CompressAI 中预定义的一些模块和层来实现自定义自动编码器架构。

定义自定义模型

让我们构建一个简单的自动编码器,其中包含一个 EntropyBottleneck模块、编码器的 3 个卷积、解码器的 3 个转置反卷积和 GDN激活函数:

import torch.nn as nnfrom compressai.entropy_models import EntropyBottleneck
from compressai.layers import GDNclass Network(nn.Module):def __init__(self, N=128):super().__init__()self.entropy_bottleneck = EntropyBottleneck(N)self.encode = nn.Sequential(nn.Conv2d(3, N, stride=2, kernel_size=5, padding=2),GDN(N)nn.Conv2d(N, N, stride=2, kernel_size=5, padding=2),GDN(N)nn.Conv2d(N, N, stride=2, kernel_size=5, padding=2),)self.decode = nn.Sequential(nn.ConvTranspose2d(N, N, kernel_size=5, padding=2, output_padding=1, stride=2)GDN(N, inverse=True),nn.ConvTranspose2d(N, N, kernel_size=5, padding=2, output_padding=1, stride=2)GDN(N, inverse=True),nn.ConvTranspose2d(N, 3, kernel_size=5, padding=2, output_padding=1, stride=2))def forward(self, x):y = self.encode(x)y_hat, y_likelihoods = self.entropy_bottleneck(y)x_hat = self.decode(y_hat)return x_hat, y_likelihoods

卷积的跨步减少了张量的空间维度,同时增加了通道数量(这有助于学习更好的潜在表示)。瓶颈模块用于在训练时获得潜在张量的可微熵估计。

损失函数

(1)Rate distortion loss
我们将定义一个简单的率失真损失,它最大化 PSNR 重建 (RGB) 并最小化量化潜在张量 ( ) 的长度(以位为单位)y_hat。

标量用于平衡重建质量和比特率(如 JPEG 质量参数或 HEVC 的 QP)
在这里插入图片描述

import math
import torch.nn as nn
import torch.nn.functional as Fx = torch.rand(1, 3, 64, 64)
net = Network()
x_hat, y_likelihoods = net(x)# bitrate of the quantized latent
N, _, H, W = x.size()
num_pixels = N * H * W
bpp_loss = torch.log(y_likelihoods).sum() / (-math.log(2) * num_pixels)# mean square error
mse_loss = F.mse_loss(x, x_hat)# final loss term
loss = mse_loss + lmbda * bpp_loss

(2)Auxiliary loss

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot使用支付宝沙箱环境进行仿真支付

目录 一、进入支付宝开发平台—沙箱环境 二、点击沙箱进入沙箱环境 三、Java二维码生成技术 1、导入依赖 2、生成指定url对应的二维码图片 四、支付接口 1、保存好沙箱应用里面的公钥私钥 2、 测试接口 3、扫码 4、买家结果 5、卖家结果 五、回调接口 1、使用内网…

el-select 多选,选有一个未选择的选项

多选有未选择这个选项后。会出现一个情况,绑定的数据为[‘未选择’,‘cpu1’,‘cpu2’] 进行一个处理,选择(未选择)就清除(其它的选择),选择(cpu)就清除(未选…

RocketMQ快速入门

RocketMQ快速入门 RocketMQ提供了发送多种发送消息的模式,例如同步消息,异步消息,顺序消息,延迟消息,事务消息等,我们一一学习 1.1 消息发送和监听的流程 我们先搞清楚消息发送和监听的流程,然…

自制c++题目《模板综合》

1.输出结果&#xff1a; 2.主函数不允许改变 int arr[5] { 5,2,3,1,4}; char arr1[5] { a,c,b,e,d }; good <int>a(arr,5); good <char>b(arr1,5); bad<int>(1,2); bad<float>(1.1, 1.2); 自制c题目《模板综合》 王赫辰/c语言 - Gitee.com

引导和服务

目录 一、Linux操作系统引导过程 1、引导过程总览图 2、引导过程的详细步骤 二、系统初始化进程 1、init进程&#xff08;串行启动&#xff09; 2、Systemd&#xff08;并行启动&#xff09; 3、Centos6与Centos7的区别&#xff1a; 4、Systemd单元类型 5、运行级别所…

EFCore8泛化关系在数据库中的体现

如图&#xff0c;在关系数据库中&#xff0c;数据表达为一张表&#xff0c;用一个字段“Discriminator”来做区分&#xff1a; 要达到这样的效果&#xff08;数据库中的结构&#xff09;&#xff0c;需要在XXContext中将继承关系的三个类都加上&#xff1a; public DbSet<P…

在 Mac 上轻松安装和配置 JMeter

Apache JMeter 是一个开源的负载测试工具&#xff0c;可以用于测试静态和动态资源&#xff0c;确定服务器的性能和稳定性。在本文中&#xff0c;我们将讨论如何下载和安装 JMeter。 安装 Java&#xff08;已安装 Java 的此步骤可跳过&#xff09; 要安装 Java&#xff0c;请按…

想学鸿蒙,又怕找不到工作?能有前途吗?

鸿蒙有没有前途&#xff0c;能不能找到工作&#xff1f;其实这与市场行情有关&#xff0c;这几年的互联网大家都已经感受到了&#xff0c;十分悲凉。不管是前端还是Android等开发行业&#xff0c;不是被裁员就是内卷严重&#xff0c;这几年倒下了无数家中小型互联网企业。 而作…

腾讯云2024年最新优惠活动整理汇总

腾讯云作为国内领先的云计算服务提供商&#xff0c;一直致力于为用户提供优质、高效的服务。为了更好地满足用户需求&#xff0c;腾讯云经常推出各种优惠活动&#xff0c;本文将对腾讯云最新优惠活动进行整理汇总&#xff0c;帮助用户更好地了解和利用这些福利。 一、腾讯云新用…

kali2.0安装VMware Tools 和自定义改变分辨率

kali2.0安装VMware Tools 和自定义改变分辨率 VMware Tools 简介&#xff1a;VMware Tools安装&#xff1a;自定义改变分辨率&#xff1a;xrandr命令修改分辨率&#xff1a; 前言&#xff1a; 因为kali2.0比较老 所以需要手动安装 WMware Tools 进行复制粘贴操作&#xff01; …

企业需要专业的合同档案管理系统吗

文书合同是企业与供应商、客户、员工等签订的重要文件&#xff0c;具有法律效力和约束力。合同档案管理系统可以帮助企业有效管理合同文件&#xff0c;提高合同管理的效率和准确性。 专久智能合同档案管理系统具备以下优点&#xff1a; 1. 文件安全性&#xff1a;合同文件经过专…

力扣刷题-二叉树-合并二叉树

617.合并二叉树&#xff08;经典&#xff09; 合并二叉树是操作两棵树的题目里面很经典的&#xff0c;如何对两棵树遍历以及处理&#xff1f; 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。 你需要将他们合并…

NE555学习笔记-2024

实物图片 NE555引脚图 内部时序图 示列1&#xff0c;红外接收电路 红外接收电路的工作原理&#xff1a;在上述电路中&#xff0c;TSOP1738构成了该电路的主要组成部分&#xff0c;旨在检测来自任何来源的红外信号。这用于检测38 KHz范围的信号&#xff0c;因此命名为“TSOP173…

探秘Spring Bean的秘境:作用域篇【beans 三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘Spring Bean的秘境&#xff1a;作用域篇【beans 三】 前言单例作用域如何声明单例Bean&#xff1a;特点&#xff1a; 原型作用域如何声明原型Bean&#xff1a;特点&#xff1a; 会话作用域如何声明…

【KingbaseES】实现MySql函数Space

CREATE OR REPLACE FUNCTION SPACE(input_length integer) RETURNS text AS $$ BEGIN RETURN REPEAT( , input_length) AS SPACES; END; $$ LANGUAGE plpgsql;

深度学习课程实验二深层神经网络搭建及优化

一、 实验目的 1、学会训练和搭建深层神经网络&#xff1b; 2、掌握超参数调试正则化及优化。 二、 实验步骤 初始化 1、导入所需要的库 2、搭建神经网络模型 3、零初始化 4、随机初始化 5、He初始化 6、总结三种不同类型的初始化 正则化 1、导入所需要的库 2、使用非正则化…

实验笔记之——基于Linux服务器复现Instant-NGP及常用的tmux指令

之前博客实现了基于windows来复现Instant-NGP&#xff0c;本博文在linux服务器上测试 实验笔记之——基于windows复现Instant-NGP-CSDN博客文章浏览阅读444次&#xff0c;点赞15次&#xff0c;收藏7次。之前博客对NeRF-SLAM进行了调研&#xff0c;本博文先复现一下Intant-NGP。…

C++基础语法——基本知识、数据类型、运算符及程序流程结构

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; >第1阶段-C基础入门 ---------第2阶段实战-通讯…

Java基础进阶(学习笔记)

注&#xff1a;本篇的代码和PPT图片来源于黑马程序员&#xff0c;本篇仅为学习笔记 static static 是静态的意思&#xff0c;可以修饰成员变量&#xff0c;也可以修饰成员方法 修饰成员的特点&#xff1a; 被其修饰的成员, 被该类的所有对象所共享 多了一种调用方式, 可以通过…

OpenHarmony源码转换器—多线程特性转换

本文讨论了如何将多线程的 Java 代码转换为 OpenHarmony ArkTS 代码​ 一、简介 Java 内存共享模型 以下示例伪代码和示意图展示了如何使用内存共享模型解决生产者消费者问题。 生产者消费者与共享内存间交互示意图 为了避免不同生产者或消费者同时访问一块共享内存的容器时…