异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection

这篇具有很好参考价值的文章主要介绍了异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

重构子网络

判别子网络

模拟异常产生

表面异常定位与检测


近年来的表面异常检测方法依赖于生成模型来精确重构正常区域。这些方法只对无异常的图像进行训练,通常需要手工制作后处理步骤来定位异常,这妨碍了优化特征提取以获得最大的检测能力。除了重构方法外,作者将表面异常检测主要视为一个判别问题,并提出了一个判别训练的重构异常嵌入模型(DRÆM)。该方法学习异常图像的联合表示及其无异常重构,同时学习正常和异常样本的决策界。该方法可以直接进行异常定位,而不需要对网络输出进行额外的复杂后处理,并且可以使用简单和一般的异常模拟进行训练。在极具挑战性的MVTec异常检测数据集上,DRÆM大大优于目前最先进的无监督方法,甚至在广泛使用的DAGM表面缺陷检测数据集上,其检测性能接近完全监督方法,同时在定位精度上显著优于它们。

作者提出的鉴别关节重建正常嵌入方法(DRÆM)由一个重建子网络和一个鉴别子网络组成如图所示。重构子网络训练为隐式检测和重构具有语义上合理的无异常内容的异常,同时保持输入图像的非异常区域不变。同时,判别子网络学习联合重构异常嵌入,并根据级联重构和原始外观生成准确的异常分割图。异常训练示例由一个概念简单的过程创建,该过程在无异常图像上模拟异常。这种异常生成方法提供了任意数量的异常样本以及像素完美的异常分割图,可以在没有真实异常样本的情况下用于训练所提出的方法。

异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection

首先,利用Lrec训练的重构子网络隐式检测和修复异常区域。重构子网络的输出和输入图像随后被连接并馈送到判别子网络。分割网络使用焦点损失Lfocal进行训练,定位异常区域并生成异常图。从异常评分图中获取图像级异常评分η

重构子网络

重构子网络被看作是一种编译码器结构,它将输入图像的局部模式转换为更接近正态样本分布的模式。对网络进行训练,以从模拟器获得的人工损坏版本Ia 去重构原始图像Il2 损失通常用于基于重构的异常检测方法,但这假设相邻像素之间是独立的,因而额外使用基于patch的SSIM损失:

异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection

其中HW分别为原图像I的高度和宽度。Np为原图像像素的个数,Ir是网络输出的重构图像SSIM (I, Ir)(i, j)IIr patch里面的SSIM,以图像坐标(i, j)为中心,因此重构损失为

异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection

λ是一个损失平衡超参数。

判别子网络

判别子网络采用类似于U-Net的架构,这个子网络输入Ic 被定义为重构子网络输出Ic和输入图像I的通道级联。由于重构子网络的正态恢复特性,在异常图像中,IIr的联合形态存在显著差异,这为异常分割提供了必要的信息。在基于重构的异常检测方法中,利用SSIM等相似函数获得异常图,将原始图像与重构图像进行比较,然而,表面异常检测的特定相似性度量是很难手工制作的。而判别子网络则学习合适的距离自动的测量。网络输出与原始图像I大小相同的异常分数图Mo 将焦点损失Focal Loss (Lseg)应用于判别子网络的输出,以提高困难示例精确分割的鲁棒性。考虑到两个子网络的分割和重构目标,在训练DRÆM时,总损耗为

异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection

其中MaM分别为ground truth和输出的异常分割掩模。

模拟异常产生

DRÆM不需要模拟真实地反映目标域中真实的异常情况,而是生成just-out- distribution现象,这允许学习适当的距离函数,通过异常偏离正态来识别异常。提出的异常模拟器遵循这个范例。噪声图像是由柏林噪声生成的,以捕捉各种异常形状(图P),并通过随机均匀采样的阈值进行二值化,生成异常图(Ma )。从一个与输入图像分布无关的异常源图像数据集上采样异常纹理源图像A

异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection

模拟异常产出过程

随机增加采样,从集合{色调分离,清晰度,曝光,均衡,亮度改变,颜色改变,自动对比度}中抽样3个随机增加函数。将增广纹理图像A与异常图Ma进行掩膜,并与原图像I进行混合,生成just-out-of-distribution的异常,从而有助于在训练后的网络中加强决策边界。因此将增强训练图像Ia定义为

