RankIQA, 先在一个大型rank数据集上训练Rank部分, 即利用数据集训练出一个model; 然后再在一个小的数据集上训练IQA部分, 利用之前训练好的网络进行微调即可.
RankIQA可以使用三种数据集: LIVE2, TID2013. 首先生成_train.txt和_test.txt, 先生成每一种失真类型的图像, 然后为每一种失真的类型标记一种rank值. rank部分; 然后生成ft__train.txt, ft__test.txt, 测试图像已知, 然后为每个测试图像认为确定一个质量分数, IQA部分.
生成失真图像和Rank值, 以及相应的txt文件生成代码可见https://github.com/xialeiliu/RankIQA.
预测或评估代码可见: tools/evaluate.py或demo/predict.py.
本实验的思想是patch-wise, 并非image-wise.
RankIQA算法根据https://ece.uwaterloo.ca/~zduanmu/cvpr16_gmad/生产4中失真类型的图像: JPEG, JP2K, Gblur and GN, 因此在Rank部分, 一共有5种类型的数据: pristine(原始图像), JPEG, JP2K, Gblur and GN. 然后对于每种失真类型, 再建立4种程度的图像: 1, 2, 3, 4, 表示失真的程度.
RankIQA源码中, https://github.com/xialeiliu/RankIQA/tree/master/data的rank_tid2013下的代码, 生产失真类型的图像. 代码已经很全面了. MATLAB代码已经包含了17种失真类型, 将失真类型简单介绍:
1: GN, 添加高斯噪声.
2: GNC, 改变图像色调.
5: HFN, 傅里叶变换进行去噪.
6: IN: 添加椒盐噪声.
7: QN, 返回噪声.
8: GB, 高斯去噪, 高斯模糊.
9: ID, BM3D去噪.
10: JPEG, 块效应.
11:, JP2K, 将图像转换为jp2图像, 并指定压缩比.
14: NEPN, 图像裁剪.
15: BW, 对某一块修改其颜色.
16: MSH, 平移.
17: CCL, 改变对比度.
18: CS, 改变饱和度.
19: MGN, 加噪声.
22: CQD, 减少RGB图像的颜色数.
23: CA, 高斯去噪, 高斯模糊.
Python代码改写实现. 生成失真图像代码可见./scripts/generate_distortions_rank_images.py, 并借鉴MATLAB代码的相应参数作为参考生成失真图像数据. 在实际中, 一种产生8种失真类型的图像, 具体见代码.
python ./scripts/generate_distortions_rank_images.py
1> 一个问题需要解决: 在python中, 直接赋值即=, 是深拷贝, 即对拷贝的对象进行改变, 那么原始对象也会发生改变. 在对对象进行处理前, 最好先做一下浅拷贝!!!
trainval的rank部分, 一张图像生成n个patch, 每个patch做7种失真变换, 每种变换4种程度. 因此, 一张原始图像可以得到: n * (4 * 7 + 1)个patch.
trainval的IQA部分, 一张图像生成n个patch, 每个patch随机做1种失真变换, 每种变换随机指定1种程度. 因此, 一张原始图像可以得到: n个patch. IQA生成图像时, 将所有的失真类型放在一个文件夹下即可, 不用再分level!!! 但是文件名要区分是第几个patch和第几种level的失真. 图像名中, 可以看出是第几个patch和第几种失真类型.
在生成iqa.txt时, 我们要对原有的代码就行修改, 原有RankIQA在预测图像质量分数时, 是回归问题; 我们现在将其变为分类问题, 因此, 其标签要自行设置!
然后根据标注人员人工评估图像质量过程, 在人工评估一张图像的时候主要借助依据是: 图像中的主要目标物, 如车, 人, 建筑物等等. 因此, 我们先利用Mask_RCNN将图像中的目标先检测, 并进行保存.
结合目标检测 + RankIQA, 我们将使用image-wise的方式评估图像质量分数. 不再使用patch-wise方式.
这些目标图像就作为训练RankIQA算法的原始图像.
利用Mask RCNN做目标检测, 并将目标进行保存, 作为训练RankIQA算法的原始图像. 在做目标检测时, 根据COCO数据集80类目标, 我们将检测并保存所有的目标.
然后生成Rank/IQA部分的图像时, 我们将采用iamge-wise方式, 并且失真类型减少! 并且, 不是所有的目标都适合做IQA算法, 保证图像分辨率比较大才可以! 失真类型去掉对比度异常和饱和度异常!!!
在使用目标时, 我们要选择分辨率比较大的目标, 这样可信度才会高一些! 这样, 可能还是会采用patch-wise的方式来做! 毕竟有些目标还是很大的!!!
目前先使用image-wise的方式测试一下效果. 并且, 失真参数要做相应的调整, 比level1-level4要有比较清晰的差距才可以. 另外, level1和pris图像必须有差距才可以!!!
应该在生成的时候resize一下, 这样就会减少很多的内存!!! Rank部分, 先每种类型每种level的图像设置为5000, 44机器硬盘太小!!!
将图像先resize, 然后再生成失真图像. 不仅可以减少内存, 并且生成速度也大幅提升, 因为图像越大, IO越慢!!!