主要内容

使用神经图像量化图像质量评估

这个例子展示了如何分析美学的图像使用神经图像质量评估(尼玛)卷积神经网络(CNN)。

图像质量指标提供一个客观的衡量图像质量。一个有效的度量提供了定量的分数,关联与一个人的主观感知质量的观察者。质量度量方法实现图像处理算法的比较。

尼玛[1]是一个不技术,预测一个图像的质量不依赖原始的参考图像,这是经常缺货。尼玛用CNN预测每个图像的质量分数的分布。

使用训练有素的尼玛模型评价图像质量

dataDir所需的位置的数据集。

dataDir = fullfile (tempdir,“LIVEInTheWild”);如果~存在(dataDir“dir”mkdir (dataDir);结束

下载一个pretrained尼玛神经网络通过使用helper函数downloadTrainedNetwork。辅助函数附加到例子作为支持文件。金宝app该模型预测的质量分数分布范围中的每个图像(1,10),在1到10的最低和最高的分数可能值,分别。一个高分表明良好的图像质量。

trainedNet_url =“https://ssd.mathworks.com/金宝appsupportfiles/image/data/trainedNIMA.zip”;downloadTrainedNetwork (trainedNet_url dataDir);负载(fullfile (dataDir“trainedNIMA.mat”));

你可以评估的有效性尼玛模型通过比较预测分数高质量和低质量的图像。

读高质量的图像到工作区中。

imOriginal = imread (“kobi.png”);

减少的审美质量图像通过应用高斯模糊。显示原始图像和模糊图像在一个蒙太奇。主观,美学质量的模糊图像比原始图像的质量。

imBlur = imgaussfilt (imOriginal 5);蒙太奇({imOriginal, imBlur})

预测尼玛两张图片使用的质量分数分布predictNIMAScorehelper函数。这个函数是附加到例子作为支持文件。金宝app

predictNIMAScore函数返回尼玛得分的平均值和标准偏差分布图像。预测的平均分数是衡量图像的质量。成绩的标准差可以被认为是衡量预测的置信水平意味着分数。

[meanOriginal, stdOriginal] = predictNIMAScore (dlnet imOriginal);[meanBlur, stdBlur] = predictNIMAScore (dlnet imBlur);

显示图像的平均值和标准偏差尼玛的分数分布预测模型。尼玛模型正确地预测分数为同意这些图像主观视觉评估。

图t = tiledlayout (1、2);displayImageAndScoresForNIMA (t, imOriginal meanOriginal stdOriginal,的“原始图像”)displayImageAndScoresForNIMA (t imBlur meanBlur stdBlur,“模糊图像”)

剩下的这个例子展示了如何训练和评估一个尼玛模型。

下载生活在野外的数据集

下面的例子使用了生活在野外的数据集[2],这是一个公共数据库主观图像质量的挑战。数据集包含1162张照片被移动设备,与7提供的额外的图像训练人的得分手。平均每个图像是额定175人规模的[100]。数据集提供了主观评分的平均值和标准偏差为每个图像。

下载数据集按照说明书中列出生活在野外数据库图像质量的挑战。提取数据到指定的目录dataDir变量。当提取成功,dataDir包含两个目录:数据图片

生活在野外数据加载

得到图像的文件路径。

imageData =负载(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:结束));

创建一个图像数据存储,对图像数据进行管理。

imd = imageDatastore (imageList);

平均值和标准偏差数据加载对应图片。

meanData =负载(fullfile (dataDir“数据”,“AllMOS_release.mat”));meanData = meanData.AllMOS_release;stdData =负载(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 - 256);imd =变换(imd, @ (x) imresize (x, rescaleSize));

尼玛模型需要一个人类分数的分布,但只提供现场数据集分布的平均值和标准偏差。生活中的每个图像近似一个潜在的分布数据集使用createNIMAScoreDistributionhelper函数。这个函数是附加到例子作为支持文件。金宝app

createNIMAScoreDistribution重新调节的分数范围[1,10],然后生成最大熵分布的分数平均值和标准偏差值。