异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection这里异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detectionMa的颠倒,异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection是逐元乘法运算,β是混合时的不透明度参数。该参数从一个间隔内均匀采样即β [0.1, 1.0]。随机混合和增强可以从单个纹理生成不同的异常图像(见图) . 原始异常源图像()可以被多次放大()来生成各种各样的模拟异常区域()

异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection

因此,上述的模拟器生成包含原始无异常图像的训练样本三组,包含模拟异常Ia和像素完美异常掩模Ma的增强图像。

表面异常定位与检测

判别子网络的输出是一个像素级异常检测掩膜Mo,可以直接被解释为图像级异常得分估计,即图像中是否存在异常。首先,利用均值滤波卷积层对Mo进行平滑处理,聚合局部异常响应信息;对平滑后的异常分数图取最大值,计算最终的图像级异常分数η:

异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection

其中fsf ×sf是大小为sf ×sf的平均过滤器,是卷积运算。在一项初步研究中,作者训练了一个分类网络用于图像级异常分类,但没有观察到直接评分估计方法的改进。

部分训练代码展示:文章来源地址https://www.toymoban.com/news/detail-403076.html

import torch
from data_loader import MVTecDRAEMTrainDataset
from torch.utils.data import DataLoader
from torch import optim
from tensorboard_visualizer import TensorboardVisualizer
from model_unet import ReconstructiveSubNetwork, DiscriminativeSubNetwork
from loss import FocalLoss, SSIM
import os

def get_lr(optimizer):
    for param_group in optimizer.param_groups:
        return param_group['lr']

def weights_init(m):
    classname = m.__class__.__name__
    if classname.find('Conv') != -1:
        m.weight.data.normal_(0.0, 0.02)
    elif classname.find('BatchNorm') != -1:
        m.weight.data.normal_(1.0, 0.02)
        m.bias.data.fill_(0)

def train_on_device(obj_names, args):

    if not os.path.exists(args.checkpoint_path):
        os.makedirs(args.checkpoint_path)

    if not os.path.exists(args.log_path):
        os.makedirs(args.log_path)

    for obj_name in obj_names:
        run_name = 'DRAEM_test_'+str(args.lr)+'_'+str(args.epochs)+'_bs'+str(args.bs)+"_"+obj_name+'_'

        visualizer = TensorboardVisualizer(log_dir=os.path.join(args.log_path, run_name+"/"))

        model = ReconstructiveSubNetwork(in_channels=3, out_channels=3)
        model.cuda()
        model.apply(weights_init)

        model_seg = DiscriminativeSubNetwork(in_channels=6, out_channels=2)
        model_seg.cuda()
        model_seg.apply(weights_init)

        optimizer = torch.optim.Adam([
                                      {"params": model.parameters(), "lr": args.lr},
                                      {"params": model_seg.parameters(), "lr": args.lr}])

        scheduler = optim.lr_scheduler.MultiStepLR(optimizer,[args.epochs*0.8,args.epochs*0.9],gamma=0.2, last_epoch=-1)

        loss_l2 = torch.nn.modules.loss.MSELoss()
        loss_ssim = SSIM()
        loss_focal = FocalLoss()

        # dataset = MVTecDRAEMTrainDataset(args.data_path + obj_name + "/train/good/", args.anomaly_source_path, resize_shape=[256, 256])
        dataset = MVTecDRAEMTrainDataset(args.data_path + obj_name + "D:/CODE/DRAEM-main/dataset/good", args.anomaly_source_path,resize_shape=[256, 256])

        # dataloader = DataLoader(dataset, batch_size=args.bs,
        #                         shuffle=True, num_workers=16)
        dataloader = DataLoader(dataset, batch_size=args.bs,
                                shuffle=False, num_workers=16)
        n_iter = 0
        for epoch in range(args.epochs):
            print("Epoch: "+str(epoch))
            for i_batch, sample_batched in enumerate(dataloader):
                gray_batch = sample_batched["image"].cuda()
                aug_gray_batch = sample_batched["augmented_image"].cuda()
                anomaly_mask = sample_batched["anomaly_mask"].cuda()

                gray_rec = model(aug_gray_batch)
                joined_in = torch.cat((gray_rec, aug_gray_batch), dim=1)

                out_mask = model_seg(joined_in)
                out_mask_sm = torch.softmax(out_mask, dim=1)

                l2_loss = loss_l2(gray_rec,gray_batch)
                ssim_loss = loss_ssim(gray_rec, gray_batch)

                segment_loss = loss_focal(out_mask_sm, anomaly_mask)
                loss = l2_loss + ssim_loss + segment_loss

                optimizer.zero_grad()

                loss.backward()
                optimizer.step()

                if args.visualize and n_iter % 200 == 0:
                    visualizer.plot_loss(l2_loss, n_iter, loss_name='l2_loss')
                    visualizer.plot_loss(ssim_loss, n_iter, loss_name='ssim_loss')
                    visualizer.plot_loss(segment_loss, n_iter, loss_name='segment_loss')
                if args.visualize and n_iter % 400 == 0:
                    t_mask = out_mask_sm[:, 1:, :, :]
                    visualizer.visualize_image_batch(aug_gray_batch, n_iter, image_name='batch_augmented')
                    visualizer.visualize_image_batch(gray_batch, n_iter, image_name='batch_recon_target')
                    visualizer.visualize_image_batch(gray_rec, n_iter, image_name='batch_recon_out')
                    visualizer.visualize_image_batch(anomaly_mask, n_iter, image_name='mask_target')
                    visualizer.visualize_image_batch(t_mask, n_iter, image_name='mask_out')


                n_iter +=1

            scheduler.step()

            torch.save(model.state_dict(), os.path.join(args.checkpoint_path, run_name+".pckl"))
            torch.save(model_seg.state_dict(), os.path.join(args.checkpoint_path, run_name+"_seg.pckl"))


