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

news2025/6/9 22:07:26

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 nn

from compressai.entropy_models import EntropyBottleneck
from compressai.layers import GDN

class 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 F

x = 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.coloradmin.cn/o/1355052.html

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

相关文章

Unity 打包AB 场景烘培信息丢失

场景打包成 AB 资源的时候,Unity 不会打包一些自带相关的资源 解决办法:在 Project settings > Graphics下设置(Automatic 修改成 Custom)

ELement UI时间控件el-date-picker误差8小时解决办法

一、问题描述&#xff1a; 在项目中引用了elementui中的date-picker组件&#xff0c;选中的时间跟实际相差八小时&#xff0c;且格式不是自己想要的格式 <el-date-pickertype"date"placeholder"选择日期"format"yyyy/M/d"v-model"form…

宏集PC Runtime软件助推食品行业生产线数字化革新

一、前言 近年来&#xff0c;中国食品行业发展迅速且灵活多变&#xff0c;在当前经济下行的情形下&#xff0c;食品行业正面临着日益激烈的竞争&#xff0c;导致企业利润下降。 为了保持企业市场竞争力&#xff0c;国内某top10食品企业采用宏集SCADA解决方案—PC Runtime软件…

2020年认证杯SPSSPRO杯数学建模B题(第二阶段)分布式无线广播全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 B题 分布式无线广播 原题再现&#xff1a; 以广播的方式来进行无线网通信&#xff0c;必须解决发送互相冲突的问题。无线网的许多基础通信协议都使用了令牌的方法来解决这个问题&#xff0c;在同一个时间段内&#xff0c;只有唯一一个拿到令牌…

Flutter迁移到空安全步骤

Flutter迁移到空安全将你现有的代码带到空安全的世界https://dart.cn/null-safety/migration-guide1. 下载并使用Flutter 3.7.12 SDK&#xff0c; 2. 使用dart pub outdated 检查并更新你的依赖&#xff08;然后使用下面的命令升级依赖&#xff09; &#xff08;1&#xff09…

django websocket

目录 核心代码 consumers.py from channels.generic.websocket import WebsocketConsumer from channels.exceptions import StopConsumer import datetime import time from asgiref.sync import async_to_sync class ChatConsumer(WebsocketConsumer):def websocket_conne…

HT81698 内置升压双声道 相互p2p兼容 HT81696

HT81698内置升压的立体声D类音频功率放大器&#xff0c;其支持单节锂电、双节锂电串联、5V、12V等多种输入&#xff0c;升压后的电压提供给功放供电&#xff0c;功放支持双通道立体声BTL输出以及并联PBTL单声道输出; HT81698内置的升压电路&#xff0c;可通过FB脚设置升压值&a…

HT760 2x30W12S输入,无电感,立体声D类放大器

HT760 典型应用图&#xff1a; HT760 引脚图&#xff1a; HT760 引脚定义信息&#xff1a; #HT760

Netty实战(待完善)

Netty组件 1. Bootstrap, ServerBootstrap Netty 中 Bootstrap 类是客户端程序的启动引导类&#xff0c;ServerBootstrap 是服务端启动引导类。 2. NioEventLoop, NioEventLoopGroup NioEventLoop 中维护了一个线程和任务队列&#xff0c;支持异步提交执行任务&#xff0c;…

RK3568驱动指南|第九篇 设备模型-第103章 在总线下注册设备实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

LeetCode-Java(29)

29. 两数相除 结果肯定落在dividend上&#xff0c;于是对这个区间每一个数进行二分查找&#xff0c;判断方法就是 while (l < r) {long mid l r 1 >> 1;if (mul(mid, y) < x) {l mid;} else {r mid - 1;}} 其中mul是一个要定义的快速乘法。 完整代码如下 …

CH341StreamI2C参数解释

总体思路&#xff1a; 第一步&#xff1a;使用EEPROM写入相应的数据 第二步&#xff1a;使用EEPROM读取相应的数据 第三步&#xff1a;使用CH341StreamI2C函数还原读取过程 每一步需要逻辑分析仪进行对比。 第一步&#xff1a;数据写入CH341WriteEEPROM 使用CH341WriteE…

当AI遇见大脑:电脑与人脑协同“进化”

编者按&#xff1a;2023年是微软亚洲研究院建院25周年。借此机会&#xff0c;我们特别策划了“智启未来”系列文章&#xff0c;邀请到微软亚洲研究院不同研究领域的领军人物&#xff0c;以署名文章的形式分享他们对人工智能、计算机及其交叉学科领域的观点洞察及前沿展望。希望…

百度搜索金融:构建高时效、高可用的分布式数据传输系统

作者 | 搜索技术平台研发部 导读 分布式数据传输系统是一种用于在多个计算节点之间高效传输大量数据的系统&#xff0c;诣在高效的解决大规模数据迁移、备份、跨地域复制等问题&#xff0c;其广泛应用在实时数据流传输、跨数据中心数据迁移、多媒体传输等场景&#xff0c;在大多…

一文读懂$mash 通证的 “Fair Launch” 规则,将公平发挥极致

Solmash 是Solana生态中由社区主导的铭文资产LaunchPad平台&#xff0c;该平台旨在为Solana原生铭文项目&#xff0c;以及通过其合作伙伴SoBit跨链桥桥接到Solana的Bitcoin生态铭文项目提供更广泛的启动机会。有了Solmash&#xff0c;将会有更多的Solana生态的铭文项目、资产通…

【逗老师的无线电】ICOM IC-705终端模式Terminal Mode直连反射器配置-外置Pi-Star网关篇

各位友台大家好呀&#xff0c;逗老师最近整了一台IC-705&#xff0c;最吸引人的莫过于这玩意可以通过USB连接树莓派直接进行通联。下面简单介绍一下这个功能和其配置方法 一、功能 终端模式Terminal Mode允许IC-705电台作为终端直接连接反射器&#xff0c;基于不同的连接方式…

雍禾医疗以患者为中心 雍禾植发医生文志清专注做精每一台手术

随着生活方式的改变&#xff0c;晚睡、长期使用电子产品等原因让脱发成为消费者不可忽视的问题。有相关数据显示&#xff0c;76%消费者关注自己的头皮健康状况&#xff0c;53%的人群受到脱发困扰&#xff0c;已经有20%消费者认识到专业毛发医疗机构的重要性&#xff0c;选择到专…

MyBatis学习二:Mapper代理开发、配置文件完成增删改查、注解开发

前言 公司要求没办法&#xff0c;前端也要了解一下后端知识&#xff0c;这里记录一下自己的学习 学习教程&#xff1a;黑马mybatis教程全套视频教程&#xff0c;2天Mybatis框架从入门到精通 文档&#xff1a; https://mybatis.net.cn/index.html Mapper代理开发 目的 解决…

innovus:Patch Wire(补丁线)

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 在修补一些min area的drc时&#xff0c;会有一些danling wire的drc冒出来&#xff0c;为了避免这些假错&#xff0c;可以使用工具patch wire功能。 1&#xff09;选中wire &…

linux centos 添加临时ip

### 1.添加ip ip addr add IP/mask dev 网络设备 例&#xff1a;ip addr add 172.104.210.247/24 dev ens5f1 ### 2.启动网卡 ip link set up 网络设备 例&#xff1a;ip link set up ens3f0 ### 3.设置默认路由 ip route add default via GATEWAY 例&#xff1a;ip route add …