往期实验报告:
脑与认知实验:认知科学实验设计
脑与认知实验:认知过程中的面孔识别加工
实验要求
请选择一种基于图像的注意预测算法,使用该算法进行图像注意区域的预测,并使用注意预测的常用评价标准进行评价。在这里请给出方法简介、原图像、预测结果、评价结果。
显著性预测简介
图像中的注意区域预测指的其实是,当人看到一副图时,他的眼球会往哪个局部区域运动。也就是差不多说放出一张照片,人首先会注意到照片的哪个位置。比如下面这张图片,
我们首先会注意到的肯定是她那双大大的眼睛,也就是下图的红圈区域
而本次实验所要做的就是,设计或者利用已有的算法,输入一张图片返回画红圈的注意点图(就如下面的图所示)。然后对这个算法利用现有标准进行评价。
显著性预测算法简介
算法名称: MSI-Net (multi-scale information network)——多尺度信息网络
相关论文:Contextual encoder–decoder network for visual saliency prediction
中文翻译:用于视觉显着性预测的上下文编码器-解码器网络
**简介:**这是一种基于对大规模图像分类任务进行预训练的卷积神经网络的方法。该算法的架构形成了一个编码器-解码器结构,并包括一个具有不同扩张率的多个卷积层的模块,以并行捕获多尺度特征。此外,将结果表示与全局场景信息相结合,以准确预测视觉显着性。此算法模型在两个公共显着性基准上的多个评估指标上实现了具有竞争力和一致的结果,并且在五个数据集和选定示例上证明了建议方法的有效性。与最先进的方法相比,该网络基于轻量级图像分类主干,因此为计算资源有限的应用(例如(虚拟)机器人系统)提供了一个合适的选择,以估计复杂自然场景中的人类注视。此算法是基于Python的TensorFlow环境的其源代码地址为.下载地址
若无法进入可在此链接下载:
https://download.csdn.net/download/weixin_51735061/85815905
在github源码网站中,作者给出了下面的比较图,
同时作者也给出了对应的卷积神经网络的编码器-解码器架构的模块示意图,如下所示。
代码的使用
此算法程序的主要粗略流程图如下所示,
主要就下载数据集
训练
测试
三步。
1.1. 环境搭建
本算法程序所需要的环境为谷歌的tensorflow 1.13.1
,python
版本为3.6.8,这里我是使用Anaconda
来进行管理环境的。一开始时尝试使用过tensorflow 2.x
的二代版本作为实验环境,但是每次运行都会报错,提示缺少了某个函数之类的。最后面才发现这是tensorflow
版本的问题,同时也在github
上有看到有人问作者是否可以将算法迁移到tensorflow 2.x
。环境的下载与安装只要利用pip
工具安装即可。这个算法的运行同时提供GPU
与CPU
的形式运行(其默认为GPU运行),一开始由于不是很了解,所以安装的是tensorflow
的CPU版本,后面在修复tensorflow版本号的问题后,也一直报错,最后才发现需要到config.py
文件里修改配置。只要将下图的device改成cpu即可。完成这步后环境才真正地配好了。
1.2. 训练
在github
中作者有明确说明如何进行训练测试的操作,要进行训练首先需要进入源码文件夹,然后打开终端并输入以下的指令,
python main.py train
运行此段代码后它首先是会先检测数据集是否存在的,若不存在会自动下载。这里的数据集默认是使用SALICON
数据集,能够自动抓取的数据集有``salicon,
mit1003,
cat2000,
dutomron,
pascals,
osie,
fiwi`。其下载时的运行图如下所示,
默认数据集首先会从谷歌云盘中下载到data/
文件夹,然而在国内却是难以访问谷歌的,所以在下载的过程中一直报连接错误的错。最后我事先把数据集下载回了本地,然后利用nginx
搭建本地服务器来将谷歌的地址换成本地地址进行下载。(事后发现其实不用搭建本地服务器也可以,只要清楚文件的目录结构然后拷贝即可)。下载完成后就会自动进行训练。如下图所示:
在训练的过程中,由于我使用了CPU
进行计算,且电脑的配置不高,因此运行了两个小时,其进度只有20%
,所以最后为了节省时间,利用了作者提供的已经训练完成的参数文件进行测试。
1.3.测试
算法的测试可以用下面的指令进行,
python main.py test -d DATA -p PATH
其中DATA对应的是用于训练时的数据集,若没有事先训练的话,它会直接从网上下载已经训练好的权重进行评估。而PATH对应的是所要测试的图片地址,可以是多张图片也可以是单张图片。最后训练得到的结果会放在 results/images/
中
1.4.算法运行过程遇到的困难
(1) 一开始以tensorflow环境运行算法时提示有些模块缺少了,结果最后发现我所使用的tensorflow版本是2.x的而作者所进行模型构件的版本是1.x的,在tensorflow升级的过程中去除了一些模块。最后对tensorflow进行降级则可以运行程序。
(2) 由于算法是自动提供数据集下载的接口的,然而接口却在中国大陆无法访问,所以在数据集的收集方面存在了一定的问题。最后通过了一些途径离线将数据集都下载回了电脑里,并为了配合代码的运行,在本地搭建了服务以替代外网接口。
(3) 在算法运行过程中曾经遇到了下面所示的报错
Default MaxPoolingOp only supports NHWC on device type CPU
查询网络资料得知,这可能与tensorflow的版本有关。我先下载了tensorflow-gpu版本进行了测试,但是在测试过程中可能是cuda版本不匹配的原因产生了缺少模块的提示。然后后面在作者的github中找到了类似的错误,发现可以将config.py
文件中的“gpu"改成”cpu"则可以运行程序。然而这样做之后CPU运行的速度显得有点慢。最后直接利用已训练完的数据进行预测。
显著性预测效果
为了展示预测的效果,我选择了三张同样尺寸的照片进行预测,下图即为原图与预测图的对比。可以辨别出此算法,预测的效果还是可以的。为了用更科学的方法评估此算法,下面我将利用MIT/Tuebingen Saliency Benchmark
评价标准来对算法进行评价。
算法评价
为了对上面的算法进行科学性地评价,我选用了MIT/Tuebingen Saliency Benchmark
评价标准进行评价。此标准是参考于https://saliency.tuebingen.ai/evaluation.html的,这个标准具有一定的权威性。在官网中有给出评价代码的github源,以及有写到此代码集成在了pysalency
的python
第三方库中。下面我将就算法评价的操作进行详细地说明。
代码下载或安装
对于MIT/Tuebingen Saliency Benchmark
,官方有提供两种途径进行评价。
-
直接利用源代码
首先可以直接在github源上下载https://github.com/matthias-k/saliency-benchmarking,然后进行评估。我一开始是有尝试利用这种方法进行评价的,但是这种方法教程却是非常少,其github网站上也没有任何的教程指导。而且此代码全是靠命令行来进行的。所以调整了很久后都不知道怎么进行评价,最后换到了教程稍微多点的
pysaliency
库。若无法下载可到此下载:
https://download.csdn.net/download/weixin_51735061/85815926 -
pysaliency
库此第三方库可以直接利用
pip
工具进行安装,下面将就此种方式继续进行说明。
评价程序的使用
这里利用了pysaliency
进行评价。在对代码进行研究后,我发现代码的运行思路主要为下载 下载数据->利用matlab提取fixations图->创建自定义模型并导入预测图->调用评价函数进行评价。在官方中,有给出下面的代码,我在此代码基础上修改成了符合我的运行方式。
import pysaliency
#此变量为设置存储数据集的地址
dataset_location = 'datasets'
#程序会自动把数据集从网络上拉回 为了能顺利拉回我在库文件中修改了服务器地址
stimuli_salicon_val, fixations_salicon_val = pysaliency.get_SALICON_val(location=dataset_location)
#自定义模型,官网上说 这里可以放模型文件也可以放预测的结果图 这里我选择放结果图
my_model = pysaliency.SaliencyMapModelFromDirectory(stimuli_salicon_val, 'D:\学习资料\大二下\资料\脑与认知\实验\实验三\数据集\SALIENCY\maps\\val')
#在经过不断报错后发现上限400张 这里设置350张 利用数据集统一为salicon的val数据集
print('AUC:',my_model.AUC(stimuli_salicon_train[:350], fixations_salicon_train[:350], nonfixations='uniform'))
print('NSS:',my_model.NSS(stimuli_salicon_train[:350], fixations_salicon_train[:350]))
虽然上面的代码量很少,但是却是都在修复了很多bug后才写出的,此评价模型的教程还是相对来说较少的,在谷歌上也就仅仅只有作者的几篇笔记。参考的网址如下:
[1] https://notebook.community/matthias-k/pysaliency/notebooks/LSUN
[2] https://notebook.community/matthias-k/pysaliency-examples/notebooks/Demo_Saliency_Maps
[3] https://github.com/matthias-k/pysaliency
[4] https://saliency.tuebingen.ai/evaluation.html
[5] https://github.com/matthias-k/saliency-benchmarking
评价结果
最后的评价指标我选择了AUC于NSS两个指标,可以看到AUC的值为0.81,而在官网上的参考值为0.87比较接近。同时在0.8以上也说明此模型的准确度是相对较高的,在官网的收录中属于中上水平。而NSS值却与官网给的参考值存在一定的偏差,官网的值为2.3而在这里却是1.3,这可能与测试的数据集有一定的联系。
经验总结
-
评价程序原理
通过对评价程序的利用后发现,此评价算法主要是利用原图、眼追踪图、预测图三中数据来进行对比评价的,最后经过计算得到AUC、NSS、SIM等的值。
-
程序运行可能存在的问题
-
安装的包里缺少了一些文件
可以通过将源码中的文件拉回库文件中来解决。
-
Python无法发现matlab程序
将matlab.exe的目录地址放入全局变量中。
-
无法发现缓存文件Temp
检查是否开了加速器,若开了加速器需要关闭否则下载的文件的temp地址会存在问题。
-
下载文件时连接超时
事先将数据集下载至本地,然后可以通过搭建本地服务器的方式修改下载接口来解决。
-
数据集在评估时提示索引超限
将数据集的数量限制在400以下
-
其他的评估机制
除了利用MIT/Tuebingen Saliency Benchmark
来进行评价外,我还利用了一些在github上关于saliency的评价模型,其介绍如下:
-
Saliency-Evaluation-Toolbox
这个github的评价代码,提供了
Enhanced-alignment measure
,Structure-measure
,Weighted F-measure
等等几个指标。这个代码只需要放入真实的显著图以及预测图即可进行预测。这里我选择了CAT2000
数据集中的test集的一个子集进行了评价。然而评价的这几个指标不知道是什么意思,而且最后的评价结果不是很好所以并未将此代码作为主要的评价模型。github地址: https://github.com/Mehrdad-Noori/Saliency-Evaluation-Toolbox
相关论文名称:Content-Aware Guidance for Salient Object Detection
-
saliency_metrics
这个源其实用的方法与
MIT/Tuebingen Saliency Benchmark
的是一致的但是进行了简化,它是使用python2来进行编程的,由于运行环境无Python2故没有进行测试。github: https://github.com/tarunsharma1/saliency_metrics
-
传统显著性模型评价模型
这是用matlab编程的传统显著性评价模型,此评价模型同样来源于 http://saliency.mit.edu
github: https://github.com/cvzoya/saliency/tree/master/code_forMetrics