检测图像异常使用可辩解的FCDD网络
这个例子展示了如何检测缺陷药片图像完全使用看到下面成了卷积数据描述(FCDD)异常检测网络。
异常检测的一个至关重要的目标是为人类观察者能够理解为什么一个训练有素的网络分类图像异常。FCDD使explainable分类补充剂类预测信息,证明了神经网络达到分类决策(1]。FCDD网络返回一个热图异常每个像素的概率。分类器标签图像基于中值为正常或异常的异常分数的热图。
下载药片图像分类数据集
下面的例子使用了PillQC数据集,数据集包含图像从三个类:正常的
图片没有缺陷,芯片
药片图像芯片缺陷污垢
图像与灰尘污染。数据集提供了149年正常的
图片,43芯片
图片,138污垢
图像。数据集的大小是3.57 MB。
集dataDir
的期望位置数据集。下载数据集使用downloadPillQCData
helper函数。这个函数是附加到例子作为支持文件。金宝app功能下载ZIP文件并将数据提取到子目录芯片
,污垢
,正常的
。
dataDir = fullfile (tempdir,“PillDefects”);downloadPillQCData (dataDir)
这张图片显示了一个示例图像从每个类。正常的药丸没有缺陷在左边,一颗药丸含有污垢是在中间,和一颗药丸芯片缺陷在右边。虽然这个数据集包含的图像阴影的实例,焦点模糊,背景颜色变化,本例中使用的方法是健壮的这些图像采集工件。
加载和数据预处理
创建一个imageDatastore
读取和管理图像数据。标签每一个形象芯片
,污垢
,或正常的
根据它的目录的名称。
imageDir = fullfile (dataDir,“pillQC-main”,“图片”);imd = imageDatastore (imageDir IncludeSubfolders = true, LabelSource =“foldernames”);
数据分割成培训、校准和测试集
创建培训、校准和测试集使用splitAnomalyData
(计算机视觉工具箱)函数。这个例子实现了一个FCDD方法,利用离群值曝光,正常的训练数据主要包括图像的一小部分异常图像。尽管主要训练样本只有正常的场景,该模型学习如何区分正常和异常的场景。
分配50%的正常图像和一个很小的比例(5%)的每一个异常类的训练数据集。分配10%的正常图像和20%的每个异常类校准设置。分配剩下的图像测试集。
normalTrainRatio = 0.5;anomalyTrainRatio = 0.05;normalCalRatio = 0.10;anomalyCalRatio = 0.20;normalTestRatio = 1 - (normalTrainRatio + normalCalRatio);anomalyTestRatio = 1 - (anomalyTrainRatio + anomalyCalRatio);anomalyClasses = [“芯片”,“土”];[imdsTrain, imdsCal imdsTest] = splitAnomalyData (imd, anomalyClasses…NormalLabelsRatio = [normalTrainRatio normalCalRatio normalTestRatio),…AnomalyLabelsRatio = [anomalyTrainRatio anomalyCalRatio anomalyTestRatio]);
分裂异常数据集- - - - - - - - - - - - - - - - - - - - - - - - - *敲定……完成了。*文件数量和比例在所有的数据集:每个类输入火车验证测试NumFiles比NumFiles比NumFiles比NumFiles比___________________ ____________________ ___________________ ___________________芯片43 0.1303 138 0.41818 0.02381 9 0.17647 32 0.1641土7 28正常0.54902 103 0.52821 149 0.083333 0.45152 0.30769 0.27451 75 0.89286 14 60
进一步把训练数据分割成两个数据存储,一个只包含正常数据,另一个只包含异常数据。
[imdsNormalTrain, imdsAnomalyTrain] = splitAnomalyData (imdsTrain anomalyClasses,…NormalLabelsRatio = [1 0 0], AnomalyLabelsRatio = [0 1 0], Verbose = false);
增加训练数据
增加训练数据使用变换
函数与自定义的helper函数指定的预处理操作augmentDataForPillAnomalyDetector
。helper函数附加到的例子作为支持文件。金宝app
的augmentDataForPillAnomalyDetector
随机函数适用于90度旋转,每个输入图像水平和垂直反射。
imdsNormalTrain =变换(imdsNormalTrain @augmentDataForPillAnomalyDetector);imdsAnomalyTrain =变换(imdsAnomalyTrain @augmentDataForPillAnomalyDetector);
将二进制的标签添加到校准和测试数据集使用变换
与指定的操作功能addLabelData
helper函数。辅助函数在这个例子中,定义和分配的图片正常的
类二元标签0
和图片的芯片
或污垢
一个二进制类标签1
。
dsCal =变换(imdsCal、@addLabelData IncludeInfo = true);dst =变换(imdsTest、@addLabelData IncludeInfo = true);
可视化九增强训练的样本图片。
exampleData = readall(子集(imdsNormalTrain, 1:9));蒙太奇(exampleData (: 1));
创建FCDD模型
这个例子使用一个完全卷积数据描述(FCDD)模型(1]。FCDD是训练一个网络的基本思想产生异常分数地图描述了输入图像中每个区域的概率包含异常内容。
的pretrainedEncoderNetwork
函数返回的前三个将采样阶段ImageNet pretrained Inception-v3网络用作pretrained骨干。
骨干= pretrainedEncoderNetwork (“inceptionv3”3);
创建一个FCDD异常探测器网络使用fcddAnomalyDetector
(计算机视觉工具箱)函数Inception-v3骨干。
网= fcddAnomalyDetector(支柱);
列车网络或下载Pretrained网络
默认情况下,这个示例下载的pretrained版本FCDD异常探测器使用helper函数downloadTrainedNetwork
。辅助函数附加到这个例子作为支持文件。金宝app您可以使用pretrained网络运行整个示例没有等待培训完成。
训练网络,设置doTraining
变量在下面的代码真正的
。指定要使用的时代进行训练numEpochs
通过输入一个值。火车模型通过使用trainFCDDAnomalyDetector
(计算机视觉工具箱)函数。
火车在一个或多个gpu,如果可用。使用GPU需要并行计算工具箱™和CUDA NVIDIA GPU®®启用。有关更多信息,请参见GPU计算的需求(并行计算工具箱)。培训大约需要3分钟的NVIDIA泰坦RTX™。
doTraining =虚假的;numEpochs =200年;如果doTraining选项= trainingOptions (“亚当”,…洗牌=“every-epoch”,…MaxEpochs = numEpochs InitialLearnRate = 1的军医,…MiniBatchSize = 32,…BatchNormalizationStatistics =“移动”);探测器= trainFCDDAnomalyDetector (imdsNormalTrain imdsAnomalyTrain,净、期权);modelDateTime =字符串(datetime (“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(fullfile (dataDir“trainedPillAnomalyDetector——”+ modelDateTime +“.mat”),“探测器”);其他的trainedPillAnomalyDetectorNet_url =“https://ssd.mathworks.com/金宝appsupportfiles/”+…“视觉/数据/ trainedFCDDPillAnomalyDetectorSpkg.zip”;downloadTrainedNetwork (trainedPillAnomalyDetectorNet_url dataDir);负载(fullfile (dataDir“folderFor金宝appSupportFilesInceptionModel”,…“trainedPillFCDDNet.mat”));结束
设置异常阈值
为异常探测器选择异常分数阈值,将图像基于他们的分数是否高于或低于阈值。这个例子使用一个校准数据集,其中包含正常和异常图像选择阈值。
获得的平均异常分数和地面真理为每个图像的校准设置标签。
成绩=预测(检测器,dsCal);= imdsCal标签。标签~ =“正常”;
画一个柱状图的意思是异常分数正常和异常类。模型预测异常的分布分别得分。
numBins = 20;[~,边缘]= histcounts(分数,numBins);图保存在hNormal =直方图(分数(标签= = 0),边);hAnomaly =直方图(分数(标签= = 1),边);持有从传奇([hNormal, hAnomaly],“正常”,“异常”)包含(“意思是异常分数”)ylabel (“计数”)
计算最优异常阈值使用anomalyThreshold
(计算机视觉工具箱)函数。前两个输入参数指定为地面真理标签,标签
,并预测异常分数,分数
的校准数据集,第三个输入参数指定为真正的
因为真正的正面有一个异常图像标签
的价值真正的
。的anomalyThreshold
函数返回的最优阈值和接受者操作特征(ROC)曲线的探测器,存储为一个rocmetrics
(深度学习工具箱)对象。
(打,roc) = anomalyThreshold(标签,分数,真的);
设置阈值
属性异常探测器的最优值。
探测器。阈值= thresh;
绘制ROC使用情节
(深度学习工具箱)对象的函数rocmetrics
。中华民国曲线说明了分类器的性能可能的阈值范围。ROC曲线上的每个点代表了假阳性率(x坐标)和真阳性率(y协调)当校准设置图像使用不同的阈值进行分类。固体蓝线代表了ROC曲线。红色虚线代表一个任何技巧分类器对应的50%的成功率。ROC曲线下面积(AUC)指标表明分类器的性能,和最大ROC AUC对应于一个完美的分类器是1.0。
情节(roc)标题(“中华民国AUC:“+ roc.AUC)
评估分类模型
分类测试中的每个图像设置为正常或异常。
testSetOutputLabels =分类(检测器,dst);
每一个测试图像的地面真值标签。
testSetTargetLabels = dsTest.UnderlyingDatastores {1} .Labels;
评估异常探测器通过计算性能指标使用evaluateAnomalyDetection
(计算机视觉工具箱)函数。函数计算几个指标,评价精度,精度、灵敏度和特异性探测器的测试数据集。
指标= evaluateAnomalyDetection (testSetOutputLabels testSetTargetLabels anomalyClasses);
评估异常检测结果- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *敲定……完成了。*数据集指标:GlobalAccuracy MeanAccuracy精密召回特异性F1Score FalsePositiveRate _______ _____累积___________ FalseNegativeRate * * * _________________ _________________ 0.044444 0.97727 0.96923 0.95556 0.97778 - 1 1 0
的ConfusionMatrix
的属性指标
包含测试集的混淆矩阵。提取混淆矩阵,并显示一个混乱情节。分类模型在本例中是非常准确和预测一小部分假阳性和假阴性。
M = metrics.ConfusionMatrix {:,:};confusionchart (M,“正常”,“异常”])acc =总和(诊断接头(M)) /笔(M,“所有”);标题(准确性:“+ acc)
如果你指定多个异常类标签,如污垢
和芯片
在这个例子中,evaluateAnomalyDetection
函数计算指标对整个数据集和每个异常类。在返回的每个类指标ClassMetrics
财产的anomalyDetectionMetrics
(计算机视觉工具箱)对象,指标
。
metrics.ClassMetrics
ans =2×2表准确性AccuracyPerSubClass ________ ___________________正常1}{1×1表异常0.95556{2×1表}
metrics.ClassMetrics (2“AccuracyPerSubClass”).AccuracyPerSubClass {1}
ans =2×1表AccuracyPerSubClass ___________________芯片0.84375土0.99029
解释分类决策
您可以使用异常的热图异常探测器可以帮助解释为什么一个预测的图像分类为正常或异常。这种方法有助于识别模式在假阴性和假阳性。您可以使用这些模式识别策略增加训练数据的类平衡或改善网络性能。
计算异常热图显示范围
计算显示范围,反映了整个校准范围内观察到的异常分数集,包括正常和异常图像。使用相同的显示范围在图像允许您比较图像比如果你规模每个图像更容易自己的最小值和最大值。应用在这个例子中所有的热图的显示范围。
minMapVal =正;maxMapVal =无穷;重置(dsCal)而hasdata (dsCal) img =阅读(dsCal);地图= anomalyMap(探测器,img {1});minMapVal = min (min(地图,[],“所有”),minMapVal);maxMapVal = max (max(地图,[],“所有”),maxMapVal);结束displayRange = [minMapVal, maxMapVal];
视图的热图异常图像
选择一个图像的正确分类异常。这个结果是一个真正积极的分类。显示图像。
testSetAnomalyLabels = testSetTargetLabels ~ =“正常”;idxTruePositive =找到(testSetAnomalyLabels & testSetOutputLabels 1“最后一次”);idxTruePositive dsExample =子集(dst);img =阅读(dsExample);img = img {1};地图= anomalyMap(探测器,img);imshow (anomalyMapOverlay (img,地图,MapRange = displayRange =“平等”))
视图的热图正常的形象
正确选择和显示图像的分类图像正常。这个结果是一个真正的负面的分类。
idxTrueNegative =找到(~ (testSetAnomalyLabels ' | testSetOutputLabels));idxTrueNegative dsExample =子集(dst);img =阅读(dsExample);img = img {1};地图= anomalyMap(探测器,img);imshow (anomalyMapOverlay (img,地图,MapRange = displayRange =“平等”))
视图的热图错误的负面形象
假阴性与药片图像缺陷异常正常网络分类。使用网络获得的见解的解释错误分类。
找到任何假阴性测试集的照片。获得的热图覆盖错误的负面形象的使用变换
函数。转换的操作是由一个匿名函数,适用于指定的anomalyMapOverlay
(计算机视觉工具箱)函数来获得每个假阴性的热图覆盖在测试集。
falseNegativeIdx =找到(testSetAnomalyLabels & ~ testSetOutputLabels);如果~ isempty (falseNegativeIdx) fnExamples =子集(dst falseNegativeIdx);fnExamplesWithHeatmapOverlays =变换(fnExamples @ (x) {…anomalyMapOverlay (x {1} anomalyMap(检测器,x {1}),…MapRange = displayRange =“平等”)});fnExamples = readall (fnExamples);fnExamples = fnExamples (: 1);fnExamplesWithHeatmapOverlays = readall (fnExamplesWithHeatmapOverlays);蒙太奇(fnExamples)蒙太奇(fnExamplesWithHeatmapOverlays)其他的disp (“没有假阴性检测。”)结束
视图的热图的虚假的正面形象
假阳性是图片没有药丸缺陷异常网络分类异常。找到任何假阳性的测试集,使用解释从网络获得洞察误分类。例如,如果异常分数是局部图像背景,你可以探索在预处理抑制背景。
falsePositiveIdx =找到(~ testSetAnomalyLabels ' & testSetOutputLabels);如果~ isempty (falsePositiveIdx) fpExamples =子集(dst falsePositiveIdx);fpExamplesWithHeatmapOverlays =变换(fpExamples @ (x) {…anomalyMapOverlay (x {1} anomalyMap(检测器,x {1}),…MapRange = displayRange =“平等”)});fpExamples = readall (fpExamples);fpExamples = fpExamples (: 1);fpExamplesWithHeatmapOverlays = readall (fpExamplesWithHeatmapOverlays);蒙太奇(fpExamples)蒙太奇(fpExamplesWithHeatmapOverlays)其他的disp (“没有假阳性发现。”)结束
没有假阳性发现。
金宝app支持功能
的addLabelData
helper函数创建了一个炎热的标签信息的编码表示数据
。
函数(数据、信息)= addLabelData(数据、信息)如果信息。标签= =分类(“正常”)onehotencoding = 0;其他的onehotencoding = 1;结束数据={数据,onehotencoding};结束
引用
[1]Liznerski,菲利普·卢卡斯飞边,Robert a . Vandermeulen比利乔·弗兰克斯klaus - Robert Muller马吕斯Kloft,。“分类可辩解的深看到下面成了。”Preprint, submitted March 18, 2021.https://arxiv.org/abs/2007.01760。
[2]飞边、卢卡斯、罗伯特·a . Vandermeulen比利乔·弗兰克斯Klaus-Robert穆勒,马吕斯Kloft。“重新思考假设深陷异常检测。”Preprint, submitted May 30, 2020.https://arxiv.org/abs/2006.00339。
[3]Simonyan,凯伦和安德鲁Zisserman。“很深的卷积网络大规模图像识别。”Preprint, submitted April 10, 2015.https://arxiv.org/abs/1409.1556。
[4]ImageNet。https://www.image-net.org。
另请参阅
变换
|pretrainedEncoderNetwork
|fcddAnomalyDetector
(计算机视觉工具箱)|trainFCDDAnomalyDetector
(计算机视觉工具箱)|预测
(计算机视觉工具箱)|anomalyThreshold
(计算机视觉工具箱)|anomalyMapOverlay
(计算机视觉工具箱)|evaluateAnomalyDetection
(计算机视觉工具箱)|anomalyDetectionMetrics
(计算机视觉工具箱)|rocmetrics
(深度学习工具箱)|confusionchart
(深度学习工具箱)
相关的例子
更多关于
- 开始使用异常检测使用深度学习(计算机视觉工具箱)
- 数据存储深度学习(深度学习工具箱)