newMaxScore = 10;概率= createNIMAScoreDistribution (meanData stdData);cumProb = cumsum(问题2);

创建一个arrayDatastore管理分数分布。

probDS = arrayDatastore (cumProb ', IterationDimension = 2);

结合包含图像数据的数据存储和分数分布数据。

probDS dsCombined =结合(imd);

预览输出数据存储相结合的阅读。

sampleRead =预览(dsCombined)
sampleRead =1×2单元阵列{256×256×3 uint8}{10×1双}
图tiledlayout (1、2) nexttile imshow (sampleRead{1})标题(“从数据集样本图像”)nexttile情节(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);dst =子集(dsCombined idxTest);

增加训练数据

增加训练数据使用augmentDataForNIMAhelper函数。这个函数是附加到例子作为支持文件。金宝app的augmentDataForNIMA增函数执行这些操作在每个培训图片:

  • 作物图像224————244像素,以减少过度拟合。

  • 翻转图像水平以50%的概率。

inputSize = (224 - 224);dsTrain =变换(dsTrain @ (x) augmentDataForNIMA (x, inputSize));

计算输入训练集数据规范化

网络的输入层执行培训的z分数归一化的图像。计算平均值和标准偏差的训练图像用于z分数归一化。

meanImage = 0 ([inputSize 3]);meanImageSq = 0 ([inputSize 3]);hasdata (dsTrain) dat =阅读(dsTrain);img =双(dat {1});meanImage = meanImage +编码器;meanImageSq = meanImageSq + img。^ 2;结束meanImage = meanImage / numTrain;meanImageSq = meanImageSq / numTrain;varImage = meanImageSq - meanImage。^ 2;stdImage =√varImage);

重置初始状态的数据存储。

重置(dsTrain);

批训练数据

创建一个minibatchqueue(深度学习工具箱)观察的对象管理mini-batching定制培训循环。的minibatchqueue对象也投下数据dlarray(深度学习工具箱)在深度学习应用程序对象,使自动分化。

指定mini-batch数据提取格式为“SSCB”(空间、空间、通道、批)。设置”DispatchInBackground”名称-值参数返回的布尔值canUseGPU。如果一个支金宝app持GPU用于计算,然后minibatchqueue对象进行预处理mini-batches背景在一个平行的池训练。

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(深度学习工具箱)函数返回一个pretrained MobileNet-v2网络。这个函数需要深度学习工具箱™模型MobileNet-v2网络金宝app支持包。如果这种支持包没金宝app有安装,那么函数提供一个下载链接。

网= mobilenetv2;

网络转换成一个layerGraph(深度学习工具箱)对象。

lgraph = layerGraph(净);

网络图像输入224 - 224像素的大小。输入层替换为一个图像输入层,对图像数据执行z分数归一化使用训练图像的平均值和标准偏差。

镶嵌者= imageInputLayer ([inputSize 3], Name =“输入”,归一化=“zscore”意味着= meanImage StandardDeviation = stdImage);lgraph = replaceLayer (lgraph,“input_1”、镶嵌者);

替换原来的最终分类层与一个完全连接层与10个神经元。添加一个softmax层规范化输出。设置完全连接层的学习速率为学习速率的10倍基线CNN层。适用75%的辍学生。

lgraph = removeLayers (lgraph, (“ClassificationLayer_Logits”,“Logits_softmax”,“分对数”]);newFinalLayers = [dropoutLayer (0.75, Name =“下降”)fullyConnectedLayer (newMaxScore Name =“俱乐部”WeightLearnRateFactor = 10, BiasLearnRateFactor = 10) softmaxLayer (Name =“概率”));lgraph = addLayers (lgraph newFinalLayers);lgraph = connectLayers (lgraph,“global_average_pooling2d_1”,“下降”);dlnet = dlnetwork (lgraph);

可视化网络使用深层网络设计师(深度学习工具箱)应用程序。

deepNetworkDesigner (lgraph)

定义模型梯度和损失函数

modelGradientshelper函数计算每个迭代的梯度和损失的培训网络。这个函数是定义在金宝app支持功能这个例子。

