图像的深度学习异常检测

Posted

技术标签:

【中文标题】图像的深度学习异常检测【英文标题】:DeepLearning Anomaly Detection for images 【发布时间】:2017-09-12 11:25:27 【问题描述】:

我对深度学习的世界还比较陌生。我想为图像异常检测创建一个深度学习模型(最好使用 Tensorflow/Keras)。我的意思是异常检测,本质上是OneClassSVM

我已经使用图像中的 HOG 特征尝试了 sklearn 的 OneClassSVM。我想知道是否有一些例子可以说明我如何在深度学习中做到这一点。我查了一下,但找不到一个可以处理这种情况的代码。

【问题讨论】:

使用 HOG 是一种特征工程方法。通常在深度学习中你不会处理这个问题,你让你的模型为你解决这个问题,这就是为什么你很可能找不到非常相似的例子。因此,如果您想尝试深度学习,您应该尝试使用简单的图像作为输入而不是预先提取的特征的标准卷积网络。 谢谢@maz。是的同意了。你能指出我在 tensorflow 中进行单类分类的一个很好的例子吗?我花了很多时间研究这个,但仍然空手而归。 您可以使用多类分类示例进行两个更改:首先,将上次激活更改为 sigmoid 或 tanh(不要对单个类使用 softmax,它不会起作用)。其次,更改最后一个 Dense 层,使其具有单个输出(在 keras 中,这是使用 Dense(1) 完成的)。我不知道单类示例,但是通过这两个更改,您可以尝试来自 keras github.com/fchollet/keras/blob/master/examples/mnist_cnn.py 的这个 mnist cnn 示例。请注意 keras 2 和 1 之间的差异(主要是名称更改)。 谢谢@maz 让我试试。 【参考方案1】:

在 Keras 中执行此操作的方法是使用 KerasRegressor 包装器模块(它们包装了 sci-kit learn 的回归器接口)。有用的信息也可以在该模块的source 代码中找到。基本上你首先必须定义你的网络模型,例如:

def simple_model():
    #Input layer
    data_in = Input(shape=(13,)) 
    #First layer, fully connected, ReLU activation
    layer_1 = Dense(13,activation='relu',kernel_initializer='normal')(data_in)   
    #second layer...etc
    layer_2 = Dense(6,activation='relu',kernel_initializer='normal')(layer_1)  
    #Output, single node without activation
    data_out = Dense(1, kernel_initializer='normal')(layer_2)     
    #Save and Compile model
    model = Model(inputs=data_in, outputs=data_out)   
    #you may choose any loss or optimizer function, be careful which you chose 
    model.compile(loss='mean_squared_error', optimizer='adam')
    return model

然后,将它与您的数据一起传递给KerasRegressor 构建器和fit

from keras.wrappers.scikit_learn import KerasRegressor
#chose your epochs and batches 
regressor = KerasRegressor(build_fn=simple_model, nb_epoch=100, batch_size=64)
#fit with your data
regressor.fit(data, labels, epochs=100)

您现在可以对其进行预测或获得其分数:

p = regressor.predict(data_test) #obtain predicted value
score = regressor.score(data_test, labels_test) #obtain test score

在您的情况下,由于您需要从正常的图像中检测异常图像,一种方法您可以采用通过传递标记为 1 的异常图像和好的,标记为0

这将使您的模型在输入是异常图像时返回更接近 1 的值,从而使您能够阈值所需的结果。您可以将此输出视为您训练为 1(完美匹配)的“异常模型”的 R^2 系数。

另外,正如您所提到的,自动编码器是另一种进行异常检测的方法。为此,我建议您查看 Keras 博客帖子 Building Autoencoders in Keras,其中详细解释了使用 Keras 库实现它们的过程。


值得注意的是,单类分类是回归的另一种说法。

分类试图在N 可能的类中找到一个概率分布,您通常会选择最可能的类作为输出(这就是为什么大多数分类网络在其上使用Sigmoid 激活输出标签,因为它的范围是 [0, 1])。它的输出是离散的/分类的

同样,回归尝试通过最小化错误或其他一些指标(如众所周知的 R^2 指标或Coefficient of Determination)来找到代表您的数据的最佳模型。它的输出是一个实数/连续(这也是大多数回归网络不在其输出上使用激活的原因)。我希望这会有所帮助,祝你的编码好运。

【讨论】:

这个包装好的模型可以保存为.pb图吗?我希望在 c# 中实现此功能,但由于 c# 中的端口中没有 sklearn,因此无法实现。 我不确定乔德。但也许可以研究一下这个模型保存的格式,然后以某种方式将其转换为您提到的这种 .pb 格式

以上是关于图像的深度学习异常检测的主要内容,如果未能解决你的问题,请参考以下文章

异常检测——从经典算法到深度学习》14 对于流数据基于 RRCF 的异常检测

《异常检测——从经典算法到深度学习》15 通过无监督和主动学习进行实用的白盒异常检测

《异常检测——从经典算法到深度学习》15 通过无监督和主动学习进行实用的白盒异常检测

异常检测——从经典算法到深度学习》14 对于流数据基于 RRCF 的异常检测

异常检测——从经典算法到深度学习》14 对于流数据基于 RRCF 的异常检测

《异常检测——从经典算法到深度学习》16 基于VAE和LOF的无监督KPI异常检测算法