Catching Both Gray and Black Swans: Open-set Supervised Anomaly Detection


文章目录

  • Catching Both Gray and Black Swans: Open-set Supervised Anomaly Detection
  • 介绍
  • DAR多头网络
    • 1.特征提取(feature extractor)
    • 2.正常头(holistic head)
    • 3.可见异常头(seen head)
    • 4.伪异常头(pseudo head)
    • 5.潜在异常头(composite head)
  • 训练过程
  • 总结

介绍

  传统缺陷检测时,所用的训练样本都是无缺陷的正常样本,但是在某些情况下也能收集到少量的缺陷样本,直接把这些缺陷样本丢弃未免有些浪费,毕竟这些样本中蕴含着真实存在的缺陷特征,若将此类缺陷样本纳入训练,或许当网络再次遇到类似的缺陷时能够更好地分割。
  本论文所提出的一种多头网络就是用于解决上述问题,充分利用可见异常,同时不会造成严重的过拟合现象。
  论文中的两种天鹅:黑天鹅与灰天鹅,灰天鹅象征着可见异常(seen anomaly),即训练集中的已知异常样本;黑天鹅象征着不可见异常(unseen anomaly),即网络未来测试中可能遇到的各式各样的异常类型。

论文地址:https://arxiv.org/pdf/2203.14506.pdf
官方代码:https://github.com/choubo/DRA


DAR多头网络

  论文中所提出了一种DAR多头网络,整个网络分为正常头(Normality learning head)、伪异常头(Pseudo anomaly)、可见异常头(Seen anomaly)和潜在异常头(Latent residual anomaly),每个头分开训练,训练不同的内容,得到每个头的异常分数,然后组合起来即可知道某样本是否为异常样本。

1.特征提取(feature extractor)

  在此之前,为了获取不同感受野的信息,对原图进行不用程度的下采样,分别进行之后的操作。
  本实验中使用的特征提取器依旧为预训练的resnet18网络,将其conv5_x层输出作为提取出的特征信息。

2.正常头(holistic head)

  正常头中所要训练的目标是对正常样本的分类,即score越接近1,是正常样本的概率越大,在训练时将所有image送入该头中。holistic head的网络结构也十分简单,相当于一个普通二分类网络的最后几层,将feature extractor提取出的feature maps平均池,而后通过两层全连接层获得正常分数normal scores。

class HolisticHead(nn.Module):def __init__(self, in_dim, dropout=0):super(HolisticHead, self).__init__()self.fc1 = nn.Linear(in_dim, 256)self.fc2 = nn.Linear(256, 1)self.drop = nn.Dropout(dropout)def forward(self, x):x = F.adaptive_avg_pool2d(x, (1, 1))x = x.view(x.size(0), -1)x = self.drop(F.relu(self.fc1(x)))x = self.fc2(x)return torch.abs(x)

3.可见异常头(seen head)

  可见异常为训练集中包含的异常样本,在训练时Label=1,将可见异常与正常样本一并送入该头中,通过一个普通的卷积层得到feature maps各个channel的异常分数,使用Top-K选取其中异常分数较大的K个进行平均,得到该头的异常分数anomaly score,异常分数越接近1,该image是异常的概率越大。

class PlainHead(nn.Module):def __init__(self, in_dim, topk_rate=0.1):super(PlainHead, self).__init__()self.scoring = nn.Conv2d(in_channels=in_dim, out_channels=1, kernel_size=1, padding=0)self.topk_rate = topk_ratedef forward(self, x):x = self.scoring(x)x = x.view(int(x.size(0)), -1)topk = max(int(x.size(1) * self.topk_rate), 1)x = torch.topk(torch.abs(x), topk, dim=1)[0]x = torch.mean(x, dim=1).view(-1, 1)return x

4.伪异常头(pseudo head)

  所谓伪异常,即使用数据增强的方法仿真出一些未来可能出现的unseen anomaly,论文中使用CutMix方法实现数据增强,CutMix分为Cut与Mix两个步骤,Cut就是将图片的一部分区域剪切掉,Mix就是在剪切掉的区域中随机填充其他image的区域像素值。伪异常头与上述的可见异常头使用相同的网络结构,伪异常Label=2。

5.潜在异常头(composite head)

  未来可能出现的那些异常与seen anomaly几乎无共同点,与normal samples仅有很少的不同处,只用异常本身的特征很难检测出来的,但在高阶复合特征空间中很容易被检测出来,复合特征具有更强的可分辨性。

  首先,从normal samples中随机抽取的一小部分图像,计算其feature maps的平均值获得可供参考的正常特征图。

  然后相减获得标识异常与正常区别的残差特征图。

