cnulab / RealNet

Offical implementation of "RealNet: A Feature Selection Network with Realistic Synthetic Anomaly for Anomaly Detection (CVPR 2024)"
MIT License
226 stars 13 forks source link

训练网络输入图像的尺寸问题 #45

Open liaoyusy opened 3 months ago

liaoyusy commented 3 months ago

作者您好,我想问一下能否将输入图像的尺寸从256调整为512呢?如果可以,麻烦您指导一下需要修改哪些代码

cnulab commented 3 months ago

你好! 如果你只想训练一个512*512的异常检测器,一个简单的方法是直接修改experiments/MVTec-AD/realnet.yaml的input_size即可。如果显存溢出可是适当减小一下structure里的planes. 如果你想训练512*512的扩散模型,你需要去 https://github.com/openai/guided-diffusion 下载512*512的预训练扩散模型checkpoint, 然后修改experiments/MVTec-AD/diffusion.yaml和experiments/MVTec-AD/classifier.yaml中的input_size和unet(classifier),可能需要参考一下 https://github.com/openai/guided-diffusion 中的设置。

liaoyusy commented 3 months ago

OK 感谢指导,我试一下

liaoyusy commented 3 months ago

作者您好,我再请教您几个问题: 我训练我自己的数据集,原图大小12801024,扩散模型和异常检测器的input_size是256256,然后有些小的缺陷检测效果不太好,我觉得是resize的太小了,丢失了一些信息,然后我做了一些修改: (1)只训练512512的异常检测器,扩散模型还是用之前256256的,生成的sdas大小也还是256256的,但是异常检测结果不及之前256256的效果好,这和扩散模型以及生成的sdas的大小有关吗?因为训练异常检测器会用到sdas异常数据。 (2)小缺陷检测效果不好,可能是因为resize尺寸太小的原因,请问我这样理解对吗? (3)我尝试训练512*512的扩散模型,将input_size和unet(classifier)参数也进行了相应的修改,但是显存48g,batchsize=1显存还是会溢出,但是之前训练256大小时,batchsize可以设置为6,这种情况正常吗? (4)我只有一个类别的异常,分类器是不是就不用训练了?

cnulab commented 3 months ago

你好! 在高分辨率图像中检测小面积异常本身就比较困难。如果你把图像resize的太小那肯定检测不出来,如果你resize成256*256肉眼都看不出来了,那就是异常信息已经丢失了,网络肯定也检测不出来。 我建议你就不要训练512*512的扩散模型了(成本较高),还用256*256的sdas或者只用dtd也可以,修改一下网络结构,仅重建前三层特征(或者前两层),来增强网络的小面积异常检测能力。

重建三层

structure:
  - name: block1
    layers:
      - idx: layer1
        planes: 256
    stride: 4

  - name: block2
    layers:
      - idx: layer2
        planes: 512
    stride: 8

  - name: block3
    layers:
      - idx: layer3
        planes: 512
    stride: 16

net:
  - name: backbone
    type: models.backbones.Backbone
    frozen: True
    kwargs:
      backbone: wide_resnet50_2

  - name: afs
    type: models.afs.AFS
    frozen: True
    prev: backbone
    kwargs:
      init_bsn: 64

  - name: recon
    type: models.recon.ReconstructionLayer
    prev: afs
    kwargs:
      num_res_blocks: 2
      hide_channels_ratio: 0.5
      channel_mult: [1,2,4]
      attention_mult: [2,4]

  - name: rrs
    type: models.rrs.RRS
    prev: recon
    kwargs:
      modes: [max,mean]
      mode_numbers: [256,256] # dimensions of RRS, max=256,mean=256
      num_residual_layers: 2
      stop_grad: False

重建两层

structure:
  - name: block1
    layers:
      - idx: layer1
        planes: 256
    stride: 4

  - name: block2
    layers:
      - idx: layer2
        planes: 512
    stride: 8

net:
  - name: backbone
    type: models.backbones.Backbone
    frozen: True
    kwargs:
      backbone: wide_resnet50_2

  - name: afs
    type: models.afs.AFS
    frozen: True
    prev: backbone
    kwargs:
      init_bsn: 64

  - name: recon
    type: models.recon.ReconstructionLayer
    prev: afs
    kwargs:
      num_res_blocks: 2
      hide_channels_ratio: 0.5
      channel_mult: [1,2,4]
      attention_mult: [2,4]

  - name: rrs
    type: models.rrs.RRS
    prev: recon
    kwargs:
      modes: [max,mean]
      mode_numbers: [128,128] # dimensions of RRS, max=256,mean=256
      num_residual_layers: 2
      stop_grad: False

上面的配置会增强网络检测小面积异常的能力,同时也会降低网络检测大面积异常区域的能力。

liaoyusy commented 3 months ago

感谢您的耐心指导,我这就去试试~