Googolxx / STF

Pytorch implementation of the paper "The Devil Is in the Details: Window-based Attention for Image Compression".
Apache License 2.0
161 stars 20 forks source link

一些问题 #19

Closed guoguo1314 closed 1 year ago

guoguo1314 commented 1 year ago

1、如何训练ssim的模型,也是将lamda改成ssim的值,loss改成ssim的loss,然后从头开始训练6个吗(比如你就是训练的6个)?我看这个链接https://github.com/InterDigitalInc/CompressAI/issues/213 只用在mes上面微调就行了,请问这个是怎么微调的?

Googolxx commented 1 year ago

都是可以的,可以从头训,也可以用预训练好的模型finetune。 方法跟你说的一样,lamda改成ssim的值,loss改成ssim的loss。 微调的话,基本跟平时训练步骤一样,也可以先用1e-4的学习率先训到收敛,最后改为1e-5。但是迭代轮数相对从头训练可以减少好几倍。

guoguo1314 commented 1 year ago

①我理解的微调是在训练好的mse模型上,将lamda改成ssim的值,loss改成ssim的loss,然后用1e-4,1e-5训练,是这样吗? ②一般你们操作是重新训练还是在mse上微调? ③https://github.com/Googolxx/STF/issues/15 你这个可视化也可以用到某几个通道可视化哈应该?

Googolxx commented 1 year ago

1.对 2.应该都可以,我当时好像是重新训练的。 3.是的

guoguo1314 commented 1 year ago

好的,收到,谢谢哥!!!💋💋💋!!!

guoguo1314 commented 1 year ago

像这位https://github.com/Googolxx/STF/issues/15 说的allocated_bits= torch.Size([1, 384, 48, 80])一样,那么怎么从384个通道中找到最大熵通道呀? 我只能理解这么一点: allocated_bits = torch.log(y_likelihoods) / - math.log(2)这个就是计算熵的公式,因为输入的张量,所以输出allocated_bits也是张量,而不是我们平时信息论书上那种是个数出来。 我又理解的是,如果是数输出,最大熵将是384个通道中熵值(384个通道数最大)最大那个通道,就叫最大熵通道,也就是这个字面意思。 ①所以这儿是384个tensor输出我怎么找最大熵呢?不太懂。 ②还有最大熵通道不应该是单通道吗?应该是像你一样灰度图嘛,https://arxiv.org/pdf/2203.10886v2.pdf Elic这篇文章fig4怎么五颜六色的?

Googolxx commented 1 year ago

1.是啊,都把tensor的的熵求出来了,在[48, 80]维度把熵加起来求得总和,选取384个通道里值最大的那个,就可以得到熵最大的通道。 2.最大熵通道是单通道,elic fig4里面是其他颜色是一个道理,只是你可视化调用api时,颜色参数不一样。他那个五颜六色不是RGB那个五颜六色,只是某个色彩的深度,比如说灰度图是灰色的色彩深度,elic里面是一种蓝色的色彩深度,它本质都是一个值,只是调用可视化api的时候你想要用哪种颜色表示的区别。并且elic的fig4是所有通道熵的大小,他的数据维度是[384],是个标量,不是特征可视化的结果,跟我论文里的图也不是同一件事。

Googolxx commented 1 year ago

和我论文中特征可视化图对应的,应该是elic里面的fig2

guoguo1314 commented 1 year ago

好的,谢谢哥!💖你!!!🌹🌹🌹!!!

guoguo1314 commented 1 year ago

我也才发现这个问题,为什么https://github.com/Googolxx/STF/blob/main/compressai/utils/eval_model/main.py 测试的时候要扩充呢?其他地方需不需要又这样的操作? “p = 64 # maximum 6 strides of 2 new_h = (h + p - 1) // p p new_w = (w + p - 1) // p p padding_left = (new_w - w) // 2 padding_right = new_w - w - padding_left padding_top = (new_h - h) // 2 padding_bottom = new_h - h - padding_top x_padded = F.pad( x, (padding_left, padding_right, padding_top, padding_bottom), mode="constant", value=0, )”

Googolxx commented 1 year ago

因为encoder下采样4次,超先验下采样2次,一共下采样6次,所以图像分辨率需是2^6倍数,否则上采样阶段转置卷积得到的数据维度会跟下采样阶段的原始数据维度mismatch。在decoder重建完之后,会将这些pad的pixel去掉。

guoguo1314 commented 1 year ago

o,原来如此,谢谢了哟!

guoguo1314 commented 2 months ago

哥,我突然逛到github,看到图像压缩的内容,发个感叹,我在打工了,打工好累!!