class CompositeHead(PlainHead):def __init__(self, in_dim, topk=0.1):super(CompositeHead, self).__init__(in_dim, topk)self.conv = nn.Sequential(nn.Conv2d(in_dim, in_dim, 3, padding=1),nn.BatchNorm2d(in_dim),nn.ReLU())def forward(self, x, ref):ref = torch.mean(ref, dim=0).repeat([x.size(0), 1, 1, 1])x = ref - xx = self.conv(x)x = super().forward(x)return x

训练过程

  训练过程中,由四个head共同训练,并且每个head参数不共享、独立进行优化。损失函数使用deviation loss,比cross entropy loss或focal loss更稳定、性能更好。将所有abnormal head分数相加,减去normal head的分数即可得到异常分数,通过该异常分数来判断一张图片是否存在异常。
  

  关于deviation loss,首先使用Z-score定义异常样本与正常样本异常分数的偏差(μ和σ在实验中为标准正态分布)

  然后定义loss:

  当样本异常时,y=1,loss为0和a-dev中较大的一项,即pred尽可能大
  当样本正常时,y=0,loss为abs(dev),即pred尽可能小


总结

  经过测试,该DAR网络在MVTec AD数据集上整体表现良好,但依旧存在某些问题,如对cable样本的poke insulation和cable swap缺陷的检测表现不佳…

【阅读笔记】《Catching Both Gray and Black Swans: Open-set Supervised Anomaly Detection》相关推荐

  1. trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer

    一.代码结构概览 1.核心部分 configs:储存各种网络的yaml配置文件 datasets:存放数据集的地方 detectron2:运行代码的核心组件 tools:提供了运行代码的入口以及一切可 ...

  2. VoxelNet阅读笔记

    作者:Tom Hardy Date:2020-02-11 来源:VoxelNet阅读笔记

  3. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  4. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  5. Mina源码阅读笔记(一)-整体解读

    2019独角兽企业重金招聘Python工程师标准>>> 今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者 ...

  6. “CoreCLR is now Open Source”阅读笔记

    英文原文:CoreCLR is now Open Source 阅读笔记如下: CoreCLR是.NET Core的执行引擎,功能包括GC(Garbage Collection), JIT(将CIL代 ...

  7. QCon 2015 阅读笔记 - 团队建设

    QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 中西对话:团队管理的五项理论和实战 - 谢欣.董飞(今日头条,LinkedI ...

  8. 05《软件需求模式》阅读笔记

    剩下的两个阅读笔记写第二部分.各类需求模式,共八个领域和它的需求模式,这一次写前四个. 基础需求模式,它是所有种类的系统都可能需要的一些东西.系统间接口需求模式使用系统间接口需求模式定义被定义的系统和 ...

  9. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  10. 大型网站技术架构:核心原理与案例分析阅读笔记二

    大型网站技术架构:核心原理与案例分析阅读笔记二 网站架构设计时可能会存在误区,其实不必一味追随大公司的解决方案,也不必为了技术而技术,要根据本公司的实际情况,制定适合本公司发展的网站架构设计,否则会变 ...

最新文章

  1. Java:new一个对象的过程中发生了什么?
  2. 谈谈中台架构之交易中台
  3. 作为面试官的一点小感想
  4. 插值,拟合,逼近的区别理解
  5. Javascript 面向对象编程中的‘new’
  6. VMware Workstation Pro通过ISO系统镜像安装ubuntu-18.04.2
  7. nodejs+kafka+storm+hbase 开发
  8. 数据从一个Oracle导到另一个,oracle拷贝数据导另一个用户
  9. 百度元宇宙产品“希壤”将于12月27日发布
  10. [eZ publish] fetch_alias() and fetch()
  11. python中关于元组的基础运用
  12. 中职学生计算机学情分析报告,中职学校学生学情分析及对策
  13. Vue面试中,经常会被问到的面试题/Vue知识点整理
  14. Android默认头像那些事儿
  15. python 妹子图抓取
  16. 挂耳式蓝牙耳机哪家的好用,推荐几款实用的挂耳式耳机
  17. 数据库SQL实战 --47.将所有获取奖金的员工当前的薪水增加10%
  18. Webpack 中 CSS 压缩插件
  19. [学习Cython编程]Cython编程入门
  20. 创维E900V21E机顶盒刷机避坑

热门文章

  1. flutter 微信语言选择_#Flutter项目(3)之仿写微信通讯录界面
  2. 亚洲及中国全国境内雷电闪电数据采集程序服务部署+接口调用说明
  3. 2020年技术领导者需要关注的5个关键领域
  4. activiti流程例子:详解员工请假流程的实现
  5. 一个简单的JS(盒子移动)
  6. UPS智能云监控报警器使用手机SIM卡和物联网卡的区别
  7. ubuntu 打不开磁盘出错
  8. 靶机渗透----bulldog2
  9. 2017年寒假集训分组测试赛2 Ranklist
  10. lumen php命令,Lumen创建自定义make命令