尼玛网络的目标是最小化挖土机的距离(EMD)之间的地面真理和预测分数分布。EMD损失惩罚错误分类时考虑类之间的距离。因此,EMD损失执行比一个典型的损失softmax叉用于分类的任务[5]。这个例子计算使用EMD损失earthMoverDistance中定义的helper函数,这是金宝app支持功能这个例子。

EMD损失函数,使用一个r规范距离r= 2。这个距离可以很容易当你使用梯度下降优化。

指定培训选项

指定的选项个优化。火车150年的网络时代。

numEpochs = 150;动量= 0.9;initialLearnRate = 3 e - 3;衰变= 0.95;

列车网络的

默认情况下,尼玛的示例加载pretrained版本网络。pretrained网络使您能够运行整个示例没有等待培训完成。

训练网络,设置doTraining变量在下面的代码真正的。火车模型在一个定制的训练循环。每一次迭代:

  • 读取数据为当前mini-batch使用下一个(深度学习工具箱)函数。

  • 评估模型梯度使用dlfeval(深度学习工具箱)函数和modelGradientshelper函数。

  • 更新网络参数使用sgdmupdate(深度学习工具箱)函数。

火车在GPU如果一个是可用的。使用GPU需要并行计算工具箱™和CUDA NVIDIA GPU®®启用。有关更多信息,请参见GPU计算的需求(并行计算工具箱)

doTraining = false;如果doTraining迭代= 0;速度= [];开始=抽搐;[hFig, lineLossTrain lineLossVal] = initializeTrainingPlotNIMA;时代= 1:numEpochs shuffle (mbqTrain);learnRate = initialLearnRate /(1 +衰变*地板(时代/ 10));hasdata (mbqTrain)迭代=迭代+ 1;[dlX, cdfY] =下一个(mbqTrain);(研究生,亏损)= dlfeval (@modelGradients、dlnet dlX, cdfY);[dlnet,速度]= sgdmupdate (dlnet、毕业生、速度、learnRate动量);updateTrainingPlotNIMA (lineLossTrain损失、时代、迭代,开始)结束%绘制添加验证数据[lossVal, ~ ~] = modelPredictions (dlnet mbqVal);时代,updateTrainingPlotNIMA (lineLossVal lossVal迭代,开始)结束%保存训练网络modelDateTime =字符串(datetime (“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(fullfile (dataDir“trainedNIMA——”+ modelDateTime +“.mat”),“dlnet”);其他的负载(fullfile (dataDir“trainedNIMA.mat”));结束

尼玛评估模型

评估模型的性能测试数据集使用三个指标:EMD,二进制分类精度和相关系数。尼玛网络的性能测试数据集符合参考尼玛模型的性能报告Talebi Milanfar[1]

创建一个minibatchqueue(深度学习工具箱)对象管理mini-batching的测试数据。

mbqTest = minibatchqueue (dst MiniBatchSize = MiniBatchSize MiniBatchFormat = [“SSCB”,”“]);

计算预测概率和地面真理mini-batches累积概率的测试数据使用modelPredictions函数。这个函数是定义在金宝app支持功能这个例子。

[YPredTest, ~, cdfYTest] = modelPredictions (dlnet mbqTest);

计算的平均值和标准偏差值地面真理和预测分布。

meanPred = extractdata (YPredTest) * (1:10)”;stdPred =√extractdata YPredTest) * ((1:10) ^ 2)”——meanPred。^ 2);origCdf = extractdata (cdfYTest);origPdf = [origCdf (1:);diff (origCdf)];meanOrig = origPdf ' * (1:10) ';stdOrig =√origPdf‘* ((1:10) ^ 2)”——meanOrig。^ 2);

计算EMD

计算地面的EMD真理和预测分数分布。预测,使用一个r规范距离r= 1。EMD值表示预测的亲密和地面真理评级分布。

emdt = earthMoverDistance (YPredTest cdfYTest 1)
emdt = 1×1单gpuArray dlarray 0.0974

计算二元分类精度

