TF_RankIQA开发说明书

TF_RankIQA. Adversarial Net与IQA.

RankIQA, 先在一个大型rank数据集上训练Rank部分, 即利用数据集训练出一个model; 然后再在一个小的数据集上训练IQA部分, 利用之前训练好的网络进行微调即可.

1. 首先准备数据集.

RankIQA可以使用三种数据集: LIVE2, TID2013. 首先生成_train.txt和_test.txt, 先生成每一种失真类型的图像, 然后为每一种失真的类型标记一种rank值. rank部分; 然后生成ft__train.txt, ft__test.txt, 测试图像已知, 然后为每个测试图像认为确定一个质量分数, IQA部分.

生成失真图像和Rank值, 以及相应的txt文件生成代码可见https://github.com/xialeiliu/RankIQA.

2. 首先训练Rank部分, 代码见tools/train_rank.py. 再训练IQA部分, 代码见tools/train_iqa.py.

预测或评估代码可见: tools/evaluate.py或demo/predict.py.

3. RankIQA算法对数据集的要求也有点高.

  1. 我们需要5种失真类型的图像. 但是这个代码也可以自动完成. 并且失真类型我们可以自己选择, 如模糊, 噪声, block等类型. 2) RankIQA算法在IQA部分, 输出的是图像质量分数, 在IQA部分, 其实做的是回归的事情. 当然, 我们也可以做成分类的事情!!!
    并且, Rank部分和IQA部分的图像可以不一样!!!

4. 准备用现有评估数据集 + RankIQA做一做图像质量评估问题.

本实验的思想是patch-wise, 并非image-wise.

  1. 生成Rank部分的图像, 即生成各种失真类型的图像.

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.

  1. 生成IQA部分的图像, IQA部分, 我们做的将是分类问题. 即对某一种失真类型的patch, 让网络判断其失真类型. 因此, IQA部分的图像也是失真图像, 只是一个patch, 我们只需要某一种失真类型即可, 然后指定其label: 0,1,2,3,4,5,6,7.

trainval的IQA部分, 一张图像生成n个patch, 每个patch随机做1种失真变换, 每种变换随机指定1种程度. 因此, 一张原始图像可以得到: n个patch. IQA生成图像时, 将所有的失真类型放在一个文件夹下即可, 不用再分level!!! 但是文件名要区分是第几个patch和第几种level的失真. 图像名中, 可以看出是第几个patch和第几种失真类型.

  1. 生成训练rank部分和iqa部分所需的txt文件. 借鉴RankIQA的python代码即可. 详细代码见: ./scripts/generate_rank_txt.py和./scripts/generate_iqa_txt.py.
    python ./scripts/generate_rank_txt.py
    python ./scripts/generate_iqa_txt.py

在生成iqa.txt时, 我们要对原有的代码就行修改, 原有RankIQA在预测图像质量分数时, 是回归问题; 我们现在将其变为分类问题, 因此, 其标签要自行设置!

5. TrainVal

  1. 首先训练Rank部分. python ./tools/train_rank.py
  2. 训练IQA部分. python ./tools/train_iqa.py. 由于在训练IQA部分时, 我们将回归问题转换成了分类问题. 原有问题是回归问题, 因此最后一层全连接层节点数为1; 但是转换成分类问题后, 最后一层全连接层节点数就是类别个数, 如8!
    因此, 在训练IQA问题时, 我们在加载训练好的Rank部分的参数时, 最后一层(fc8, 全连接层)要跳过!!!

6. 测试阶段

  1. 首先生成测试图像数据集. 基本思想仍是patch-wise, 即将一张原始图像先切分成许多patches, 然后给每个patch添加一种指定类型的失真, 然后检测每一个patch的结果. 最后整张图像的分类结果, 通过投票手段解决.
  2. 原有代码./tools/evaluate.py, 是评价算法优劣, 想得到一个数值结果.
  3. 原代码./demo/predict.py, 是预测一张图像的结果. 先将predict.py修改, 变成预测RankIQA算法分类准确率的代码.

7. 直接利用RankIQA算法 + patch-wise的方法, 评估效果不是很好.

然后根据标注人员人工评估图像质量过程, 在人工评估一张图像的时候主要借助依据是: 图像中的主要目标物, 如车, 人, 建筑物等等. 因此, 我们先利用Mask_RCNN将图像中的目标先检测, 并进行保存.

结合目标检测 + RankIQA, 我们将使用image-wise的方式评估图像质量分数. 不再使用patch-wise方式.

这些目标图像就作为训练RankIQA算法的原始图像.

  1. 利用Mask RCNN做目标检测, 并将目标进行保存, 作为训练RankIQA算法的原始图像. 在做目标检测时, 根据COCO数据集80类目标, 我们将检测并保存所有的目标.

  2. 然后生成Rank/IQA部分的图像时, 我们将采用iamge-wise方式, 并且失真类型减少! 并且, 不是所有的目标都适合做IQA算法, 保证图像分辨率比较大才可以! 失真类型去掉对比度异常和饱和度异常!!!
    在使用目标时, 我们要选择分辨率比较大的目标, 这样可信度才会高一些! 这样, 可能还是会采用patch-wise的方式来做! 毕竟有些目标还是很大的!!!

目前先使用image-wise的方式测试一下效果. 并且, 失真参数要做相应的调整, 比level1-level4要有比较清晰的差距才可以. 另外, level1和pris图像必须有差距才可以!!!

应该在生成的时候resize一下, 这样就会减少很多的内存!!! Rank部分, 先每种类型每种level的图像设置为5000, 44机器硬盘太小!!!
将图像先resize, 然后再生成失真图像. 不仅可以减少内存, 并且生成速度也大幅提升, 因为图像越大, IO越慢!!!

  1. 很重要!!! 在训练Rank部分时, 我们需要修改的地方很多!!! 包括train_rank.py, rank_loss.py, rank_dataloader.py! 这三个py文件都需要修改!!!
    另外, 训练Rank部分的model和训练IQA部分的model, 不一样!!! 因为, 训练Rank部分的model, 最后一个FC层, 结点个数为1; 而训练IQA时, 我们将回归问题变为分类问题, 结点为失真类别个数, 如6!!!

你可能感兴趣的:(深度学习,机器学习)