if __name__=="__main__":
    import argparse

    parser = argparse.ArgumentParser()
    parser.add_argument('--obj_id', action='store', type=int, required=True)
    parser.add_argument('--bs', action='store', type=int, required=True)
    parser.add_argument('--lr', action='store', type=float, required=True)
    parser.add_argument('--epochs', action='store', type=int, required=True)
    parser.add_argument('--gpu_id', action='store', type=int, default=0, required=False)
    parser.add_argument('--data_path', action='store', type=str, required=True)
    parser.add_argument('--anomaly_source_path', action='store', type=str, required=True)
    parser.add_argument('--checkpoint_path', action='store', type=str, required=True)
    parser.add_argument('--log_path', action='store', type=str, required=True)
    parser.add_argument('--visualize', action='store_true')

    args = parser.parse_args()

    obj_batch = [['capsule'],
                 ['bottle'],
                 ['carpet'],
                 ['leather'],
                 ['pill'],
                 ['transistor'],
                 ['tile'],
                 ['cable'],
                 ['zipper'],
                 ['toothbrush'],
                 ['metal_nut'],
                 ['hazelnut'],
                 ['screw'],
                 ['grid'],
                 ['wood']
                 ]

    if int(args.obj_id) == -1:
        obj_list = ['capsule',
                     'bottle',
                     'carpet',
                     'leather',
                     'pill',
                     'transistor',
                     'tile',
                     'cable',
                     'zipper',
                     'toothbrush',
                     'metal_nut',
                     'hazelnut',
                     'screw',
                     'grid',
                     'wood'
                     ]
        picked_classes = obj_list
    else:
        picked_classes = obj_batch[int(args.obj_id)]

    with torch.cuda.device(args.gpu_id):
        train_on_device(picked_classes, args)

