PyTorch中的不同图像压缩操作



在计算损失的CNN分类模型训练过程中,我正在PyTorch中对图像应用编码jpeg压缩。当我调用loss.backward((时,它还必须通过对图像执行编码和压缩操作来进行反向传播。

这些压缩算法(例如编码和JPEG压缩(是可微分的吗?否则如何通过这些操作反向传播损失梯度?

如果这些操作是不可微分的,那么PyTorch中是否存在执行H.264编码和JPEG压缩的可微分压缩算法

任何建议都将非常有帮助。

首先,请仔细考虑是否需要区分JPEG压缩步骤。绝大多数项目在这一步中都没有区别,如果你不确定是否需要,你可能不会。


如果你真的需要在图像压缩器之间进行区分,你可以考虑一种比JPEG更容易实现的编解码器。基于Wavelett的压缩(命运多舛的JPEG 2000格式背后的技术(在数学上很优雅,易于区分。在这项技术的最新应用中,Thies等人2019将图像表示为拉普拉斯金字塔,其损耗分量用于在更高分辨率级别中强制稀疏。


现在,作为一个思想实验,我们可以查看JPEG压缩中的不同步骤,并确定它们是否可以以可微分的方式实现。

  • 颜色变换(RBG到YCbCr(:我们可以将其表示为逐点卷积。

  • 色度下采样:在色度通道上使用torch.nn.functional.interpolate非常简单。

  • 离散余弦变换(DCT(:现在事情变得越来越有趣了。以下是DCT的Pytorch实现,可能会起作用:https://github.com/zh217/torch-dct.

  • 量化表:又简单了。这应该只是将DCT的输出与表中的值相乘。

  • 霍夫曼编码:硬;我不确定这是否可能。输出元素的数量将根据图像熵而变化,这排除了许多可微分的构建块。根据您的应用程序,您可能可以跳过此步骤(此步骤是无损压缩;因此,如果您试图区分JPEG引入的压缩伪影,则前面的步骤应该足够了(。

有关将JPEG DCT组件直接输入神经网络的有趣相关工作,请参阅直接从JPEG中输入的更快神经网络。

最新更新