1. 对比损失函数(Contrastive Loss function)
孪生架构的目的不是对输入图像进行分类,而是区分它们。因此,分类损失函数(如交叉熵)不是最合适的选择,这种架构更适合使用对比函数。对比损失函数如下:
(以判断图片相似度为例)其中Dw被定义为姐妹孪生网络的输出之间的欧氏距离。Y值为1或0。如果模型预测输入是相似的,那么Y的值为0,否则Y为1。m是大于0的边际价值(margin value)。有一个边际价值表示超出该边际价值的不同对不会造成损失。
Siamese网络架构需要一个输入对,以及标签(类似/不相似)。
2. 孪生网络的训练过程
(1) 通过网络传递图像对的第一张图像。
(2) 通过网络传递图像对的第二张图像。
(3) 使用(1)和(2)中的输出来计算损失。
其中,l12为标签,用于表示x1的排名是否高于x2。
训练过程中两个分支网络的输出为高级特征,可以视为quality score。在训练时,输入是两张图像,分别得到对应的分数,将分数的差异嵌入loss层,再进行反向传播。
(4) 返回传播损失计算梯度。
(5) 使用优化器更新权重。
3. 基于Siamese网络的无参考图像质量评估:RankIQA
3.1 参考文献
https://arxiv.org/abs/1707.08347
3.2 RankIQA的流程
(1) 合成失真图像。
(2) 训练Siamese网络,使网络输出对图像质量的排序。
(3) 提取Siamese网络的一支,使用IQA数据集进行fine-tune。将网络的输出校正为IQA度量值。fine-tune阶段的损失函数如下:
训练阶段使用Hinge loss,fine-tune阶段使用MSE。
训练时,每次从图像中随机提取224*224或者227*227大小的图像块。和AlexNet、VGG16有关。在训练Siamese network时,初始的learning rate 是1e-4;fine-tuning是初始的learning rate是1e-6,每隔10k步,rate变成原来的0.1倍。训练50k次。测试时,随机在图像中提取30个图像块,得到30个分数之后,进行均值操作。
本文如何提高Siamese网络的效率:
假设有三张图片,则每张图片将被输入网络两次,原因是含有某张图片的排列数为2。为了减少计算量,每张图片只输入网络一次,在网络之后、损失函数之前新建一层,用于生成每个mini-batch中图片的可能排列组合。
使用上述方法,每张图片只前向传播一次,只在loss计算时考虑所有的图片组合方式。
本文使用的网络架构:Shallow, AlexNet, and VGG-16。
4. Siamese网络的开源实现
4.1 代码地址
https://github.com/xialeiliu/RankIQA
4.2 RankIQA的运行过程
4.2.1 数据集
使用两方面的数据集,一般性的非IQA数据集用于生成排序好的图片,进而训练Siamese网络;IQA数据集用于微调和评估。
本文使用的IQA数据集:
(1) LIVE数据集:http://live.ece.utexas.edu/research/quality/ 对29张原始图片进行五类失真处理,得到808张图片。Ground Truth MOS在[0, 100]之间(人工评分)。
(2) TID2013:25张原始图片,3000张失真图片。MOS范围是[0, 9]。
本文使用的用于生成ranked pairs的数据集:
(1) 为了测试LIVE数据集,人工生成了四类失真,GB(Gaussian Blur)、GN(Gaussian Noise)、JPEG、JPEG2K
(2) 为了在TID2013上测试,生成了17种失真(去掉了#3, #4,#12, #13, #20, #21, #24)
Waterloo数据集:
包含4744张高质量自然图片。
Places2数据集:
作为验证集(包含356种场景,http://places2.csail.mit.edu/ ),每类100张,共35600张。
两种数据集的区别:
python generate_rank_txt_tid2013.py生成的是tid2013_train.txt,标签只起到表示相对顺序的作用,即,标签为{1, 2, 3, 4, 5};python generate_ft_txt_tid2013.py生成的是ft_tid2013_test.txt,其中的标签是浮点数,表示图片的质量评分。
4.2.2 训练和测试过程
从原始图像中随机采样子图(sub-images),避免因差值和过滤而产生的失真。输入的子图至少占原图的1/3,以保留场景信息。本文采用227*227或者224*224的采样图像(根据使用的主干网络而不同)。
训练过程使用mini-batch SGD,初始学习率1e-4,fine-tune学习率1e-6。
共迭代50K次,每10K次减小学习率(乘以0.1),两个训练过程都是用l2权重衰减(正则化系数lambda=5e-4)。
实验一:本文首先使用Places2数据集(使用五种失真进行处理)训练网络(不进行微调),然后在Waterloo数据及上进行预测IQA(使用同样的五种失真进行处理)。实验结果如图2所示。
实验二:hard negative mining
难分样本挖掘,是当得到错误的检测patch时,会明确的从这个patch中创建一个负样本,并把这个负样本添加到训练集中去。重新训练分类器后,分类器会表现的更好,并且不会像之前那样产生多的错误的正样本。
本实验使用Alexnet进行。
实验三:网络性能分析
LIVE数据集,80%训练集,评价指标LCC和SROCC。VGG-16的效果最好。
4.2.3 RankIQA对数据集的处理过程
将原始图像文件放在data/rank_tid2013/pristine_images路径下,然后运行data/rank_tid2013/路径下的tid2013_main.m,进而生成排序数据集(17种失真形式)。
4.3 运行指令
4.3.1 Train RankIQA
To train the RankIQA models on tid2013 dataset:
./src/RankIQA/tid2013/train_vgg.sh
To train the RankIQA models on LIVE dataset:
./src/RankIQA/live/train_vgg.sh
FT
To train the RankIQA+FT models on tid2013 dataset:
./src/FT/tid2013/train_vgg.sh
To train the RankIQA+FT models on LIVE dataset:
./src/FT/live/train_live.sh
4.3.2 Evaluation for RankIQA
python src/eval/Rank_eval_each_tid2013.py # evaluation for each distortions in tid2013
python src/eval/Rank_eval_all_tid2013.py # evaluation for all distortions in tid2013
Evaluation for RankIQA+FT on tid2013:
python src/eval/FT_eval_each_tid2013.py # evaluation for each distortions in tid2013
python src/eval/FT_eval_all_tid2013.py # evaluation for all distortions in tid2013
Evaluation for RankIQA on LIVE:
python src/eval/Rank_eval_all_live.py # evaluation for all distortions in LIVE
Evaluation for RankIQA+FT on LIVE:
python src/eval/FT_eval_all_live.py # evaluation for all distortions in LIVE
5. 代码调试过程
5.1 Python无法导入某个模块ImportError:could not find module XXX
解决方案:
配置环境变量:export PYTHONPATH=path/to/modules
Siamese网络的更多相关文章
-
Pytorch 入门之Siamese网络
首次体验Pytorch,本文参考于:github and PyTorch 中文网人脸相似度对比 本文主要熟悉Pytorch大致流程,修改了读取数据部分.没有采用原作者的ImageFolder方法: ...
-
siamese网络&;&;tripletnet
siamese网络 - 之前记录过: https://www.cnblogs.com/ranjiewen/articles/7736089.html - 原始的siamese network: 输入一 ...
-
tensorflow实现siamese网络 (附代码)
转载自:https://blog.csdn.net/qq1483661204/article/details/79039702 Learning a Similarity Metric Discrim ...
-
paper 164: Siamese网络--相似度量方法
简介: Siamese网络是一种相似性度量方法,当类别数多,但每个类别的样本数量少的情况下可用于类别的识别.分类等.传统的用于区分的分类方法是需要确切的知道每个样本属于哪个类,需要针对每个样本有 ...
-
孪生网络入门(上) Siamese Net及其损失函数
最近在多个关键词(小数据集,无监督半监督,图像分割,SOTA模型)的范畴内,都看到了这样的一个概念,孪生网络,所以今天有空大概翻看了一下相关的经典论文和博文,之后做了一个简单的案例来强化理解.如果需要 ...
-
Siamese Network理解
提起siamese network一般都会引用这两篇文章: <Learning a similarity metric discriminatively, with application to ...
-
[DeeplearningAI笔记]卷积神经网络4.1-4.5 人脸识别/one-shot learning/Siamase网络/Triplet损失/将面部识别转化为二分类问题
4.4特殊应用:人脸识别和神经网络风格转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 4.1什么是人脸识别 Face verification人脸验证 VS face recogniti ...
-
卷积网络中的通道(Channel)和特征图
转载自:https://www.jianshu.com/p/bf8749e15566 今天介绍卷积网络中一个很重要的概念,通道(Channel),也有叫特征图(feature map)的. 首先,之前 ...
-
[转] Siamese network 孪生神经网络--一个简单神奇的结构
转自: 作者:fighting41love 链接:https://www.jianshu.com/p/92d7f6eaacf5 1.名字的由来 Siamese和Chinese有点像.Siam是古时候泰 ...
随机推荐
-
【转】C#调用Windows图片和传真查看器打开图片
//建立新的系统进程 System.Diagnostics.Process process = new System.Diagnostics.Process(); //设置文件名,此处为图片的真实路径 ...
-
jq获取屏幕高度和宽度(盒子模型)
$(window).width(); //浏览器可视窗口宽度 $(window).height(); //浏览器可视窗口高度 $(document).width();//body的宽度 $(docum ...
-
【POJ 1035】Spell checker
题 题意 每个单词,如果字典里存在,输出”该单词 is correct“:如果字典里不存在,但是可以通过删除.添加.替换一个字母得到字典里存在的单词,那就输出“该单词:修正的单词”,并按字典里的顺序输 ...
-
shell脚本的调试技巧
请参考文章:http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/index.html 读后的感觉,还是用shell的选项灵活,方便. ...
-
hdu4611 Balls Rearrangement
Balls Rearrangement Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) ...
-
bootstrap基本标签总结2
[布局]bootstrap基本标签总结2 缩略图 <div class="container"> <div class="row"> ...
-
丢手帕问题as3版
N个孩子围成一圈报数,报到M的退出,剩下的再从1继续报数,报到M的再退出,一直持续到只剩一个人,问剩下的是哪个? package { import flash.display.Sprite; publ ...
-
一个高性能异步socket封装库的实现思路 (c#)
前言 socket是软件之间通讯最常用的一种方式.c#实现socket通讯有很多中方法,其中效率最高就是异步通讯. 异步通讯实际是利用windows完成端口(IOCP)来处理的,关于完成端口实现原理, ...
-
Microsoft Windows .Reg File Dialog Box Message Spoofing 0day
Microsoft Windows .Reg文件对话框消息欺骗 0day 概述 扩展名为.reg的文件是Windows注册表中使用的注册文件.这些文件可以包含hives.密钥和值..reg文件可以在文 ...
-
VirtualBox 克隆后 IP 地址相同(DHCP 分配),如何变更MAC以获取不同的IP?
由于需要做实验需要两个相同环境的虚拟机,在linux下使用virtualbox最小化安装centos6.0,并克隆了一个相同的,联网模式为桥接,修改配置文件之后重启网络发现二者的网络信息相同,所获取的 ...