在CNN分类模型训练期间,在计算损失的同时,我在PyTorch中对图像应用了jpeg压缩编码。当我调用loss.backward()时,它还必须通过对图像执行的编码和压缩操作来反向传播。
那些压缩算法(例如编码和JPEG压缩)是否可以区分,否则如何通过这些操作反向传播损耗梯度?
如果这些操作不可区分,PyTorch中是否存在执行H.264编码和JPEG压缩的可区分压缩算法?
任何建议都会很有帮助。
首先,请仔细考虑您是否需要区分JPEG压缩步骤。绝大多数项目在此步骤中没有区别,如果您不确定是否需要,则可能不需要。
如果确实需要在图像压缩器之间进行区分,则可以考虑比JPEG易于实现的编解码器。基于小波的压缩(命运不佳的JPEG 2000 format背后的技术)在数学上是优雅的,并且易于区分。在该技术的最新应用中,Thies et al. 2019将图像表示为拉普拉斯金字塔,其损耗分量用于在较高分辨率的水平上强制稀疏。
现在,作为思想实验,我们可以查看different steps within JPEG compression并确定是否可以以不同的方式实现它们。
色彩转换(从RBG到YCbCr):我们可以将其表示为逐点卷积。
色度下采样:在色度通道上使用torch.nn.functional.interpolate
非常容易。
离散余弦变换(DCT):现在,事情变得越来越有趣了。这是可能有效的DCT的Pytorch实现:https://github.com/zh217/torch-dct。
量化表:再次简单。这应该只是将DCT的输出与表中的值相乘。
霍夫曼编码:硬;我不确定这是否可能。输出元素的数量将根据图像熵而变化,这会排除许多可区分的构造块。根据您的应用程序,您可能可以跳过此步骤(此步骤是无损压缩;因此,如果您试图区分JPEG引入的压缩伪像,那么前面的步骤就足够了。)
有关将JPEG DCT分量直接输入到神经网络的有趣的相关工作,请参见Faster Neural Networks Straight from JPEG。>