xialeiliu / RankIQA

The rep for the RankIQA paper in ICCV 2017
https://xialeiliu.github.io/RankIQA/
MIT License
453 stars 117 forks source link

在tid2013上fine-tune时数据的设置 #45

Open InspirationMy opened 4 years ago

InspirationMy commented 4 years ago

你好 ./data/generate_ft_txt_tid2013.py 程序中的 Num_tr = 19 Num_te = 5

这里我有些疑问,tid2013里面有25类图像 按照程序中的设置,他其实只是随机选取了其中的24类 请问,是在这里需要修改一下,还是我程序理解错了?

xialeiliu commented 4 years ago

其中一张图我记得是人造图,所以没用

InspirationMy commented 4 years ago

不好意思再打扰一下,我有些地方没弄明白,希望能请教一下 因为是菜鸟,有些问题可能比较白痴,望见谅

1.在由Places生成的排序数据集中 /data/rank_tid2013/tid2013_generator.m中,是产生17种类型的失真,每种类型有 4个等级。 /src/data_layer/rank_layer_tid2013.py中,相应的参数则是表示有18种类型的失真,每种类型有5个等级。针对这点我有下面两个问题 1)rank_layer_tid2013.py中相应的参数是否需要改动? 2)我也看了下仓库中的/data/tid2013_train.txt文件,发现确实是18种类型的失真以及5个等级,但在每种失真图像的信息前都有原图像的信息。而在 /src/data_layer/rank_layer_tid2013.py的_get_next_minibatch_inds(self)中 Num = len(self.scores)/dis/level 我猜想这里的Num应该是想表示训练集中有多少个不同种类的照片(原图与相应的失真图像算在一个种类),但是由于之前所说的txt文件中重复出现了18次原图信息,所以我觉得这里的Num值并没有实际意义。这点我很困惑,不知道为什么这样设置Num

2.由于之前没有接触过caffe和c++,所以网络中的两个python层我在看代码的时候感觉很困难,特别是像top[0].data[...] = np.sum(self.loss)/bottom[0].num这种,其中的data[...]我不知道是什么意思。现在问题就是不知道该怎么学,如果作者能提供一些相关的学习资料我将十分感激。目前正在看caffe的相关书籍,可是里面有大量的c++源码,我看起来很吃力。(也在看c++ primer)

3.关于Siamse网络 这些问题大部分是由于我没太看懂/src/data_layer/rank_layer_tid2013.py和/src/MyLossLayer/netloss_tid2013.py。 1)首先是Siamse的输出,我也看过之前的一些issue,知道输出应该就是类似于图像的MOS值。那么如果是这样的话,在排序数据集中原图的分数为0,失真等级越高,分数越高,这和tid2013给出的得分情况是刚好相反的。为什么在排序数据集中训练出的网络在还没有fine tune的时候能在tid2013上表现这么好?是因为我深度学习的知识比较欠缺吗?如果是,那么我现在该看哪一方面的参考资料? 2)论文中3.3提到的,在最后计算损失函数之前加了一层网络来产生pairs,这个网络就是前面的netloss_tid2013.py中定义的网络吗?

(方便的话,后续能否与您通过gmail或微信联络)

xialeiliu commented 4 years ago
  1. Num = len(self.scores)/dis/level 其中Num就是我想知道总共有多少张图片,因为我的txt是提前制备好的,这样的话我就可以取不同的失真等级。
  2. tid2013给出的得分情况是刚好相反的 对的,所以训练的时候最好也用相反的顺序就可以。
  3. pairs是通过netloss_tid2013.py产生的。 问题太多,我挑重点的回复,也不知到回复全了没。
  4. 我是四年前开始用的caffe,网上有很多资料,不过做研究的话目前pytorch用的比较多。
InspirationMy commented 4 years ago

收到,十分感谢你的回复!

1.关于训练的时候采用相反的顺序这一点我还不是很理解,能告诉我下具体是怎么实现的吗?是将论文中的l[ij]的值给颠倒一下吗,例如l[ij]=1表示y[i]<y[j]而不再是y[i]>y[j]。

2.我在CSIQ数据集上测试了一下,CSIQ给的值标准是DMOS,和排序数据集的标准类似,都是越小越好。 我发现如果用Rank_live的模型,最后计算出来的LCC和SROCC都十分接近1,而如果用Ran_tid2013的模型,最后计算出来的值非常接近-1。这是不是就是因为,这些不同的数据集的标准不一样。因为你在训练Rank_tid2013的时候已经采用了相反的顺序进行训练,所以得到的网络适用于那些以MOS值为标准的数据集。而在训练Rank_live的时候,用的是正常的顺序进行训练,所以得到的网络适用于那些以DMOS值为标准的数据集。

不好意思啊,占用了你的时间

xialeiliu commented 4 years ago
  1. 可以这么做。也可以直接把你生产的txt顺序换一下,这样的话就可以得到相反的结果。
  2. 对的。
InspirationMy commented 4 years ago

你好,我在训练fine-tune网络时又遇到了新的问题(是跟软件兼容相关的,你能帮我看下吗) a 尝试了2方法都没有解决 (1)我以为时protobuf的版本问题,可是在pip list之后发现安装的protobuf的版本是3.10.1也不是3.6.0。之后我还是把他卸载了又重装3.5.1版本的,可是报错信息还是图片中的,一点都没变 (2)因为之前用环境是anaconda下的,这次我又从官网重新下载了protobuf-all-3.5.1.tar.gz,并进行编译,之后修改PATH使其先用这个新安装的protoc,如图 1 还是没有解决问题,报错信息还是一样 我想知道 (1)这个错误的原因(是protobuf的版本导致的吗?) (2)解决方法