DeepLearning图像异常检测

时间:2017-04-16 19:46:25

标签: tensorflow scikit-learn keras autoencoder anomaly-detection

我仍然是深度学习世界的新手。我想创建一个深度学习模型(最好使用Tensorflow / Keras)进行图像异常检测。通过异常检测我的意思是,基本上是OneClassSVM

我已经使用图像中的HOG功能尝试了sklearn的OneClassSVM。我想知道是否有一些如何在深度学习中做到这一点的例子。我抬起头但找不到一个处理这种情况的代码片。

1 个答案:

答案 0 :(得分:2)

在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个可能的类中找到概率分布,并且通常选择最可能的类作为输出(这就是为什么大多数分类网络使用{{1}激活其输出标签,因为它具有范围[0,1])。它的输出是离散的/分类的

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