对于二进制分类精度,将分布转换为两个分类:高质量和低质量。分类图像与高质量的平均评分大于一个阈值。

qualityThreshold = 5;binaryPred = meanPred > qualityThreshold;binaryOrig = meanOrig > qualityThreshold;

计算二元分类精度。

binaryAccuracy = 100 * (binaryPred = = binaryOrig) /长度总和(binaryPred)
binaryAccuracy = 81.8182

计算相关系数

大型相关值表明大型地面实况和预测分数之间的正相关关系。计算线性相关系数(LCC)和斯皮尔曼等级相关系数(罢工)平均分数。

meanLCC = corr (meanOrig meanPred)
meanLCC = 0.8270 gpuArray单一
meanSRCC = corr (meanOrig、meanPred类型=“枪兵”)
meanSRCC = 0.8133 gpuArray单一

金宝app支持功能

模型梯度函数

modelGradients函数作为输入dlnetwork对象dlnet和mini-batch输入数据dlX与相应的目标累积概率cdfY。函数返回的梯度对可学的参数dlnet以及损失。自动计算梯度,使用dlgradient函数。

函数(渐变,亏损)= modelGradients (dlnet、dlX cdfY) dlYPred =前进(dlnet dlX);损失= earthMoverDistance (dlYPred cdfY 2);梯度= dlgradient(损失、dlnet.Learnables);结束

损失函数

earthMoverDistance函数计算地面实况和预测分布之间的EMD指定r规范值。的earthMoverDistance使用computeCDFhelper函数来计算预测的累积概率分布。

函数损失= earthMoverDistance (YPred cdfY, r) N =大小(cdfY, 1);cdfYPred = computeCDF (YPred);cdfDiff = (1 / N) * (abs (cdfY - cdfYPred)。^ r);lossArray = (cdfDiff, 1)总和。^ (1 / r);损失=意味着(lossArray);结束函数cdfY = computeCDF (Y)%概率质量函数Y,计算累积概率[N, miniBatchSize] =大小(Y);L = repmat (triu ((N)), 1, 1, miniBatchSize);L3d =排列(L, [1 3 2]);刺激= y * L3d;prodSum =总和(prod 1);cdfY =重塑(prodSum (:)“miniBatchSize, N)”;结束

模型的预测函数

modelPredictions函数计算估计的概率、损失和地面实况mini-batches累积概率的数据。

函数[dlYPred,失去,cdfYOrig] = modelPredictions (dlnet兆贝可)重置(兆贝可);损失= 0;numObservations = 0;dlYPred = [];cdfYOrig = [];hasdata(兆贝可)[dlX cdfY] =(兆贝可);miniBatchSize =大小(dlX 4);海底=预测(dlnet dlX);损失=损失+ earthMoverDistance(海底cdfY 2) * miniBatchSize;dlYPred = (dlYPred海底);cdfYOrig = [cdfYOrig cdfY];numObservations = numObservations + miniBatchSize;结束损失= / numObservations损失;结束

引用

[1]Talebi,侯赛因和Peyman Milanfar。“尼玛:神经图像评估。”27岁的IEEE图像处理。8(2018年8月):3998 - 4011。https://doi.org/10.1109/TIP.2018.2831899

[2]生活:实验室工程图片和视频。“生活在野外数据库图像质量的挑战。”https://live.ece.utexas.edu/research/ChallengeDB/index.html

[3]桑德勒,马克,安德鲁·霍华德,“朱、陈Andrey Zhmoginov, Liang-Chieh。“MobileNetV2:倒残差和线性瓶颈。“2018年IEEE / CVF计算机视觉与模式识别会议,4510 - 20。盐湖城犹他:IEEE 2018。https://doi.org/10.1109/CVPR.2018.00474

[4]ImageNet。https://www.image-net.org

[5]侯,Le,陈平Yu, Dimitris萨马拉斯。“方挖土机的基于距离损失训练神经网络。2016年11月30日,“预印本,提交。https://arxiv.org/abs/1611.05916

另请参阅

(深度学习工具箱)||(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)

相关的话题