在MatConvNet框架下,FCN是由DAG结构实现的,主要利用Matlab的OOP编程,下面是SegmentationLoss类的实现代码:
下面对上述代码行讲解:
classdef SegmentationLoss < dagnn.Loss
第一行此句表示定义一个类,类名为SegmentationLoss,该类继承自类dagnn.Loss,这里均与C++类的创建与继承类似。接着从line 3(第三行)到 line 26 (methods ... end)创建类方法,也就是在类内定义的普通函数(function ... end)。
line 24 到 line 26是类构造函数方法,因其方法名与类名一致,所以是类构造函数:A constructor method is a special function that creates an instance of the class. Typically, constructor methods accept input arguments to assign the data stored in properties and return an initialized object.
值得注意的是,该类构造函数并没有实现什么代码,而是调用了一个函数(确切地说应该是类方法,因为调用它的是一个类实例obj):obj.load(varargin) ,而该类方法在当前类SegmentationLoss中并没有被实现,而是来源于继承。这个类方法load(注意与Matlab built-in的load函数相区别)。该类方法load在类Layer中定义,注意这里的继承顺序:
SegmentationLoss < dagnn.Loss < dagnn.ElementWise < dagnn.Layer < handle
下面是在Layer类中类方法load的实现代码:
由此可见,SegmentationAccuracy类构造函数方法载入输入的varargin参变量用来初始化SegmentationAccuracy类的properties,相当于C++中的类成员变量:
在上述代码中,properties (Transient)表示:property value is not saved when object is saved to a file,具体参考Property Attributes。
下面重点讲解语义分割的评价标准,其定义在Line 04的类方法forward函数中。若要完全理解该评价指标的计算及代码实现,需要先熟悉分类器模型评价指标之ROC曲线机理。ROC曲线相关概念如下图所示:
注意ROC曲线也用于多分类中分类器的评价指标,理解上图相关概念后,下面来看FCN相关评价指标的定义及计算公式:
下面对其代码实现进行解析:
上述代码Line 12中inputs{1}为384x384x21的数据,其中384x384为Scores的size,21表示通道数,也表示类别数。Line 21表示取出每个通道对应的spatial location处的最大值答应的通道索引即表示类别标签。Line 13表示把得到的预测标签为384x384 gpuArray收集到内存中,变为384x384 double。Line 14表示取出Ground Truth label,并且忽略背景标签,即labels为0的标签。Line 18表示有效标签数,也就是像素数,Line 19计算混淆矩阵,这里需要理解混淆矩阵和accumarray函数。将 accumarray 与 val = 1 结合使用可计算 subs 中相同下标的数目。得到混淆矩阵后,便可得到相关的统计数据。下面是obj.confusion示例:
上图中的TP,FN和FP是相对第一类而言的,其他类与之类似。在上式中,pii就表示TP,Pij(j=1...N)若i不等于j,即为FN;Pji(j=1...N)若j不等于i,即为FP。
Line 23 表示获取每一类Ground Truth标注的像素数,其值等于(TP+FN);
Line 24 表示获取被预测为每一类的像素数,其值等于(TP+FP);
Line 25 表示获取每一类被正确预测的像素数,其值等于(TP);
根据pixelAccuracy的定义可知,Line 27 即表示每类的TP之和,即被正确分累的像素数之和与所有类的像素数之和的比值;
根据meanAccuracy的定义可知,Line 28 即表示每类的分类正确率取平均;
根据meanIntersectionUnion的定义可知,Line 29 即表示预测区域与Ground Truth区域重合的区域(交集)占预测区域与Ground Truth区域并集之比,完美分割的话,其值为1。根据下图可知:
可知meanIntersectionUnion等于:TP/[(FN+TP)+(TP+FP)-TP] ;
至此,关于全卷积神经网络(FCN) SegmentationLoss代码解析及语义分割的评价标准讲解完毕。