使用神经图像评估量化图像质量
这个例子展示了如何使用神经图像评估(NIMA)卷积神经网络(CNN)分析图像的美学质量。
图像质量度量提供了图像质量的客观度量。有效的度量标准提供了与人类观察者对质量的主观感知密切相关的定量分数。质量度量可以比较图像处理算法。
尼玛[1]是一种无参考技术,可以在不依赖原始参考图像的情况下预测图像的质量,而原始参考图像通常是不可用的。NIMA使用CNN来预测每个图像的质量分数分布。
使用训练过的NIMA模型评估图像质量
集dataDir
作为数据集的期望位置。
dataDir = fullfile(tempdir,“LIVEInTheWild”);如果~存在(dataDir“dir”mkdir (dataDir);结束
使用helper函数下载一个预先训练好的NIMA神经网络downloadTrainedNetwork
.helper函数作为支持文件附加到示例中。万博1manbetx该模型预测了范围[1,10]中每个图像的质量分数分布,其中1和10分别是分数的最低和最高可能值。分数越高,图像质量越好。
trainedNet_url =“https://ssd.mathworks.com/万博1manbetxsupportfiles/image/data/trainedNIMA.zip”;downloadTrainedNetwork (trainedNet_url dataDir);负载(fullfile (dataDir“trainedNIMA.mat”));
您可以通过比较高质量和低质量图像的预测分数来评估NIMA模型的有效性。
将高质量的图像读入工作区。
imOriginal = imread(“kobi.png”);
通过应用高斯模糊降低图像的美学质量。在蒙太奇中显示原始图像和模糊图像。主观上,模糊图像的审美质量比原始图像的质量差。
imBlur = imgaussfilt(imOriginal,5);蒙太奇({imOriginal, imBlur})
预测两幅图像的NIMA质量分数分布predictNIMAScore
helper函数。该函数作为支持文件附加到示例中。万博1manbetx
的predictNIMAScore
函数返回图像的NIMA评分分布的平均值和标准差。预测的平均分是对图像质量的衡量。分数的标准偏差可以被认为是预测平均分数的置信水平的度量。
[meanOriginal,stdOriginal] = predictNIMAScore(dlnet,imOriginal);[meanBlur,stdBlur] = predictNIMAScore(dlnet,imBlur);
显示图像以及由NIMA模型预测的得分分布的平均值和标准差。NIMA模型正确地预测了与主观视觉评估一致的这些图像的分数。
图t = tiledlayout(1,2);displayImageAndScoresForNIMA (t, imOriginal meanOriginal stdOriginal,的“原始图像”) displayImageAndScoresForNIMA (t imBlur meanBlur stdBlur,“模糊图像”)
这个例子的其余部分展示了如何训练和评估一个NIMA模型。
下载野外实况数据集
本例使用LIVE In the Wild数据集[2],这是一个公共领域的主观图像质量挑战数据库。该数据集包含由移动设备捕获的1162张照片,还有7张额外的图像用于训练人类记分员。每张图片平均由175人评分,满分为[1100]。数据集提供了每个图像的主观得分的平均值和标准差。
按照中列出的说明下载数据集LIVE In Wild图像质量挑战数据库.方法指定的目录中提取数据dataDir
变量。提取成功后,dataDir
包含两个目录:数据
而且图片
.
加载LIVE In Wild数据
获取图像的文件路径。
imageData = load(fullfile(dataDir,“数据”,“AllImages_release.mat”));imageData = imageData. allimages_release;nImg =长度(imageData);imageList(1:7) = fullfile(dataDir,“图片”,“trainingImages”imageData (1:7));imageList(8:nImg) = fullfile(dataDir,“图片”imageData(8:结束));
创建用于管理映像数据的映像数据存储。
imds = imageDatastore(imageList);
加载图像对应的均值和标准差数据。
meanData = load(fullfile(dataDir,“数据”,“AllMOS_release.mat”));meanData = meanData. allmos_release;stdData = load(fullfile(dataDir,“数据”,“AllStdDev_release.mat”));stdData = stdData. allstddev_release;
可选地,显示数据集中具有相应均值和标准差值的一些示例图像。
图t = tiledlayout(1,3);Idx1 = 785;idx1 displayImageAndScoresForNIMA (t, readimage (imd),...meanData (idx1) stdData (idx1),“图像”+imageData(idx1)) idx2 = 203;idx2 displayImageAndScoresForNIMA (t, readimage (imd),...meanData (idx2) stdData (idx2),“图像”+imageData(idx2)) idx3 = 777;idx3 displayImageAndScoresForNIMA (t, readimage (imd),...meanData (idx3) stdData (idx3),“图像”+ imageData (idx3))
预处理和增加数据
对图像进行预处理,将其大小调整为256 * 256像素。
rescaleSize = [256];imds = transform(imds,@(x)imresize(x,rescaleSize));
NIMA模型需要人类得分的分布,但LIVE数据集只提供分布的平均值和标准偏差。方法近似LIVE数据集中每个图像的底层分布createNIMAScoreDistribution
helper函数。该函数作为支持文件附加到示例中。万博1manbetx
的createNIMAScoreDistribution
将分数重新缩放到范围[1,10],然后从平均值和标准差值生成分数的最大熵分布。
newMaxScore = 10;prob = createNIMAScoreDistribution(meanData,stdData);cumProb = cumsum(prob,2);
创建一个arrayDatastore
管理分数分布。
probDS = arrayDatastore(cumProb',IterationDimension=2);
组合包含图像数据和分数分布数据的数据存储。
dsCombined = combine(imds,probDS);
预览从组合数据存储中读取的输出。
sampleRead =预览(dsCombined)
sampleRead =1×2单元格数组{256×256×3 uint8} {10×1 double}
图tiledlayout(1,2) nexttile imshow(sampleRead{1}) title(“来自数据集的样本图像”nexttile plot(sampleRead{2})“累积分数分布”)
分割数据用于训练、验证和测试
将数据划分为训练集、验证集和测试集。将70%的数据用于训练,15%用于验证,剩余的数据用于测试。
numTrain =地板(0.70 * nImg);numVal =地板(0.15 * nImg);Idx = randperm(nImg);idxTrain = Idx(1:numTrain);idxVal = Idx(numTrain+1:numTrain+numVal);idxTest = Idx(numTrain+numVal+1:nImg);dsTrain =子集(dsCombined,idxTrain);dsVal =子集(dsCombined,idxVal);dsTest =子集(dsCombined,idxTest);
增强训练数据
增强训练数据使用augmentDataForNIMA
helper函数。该函数作为支持文件附加到示例中。万博1manbetx的augmentDataForNIMA
函数对每个训练图像执行以下增强操作:
将图像裁剪为224 * 244像素以减少过拟合。
以50%的概率水平翻转图像。
inputSize = [224 224];dsTrain = transform(dsTrain,@(x)augmentDataForNIMA(x,inputSize));
为输入归一化计算训练集统计量
网络的输入层对训练图像进行z-score归一化。计算用于z-score归一化的训练图像的平均值和标准差。
均值= 0 ([inputSize 3]);meanImageSq = 0 ([inputSize 3]);而hasdata(dsTrain) dat = read(dsTrain);Img = double(dat{1});meanImage = meanImage + img;meanImageSq = meanImageSq + img.^2;结束meanImage = meanImage/numTrain;meanImageSq = meanImageSq/numTrain;varImage = meanImageSq - meanImage.^2;stdImage = sqrt(varImage);
将数据存储重置为初始状态。
重置(dsTrain);
批量训练数据
创建一个minibatchqueue
(深度学习工具箱)对象,该对象在自定义训练循环中管理观察结果的迷你批处理。的minibatchqueue
对象也将数据强制转换为dlarray
(深度学习工具箱)对象,用于在深度学习应用程序中实现自动区分。
指定小批数据提取格式为"SSCB”
(空间,空间,通道,批次)。设置DispatchInBackground”
返回的布尔值参数canUseGPU
.如果支持的万博1manbetxGPU可用于计算,则minibatchqueue
对象在训练期间在并行池的后台预处理小批。
miniBatchSize = 128;mbqTrain = minibatchqueue(dsTrain,MiniBatchSize= MiniBatchSize,...PartialMiniBatch =“丢弃”MiniBatchFormat = (“SSCB”,""),...DispatchInBackground = canUseGPU);mbqVal = minibatchqueue(dsVal,MiniBatchSize= MiniBatchSize,...MiniBatchFormat = [“SSCB”,""), DispatchInBackground = canUseGPU);
加载和修改MobileNet-v2网络
本例从MobileNet-v2开始[3]CNN在ImageNet上训练[4].该示例修改了网络,将MobileNet-v2网络的最后一层替换为具有10个神经元的完全连接层,每个神经元表示从1到10的离散分数。该网络预测每张图像的每个分数的概率。该示例使用softmax激活层规范化全连接层的输出。
的mobilenetv2
(深度学习工具箱)函数返回预先训练好的MobileNet-v2网络。此功能需要深度学习工具箱™模型MobileNet-v2网络万博1manbetx支持包。如果没有安装此支万博1manbetx持包,则该函数将提供下载链接。
Net = mobilenetv2;
将网络转换为layerGraph
(深度学习工具箱)对象。
lgraph = layerGraph(net);
该网络的图像输入大小为224 * 224像素。将输入层替换为图像输入层,该图像输入层使用训练图像的均值和标准差对图像数据执行z-score归一化。
inLayer = imageInputLayer([inputSize 3],Name=“输入”,...归一化=“zscore”意味着= meanImage StandardDeviation = stdImage);lgraph =替换层(lgraph,“input_1”、镶嵌者);
将原来的最终分类层替换为具有10个神经元的完全连接层。添加一个softmax层来规范化输出。设置全连接层的学习率为基线CNN层学习率的10倍。应用75%的dropout。
lgraph = removeLayers(lgraph,[“ClassificationLayer_Logits”,“Logits_softmax”,“分对数”]);newfinallayer = [dropoutLayer(0.75,Name=“下降”) fullyConnectedLayer (newMaxScore Name =“俱乐部”WeightLearnRateFactor = 10, BiasLearnRateFactor = 10) softmaxLayer (Name =“概率”));lgraph = addLayers(lgraph, newfinallayer);lgraph = connectLayers(“global_average_pooling2d_1”,“下降”);Dlnet = dlnetwork(lgraph);
可视化网络使用深度网络设计器(深度学习工具箱)应用程序。
deepNetworkDesigner (lgraph)
定义模型梯度和损失函数
的modelGradients
Helper函数计算网络每次迭代训练的梯度和损失。函数中定义了此函数万博1manbetx支持功能部分的示例。
NIMA网络的目标是最小化地面真实值和预测分数分布之间的地球运动距离(EMD)。EMD损失在惩罚错误分类时考虑了类之间的距离。因此,EMD损失比分类任务中使用的典型的软最大交叉熵损失性能更好[5].方法计算EMD损失earthMoverDistance
方法中定义的Helper函数万博1manbetx支持功能部分的示例。
对于EMD损失函数,使用anr-范数距离r= 2。当您使用梯度下降时,这个距离可以方便地进行优化。
指定培训项目
指定用于SGDM优化的选项。训练网络150个epoch。
numEpochs = 150;动量= 0.9;initialLearnRate = 3e-3;衰减= 0.95;
列车网络的
默认情况下,该示例加载预训练的NIMA网络版本。预训练的网络使您可以运行整个示例,而无需等待训练完成。
为了训练网络,设置doTraining
变量转换为真正的
.在自定义训练循环中训练模型。对于每个迭代:
方法读取当前小批处理的数据
下一个
(深度学习工具箱)函数。方法评估模型梯度
dlfeval
(深度学习工具箱)功能和modelGradients
helper函数。方法更新网络参数
sgdmupdate
(深度学习工具箱)函数。
如果有GPU,可以在GPU上进行训练。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU计算要求(并行计算工具箱).
doTraining = false;如果doTraining迭代= 0;速度= [];开始= tic;[hFig,lineLossTrain,lineLossVal] = initializeTrainingPlotNIMA;为epoch = 1:numEpochs shuffle (mbqTrain);learnRate = initialLearnRate/(1+decay*floor(epoch/10));而hasdata(mbqTrain)迭代=迭代+ 1;[dlX,cdfY] = next(mbqTrain);[grad,loss] = dlfeval(@modelGradients,dlnet,dlX,cdfY);[dlnet,velocity] = sgdmupdate(dlnet,grad,velocity,learnRate,动量);updateTrainingPlotNIMA (lineLossTrain损失、时代、迭代,开始)结束将验证数据添加到绘图中[~,lossVal,~] = modelforecasts (dlnet,mbqVal);时代,updateTrainingPlotNIMA (lineLossVal lossVal迭代,开始)结束保存已训练的网络modelDateTime = string(datetime(“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(fullfile (dataDir“trainedNIMA——”+ modelDateTime +“.mat”),“dlnet”);其他的负载(fullfile (dataDir“trainedNIMA.mat”));结束
评估NIMA模型
使用三个指标评估模型在测试数据集上的性能:EMD,二进制分类精度和相关系数。NIMA网络在测试数据集上的性能与Talebi和Milanfar报道的参考NIMA模型的性能一致[1].
创建一个minibatchqueue
(深度学习工具箱)对象,该对象管理测试数据的迷你批处理。
mbqTest = minibatchqueue(dsTest,MiniBatchSize= MiniBatchSize,MiniBatchFormat=[“SSCB”,""]);
计算小批测试数据的预测概率和真实累积概率modelPredictions
函数。函数中定义了此函数万博1manbetx支持功能部分的示例。
[YPredTest,~,cdfYTest] = modelforecasts (dlnet,mbqTest);
计算地面真相和预测分布的平均值和标准偏差值。
meanPred = extractdata(YPredTest)' * (1:10)';stdPred = sqrt(extractdata(YPredTest)'*((1:10).^2)' - meanPred.^2);origCdf = extractdata(cdfYTest);origPdf = [origCdf(1,:);diff (origCdf)];mean = origPdf' * (1:10)';stdOrig =√origPdf‘*((1:10)^ 2)”——meanOrig。^ 2);
计算EMD
计算ground truth的EMD和预测得分分布。对于预测,使用anr-范数距离r= 1。EMD值表示预测和地面真实评级分布的接近度。
EMDTest = earthmovedistance (YPredTest,cdfYTest,1)
EMDTest = 1×1 single gpuArray dlarray 0.0974
计算二元分类精度
为了二进制分类的准确性,将分布转换为两个分类:高质量和低质量。将平均得分大于阈值的图像分类为高质量图像。
qualityThreshold = 5;binaryPred = meanPred >质量阈值;binaryOrig = meanOrig >质量阈值;
计算二元分类精度。
binaryAccuracy = 100 * sum(binaryPred==binaryOrig)/length(binaryPred)
binaryAccuracy = 81.8182
计算相关系数
相关值越大,表明基本事实与预测分数之间存在较大的正相关。计算平均分数的线性相关系数(LCC)和斯皮尔曼等级相关系数(SRCC)。
meanLCC = corr(meanOrig,meanPred)
meanLCC = gpuArray single 0.8270
meanSRCC = corr(meanOrig,meanPred,type=“枪兵”)
meanSRCC = gpuArray single 0.8133
万博1manbetx支持功能
模型梯度函数
的modelGradients
函数以a作为输入dlnetwork
对象dlnet
和一小批输入数据dlX
对应的目标累积概率cdfY
.该函数返回损失相对于中可学习参数的梯度dlnet
还有损失。要自动计算梯度,请使用dlgradient
函数。
函数[gradients,loss] = modelGradients(dlnet,dlX,cdfY) dlYPred = forward(dlnet,dlX);loss = earthmovedistance (dlYPred,cdfY,2);gradients = dlgradient(loss,dlnet.Learnables);结束
损失函数
的earthMoverDistance
函数计算指定的地面真相和预测分布之间的EMDr规范值。的earthMoverDistance
使用computeCDF
辅助函数来计算预测分布的累积概率。
函数loss = earthmovedistance (YPred,cdfY,r) N = size(cdfY,1);cdfYPred = computeCDF(YPred);(1/N) * (abs(cdfY - cdfYPred).^r);losarray = sum(cdfDiff,1).^(1/r);loss = mean(lossArray);结束函数cdfY = computeCDF(Y)给定一个概率质量函数Y,计算累积概率[N,miniBatchSize] = size(Y);L = repmat(triu(ones(N)),1,1,miniBatchSize);L3d = permute(L,[1 3 2]);prod = Y.*L3d;prodSum = sum(prod,1);cdfY =重塑(prodSum(:)',miniBatchSize,N)';结束
模型预测函数
的modelPredictions
函数计算小批数据的估计概率、损失和实际情况累积概率。
函数[dlYPred,loss,cdfYOrig] = modelforecasts (dlnet,mbq) reset(mbq);损失= 0;numObservations = 0;dlYPred = [];cdfYOrig = [];而hasdata(mbq) [dlX,cdfY] = next(mbq);miniBatchSize = size(dlX,4);德利=预测(dlnet,dlX);损失=损失+ earthmovedistance (dlY,cdfY,2)*miniBatchSize;dlYPred = [dlYPred];cdfYOrig = [cdfYOrig cdfY];numObservations = numObservations + miniBatchSize;结束loss = loss / numObservations;结束
参考文献
塔莱比,侯赛因,佩曼·米兰法尔。NIMA:神经图像评估。《IEEE图像处理汇刊》第27期。8(2018年8月):3998-4011。https://doi.org/10.1109/TIP.2018.2831899.
[2] LIVE:图像与视频工程实验室。"野外生活图像质量挑战数据库"https://live.ece.utexas.edu/research/ChallengeDB/index.html.
[3]桑德勒,马克,安德鲁·霍华德,朱梦龙,安德烈·日莫吉诺夫,陈良杰。MobileNetV2:反向残差和线性瓶颈。2018年IEEE/CVF计算机视觉和模式识别会议,4510-20。盐湖城,UT: IEEE, 2018。https://doi.org/10.1109/CVPR.2018.00474.
[4] ImageNet。https://www.image-net.org.
[5]侯,乐,余振平,Dimitris Samaras。“平方地球移动器基于距离的损失,用于训练深度神经网络。”预印本,2016年11月30日提交。https://arxiv.org/abs/1611.05916.
另请参阅
mobilenetv2
(深度学习工具箱)|变换
|layerGraph
(深度学习工具箱)|dlnetwork
(深度学习工具箱)|minibatchqueue
(深度学习工具箱)|预测
(深度学习工具箱)|dlfeval
(深度学习工具箱)|sgdmupdate
(深度学习工具箱)
相关的话题
- 图像质量指标
- 用于深度学习的数据存储(深度学习工具箱)
- 定义自定义训练循环、损失函数和网络(深度学习工具箱)
- 定义自定义训练循环的模型损失函数(深度学习工具箱)
- 在自定义培训循环中指定培训选项(深度学习工具箱)
- 使用自定义训练循环训练网络(深度学习工具箱)