到了这里,关于异常检测论文阅读(一)——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【阅读论文】USAD:多变量时间序列上的无监督异常检测

    USAD : UnSupervised Anomaly Detection on Multivariate Time Series IT系统的自动监控是Orange目前面临的挑战。考虑到其IT运营所达到的规模和复杂性,随着时间的推移,用于推断正常和异常行为的测量所需的传感器数量急剧增加,使得传统的基于专家的监督方法变得缓慢或容易出错。在本文中

    2024年02月12日
    浏览(47)
  • 【阅读论文】基于VAE-LSTM混合模型的时间序列异常检测

    Anomaly Detection for Time Series Using VAE-LSTM Hybrid Model CCFB Shuyu LinRonald ClarkRobert BirkeSandro SchönbornNiki TrigoniStephen J. Roberts International Conference on Acoustics, Speech, and Signal Processing May 2020 在这项工作中,我们提出了一种VAE-LSTM混合模型,作为一种无监督的时间序列异常检测方法。我们的模型

    2024年02月08日
    浏览(47)
  • 【论文阅读 09】融合门控自注意力机制的生成对抗网络视频异常检测

            2021年 中国图象图形学报 背景: 视频异常行为检测是智能监控技术的研究重点,广泛应用于社会安防领域。当前的挑战之一是如何提高异常检测的准确性,这需要有效地建模视频数据的空间维度和时间维度信息。生成对抗网络(GANs)因其结构优势而被广泛应用于视

    2024年02月03日
    浏览(46)
  • 【视频异常检测综述-论文阅读】Deep Video Anomaly Detection: Opportunities and Challenges

    来源:  Ren, Jing, et al. “Deep Video Anomaly Detection: Opportunities and Challenges.” 2021 International Conference on Data Mining Workshops (ICDMW), Dec. 2021. Crossref, https://doi.org/10.1109/icdmw53433.2021.00125. 文章连接:https://arxiv.org/abs/2110.05086 异常检测在各种研究环境中是一项热门而重要的任务,已经研究了

    2023年04月16日
    浏览(46)
  • 论文阅读 - VGAER: Graph Neural Network Reconstruction based Community Detection

    https://arxiv.org/pdf/2201.04066.pdf         社群检测是网络科学中一个基础而重要的问题,但基于图神经网络的社群检测算法为数不多,其中无监督算法几乎是空白。         本文通过将 高阶模块化信息与网络特征融合 ,首次提出了基于变异图自动编码器重构的社群检测

    2024年01月18日
    浏览(44)
  • Rethinking Point Cloud Registration as Masking and Reconstruction论文阅读

    2023 ICCV * Guangyan Chen, Meiling Wang, Li Yuan, Yi Yang, Yufeng Yue* ; Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV), 2023, pp. 17717-17727 paper: Rethinking Point Cloud Registration as Masking and Reconstruction (thecvf.com) code: CGuangyan-BIT/MRA (github.com) 这论文标题就很吸引人,但是研读下来作者只是想

    2024年02月08日
    浏览(45)
  • CORE: Cooperative Reconstruction for Multi-Agent Perception 论文阅读

    论文连接 CORE: Cooperative Reconstruction for Multi-Agent Perception 0. 摘要 本文提出了 CORE,一种概念简单、有效且通信高效的多智能体协作感知模型。 从合作重建的新颖角度解决了该任务: 合作主体共同提供对环境的更全面的观察 整体观察可以作为有价值的监督,明确指导模型学习如

    2024年02月07日
    浏览(45)
  • 用于无监督视频异常检测的合成伪异常:一种简单有效的基于掩码自动编码器的框架 论文阅读

    论文标题:SYNTHETIC PSEUDO ANOMALIES FOR UNSUPERVISED VIDEO ANOMALY DETECTION: A SIMPLE YET EFFICIENT FRAMEWORK BASED ON MASKED AUTOENCODER 文章信息: 发表于:ICASSP 2023(CCF B) 原文链接:https://arxiv.org/abs/2303.05112 源码:无 由于用于训练的异常样本的可用性有限,视频异常检测通常被视为一类分类问题

    2024年02月04日
    浏览(52)
  • Nerf论文阅读笔记Neuralangelo: High-Fidelity Neural Surface Reconstruction

    公众号:AI知识物语;B站暂定;知乎同名 视频入门介绍可以参考 B站——CVPR 2023最新工作!Neuralangelo:高保真Nerf表面重建 https://www.bilibili.com/video/BV1Ju411W7FL/spm_id_from=333.337.searchcard.all.clickvd_source=03387e75fde3d924cb207c0c18ffa567 图1所示。本文提出Neuralangelo,一种用神经体渲染从RGB图像

    2024年02月08日
    浏览(46)
  • 【视频异常检测】Delving into CLIP latent space for Video Anomaly Recognition 论文阅读

    中文题目:视频异常识别的CLIP潜在空间研究 文章信息: 原文链接:https://arxiv.org/abs/2310.02835 源代码:https://github.com/luca-zanella-dvl/AnomalyCLIP 我们介绍了一种新的方法AnomalyCLIP,它首次将大型语言和视觉(LLV)模型(如CLIP)与多实例学习相结合,用于联合视频异常检测和分类。

    2024年04月14日
    浏览(91)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包